diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..6712f145 --- /dev/null +++ b/404.html @@ -0,0 +1,1117 @@ + + + + + + + + + + + + + + + + + + + ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/assets/Cyber_Hunterz_Brasao-1.png b/assets/Cyber_Hunterz_Brasao-1.png new file mode 100644 index 00000000..4b05a9c4 Binary files /dev/null and b/assets/Cyber_Hunterz_Brasao-1.png differ diff --git a/assets/SAFe.png b/assets/SAFe.png new file mode 100644 index 00000000..30fc4ee8 Binary files /dev/null and b/assets/SAFe.png differ diff --git a/assets/agile.png b/assets/agile.png new file mode 100644 index 00000000..7d2740a2 Binary files /dev/null and b/assets/agile.png differ diff --git a/assets/capacidades.png b/assets/capacidades.png new file mode 100644 index 00000000..a7cbee52 Binary files /dev/null and b/assets/capacidades.png differ diff --git a/assets/ciclodevida.png b/assets/ciclodevida.png new file mode 100644 index 00000000..b0a6ae0d Binary files /dev/null and b/assets/ciclodevida.png differ diff --git a/assets/criterios-aceitacao/fe01-crud-turma.png b/assets/criterios-aceitacao/fe01-crud-turma.png new file mode 100644 index 00000000..1e2910e5 Binary files /dev/null and b/assets/criterios-aceitacao/fe01-crud-turma.png differ diff --git a/assets/criterios-aceitacao/fe02-crud-aluno.png b/assets/criterios-aceitacao/fe02-crud-aluno.png new file mode 100644 index 00000000..231110a0 Binary files /dev/null and b/assets/criterios-aceitacao/fe02-crud-aluno.png differ diff --git a/assets/criterios-aceitacao/fe03-crud-monitor.png b/assets/criterios-aceitacao/fe03-crud-monitor.png new file mode 100644 index 00000000..51bce99e Binary files /dev/null and b/assets/criterios-aceitacao/fe03-crud-monitor.png differ diff --git a/assets/criterios-aceitacao/fe04-crud-grupo.png b/assets/criterios-aceitacao/fe04-crud-grupo.png new file mode 100644 index 00000000..fe1c0868 Binary files /dev/null and b/assets/criterios-aceitacao/fe04-crud-grupo.png differ diff --git a/assets/criterios-aceitacao/fe06-crud-atividade.png b/assets/criterios-aceitacao/fe06-crud-atividade.png new file mode 100644 index 00000000..5110a7d6 Binary files /dev/null and b/assets/criterios-aceitacao/fe06-crud-atividade.png differ diff --git a/assets/criterios-aceitacao/fe07-emitir-planilhas.png b/assets/criterios-aceitacao/fe07-emitir-planilhas.png new file mode 100644 index 00000000..70ef670e Binary files /dev/null and b/assets/criterios-aceitacao/fe07-emitir-planilhas.png differ diff --git a/assets/criterios-aceitacao/fe08-corrigir-atividades.png b/assets/criterios-aceitacao/fe08-corrigir-atividades.png new file mode 100644 index 00000000..63cb48ec Binary files /dev/null and b/assets/criterios-aceitacao/fe08-corrigir-atividades.png differ diff --git a/assets/criterios-aceitacao/fe09-crud-professor.png b/assets/criterios-aceitacao/fe09-crud-professor.png new file mode 100644 index 00000000..d6ec7b36 Binary files /dev/null and b/assets/criterios-aceitacao/fe09-crud-professor.png differ diff --git a/assets/criterios-aceitacao/fe10-inserir-feedback.png b/assets/criterios-aceitacao/fe10-inserir-feedback.png new file mode 100644 index 00000000..130b240b Binary files /dev/null and b/assets/criterios-aceitacao/fe10-inserir-feedback.png differ diff --git a/assets/criterios-aceitacao/fe11-submeter-atividades.png b/assets/criterios-aceitacao/fe11-submeter-atividades.png new file mode 100644 index 00000000..45ec4adf Binary files /dev/null and b/assets/criterios-aceitacao/fe11-submeter-atividades.png differ diff --git a/assets/criterios-aceitacao/fe12-entrar-e-sair-grupos.png b/assets/criterios-aceitacao/fe12-entrar-e-sair-grupos.png new file mode 100644 index 00000000..9089c3fb Binary files /dev/null and b/assets/criterios-aceitacao/fe12-entrar-e-sair-grupos.png differ diff --git a/assets/criterios-aceitacao/fe14-professor-admin-login-logout.png b/assets/criterios-aceitacao/fe14-professor-admin-login-logout.png new file mode 100644 index 00000000..1d06e02e Binary files /dev/null and b/assets/criterios-aceitacao/fe14-professor-admin-login-logout.png differ diff --git a/assets/criterios-aceitacao/fe15-aluno-monitor-login-logout.png b/assets/criterios-aceitacao/fe15-aluno-monitor-login-logout.png new file mode 100644 index 00000000..4bf7f54b Binary files /dev/null and b/assets/criterios-aceitacao/fe15-aluno-monitor-login-logout.png differ diff --git a/assets/epicos.png b/assets/epicos.png new file mode 100644 index 00000000..5a6e7fc2 Binary files /dev/null and b/assets/epicos.png differ diff --git a/assets/features-alunos.png b/assets/features-alunos.png new file mode 100644 index 00000000..20c803ee Binary files /dev/null and b/assets/features-alunos.png differ diff --git a/assets/features-monitor.png b/assets/features-monitor.png new file mode 100644 index 00000000..d43fa81d Binary files /dev/null and b/assets/features-monitor.png differ diff --git a/assets/features-professor.png b/assets/features-professor.png new file mode 100644 index 00000000..8135ba0f Binary files /dev/null and b/assets/features-professor.png differ diff --git a/assets/fonts/Cyberpunk/Cyberpunk.otf b/assets/fonts/Cyberpunk/Cyberpunk.otf new file mode 100644 index 00000000..38032d6d Binary files /dev/null and b/assets/fonts/Cyberpunk/Cyberpunk.otf differ diff --git a/assets/fonts/Cyberpunk/Cyberpunk.ttf b/assets/fonts/Cyberpunk/Cyberpunk.ttf new file mode 100644 index 00000000..fc7ff741 Binary files /dev/null and b/assets/fonts/Cyberpunk/Cyberpunk.ttf differ diff --git "a/assets/fonts/Cyberpunk/Free Quality Fonts Available For Download \342\200\223 fontsrepo.url" "b/assets/fonts/Cyberpunk/Free Quality Fonts Available For Download \342\200\223 fontsrepo.url" new file mode 100644 index 00000000..915a1f7b --- /dev/null +++ "b/assets/fonts/Cyberpunk/Free Quality Fonts Available For Download \342\200\223 fontsrepo.url" @@ -0,0 +1,8 @@ +[{000214A0-0000-0000-C000-000000000046}] +Prop3=19,11 +[InternetShortcut] +IDList= +URL=https://fontsrepo.com/ +IconFile=C:\WINDOWS\System32\SHELL32.dll +IconIndex=220 +HotKey=0 diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 00000000..1cf13b9f Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/javascripts/bundle.af256bd8.min.js b/assets/javascripts/bundle.af256bd8.min.js new file mode 100644 index 00000000..27355d2b --- /dev/null +++ b/assets/javascripts/bundle.af256bd8.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var ji=Object.create;var gr=Object.defineProperty;var Wi=Object.getOwnPropertyDescriptor;var Ui=Object.getOwnPropertyNames,Vt=Object.getOwnPropertySymbols,Di=Object.getPrototypeOf,xr=Object.prototype.hasOwnProperty,io=Object.prototype.propertyIsEnumerable;var no=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,$=(e,t)=>{for(var r in t||(t={}))xr.call(t,r)&&no(e,r,t[r]);if(Vt)for(var r of Vt(t))io.call(t,r)&&no(e,r,t[r]);return e};var ao=(e,t)=>{var r={};for(var o in e)xr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Vt)for(var o of Vt(e))t.indexOf(o)<0&&io.call(e,o)&&(r[o]=e[o]);return r};var yr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Vi=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ui(t))!xr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=Wi(t,n))||o.enumerable});return e};var Lt=(e,t,r)=>(r=e!=null?ji(Di(e)):{},Vi(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var so=(e,t,r)=>new Promise((o,n)=>{var i=p=>{try{s(r.next(p))}catch(c){n(c)}},a=p=>{try{s(r.throw(p))}catch(c){n(c)}},s=p=>p.done?o(p.value):Promise.resolve(p.value).then(i,a);s((r=r.apply(e,t)).next())});var po=yr((Er,co)=>{(function(e,t){typeof Er=="object"&&typeof co!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Er,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(H){return!!(H&&H!==document&&H.nodeName!=="HTML"&&H.nodeName!=="BODY"&&"classList"in H&&"contains"in H.classList)}function p(H){var ft=H.type,qe=H.tagName;return!!(qe==="INPUT"&&a[ft]&&!H.readOnly||qe==="TEXTAREA"&&!H.readOnly||H.isContentEditable)}function c(H){H.classList.contains("focus-visible")||(H.classList.add("focus-visible"),H.setAttribute("data-focus-visible-added",""))}function l(H){H.hasAttribute("data-focus-visible-added")&&(H.classList.remove("focus-visible"),H.removeAttribute("data-focus-visible-added"))}function f(H){H.metaKey||H.altKey||H.ctrlKey||(s(r.activeElement)&&c(r.activeElement),o=!0)}function u(H){o=!1}function h(H){s(H.target)&&(o||p(H.target))&&c(H.target)}function w(H){s(H.target)&&(H.target.classList.contains("focus-visible")||H.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(H.target))}function A(H){document.visibilityState==="hidden"&&(n&&(o=!0),te())}function te(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function ie(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(H){H.target.nodeName&&H.target.nodeName.toLowerCase()==="html"||(o=!1,ie())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",A,!0),te(),r.addEventListener("focus",h,!0),r.addEventListener("blur",w,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var qr=yr((lx,Sn)=>{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var Ha=/["'&<>]/;Sn.exports=ka;function ka(e){var t=""+e,r=Ha.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof It=="object"&&typeof Yr=="object"?Yr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof It=="object"?It.ClipboardJS=r():t.ClipboardJS=r()})(It,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Fi}});var a=i(279),s=i.n(a),p=i(370),c=i.n(p),l=i(817),f=i.n(l);function u(V){try{return document.execCommand(V)}catch(_){return!1}}var h=function(_){var M=f()(_);return u("cut"),M},w=h;function A(V){var _=document.documentElement.getAttribute("dir")==="rtl",M=document.createElement("textarea");M.style.fontSize="12pt",M.style.border="0",M.style.padding="0",M.style.margin="0",M.style.position="absolute",M.style[_?"right":"left"]="-9999px";var j=window.pageYOffset||document.documentElement.scrollTop;return M.style.top="".concat(j,"px"),M.setAttribute("readonly",""),M.value=V,M}var te=function(_,M){var j=A(_);M.container.appendChild(j);var D=f()(j);return u("copy"),j.remove(),D},ie=function(_){var M=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},j="";return typeof _=="string"?j=te(_,M):_ instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(_==null?void 0:_.type)?j=te(_.value,M):(j=f()(_),u("copy")),j},J=ie;function H(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?H=function(M){return typeof M}:H=function(M){return M&&typeof Symbol=="function"&&M.constructor===Symbol&&M!==Symbol.prototype?"symbol":typeof M},H(V)}var ft=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},M=_.action,j=M===void 0?"copy":M,D=_.container,Y=_.target,$e=_.text;if(j!=="copy"&&j!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Y!==void 0)if(Y&&H(Y)==="object"&&Y.nodeType===1){if(j==="copy"&&Y.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(j==="cut"&&(Y.hasAttribute("readonly")||Y.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if($e)return J($e,{container:D});if(Y)return j==="cut"?w(Y):J(Y,{container:D})},qe=ft;function je(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?je=function(M){return typeof M}:je=function(M){return M&&typeof Symbol=="function"&&M.constructor===Symbol&&M!==Symbol.prototype?"symbol":typeof M},je(V)}function Ai(V,_){if(!(V instanceof _))throw new TypeError("Cannot call a class as a function")}function oo(V,_){for(var M=0;M<_.length;M++){var j=_[M];j.enumerable=j.enumerable||!1,j.configurable=!0,"value"in j&&(j.writable=!0),Object.defineProperty(V,j.key,j)}}function Ci(V,_,M){return _&&oo(V.prototype,_),M&&oo(V,M),V}function Hi(V,_){if(typeof _!="function"&&_!==null)throw new TypeError("Super expression must either be null or a function");V.prototype=Object.create(_&&_.prototype,{constructor:{value:V,writable:!0,configurable:!0}}),_&&br(V,_)}function br(V,_){return br=Object.setPrototypeOf||function(j,D){return j.__proto__=D,j},br(V,_)}function ki(V){var _=Ri();return function(){var j=Ut(V),D;if(_){var Y=Ut(this).constructor;D=Reflect.construct(j,arguments,Y)}else D=j.apply(this,arguments);return $i(this,D)}}function $i(V,_){return _&&(je(_)==="object"||typeof _=="function")?_:Pi(V)}function Pi(V){if(V===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return V}function Ri(){if(typeof Reflect=="undefined"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(V){return!1}}function Ut(V){return Ut=Object.setPrototypeOf?Object.getPrototypeOf:function(M){return M.__proto__||Object.getPrototypeOf(M)},Ut(V)}function vr(V,_){var M="data-clipboard-".concat(V);if(_.hasAttribute(M))return _.getAttribute(M)}var Ii=function(V){Hi(M,V);var _=ki(M);function M(j,D){var Y;return Ai(this,M),Y=_.call(this),Y.resolveOptions(D),Y.listenClick(j),Y}return Ci(M,[{key:"resolveOptions",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof D.action=="function"?D.action:this.defaultAction,this.target=typeof D.target=="function"?D.target:this.defaultTarget,this.text=typeof D.text=="function"?D.text:this.defaultText,this.container=je(D.container)==="object"?D.container:document.body}},{key:"listenClick",value:function(D){var Y=this;this.listener=c()(D,"click",function($e){return Y.onClick($e)})}},{key:"onClick",value:function(D){var Y=D.delegateTarget||D.currentTarget,$e=this.action(Y)||"copy",Dt=qe({action:$e,container:this.container,target:this.target(Y),text:this.text(Y)});this.emit(Dt?"success":"error",{action:$e,text:Dt,trigger:Y,clearSelection:function(){Y&&Y.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(D){return vr("action",D)}},{key:"defaultTarget",value:function(D){var Y=vr("target",D);if(Y)return document.querySelector(Y)}},{key:"defaultText",value:function(D){return vr("text",D)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(D){var Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return J(D,Y)}},{key:"cut",value:function(D){return w(D)}},{key:"isSupported",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Y=typeof D=="string"?[D]:D,$e=!!document.queryCommandSupported;return Y.forEach(function(Dt){$e=$e&&!!document.queryCommandSupported(Dt)}),$e}}]),M}(s()),Fi=Ii},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,p){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(p))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(l,f,u,h,w){var A=c.apply(this,arguments);return l.addEventListener(u,A,w),{destroy:function(){l.removeEventListener(u,A,w)}}}function p(l,f,u,h,w){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(A){return s(A,f,u,h,w)}))}function c(l,f,u,h){return function(w){w.delegateTarget=a(w.target,f),w.delegateTarget&&h.call(l,w)}}o.exports=p},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function p(u,h,w){if(!u&&!h&&!w)throw new Error("Missing required arguments");if(!a.string(h))throw new TypeError("Second argument must be a String");if(!a.fn(w))throw new TypeError("Third argument must be a Function");if(a.node(u))return c(u,h,w);if(a.nodeList(u))return l(u,h,w);if(a.string(u))return f(u,h,w);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(u,h,w){return u.addEventListener(h,w),{destroy:function(){u.removeEventListener(h,w)}}}function l(u,h,w){return Array.prototype.forEach.call(u,function(A){A.addEventListener(h,w)}),{destroy:function(){Array.prototype.forEach.call(u,function(A){A.removeEventListener(h,w)})}}}function f(u,h,w){return s(document.body,u,h,w)}o.exports=p},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var p=window.getSelection(),c=document.createRange();c.selectNodeContents(i),p.removeAllRanges(),p.addRange(c),a=p.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var p=this.e||(this.e={});return(p[i]||(p[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var p=this;function c(){p.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),p=0,c=s.length;for(p;p0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||s(u,h)})})}function s(u,h){try{p(o[u](h))}catch(w){f(i[0][3],w)}}function p(u){u.value instanceof nt?Promise.resolve(u.value.v).then(c,l):f(i[0][2],u)}function c(u){s("next",u)}function l(u){s("throw",u)}function f(u,h){u(h),i.shift(),i.length&&s(i[0][0],i[0][1])}}function fo(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof he=="function"?he(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(a){return new Promise(function(s,p){a=e[i](a),n(s,p,a.done,a.value)})}}function n(i,a,s,p){Promise.resolve(p).then(function(c){i({value:c,done:s})},a)}}function k(e){return typeof e=="function"}function ut(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var zt=ut(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Qe(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var We=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=he(a),p=s.next();!p.done;p=s.next()){var c=p.value;c.remove(this)}}catch(A){t={error:A}}finally{try{p&&!p.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(k(l))try{l()}catch(A){i=A instanceof zt?A.errors:[A]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=he(f),h=u.next();!h.done;h=u.next()){var w=h.value;try{uo(w)}catch(A){i=i!=null?i:[],A instanceof zt?i=q(q([],N(i)),N(A.errors)):i.push(A)}}}catch(A){o={error:A}}finally{try{h&&!h.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new zt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)uo(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Qe(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Qe(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Tr=We.EMPTY;function qt(e){return e instanceof We||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function uo(e){k(e)?e():e.unsubscribe()}var Pe={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var dt={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Tr:(this.currentObservers=null,s.push(r),new We(function(){o.currentObservers=null,Qe(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,o){return new wo(r,o)},t}(F);var wo=function(e){re(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Tr},t}(g);var _r=function(e){re(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t}(g);var At={now:function(){return(At.delegate||Date).now()},delegate:void 0};var Ct=function(e){re(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=At);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,p=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+p)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),p=0;p0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t}(gt);var Oo=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(xt);var Hr=new Oo(So);var Mo=function(e){re(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=vt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(vt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(gt);var Lo=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(xt);var me=new Lo(Mo);var S=new F(function(e){return e.complete()});function Yt(e){return e&&k(e.schedule)}function kr(e){return e[e.length-1]}function Xe(e){return k(kr(e))?e.pop():void 0}function He(e){return Yt(kr(e))?e.pop():void 0}function Bt(e,t){return typeof kr(e)=="number"?e.pop():t}var yt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Gt(e){return k(e==null?void 0:e.then)}function Jt(e){return k(e[bt])}function Xt(e){return Symbol.asyncIterator&&k(e==null?void 0:e[Symbol.asyncIterator])}function Zt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Ji(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var er=Ji();function tr(e){return k(e==null?void 0:e[er])}function rr(e){return mo(this,arguments,function(){var r,o,n,i;return Nt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,nt(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,nt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,nt(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function or(e){return k(e==null?void 0:e.getReader)}function W(e){if(e instanceof F)return e;if(e!=null){if(Jt(e))return Xi(e);if(yt(e))return Zi(e);if(Gt(e))return ea(e);if(Xt(e))return _o(e);if(tr(e))return ta(e);if(or(e))return ra(e)}throw Zt(e)}function Xi(e){return new F(function(t){var r=e[bt]();if(k(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Zi(e){return new F(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?b(function(n,i){return e(n,i,o)}):le,Te(1),r?De(t):qo(function(){return new ir}))}}function Fr(e){return e<=0?function(){return S}:y(function(t,r){var o=[];t.subscribe(T(r,function(n){o.push(n),e=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new g}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,p=s===void 0?!0:s;return function(c){var l,f,u,h=0,w=!1,A=!1,te=function(){f==null||f.unsubscribe(),f=void 0},ie=function(){te(),l=u=void 0,w=A=!1},J=function(){var H=l;ie(),H==null||H.unsubscribe()};return y(function(H,ft){h++,!A&&!w&&te();var qe=u=u!=null?u:r();ft.add(function(){h--,h===0&&!A&&!w&&(f=Wr(J,p))}),qe.subscribe(ft),!l&&h>0&&(l=new at({next:function(je){return qe.next(je)},error:function(je){A=!0,te(),f=Wr(ie,n,je),qe.error(je)},complete:function(){w=!0,te(),f=Wr(ie,a),qe.complete()}}),W(H).subscribe(l))})(c)}}function Wr(e,t){for(var r=[],o=2;oe.next(document)),e}function P(e,t=document){return Array.from(t.querySelectorAll(e))}function R(e,t=document){let r=fe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function fe(e,t=document){return t.querySelector(e)||void 0}function Ie(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var ya=O(d(document.body,"focusin"),d(document.body,"focusout")).pipe(_e(1),Q(void 0),m(()=>Ie()||document.body),G(1));function et(e){return ya.pipe(m(t=>e.contains(t)),K())}function $t(e,t){return C(()=>O(d(e,"mouseenter").pipe(m(()=>!0)),d(e,"mouseleave").pipe(m(()=>!1))).pipe(t?kt(r=>Me(+!r*t)):le,Q(e.matches(":hover"))))}function Go(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Go(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Go(o,n);return o}function sr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function Tt(e){let t=x("script",{src:e});return C(()=>(document.head.appendChild(t),O(d(t,"load"),d(t,"error").pipe(v(()=>$r(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),L(()=>document.head.removeChild(t)),Te(1))))}var Jo=new g,Ea=C(()=>typeof ResizeObserver=="undefined"?Tt("https://unpkg.com/resize-observer-polyfill"):I(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>Jo.next(t)))),v(e=>O(Ye,I(e)).pipe(L(()=>e.disconnect()))),G(1));function ce(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return Ea.pipe(E(r=>r.observe(t)),v(r=>Jo.pipe(b(o=>o.target===t),L(()=>r.unobserve(t)))),m(()=>ce(e)),Q(ce(e)))}function St(e){return{width:e.scrollWidth,height:e.scrollHeight}}function cr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function Xo(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Ve(e){return{x:e.offsetLeft,y:e.offsetTop}}function Zo(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function en(e){return O(d(window,"load"),d(window,"resize")).pipe(Le(0,me),m(()=>Ve(e)),Q(Ve(e)))}function pr(e){return{x:e.scrollLeft,y:e.scrollTop}}function Ne(e){return O(d(e,"scroll"),d(window,"scroll"),d(window,"resize")).pipe(Le(0,me),m(()=>pr(e)),Q(pr(e)))}var tn=new g,wa=C(()=>I(new IntersectionObserver(e=>{for(let t of e)tn.next(t)},{threshold:0}))).pipe(v(e=>O(Ye,I(e)).pipe(L(()=>e.disconnect()))),G(1));function tt(e){return wa.pipe(E(t=>t.observe(e)),v(t=>tn.pipe(b(({target:r})=>r===e),L(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function rn(e,t=16){return Ne(e).pipe(m(({y:r})=>{let o=ce(e),n=St(e);return r>=n.height-o.height-t}),K())}var lr={drawer:R("[data-md-toggle=drawer]"),search:R("[data-md-toggle=search]")};function on(e){return lr[e].checked}function Je(e,t){lr[e].checked!==t&&lr[e].click()}function ze(e){let t=lr[e];return d(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function Ta(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Sa(){return O(d(window,"compositionstart").pipe(m(()=>!0)),d(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function nn(){let e=d(window,"keydown").pipe(b(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:on("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),b(({mode:t,type:r})=>{if(t==="global"){let o=Ie();if(typeof o!="undefined")return!Ta(o,r)}return!0}),pe());return Sa().pipe(v(t=>t?S:e))}function xe(){return new URL(location.href)}function lt(e,t=!1){if(B("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function an(){return new g}function sn(){return location.hash.slice(1)}function cn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Oa(e){return O(d(window,"hashchange"),e).pipe(m(sn),Q(sn()),b(t=>t.length>0),G(1))}function pn(e){return Oa(e).pipe(m(t=>fe(`[id="${t}"]`)),b(t=>typeof t!="undefined"))}function Pt(e){let t=matchMedia(e);return ar(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function ln(){let e=matchMedia("print");return O(d(window,"beforeprint").pipe(m(()=>!0)),d(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function Nr(e,t){return e.pipe(v(r=>r?t():S))}function zr(e,t){return new F(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let a=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+a*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function Fe(e,t){return zr(e,t).pipe(v(r=>r.text()),m(r=>JSON.parse(r)),G(1))}function mn(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),G(1))}function fn(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),G(1))}function un(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function dn(){return O(d(window,"scroll",{passive:!0}),d(window,"resize",{passive:!0})).pipe(m(un),Q(un()))}function hn(){return{width:innerWidth,height:innerHeight}}function bn(){return d(window,"resize",{passive:!0}).pipe(m(hn),Q(hn()))}function vn(){return z([dn(),bn()]).pipe(m(([e,t])=>({offset:e,size:t})),G(1))}function mr(e,{viewport$:t,header$:r}){let o=t.pipe(Z("size")),n=z([o,r]).pipe(m(()=>Ve(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:p,y:c}])=>({offset:{x:a.x-p,y:a.y-c+i},size:s})))}function Ma(e){return d(e,"message",t=>t.data)}function La(e){let t=new g;return t.subscribe(r=>e.postMessage(r)),t}function gn(e,t=new Worker(e)){let r=Ma(t),o=La(t),n=new g;n.subscribe(o);let i=o.pipe(X(),ne(!0));return n.pipe(X(),Re(r.pipe(U(i))),pe())}var _a=R("#__config"),Ot=JSON.parse(_a.textContent);Ot.base=`${new URL(Ot.base,xe())}`;function ye(){return Ot}function B(e){return Ot.features.includes(e)}function Ee(e,t){return typeof t!="undefined"?Ot.translations[e].replace("#",t.toString()):Ot.translations[e]}function Se(e,t=document){return R(`[data-md-component=${e}]`,t)}function ae(e,t=document){return P(`[data-md-component=${e}]`,t)}function Aa(e){let t=R(".md-typeset > :first-child",e);return d(t,"click",{once:!0}).pipe(m(()=>R(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function xn(e){if(!B("announce.dismiss")||!e.childElementCount)return S;if(!e.hidden){let t=R(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return C(()=>{let t=new g;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),Aa(e).pipe(E(r=>t.next(r)),L(()=>t.complete()),m(r=>$({ref:e},r)))})}function Ca(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function yn(e,t){let r=new g;return r.subscribe(({hidden:o})=>{e.hidden=o}),Ca(e,t).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>$({ref:e},o)))}function Rt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function En(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function wn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Rt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Rt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function Tn(e){return x("button",{class:"md-clipboard md-icon",title:Ee("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}var On=Lt(qr());function Qr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(p=>!e.terms[p]).reduce((p,c)=>[...p,x("del",null,(0,On.default)(c))," "],[]).slice(0,-1),i=ye(),a=new URL(e.location,i.base);B("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,p])=>p).reduce((p,[c])=>`${p} ${c}`.trim(),""));let{tags:s}=ye();return x("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(p=>{let c=s?p in s?`md-tag-icon md-tag--${s[p]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${c}`},p)}),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Ee("search.result.term.missing"),": ",...n)))}function Mn(e){let t=e[0].score,r=[...e],o=ye(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreQr(l,1)),...p.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,p.length>0&&p.length===1?Ee("search.result.more.one"):Ee("search.result.more.other",p.length))),...p.map(l=>Qr(l,1)))]:[]];return x("li",{class:"md-search-result__item"},c)}function Ln(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?sr(r):r)))}function Kr(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function _n(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function $a(e){var o;let t=ye(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function An(e,t){var o;let r=ye();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Ee("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map($a)))}var Pa=0;function Ra(e){let t=z([et(e),$t(e)]).pipe(m(([o,n])=>o||n),K()),r=C(()=>Xo(e)).pipe(oe(Ne),pt(1),ke(t),m(()=>Zo(e)));return t.pipe(Ae(o=>o),v(()=>z([t,r])),m(([o,n])=>({active:o,offset:n})),pe())}function Ia(e,t){let{content$:r,viewport$:o}=t,n=`__tooltip2_${Pa++}`;return C(()=>{let i=new g,a=new _r(!1);i.pipe(X(),ne(!1)).subscribe(a);let s=a.pipe(kt(c=>Me(+!c*250,Hr)),K(),v(c=>c?r:S),E(c=>c.id=n),pe());z([i.pipe(m(({active:c})=>c)),s.pipe(v(c=>$t(c,250)),Q(!1))]).pipe(m(c=>c.some(l=>l))).subscribe(a);let p=a.pipe(b(c=>c),ee(s,o),m(([c,l,{size:f}])=>{let u=e.getBoundingClientRect(),h=u.width/2;if(l.role==="tooltip")return{x:h,y:8+u.height};if(u.y>=f.height/2){let{height:w}=ce(l);return{x:h,y:-16-w}}else return{x:h,y:16+u.height}}));return z([s,i,p]).subscribe(([c,{offset:l},f])=>{c.style.setProperty("--md-tooltip-host-x",`${l.x}px`),c.style.setProperty("--md-tooltip-host-y",`${l.y}px`),c.style.setProperty("--md-tooltip-x",`${f.x}px`),c.style.setProperty("--md-tooltip-y",`${f.y}px`),c.classList.toggle("md-tooltip2--top",f.y<0),c.classList.toggle("md-tooltip2--bottom",f.y>=0)}),a.pipe(b(c=>c),ee(s,(c,l)=>l),b(c=>c.role==="tooltip")).subscribe(c=>{let l=ce(R(":scope > *",c));c.style.setProperty("--md-tooltip-width",`${l.width}px`),c.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(K(),ve(me),ee(s)).subscribe(([c,l])=>{l.classList.toggle("md-tooltip2--active",c)}),z([a.pipe(b(c=>c)),s]).subscribe(([c,l])=>{l.role==="dialog"?(e.setAttribute("aria-controls",n),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",n)}),a.pipe(b(c=>!c)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),Ra(e).pipe(E(c=>i.next(c)),L(()=>i.complete()),m(c=>$({ref:e},c)))})}function mt(e,{viewport$:t},r=document.body){return Ia(e,{content$:new F(o=>{let n=e.title,i=En(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t})}function Fa(e,t){let r=C(()=>z([en(e),Ne(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ce(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return et(e).pipe(v(o=>r.pipe(m(n=>({active:o,offset:n})),Te(+!o||1/0))))}function Cn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return C(()=>{let i=new g,a=i.pipe(X(),ne(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),tt(e).pipe(U(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),O(i.pipe(b(({active:s})=>s)),i.pipe(_e(250),b(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Le(16,me)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(pt(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),d(n,"click").pipe(U(a),b(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),d(n,"mousedown").pipe(U(a),ee(i)).subscribe(([s,{active:p}])=>{var c;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(p){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(c=Ie())==null||c.blur()}}),r.pipe(U(a),b(s=>s===o),Ge(125)).subscribe(()=>e.focus()),Fa(e,t).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>$({ref:e},s)))})}function ja(e){return e.tagName==="CODE"?P(".c, .c1, .cm",e):[e]}function Wa(e){let t=[];for(let r of ja(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,p]=a;if(typeof p=="undefined"){let c=i.splitText(a.index);i=c.splitText(s.length),t.push(c)}else{i.textContent=s,t.push(i);break}}}}return t}function Hn(e,t){t.append(...Array.from(e.childNodes))}function fr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Wa(t)){let[,p]=s.textContent.match(/\((\d+)\)/);fe(`:scope > li:nth-child(${p})`,e)&&(a.set(p,wn(p,i)),s.replaceWith(a.get(p)))}return a.size===0?S:C(()=>{let s=new g,p=s.pipe(X(),ne(!0)),c=[];for(let[l,f]of a)c.push([R(".md-typeset",f),R(`:scope > li:nth-child(${l})`,e)]);return o.pipe(U(p)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of c)l?Hn(f,u):Hn(u,f)}),O(...[...a].map(([,l])=>Cn(l,t,{target$:r}))).pipe(L(()=>s.complete()),pe())})}function kn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return kn(t)}}function $n(e,t){return C(()=>{let r=kn(e);return typeof r!="undefined"?fr(r,e,t):S})}var Pn=Lt(Br());var Ua=0;function Rn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Rn(t)}}function Da(e){return ge(e).pipe(m(({width:t})=>({scrollable:St(e).width>t})),Z("scrollable"))}function In(e,t){let{matches:r}=matchMedia("(hover)"),o=C(()=>{let n=new g,i=n.pipe(Fr(1));n.subscribe(({scrollable:c})=>{c&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=[];if(Pn.default.isSupported()&&(e.closest(".copy")||B("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${Ua++}`;let l=Tn(c.id);c.insertBefore(l,e),B("content.tooltips")&&a.push(mt(l,{viewport$}))}let s=e.closest(".highlight");if(s instanceof HTMLElement){let c=Rn(s);if(typeof c!="undefined"&&(s.classList.contains("annotate")||B("content.code.annotate"))){let l=fr(c,e,t);a.push(ge(s).pipe(U(i),m(({width:f,height:u})=>f&&u),K(),v(f=>f?l:S)))}}return P(":scope > span[id]",e).length&&e.classList.add("md-code__content"),Da(e).pipe(E(c=>n.next(c)),L(()=>n.complete()),m(c=>$({ref:e},c)),Re(...a))});return B("content.lazy")?tt(e).pipe(b(n=>n),Te(1),v(()=>o)):o}function Va(e,{target$:t,print$:r}){let o=!0;return O(t.pipe(m(n=>n.closest("details:not([open])")),b(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(b(n=>n||!o),E(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Fn(e,t){return C(()=>{let r=new g;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Va(e,t).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>$({ref:e},o)))})}var jn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var Gr,za=0;function qa(){return typeof mermaid=="undefined"||mermaid instanceof Element?Tt("https://unpkg.com/mermaid@10/dist/mermaid.min.js"):I(void 0)}function Wn(e){return e.classList.remove("mermaid"),Gr||(Gr=qa().pipe(E(()=>mermaid.initialize({startOnLoad:!1,themeCSS:jn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),G(1))),Gr.subscribe(()=>so(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${za++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})),Gr.pipe(m(()=>({ref:e})))}var Un=x("table");function Dn(e){return e.replaceWith(Un),Un.replaceWith(_n(e)),I({ref:e})}function Qa(e){let t=e.find(r=>r.checked)||e[0];return O(...e.map(r=>d(r,"change").pipe(m(()=>R(`label[for="${r.id}"]`))))).pipe(Q(R(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Vn(e,{viewport$:t,target$:r}){let o=R(".tabbed-labels",e),n=P(":scope > input",e),i=Kr("prev");e.append(i);let a=Kr("next");return e.append(a),C(()=>{let s=new g,p=s.pipe(X(),ne(!0));z([s,ge(e),tt(e)]).pipe(U(p),Le(1,me)).subscribe({next([{active:c},l]){let f=Ve(c),{width:u}=ce(c);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let h=pr(o);(f.xh.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([Ne(o),ge(o)]).pipe(U(p)).subscribe(([c,l])=>{let f=St(o);i.hidden=c.x<16,a.hidden=c.x>f.width-l.width-16}),O(d(i,"click").pipe(m(()=>-1)),d(a,"click").pipe(m(()=>1))).pipe(U(p)).subscribe(c=>{let{width:l}=ce(o);o.scrollBy({left:l*c,behavior:"smooth"})}),r.pipe(U(p),b(c=>n.includes(c))).subscribe(c=>c.click()),o.classList.add("tabbed-labels--linked");for(let c of n){let l=R(`label[for="${c.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),d(l.firstElementChild,"click").pipe(U(p),b(f=>!(f.metaKey||f.ctrlKey)),E(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return B("content.tabs.link")&&s.pipe(Ce(1),ee(t)).subscribe(([{active:c},{offset:l}])=>{let f=c.innerText.trim();if(c.hasAttribute("data-md-switching"))c.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let w of P("[data-tabs]"))for(let A of P(":scope > input",w)){let te=R(`label[for="${A.id}"]`);if(te!==c&&te.innerText.trim()===f){te.setAttribute("data-md-switching",""),A.click();break}}window.scrollTo({top:e.offsetTop-u});let h=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...h])])}}),s.pipe(U(p)).subscribe(()=>{for(let c of P("audio, video",e))c.pause()}),Qa(n).pipe(E(c=>s.next(c)),L(()=>s.complete()),m(c=>$({ref:e},c)))}).pipe(Ke(se))}function Nn(e,{viewport$:t,target$:r,print$:o}){return O(...P(".annotate:not(.highlight)",e).map(n=>$n(n,{target$:r,print$:o})),...P("pre:not(.mermaid) > code",e).map(n=>In(n,{target$:r,print$:o})),...P("pre.mermaid",e).map(n=>Wn(n)),...P("table:not([class])",e).map(n=>Dn(n)),...P("details",e).map(n=>Fn(n,{target$:r,print$:o})),...P("[data-tabs]",e).map(n=>Vn(n,{viewport$:t,target$:r})),...P("[title]",e).filter(()=>B("content.tooltips")).map(n=>mt(n,{viewport$:t})))}function Ka(e,{alert$:t}){return t.pipe(v(r=>O(I(!0),I(!1).pipe(Ge(2e3))).pipe(m(o=>({message:r,active:o})))))}function zn(e,t){let r=R(".md-typeset",e);return C(()=>{let o=new g;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Ka(e,t).pipe(E(n=>o.next(n)),L(()=>o.complete()),m(n=>$({ref:e},n)))})}var Ya=0;function Ba(e,t){document.body.append(e);let{width:r}=ce(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=cr(t),n=typeof o!="undefined"?Ne(o):I({x:0,y:0}),i=O(et(t),$t(t)).pipe(K());return z([i,n]).pipe(m(([a,s])=>{let{x:p,y:c}=Ve(t),l=ce(t),f=t.closest("table");return f&&t.parentElement&&(p+=f.offsetLeft+t.parentElement.offsetLeft,c+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:p-s.x+l.width/2-r/2,y:c-s.y+l.height+8}}}))}function qn(e){let t=e.title;if(!t.length)return S;let r=`__tooltip_${Ya++}`,o=Rt(r,"inline"),n=R(".md-typeset",o);return n.innerHTML=t,C(()=>{let i=new g;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),O(i.pipe(b(({active:a})=>a)),i.pipe(_e(250),b(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(Le(16,me)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(pt(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Ba(o,e).pipe(E(a=>i.next(a)),L(()=>i.complete()),m(a=>$({ref:e},a)))}).pipe(Ke(se))}function Ga({viewport$:e}){if(!B("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Be(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),K()),o=ze("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),K(),v(n=>n?r:I(!1)),Q(!1))}function Qn(e,t){return C(()=>z([ge(e),Ga(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),K((r,o)=>r.height===o.height&&r.hidden===o.hidden),G(1))}function Kn(e,{header$:t,main$:r}){return C(()=>{let o=new g,n=o.pipe(X(),ne(!0));o.pipe(Z("active"),ke(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=ue(P("[title]",e)).pipe(b(()=>B("content.tooltips")),oe(a=>qn(a)));return r.subscribe(o),t.pipe(U(n),m(a=>$({ref:e},a)),Re(i.pipe(U(n))))})}function Ja(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ce(e);return{active:o>=n}}),Z("active"))}function Yn(e,t){return C(()=>{let r=new g;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=fe(".md-content h1");return typeof o=="undefined"?S:Ja(o,t).pipe(E(n=>r.next(n)),L(()=>r.complete()),m(n=>$({ref:e},n)))})}function Bn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),K()),n=o.pipe(v(()=>ge(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),Z("bottom"))));return z([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:p},size:{height:c}}])=>(c=Math.max(0,c-Math.max(0,a-p,i)-Math.max(0,c+p-s)),{offset:a-i,height:c,active:a-i<=p})),K((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function Xa(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return I(...e).pipe(oe(o=>d(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),G(1))}function Gn(e){let t=P("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=Pt("(prefers-color-scheme: light)");return C(()=>{let i=new g;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),p=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=p.getAttribute("data-md-color-scheme"),a.color.primary=p.getAttribute("data-md-color-primary"),a.color.accent=p.getAttribute("data-md-color-accent")}for(let[s,p]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,p);for(let s=0;sa.key==="Enter"),ee(i,(a,s)=>s)).subscribe(({index:a})=>{a=(a+1)%t.length,t[a].click(),t[a].focus()}),i.pipe(m(()=>{let a=Se("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(p=>(+p).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(ve(se)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),Xa(t).pipe(U(n.pipe(Ce(1))),ct(),E(a=>i.next(a)),L(()=>i.complete()),m(a=>$({ref:e},a)))})}function Jn(e,{progress$:t}){return C(()=>{let r=new g;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(E(o=>r.next({value:o})),L(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Jr=Lt(Br());function Za(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Xn({alert$:e}){Jr.default.isSupported()&&new F(t=>{new Jr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Za(R(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(E(t=>{t.trigger.focus()}),m(()=>Ee("clipboard.copied"))).subscribe(e)}function Zn(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function es(e,t){let r=new Map;for(let o of P("url",e)){let n=R("loc",o),i=[Zn(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let a of P("[rel=alternate]",o)){let s=a.getAttribute("href");s!=null&&i.push(Zn(new URL(s),t))}}return r}function ur(e){return fn(new URL("sitemap.xml",e)).pipe(m(t=>es(t,new URL(e))),de(()=>I(new Map)))}function ts(e,t){if(!(e.target instanceof Element))return S;let r=e.target.closest("a");if(r===null)return S;if(r.target||e.metaKey||e.ctrlKey)return S;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),I(new URL(r.href))):S}function ei(e){let t=new Map;for(let r of P(":scope > *",e.head))t.set(r.outerHTML,r);return t}function ti(e){for(let t of P("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return I(e)}function rs(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...B("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=fe(o),i=fe(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=ei(document);for(let[o,n]of ei(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Se("container");return Ue(P("script",r)).pipe(v(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new F(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),S}),X(),ne(document))}function ri({location$:e,viewport$:t,progress$:r}){let o=ye();if(location.protocol==="file:")return S;let n=ur(o.base);I(document).subscribe(ti);let i=d(document.body,"click").pipe(ke(n),v(([p,c])=>ts(p,c)),pe()),a=d(window,"popstate").pipe(m(xe),pe());i.pipe(ee(t)).subscribe(([p,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",p)}),O(i,a).subscribe(e);let s=e.pipe(Z("pathname"),v(p=>mn(p,{progress$:r}).pipe(de(()=>(lt(p,!0),S)))),v(ti),v(rs),pe());return O(s.pipe(ee(e,(p,c)=>c)),s.pipe(v(()=>e),Z("pathname"),v(()=>e),Z("hash")),e.pipe(K((p,c)=>p.pathname===c.pathname&&p.hash===c.hash),v(()=>i),E(()=>history.back()))).subscribe(p=>{var c,l;history.state!==null||!p.hash?window.scrollTo(0,(l=(c=history.state)==null?void 0:c.y)!=null?l:0):(history.scrollRestoration="auto",cn(p.hash),history.scrollRestoration="manual")}),e.subscribe(()=>{history.scrollRestoration="manual"}),d(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),t.pipe(Z("offset"),_e(100)).subscribe(({offset:p})=>{history.replaceState(p,"")}),s}var oi=Lt(qr());function ni(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,oi.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function Ft(e){return e.type===1}function dr(e){return e.type===3}function ii(e,t){let r=gn(e);return O(I(location.protocol!=="file:"),ze("search")).pipe(Ae(o=>o),v(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:B("search.suggest")}}})),r}function ai({document$:e}){let t=ye(),r=Fe(new URL("../versions.json",t.base)).pipe(de(()=>S)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),v(n=>d(document.body,"click").pipe(b(i=>!i.metaKey&&!i.ctrlKey),ee(o),v(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let p=s.href;return!i.target.closest(".md-version")&&n.get(p)===a?S:(i.preventDefault(),I(p))}}return S}),v(i=>ur(new URL(i)).pipe(m(a=>{let p=xe().href.replace(t.base,i);return a.has(p.split("#")[0])?new URL(p):new URL(i)})))))).subscribe(n=>lt(n,!0)),z([r,o]).subscribe(([n,i])=>{R(".md-header__topic").appendChild(An(n,i))}),e.pipe(v(()=>o)).subscribe(n=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let s=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(s)||(s=[s]);e:for(let p of s)for(let c of n.aliases.concat(n.version))if(new RegExp(p,"i").test(c)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let s of ae("outdated"))s.hidden=!1})}function is(e,{worker$:t}){let{searchParams:r}=xe();r.has("q")&&(Je("search",!0),e.value=r.get("q"),e.focus(),ze("search").pipe(Ae(i=>!i)).subscribe(()=>{let i=xe();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=et(e),n=O(t.pipe(Ae(Ft)),d(e,"keyup"),o).pipe(m(()=>e.value),K());return z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),G(1))}function si(e,{worker$:t}){let r=new g,o=r.pipe(X(),ne(!0));z([t.pipe(Ae(Ft)),r],(i,a)=>a).pipe(Z("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(Z("focus")).subscribe(({focus:i})=>{i&&Je("search",i)}),d(e.form,"reset").pipe(U(o)).subscribe(()=>e.focus());let n=R("header [for=__search]");return d(n,"click").subscribe(()=>e.focus()),is(e,{worker$:t}).pipe(E(i=>r.next(i)),L(()=>r.complete()),m(i=>$({ref:e},i)),G(1))}function ci(e,{worker$:t,query$:r}){let o=new g,n=rn(e.parentElement).pipe(b(Boolean)),i=e.parentElement,a=R(":scope > :first-child",e),s=R(":scope > :last-child",e);ze("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(ee(r),Ur(t.pipe(Ae(Ft)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?Ee("search.result.none"):Ee("search.result.placeholder");break;case 1:a.textContent=Ee("search.result.one");break;default:let u=sr(l.length);a.textContent=Ee("search.result.other",u)}});let p=o.pipe(E(()=>s.innerHTML=""),v(({items:l})=>O(I(...l.slice(0,10)),I(...l.slice(10)).pipe(Be(4),Vr(n),v(([f])=>f)))),m(Mn),pe());return p.subscribe(l=>s.appendChild(l)),p.pipe(oe(l=>{let f=fe("details",l);return typeof f=="undefined"?S:d(f,"toggle").pipe(U(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(b(dr),m(({data:l})=>l)).pipe(E(l=>o.next(l)),L(()=>o.complete()),m(l=>$({ref:e},l)))}function as(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=xe();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function pi(e,t){let r=new g,o=r.pipe(X(),ne(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),d(e,"click").pipe(U(o)).subscribe(n=>n.preventDefault()),as(e,t).pipe(E(n=>r.next(n)),L(()=>r.complete()),m(n=>$({ref:e},n)))}function li(e,{worker$:t,keyboard$:r}){let o=new g,n=Se("search-query"),i=O(d(n,"keydown"),d(n,"focus")).pipe(ve(se),m(()=>n.value),K());return o.pipe(ke(i),m(([{suggest:s},p])=>{let c=p.split(/([\s-]+)/);if(s!=null&&s.length&&c[c.length-1]){let l=s[s.length-1];l.startsWith(c[c.length-1])&&(c[c.length-1]=l)}else c.length=0;return c})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(b(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(b(dr),m(({data:s})=>s)).pipe(E(s=>o.next(s)),L(()=>o.complete()),m(()=>({ref:e})))}function mi(e,{index$:t,keyboard$:r}){let o=ye();try{let n=ii(o.search,t),i=Se("search-query",e),a=Se("search-result",e);d(e,"click").pipe(b(({target:p})=>p instanceof Element&&!!p.closest("a"))).subscribe(()=>Je("search",!1)),r.pipe(b(({mode:p})=>p==="search")).subscribe(p=>{let c=Ie();switch(p.type){case"Enter":if(c===i){let l=new Map;for(let f of P(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,h])=>h-u);f.click()}p.claim()}break;case"Escape":case"Tab":Je("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof c=="undefined")i.focus();else{let l=[i,...P(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(c))+l.length+(p.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}p.claim();break;default:i!==Ie()&&i.focus()}}),r.pipe(b(({mode:p})=>p==="global")).subscribe(p=>{switch(p.type){case"f":case"s":case"/":i.focus(),i.select(),p.claim();break}});let s=si(i,{worker$:n});return O(s,ci(a,{worker$:n,query$:s})).pipe(Re(...ae("search-share",e).map(p=>pi(p,{query$:s})),...ae("search-suggest",e).map(p=>li(p,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ye}}function fi(e,{index$:t,location$:r}){return z([t,r.pipe(Q(xe()),b(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>ni(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let p=s.textContent,c=o(p);c.length>p.length&&n.set(s,c)}for(let[s,p]of n){let{childNodes:c}=x("span",null,p);s.replaceWith(...Array.from(c))}return{ref:e,nodes:n}}))}function ss(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),K((i,a)=>i.height===a.height&&i.locked===a.locked))}function Xr(e,o){var n=o,{header$:t}=n,r=ao(n,["header$"]);let i=R(".md-sidebar__scrollwrap",e),{y:a}=Ve(i);return C(()=>{let s=new g,p=s.pipe(X(),ne(!0)),c=s.pipe(Le(0,me));return c.pipe(ee(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),c.pipe(Ae()).subscribe(()=>{for(let l of P(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ce(f);f.scrollTo({top:u-h/2})}}}),ue(P("label[tabindex]",e)).pipe(oe(l=>d(l,"click").pipe(ve(se),m(()=>l),U(p)))).subscribe(l=>{let f=R(`[id="${l.htmlFor}"]`);R(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),ss(e,r).pipe(E(l=>s.next(l)),L(()=>s.complete()),m(l=>$({ref:e},l)))})}function ui(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return st(Fe(`${r}/releases/latest`).pipe(de(()=>S),m(o=>({version:o.tag_name})),De({})),Fe(r).pipe(de(()=>S),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),De({}))).pipe(m(([o,n])=>$($({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Fe(r).pipe(m(o=>({repositories:o.public_repos})),De({}))}}function di(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return st(Fe(`${r}/releases/permalink/latest`).pipe(de(()=>S),m(({tag_name:o})=>({version:o})),De({})),Fe(r).pipe(de(()=>S),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),De({}))).pipe(m(([o,n])=>$($({},o),n)))}function hi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return ui(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return di(r,o)}return S}var cs;function ps(e){return cs||(cs=C(()=>{let t=__md_get("__source",sessionStorage);if(t)return I(t);if(ae("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return S}return hi(e.href).pipe(E(o=>__md_set("__source",o,sessionStorage)))}).pipe(de(()=>S),b(t=>Object.keys(t).length>0),m(t=>({facts:t})),G(1)))}function bi(e){let t=R(":scope > :last-child",e);return C(()=>{let r=new g;return r.subscribe(({facts:o})=>{t.appendChild(Ln(o)),t.classList.add("md-source__repository--active")}),ps(e).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>$({ref:e},o)))})}function ls(e,{viewport$:t,header$:r}){return ge(document.body).pipe(v(()=>mr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),Z("hidden"))}function vi(e,t){return C(()=>{let r=new g;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(B("navigation.tabs.sticky")?I({hidden:!1}):ls(e,t)).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>$({ref:e},o)))})}function ms(e,{viewport$:t,header$:r}){let o=new Map,n=P(".md-nav__link",e);for(let s of n){let p=decodeURIComponent(s.hash.substring(1)),c=fe(`[id="${p}"]`);typeof c!="undefined"&&o.set(s,c)}let i=r.pipe(Z("height"),m(({height:s})=>{let p=Se("main"),c=R(":scope > :first-child",p);return s+.8*(c.offsetTop-p.offsetTop)}),pe());return ge(document.body).pipe(Z("height"),v(s=>C(()=>{let p=[];return I([...o].reduce((c,[l,f])=>{for(;p.length&&o.get(p[p.length-1]).tagName>=f.tagName;)p.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let h=f.offsetParent;for(;h;h=h.offsetParent)u+=h.offsetTop;return c.set([...p=[...p,l]].reverse(),u)},new Map))}).pipe(m(p=>new Map([...p].sort(([,c],[,l])=>c-l))),ke(i),v(([p,c])=>t.pipe(jr(([l,f],{offset:{y:u},size:h})=>{let w=u+h.height>=Math.floor(s.height);for(;f.length;){let[,A]=f[0];if(A-c=u&&!w)f=[l.pop(),...f];else break}return[l,f]},[[],[...p]]),K((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,p])=>({prev:s.map(([c])=>c),next:p.map(([c])=>c)})),Q({prev:[],next:[]}),Be(2,1),m(([s,p])=>s.prev.length{let i=new g,a=i.pipe(X(),ne(!0));if(i.subscribe(({prev:s,next:p})=>{for(let[c]of p)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",c===s.length-1)}),B("toc.follow")){let s=O(t.pipe(_e(1),m(()=>{})),t.pipe(_e(250),m(()=>"smooth")));i.pipe(b(({prev:p})=>p.length>0),ke(o.pipe(ve(se))),ee(s)).subscribe(([[{prev:p}],c])=>{let[l]=p[p.length-1];if(l.offsetHeight){let f=cr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:h}=ce(f);f.scrollTo({top:u-h/2,behavior:c})}}})}return B("navigation.tracking")&&t.pipe(U(a),Z("offset"),_e(250),Ce(1),U(n.pipe(Ce(1))),ct({delay:250}),ee(i)).subscribe(([,{prev:s}])=>{let p=xe(),c=s[s.length-1];if(c&&c.length){let[l]=c,{hash:f}=new URL(l.href);p.hash!==f&&(p.hash=f,history.replaceState({},"",`${p}`))}else p.hash="",history.replaceState({},"",`${p}`)}),ms(e,{viewport$:t,header$:r}).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>$({ref:e},s)))})}function fs(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Be(2,1),m(([a,s])=>a>s&&s>0),K()),i=r.pipe(m(({active:a})=>a));return z([i,n]).pipe(m(([a,s])=>!(a&&s)),K(),U(o.pipe(Ce(1))),ne(!0),ct({delay:250}),m(a=>({hidden:a})))}function xi(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new g,a=i.pipe(X(),ne(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(U(a),Z("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),d(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),fs(e,{viewport$:t,main$:o,target$:n}).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>$({ref:e},s)))}function yi({document$:e,viewport$:t}){e.pipe(v(()=>P(".md-ellipsis")),oe(r=>tt(r).pipe(U(e.pipe(Ce(1))),b(o=>o),m(()=>r),Te(1))),b(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,B("content.tooltips")?mt(n,{viewport$:t}).pipe(U(e.pipe(Ce(1))),L(()=>n.removeAttribute("title"))):S})).subscribe(),B("content.tooltips")&&e.pipe(v(()=>P(".md-status")),oe(r=>mt(r,{viewport$:t}))).subscribe()}function Ei({document$:e,tablet$:t}){e.pipe(v(()=>P(".md-toggle--indeterminate")),E(r=>{r.indeterminate=!0,r.checked=!1}),oe(r=>d(r,"change").pipe(Dr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ee(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function us(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function wi({document$:e}){e.pipe(v(()=>P("[data-md-scrollfix]")),E(t=>t.removeAttribute("data-md-scrollfix")),b(us),oe(t=>d(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Ti({viewport$:e,tablet$:t}){z([ze("search"),t]).pipe(m(([r,o])=>r&&!o),v(r=>I(r).pipe(Ge(r?400:100))),ee(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function ds(){return location.protocol==="file:"?Tt(`${new URL("search/search_index.js",Zr.base)}`).pipe(m(()=>__index),G(1)):Fe(new URL("search/search_index.json",Zr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ot=Bo(),Wt=an(),Mt=pn(Wt),eo=nn(),Oe=vn(),hr=Pt("(min-width: 960px)"),Oi=Pt("(min-width: 1220px)"),Mi=ln(),Zr=ye(),Li=document.forms.namedItem("search")?ds():Ye,to=new g;Xn({alert$:to});var ro=new g;B("navigation.instant")&&ri({location$:Wt,viewport$:Oe,progress$:ro}).subscribe(ot);var Si;((Si=Zr.version)==null?void 0:Si.provider)==="mike"&&ai({document$:ot});O(Wt,Mt).pipe(Ge(125)).subscribe(()=>{Je("drawer",!1),Je("search",!1)});eo.pipe(b(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=fe("link[rel=prev]");typeof t!="undefined"&<(t);break;case"n":case".":let r=fe("link[rel=next]");typeof r!="undefined"&<(r);break;case"Enter":let o=Ie();o instanceof HTMLLabelElement&&o.click()}});yi({viewport$:Oe,document$:ot});Ei({document$:ot,tablet$:hr});wi({document$:ot});Ti({viewport$:Oe,tablet$:hr});var rt=Qn(Se("header"),{viewport$:Oe}),jt=ot.pipe(m(()=>Se("main")),v(e=>Bn(e,{viewport$:Oe,header$:rt})),G(1)),hs=O(...ae("consent").map(e=>yn(e,{target$:Mt})),...ae("dialog").map(e=>zn(e,{alert$:to})),...ae("header").map(e=>Kn(e,{viewport$:Oe,header$:rt,main$:jt})),...ae("palette").map(e=>Gn(e)),...ae("progress").map(e=>Jn(e,{progress$:ro})),...ae("search").map(e=>mi(e,{index$:Li,keyboard$:eo})),...ae("source").map(e=>bi(e))),bs=C(()=>O(...ae("announce").map(e=>xn(e)),...ae("content").map(e=>Nn(e,{viewport$:Oe,target$:Mt,print$:Mi})),...ae("content").map(e=>B("search.highlight")?fi(e,{index$:Li,location$:Wt}):S),...ae("header-title").map(e=>Yn(e,{viewport$:Oe,header$:rt})),...ae("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Nr(Oi,()=>Xr(e,{viewport$:Oe,header$:rt,main$:jt})):Nr(hr,()=>Xr(e,{viewport$:Oe,header$:rt,main$:jt}))),...ae("tabs").map(e=>vi(e,{viewport$:Oe,header$:rt})),...ae("toc").map(e=>gi(e,{viewport$:Oe,header$:rt,main$:jt,target$:Mt})),...ae("top").map(e=>xi(e,{viewport$:Oe,header$:rt,main$:jt,target$:Mt})))),_i=ot.pipe(v(()=>bs),Re(hs),G(1));_i.subscribe();window.document$=ot;window.location$=Wt;window.target$=Mt;window.keyboard$=eo;window.viewport$=Oe;window.tablet$=hr;window.screen$=Oi;window.print$=Mi;window.alert$=to;window.progress$=ro;window.component$=_i;})(); +//# sourceMappingURL=bundle.af256bd8.min.js.map + diff --git a/assets/javascripts/bundle.af256bd8.min.js.map b/assets/javascripts/bundle.af256bd8.min.js.map new file mode 100644 index 00000000..0501d117 --- /dev/null +++ b/assets/javascripts/bundle.af256bd8.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/escape-html/index.js", "node_modules/clipboard/dist/clipboard.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/rxjs/node_modules/tslib/tslib.es6.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/BehaviorSubject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/QueueAction.ts", "node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts", "node_modules/rxjs/src/internal/scheduler/queue.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounce.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip2/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*\n * Copyright (c) 2016-2024 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ viewport$, document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n *\n * @class BehaviorSubject\n */\nexport class BehaviorSubject extends Subject {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n }\n\n getValue(): T {\n const { hasError, thrownError, _value } = this;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n }\n\n next(value: T): void {\n super.next((this._value = value));\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\nimport { TimerHandle } from './timerHandle';\n\nexport class QueueAction extends AsyncAction {\n constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n\n if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n\n // Otherwise flush the scheduler starting with this action.\n scheduler.flush(this);\n\n // HACK: In the past, this was returning `void`. However, `void` isn't a valid\n // `TimerHandle`, and generally the return value here isn't really used. So the\n // compromise is to return `0` which is both \"falsy\" and a valid `TimerHandle`,\n // as opposed to refactoring every other instanceo of `requestAsyncId`.\n return 0;\n }\n}\n", "import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n", "import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\n\n/**\n *\n * Queue Scheduler\n *\n * Put every next task on a queue, instead of executing it immediately\n *\n * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.\n *\n * When used without delay, it schedules given task synchronously - executes it right when\n * it is scheduled. However when called recursively, that is when inside the scheduled task,\n * another task is scheduled with queue scheduler, instead of executing immediately as well,\n * that task will be put on a queue and wait for current one to finish.\n *\n * This means that when you execute task with `queue` scheduler, you are sure it will end\n * before any other task scheduled with that scheduler will start.\n *\n * ## Examples\n * Schedule recursively first, then do something\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(() => {\n * queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue\n *\n * console.log('first');\n * });\n *\n * // Logs:\n * // \"first\"\n * // \"second\"\n * ```\n *\n * Reschedule itself recursively\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(function(state) {\n * if (state !== 0) {\n * console.log('before', state);\n * this.schedule(state - 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * console.log('after', state);\n * }\n * }, 0, 3);\n *\n * // In scheduler that runs recursively, you would expect:\n * // \"before\", 3\n * // \"before\", 2\n * // \"before\", 1\n * // \"after\", 1\n * // \"after\", 2\n * // \"after\", 3\n *\n * // But with queue it logs:\n * // \"before\", 3\n * // \"after\", 3\n * // \"before\", 2\n * // \"after\", 2\n * // \"before\", 1\n * // \"after\", 1\n * ```\n */\n\nexport const queueScheduler = new QueueScheduler(QueueAction);\n\n/**\n * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.\n */\nexport const queue = queueScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an + +

Foram produzidas 88 Histórias de Usuários, portanto nas tabelas abaixo só foi possível apresentar os Títulos. Para verificar as Histórias de Usuário é necessário expandir os Cards de Título de História de Usuário no Miro (acima), conforme o tutorial:

+

Como verificar as Histórias de Usuário:

+

Primeiramente, coloque em tela cheia para facilitar a visualização: +Fullscreen no Iframe Miro

+

Aproxime do Card que deseja verificar a US, em seguida selecione-o, por fim, aperte o botão com ícone de Expadir: +SAFe

+

Desça até a descrição do Card, onde se encontra a História de Usuário: +SAFe

+

Observação: Caso seja necessário necessário fazer auditoria do último horário onde foram realizadas modificações no quadro Miro para verificar fraude, por favor entrar em contato com a equipe, pois apenas membros com permissão de edição conseguem visualizar o histórico do quadro. E a mensagem de "Última Modificação" apresentada ao abrir o quadro, geralmente é atualizada mesmo sem modificações relevantes. +

+

Visualização como Tabela (Não detalha as US's)

+
+

+

Organizador do Evento

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Objetivos do UsuárioJornada do UsuárioTítulo das Histórias
Fechar com patrocinadoresBuscar patrocinadores- Pesquisar patrocinadores que se encaixam com o evento
- Criar uma lista de potenciais patrocinadores
- Contatar os potenciais patrocinadores
Fechar com patrocinadoresApresentar proposta para patrocinadores- Enviar proposta aos patrocinadores
- Acompanhar o retorno
Fechar com patrocinadoresFormalizar contrato- Visualizar os termos do contrato
- Assinar o contrato
Fechar com fornecedoresEncontrar fornecedores- Definir os serviços ou produtos
- Criar lista de fornecedores em potencial
- Contatar esses fornecedores
Fechar com fornecedoresEstabelecer um acordo- Visualizar os termos do acordo
- Assinar o contrato
Recrutar voluntáriosRecrutar voluntários- Definir as atividades do voluntário
- Publicar vaga de voluntário
- Receber inscrições
- Selecionar voluntários
Recrutar voluntáriosOrientar os voluntários- Criar um plano de orientação
Recrutar voluntáriosTreinar os voluntários- Estabelecer o conteúdo do treinamento
- Vincular esse conteúdo com as atividades
Planejar EventoDefinir tipo de evento- Escolher o conteúdo do evento
- Escolher o formato do evento
- Definir o público-alvo
- Definir o objetivo do evento
Planejar EventoDefinir data, hora e local- Pesquisar a disponibilidade do público-alvo
- Definir o local do evento
- Escolher o conteúdo do evento para ter um tema definido
Planejar EventoPlanejar logística- Definir a hospedagem
- Estabelecer a forma de transporte
- Definir a alimentação
Organizar inscriçãoGerenciar processo de inscrições- Criar formulário de inscrição
- Publicar formulário de inscrição
- Selecionar canais de promoção
- Criar o conteúdo da promoção
Organizar inscriçãoProcessar pagamentos- Criar pagamentos
- Monitorar os resultados
Organizar inscriçãoEmitir ingressos e informações aos participantes- Estabelecer os termos do anúncio
- Criar o anúncio
- Enviar o anúncio
- Criar o conteúdo da promoção
Divulgar eventoDefinir estratégia de promoção do evento e público alvo- Definir os objetivos da promoção
- Definir como promover o evento
- Selecionar canais de promoção
- Criar o conteúdo da promoção
Divulgar eventoFazer publicações nas redes sociais- Criar publicações
- Monitorar os resultados
Divulgar eventoAnunciar em sites e outros meios- Estabelecer os termos do anúncio
- Criar o anúncio
- Enviar o anúncio
Realizar eventoCoordenar fornecedores e voluntários- Entregar feedback para fornecedores
- Entregar feedback para voluntários
Realizar eventoGarantir espaço e equipamentos- Receber o espaço e equipamentos
- Monitorar o espaço e equipamentos
Realizar eventoGarantir materiais promocionais- Receber os materiais promocionais
- Analisar materiais
Realizar eventoGerenciar entrada e saída dos participantes- Monitorar a entrada e saída de cada participante
- Criar um plano de entrada e saída
+

Patrocinador

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Objetivos do usuárioJornada do usuárioTítulo das histórias
Fechar com organizadoresRecebe proposta dos organizadores- Avaliar o propósito do evento
Fechar com organizadoresNegocia com os organizadores- Estabelecer o escopo do patrocínio
- Determinar direitos e deveres das partes
Ampliar visibilidade da marcaPromove o evento- Elaborar anúncios publicitários
- Divulgar conteúdo
Ampliar visibilidade da marcaCria laços com o público- Interagir com os participantes
Gerenciar o impacto da participaçãoColeta feedback de satisfação- Realizar pesquisas de satisfação
Gerenciar o impacto da participaçãoAvalia o engajamento da empresa nas redes sociais- Conferir o número de seguidores
- Conferir o número de "curtidas"
Gerenciar o impacto da participaçãoCompara as vendas da empresa antes e depois do patrocínio- Avaliar o volume das vendas
- Avaliar o valor das vendas
+

Voluntários

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Objetivos do usuárioJornada do usuárioTítulo das histórias
Obter informações sobre o eventoProcura por evento de interesse- Procurar por eventos de interesse
- Procurar por meio de palavras-chave de interesse
- Se informar sobre o evento
Participar do processo de inscriçãoSe inscreve como voluntário (a) no evento- Localizar e preenche formulário de inscrição
- Selecionar as atividades desejadas
- Enviar a inscrição
Participar do processo de inscriçãoSe comunica com os organizadores- Acessar o canal de comunicação com os organizadores
- Receber mensagens
- Enviar mensagens
Realizar treinamentoRecebe instruções de suas atividades e responsabilidades- Acessar a página de instruções
- Receber as informações básicas do evento
Realizar treinamentoRecebe feedback do organizador- Receber feedback por parte do organizador
+

Participante

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Objetivos do usuárioJornada do usuárioTítulo das histórias
Ir em um eventoProcurar por eventos- Pesquisar por eventos de interesse
Ir em um eventoObter informações sobre o evento- Checar detalhes do evento, como data e local
Ir em um eventoInscrever-se no evento- Visualizar informações do evento
- Realizar cadastro na plataforma
- Adquirir ingressos
- Escolher ingressos, preencher dados e confirmar compra
Ir em um eventoIr ao evento- Ler a programação e horários do evento
- Navegar até o local do evento
Dar FeedbackPublicar feedback- Publicar um comentário sobre o evento
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/entrega-missao1/index.html b/entrega-missao1/index.html new file mode 100644 index 00000000..6655cbee --- /dev/null +++ b/entrega-missao1/index.html @@ -0,0 +1,1308 @@ + + + + + + + + + + + + + + + + + + + + + + + Entregas - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Entregas

+ +

Apresentação da facção

+
+ +
+ +

Material Apresentaçao de Processo de Desenvolvimento de Software

+
+ +
+ +

Vídeo da Entrega

+ + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/entrega-missao2/index.html b/entrega-missao2/index.html new file mode 100644 index 00000000..958e05a3 --- /dev/null +++ b/entrega-missao2/index.html @@ -0,0 +1,1254 @@ + + + + + + + + + + + + + + + + + + + + + + + Vídeo da Entrega - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Vídeo da Entrega

+ +

Vídeo da Entrega

+ + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/entrega-missao3/index.html b/entrega-missao3/index.html new file mode 100644 index 00000000..032406d3 --- /dev/null +++ b/entrega-missao3/index.html @@ -0,0 +1,1236 @@ + + + + + + + + + + + + + + + + + + + + + Vídeo da Entrega - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Vídeo da Entrega

+ +

Vídeo da Entrega

+ + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/font/Cyberpunk/Cyberpunk.otf b/font/Cyberpunk/Cyberpunk.otf new file mode 100644 index 00000000..38032d6d Binary files /dev/null and b/font/Cyberpunk/Cyberpunk.otf differ diff --git a/font/Cyberpunk/Cyberpunk.ttf b/font/Cyberpunk/Cyberpunk.ttf new file mode 100644 index 00000000..fc7ff741 Binary files /dev/null and b/font/Cyberpunk/Cyberpunk.ttf differ diff --git "a/font/Cyberpunk/Free Quality Fonts Available For Download \342\200\223 fontsrepo.url" "b/font/Cyberpunk/Free Quality Fonts Available For Download \342\200\223 fontsrepo.url" new file mode 100644 index 00000000..915a1f7b --- /dev/null +++ "b/font/Cyberpunk/Free Quality Fonts Available For Download \342\200\223 fontsrepo.url" @@ -0,0 +1,8 @@ +[{000214A0-0000-0000-C000-000000000046}] +Prop3=19,11 +[InternetShortcut] +IDList= +URL=https://fontsrepo.com/ +IconFile=C:\WINDOWS\System32\SHELL32.dll +IconIndex=220 +HotKey=0 diff --git a/healthnet-pbb/index.html b/healthnet-pbb/index.html new file mode 100644 index 00000000..a8ccf86e --- /dev/null +++ b/healthnet-pbb/index.html @@ -0,0 +1,1284 @@ + + + + + + + + + + + + + + + + + + + + + + + PBB - HealthNet - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

PBB - HealthNet

+ +

Product Backlog Building (PBB) é um método sistemático para criar e refinar o backlog de produto. Ele visa maximizar o valor entregue ao cliente, otimizando o esforço da equipe de desenvolvimento. O PBB é aplicado para identificar problemas, expectativas e necessidades das personas, definindo e priorizando itens no backlog de forma colaborativa para uma visão holística do produto. O PBB é um processo contínuo que começa antes do início do projeto e continua durante todo o ciclo de vida do projeto. Ele é usado para garantir que o projeto esteja sempre alinhado com as necessidades do negócio e dos usuários, e para garantir que o trabalho do time de desenvolvimento esteja sempre focado nas coisas mais importantes.

+

HealthNet

+

A "HealthNet" enfrenta um desafio significativo devido à falta de uma estrutura unificada para a gestão de dados de pacientes em suas diversas unidades espalhadas por vários estados. Os profissionais de saúde lidam com sistemas desatualizados e incompatíveis, resultando em prontuários isolados que não se comunicam entre si. Isso atrasa os processos, aumenta o risco de erros médicos e dificulta o acesso a informações completas e atualizadas. Além disso, os sistemas de agendamento de consultas são ineficientes, causando longos tempos de espera e frustração. O controle de medicamentos também é prejudicado, dificultando o rastreamento de prescrições e aumentando o risco de complicações médicas. A dependência de processos manuais e papelada agrava ainda mais a situação, tornando as operações lentas, propensas a erros, e complicando a conformidade com regulamentações de proteção de dados de saúde.

+ + +

A atividade de PBB foi realizada com a criação de 3 Frames no Miro, sendo o primeiro (PBB) o diagrama PBB em si, detalhando os Problemas e Expectativas acerca de como é feito atualmente e como as personas esperam que seja. Detalha as personas, informando o que elas fazem e o que elas esperam fazer no produto.

+

Em seguido há o detalhamento das features, que são derivadas das expectativas de cada persona. As features tem à esquerda os problemas ou necessidades associados, e à direita os benefícios que essa feature traz.

+

Logo em seguida, são mostrados os Itens do Product Backlog, que são as Histórias de Usuários geradas com base em cada uma das Features informadas anteriormente, e cada um desses itens são detalhados em forma de US no Frame US's logo abaixo.

+

A priorização das US's foi feita em seguida, no Frame chamado PRIORIZAÇÃO COORG, utilizando o método de priorização COORG, onde a priorização é realizada verticalmente e horizontalmente, onde, verticalmente representa a prioridade (quanto mais alta, maior), e horizontalmente representando a sequência lógica de ordem.

+

PBB do Projeto (ObjeX)

+

A título de curiosidade, segue o PBB do nosso próprio projeto.

+ + +

A criação segue a mesma apresentada no PBB da atividade (HealthNet), com a diferença de que só possui dois Frames no Miro, o primeiro sendo o PBB em si, e o segundo (Pontuação VN DFD) sendo a priorização das US's seguindo o método de Priorização Dificuldade + Valor de Negócio.

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..e171e0d3 --- /dev/null +++ b/index.html @@ -0,0 +1,1439 @@ + + + + + + + + + + + + + + + + + + + + + ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

História da Facção

+ +

Brasão CyberHunterz

+

CyberHunterz

+

Kairos e Shin já se conheciam, pois eram do mesmo planeta e testemunharam de perto os efeitos da corrupção que empobrecia seu mundo. Incapazes de mudar a situação, decidiram partir na esperança de evitar que outros planetas sofressem nas mãos de grandes conglomerados. Foi durante uma missão que encontraram Vincent.

+

Cada um seguia seu caminho até que Kairos, Shin e Vincent se encontraram em uma missão para extrair dados do grupo Apache. Percebendo sua afinidade e habilidades complementares, decidiram formar um grupo de caçadores de recompensas chamado Cyber Hunterz (ainda não oficialmente ligado ao Comando Estelar).

+

Em busca de vingança, Simão contatou os Cyber Hunterz para prejudicar o conglomerado Celestia. Com o tempo, o grupo se aproximou de Simão, aproveitando suas conexões e serviços para facilitar suas missões.

+

Durante uma batalha em um planeta distante, a facção - composta por Kairos, Shin, Vincent e Simão - encontrou Dronada. Ela os atacou por engano, acreditando que eles estavam ligados à Slitherium, aliada da Spark Tech, que havia destruído seu planeta. Após um longo interrogatório, as tensões diminuíram. Reconhecendo o talento de Dronada, os Cyber Hunterz a convidaram para se juntar à facção, que havia mudado seu código de conduta e não realizava mais trabalhos sujos.

+

Não se sabe por que Black Star espionava a facção, mas mostrou grande habilidade, levando o grupo a recrutá-lo para seus objetivos misteriosos.

+

708145 começou a acompanhar os Cyber Hunterz por causa das habilidades de Shin em fabricar bombas brilhantes e do cabelo perfumado a pólvora da moça de fogo. Com o tempo, os membros da facção a adotaram como parte do grupo.

+

Kairos

+

Caio Moreira Sulz Gonsalves     +

+

Kairos

+

Em um universo distante, no planeta Diafthorá, um planeta conhecido pela imensa corrupção que o assolava, surge a história de Kairos, um jovem destemido e perspicaz. Desde tenra idade, Kairos foi criado pelo seu pai que sempre o ensinou a andar contra a maré e o sistema, a corrupção.

+

O momento decisivo que mudou o destino de Kairos, ocorreu quando seu pai foi obrigado por poderosos políticos a assumir um esquema de corrupção que ele mesmo não teria participado. Kairos testemunhou a seu pai negando e por isso sendo morto. Sentindo-se impotente diante da crueldade que assolava seu lar, foi nesse momento que ele percebeu que não podia mais ficar à margem, enquanto outros sofriam.

+

A partir disso, Kairos cresceu com uma natureza implicante, sendo opositor a tudo que lhe diziam ou sugeriam. Mas encontrou consolo no que seu pai tinha deixado de ensinamento, um código de honra a ser seguido, por isso ingressou na facção dos Caçadores de Recompensa. Ele desenvolveu um senso aguçado de justiça por causa de seu pai e uma determinação inabalável, características que o ajudaram a enfrentar os desafios que surgiram ao longo do caminho.

+

Desde então, viaja pela vastidão do espaço, enfrentando perigos inimagináveis ​​e buscando recompensas por criminosos procurados. Apesar de sua natureza implicante e de sua reputação como um caçador incansável, Kairos é conhecido por sua generosidade e lealdade aos seus amigos. Ele se tornou uma figura respeitada entre os caçadores de recompensas, um verdadeiro caçador no universo em constante expansão.

+

Vincent

+

Gustavo Costa de Jesus     +

+

Vincent

+

Vincent, um nativo do planeta NSA, cresceu em meio às sombras da cidade de Nocturne Falls, dominada pelo sinistro Conglomerado Apache. Desde jovem, ele testemunhou a exploração desenfreada do seu lar pelas mãos gananciosas dessa corporação militar, que lucrava com guerras induzidas e caos espalhado.

+

Determinado a fazer a diferença, Vincent ingressou no exército aos 18 anos, acreditando que poderia melhorar as condições de sua família. No entanto, Vincent não imaginava que as tão constantes guerras eram causadas pelos interesses do Grupo Apache, que manipulava o governo de NSA.

+

Durante uma dessas batalhas, Vincent sofreu um terrível acidente que custou-lhe um de seus braços, forçando-o a se aposentar do serviço militar. Sem muitas opções, ele acabou se juntando à corporação de Apache, pensando que poderia, de alguma forma, ainda fazer a diferença.

+

O preço da sua lealdade se mostrou alto quando foi obrigado a cometer seu primeiro ato criminoso, empurrado pelo próprio Apache para eliminar um suposto espião da rival Celestia. A verdade sobre os métodos corruptos e criminosos do Grupo Apache começou a se revelar para Vincent quando ele foi encarregado de eliminar outro suposto espião durante um vazamento de informações. Investigando mais a fundo, ele descobriu as atrocidades que a corporação cometia em nome do lucro.

+

Percebendo que agora era um alvo, Vincent teve que fugir de Nocturne Falls para salvar sua própria vida. Refugiando-se em uma facção rebelde, ele decidiu lutar contra as injustiças perpetradas pelas grandes corporações, especialmente contra o Grupo Apache, jurando que sua cidade natal um dia seria livre do jugo opressor que a aprisionava. Assim, equipado com sua determinação e habilidades adquiridas, Vincent se tornou uma força a ser reconhecida na luta contra o domínio corporativo em seu mundo.

+

Simão

+

Arthur Rodrigues Sousa     +

+

Simão

+

Saindo de um planeta humilde, onde a vida não era fácil, Simão viu-se mergulhado no mundo do crime em busca de oportunidades para sobreviver. No entanto, o conglomerado de Celestia, na sua ânsia por semear o caos e promover conflitos, manipulou alguns dos aliados de Simão, resultando na perda de milhões de créditos para ele.

+

Movido pela sede de retaliação, Simão decidiu agir e entrou em contato com a facção CyberHunterz. Ele viu nessa associação uma oportunidade de atingir seus objetivos e prejudicar o conglomerado de Celestia, buscando vingança pela traição que sofrera. Ao se unir aos CyberHunterz, Simão planejava não apenas recuperar o que perdera, mas também desmantelar as operações corruptas que prejudicavam tantos em sua galáxia.

+

Shin

+

Fabrício Macedo de Queiroz     +

+

Shin

+

Shin não se juntou a facção Cyber Hunterz por interesse em fama ou respeito. Tendo nascido em uma região pobre do planeta Diafthorá, levou uma vida marcada por desafios, que puderam ser superados com uma boa adaptabilidade. Ele e seu amigo Kairos conseguiram se juntar a uma facção determinada (no que diz respeito aos seus interesses). Ele preza muito pelo ganho monetário e de informações, tendo em vista suas origens. Tem como hobbie projetar, criar e vender equipamentos para seus companheiros. Enxerga como vantagem ser enviado em algumas invasões orquestradas pela Slitherium, já que nessas missões de reconhecimento, é plausível que encontre materiais raros desejáveis para suas criações. +Mesmo tendo uma personalidade mesquinha, ele preza muito por seus companheiros, e trabalha como um informante do Comando Estelar, passando informações privilegiadas dos planos da Slitherium dos quais tenha conhecimento.

+

Dronada

+

Rayene Ferreira Almeida     +

+

Dronada

+

Dronada nasceu sob os céus avermelhados do exoplaneta Gliese 876d, um mundo onde os extremos eram a norma e a adaptação era a chave para a sobrevivência. +Criada por seus pais em uma comunidade subterrânea, Dronada aprendeu os segredos da sobrevivência em um ambiente hostil. Seu pai, um engenheiro habilidoso, ensinou-lhe a arte de construir dispositivos que podiam resistir às forças brutais do planeta, enquanto sua mãe, uma curandeira talentosa, transmitiu-lhe o conhecimento ancestral das plantas e ervas que cresciam em cavernas profundas. +Dronada a Gliesiana encontrou seu caminho como caçadora de recompensas após uma tragédia sombria que mudou sua vida para sempre. Quando Dronada era jovem, sua família foi abruptamente assassinada quando um conglomerado chamado Spark Tech, motivado por ganância e poder, atacou sua comunidade em busca dos recursos tecnológicos do seu povo. Durante o ataque brutal, deixando-a órfã e consumida pela dor e pela sede de vingança, ela jurou caçar e destruir aqueles responsáveis pelo ataque. +Para honrar os ensinamentos de seus pais ela seguiu em frente com sua facção completando as missões em busca de recompensas com ética e respeito por aqueles que não carregam a culpa, em busca de justiça e vingança por aqueles que injustamente se foram.

+

Black Star

+

Nicollas Garbield Oliveira Sousa     +

+

Black Star

+

Black Star, um indivíduo frio e observador, é guiado por seus interesses, que frequentemente envolvem dinheiro. No entanto, ele segue a ética e a disciplina de seu grupo. Black aprecia as batalhas e as recompensas que elas trazem. Apesar de uma história de vida tumultuada, ele é um guerreiro leal e competente, sempre vigilante em relação a tudo e a todos. Desde a infância, envolveu-se em diversos problemas, mas isso lhe proporcionou experiência e habilidades valiosas.

+

708145

+

Manoel Castro Moura Filho     +

+

708145

+

😄 😄 20 pontos de qi. 😄 😄

+

+░░░░▄▄▄▄▀▀▀▀▀▀▀▀▄▄▄▄▄▄ +░░░░█░░░░▒▒▒▒▒▒▒▒▒▒▒▒░░▀▀▄ +░░░█░░░▒▒▒▒▒▒░░░░░░░░▒▒▒░░█ +░░█░░░░░░▄██▀▄▄░░░░░▄▄▄░░░█ +░▀▒▄▄▄▒░█▀▀▀▀▄▄█░░░██▄▄█░░░█ +█▒█▒▄░▀▄▄▄▀░░░░░░░░█░░░▒▒▒▒▒█ +█▒█░█▀▄▄░░░░░█▀░░░░▀▄░░▄▀▀▀▄▒█ +░█▀▄░█▄░█▀▄▄░▀░▀▀░▄▄▀░░░░█░░█ +░░█░░▀▄▀█▄▄░█▀▀▀▄▄▄▄▀▀█▀██░█ +░░░█░░██░░▀█▄▄▄█▄▄█▄████░█ +░░░░█░░░▀▀▄░█░░░█░███████░█ +░░░░░▀▄░░░▀▀▄▄▄█▄█▄█▄█▄▀░░█ +░░░░░░░▀▄▄░▒▒▒▒░░░░░░░░░░█ +░░░░░░░░░░▀▀▄▄░▒▒▒▒▒▒▒▒▒▒░█ +░░░░░░░░░░░░░░▀▄▄▄▄▄░░░░░█ +

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/integrantes/blackstar/blackstar.png b/integrantes/blackstar/blackstar.png new file mode 100644 index 00000000..274daa6e Binary files /dev/null and b/integrantes/blackstar/blackstar.png differ diff --git a/integrantes/blackstar/profile.png b/integrantes/blackstar/profile.png new file mode 100644 index 00000000..b534c65b Binary files /dev/null and b/integrantes/blackstar/profile.png differ diff --git a/integrantes/dronada/dronada.png b/integrantes/dronada/dronada.png new file mode 100644 index 00000000..45190b9b Binary files /dev/null and b/integrantes/dronada/dronada.png differ diff --git a/integrantes/dronada/profile.png b/integrantes/dronada/profile.png new file mode 100644 index 00000000..8e449c1a Binary files /dev/null and b/integrantes/dronada/profile.png differ diff --git a/integrantes/kairos/kairos.png b/integrantes/kairos/kairos.png new file mode 100644 index 00000000..e51bf4e1 Binary files /dev/null and b/integrantes/kairos/kairos.png differ diff --git a/integrantes/kairos/profile.png b/integrantes/kairos/profile.png new file mode 100644 index 00000000..ca90acaf Binary files /dev/null and b/integrantes/kairos/profile.png differ diff --git a/integrantes/shin/profile.png b/integrantes/shin/profile.png new file mode 100644 index 00000000..fff14eba Binary files /dev/null and b/integrantes/shin/profile.png differ diff --git a/integrantes/shin/shin.png b/integrantes/shin/shin.png new file mode 100644 index 00000000..4c8efc12 Binary files /dev/null and b/integrantes/shin/shin.png differ diff --git a/integrantes/simao/profile.png b/integrantes/simao/profile.png new file mode 100644 index 00000000..4b98a154 Binary files /dev/null and b/integrantes/simao/profile.png differ diff --git a/integrantes/simao/simao.png b/integrantes/simao/simao.png new file mode 100644 index 00000000..3c97dcb0 Binary files /dev/null and b/integrantes/simao/simao.png differ diff --git a/integrantes/tobias/profile.png b/integrantes/tobias/profile.png new file mode 100644 index 00000000..b2d77950 Binary files /dev/null and b/integrantes/tobias/profile.png differ diff --git a/integrantes/tobias/tobias - Copia.png b/integrantes/tobias/tobias - Copia.png new file mode 100644 index 00000000..b3a50104 Binary files /dev/null and b/integrantes/tobias/tobias - Copia.png differ diff --git a/integrantes/tobias/tobias.png b/integrantes/tobias/tobias.png new file mode 100644 index 00000000..b3a50104 Binary files /dev/null and b/integrantes/tobias/tobias.png differ diff --git a/integrantes/vincent/profile.png b/integrantes/vincent/profile.png new file mode 100644 index 00000000..38e3bd81 Binary files /dev/null and b/integrantes/vincent/profile.png differ diff --git a/integrantes/vincent/vincent.png b/integrantes/vincent/vincent.png new file mode 100644 index 00000000..725c420c Binary files /dev/null and b/integrantes/vincent/vincent.png differ diff --git a/licoes-missao1/index.html b/licoes-missao1/index.html new file mode 100644 index 00000000..89134d36 --- /dev/null +++ b/licoes-missao1/index.html @@ -0,0 +1,1283 @@ + + + + + + + + + + + + + + + + + + + + + + + Lições Aprendidas - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Lições Aprendidas

+ +

Unidade 1

+

Durante a nossa primeira tarefa, a equipe teve a oportunidade de adquirir várias lições significativas. Encontramos alguns obstáculos devido a conflitos de horários entre os membros da equipe, mas todos se mostraram dispostos a contribuir quando podiam.

+

A maior dificuldade que o grupo enfrentou foi em relação à documentação do projeto. Isso nos levou a gastar um tempo considerável em reuniões, pois havia muitas dúvidas e opiniões diferentes a serem consideradas. A complexidade da documentação exigiu que todos os membros da equipe estivessem na mesma página, o que se mostrou um desafio. No entanto, a equipe se mostrou resiliente e disposta a superar esses obstáculos.

+

Apesar desses desafios, uma das lições mais positivas que tiramos foi o interesse e o empenho demonstrados pelos membros da equipe. Todos compartilhavam uma visão unificada e um entendimento aprofundado do projeto, o que facilitou bastante o processo de desenvolvimento. Esse alinhamento permitiu que a equipe superasse as dificuldades encontradas na documentação e mantivesse o foco no objetivo final.

+

Após uma reunião produtiva com o professor (cliente), a equipe conseguiu chegar a um consenso sobre os objetivos principais do projeto com facilidade. Isso nos permitiu definir as metas e diretrizes estabelecidas, resultando em um planejamento mais robusto e uma execução mais fluida. A participação de todos na reunião foi crucial para garantir que todos estivessem alinhados com os objetivos do projeto. Isso, por sua vez, facilitou a coordenação e a colaboração dentro da equipe, permitindo uma execução mais suave do projeto.

+

Unidade 2

+

Durante a segunda unidade, a equipe continuou a desenvolver suas habilidades e aprofundou seus conhecimentos em metodologias ágeis e práticas de desenvolvimento de software. Um dos principais focos foi a implementação de PBB (Product Backlog Building), SAFe (Scaled Agile Framework), MVP (Minimum Viable Product), critérios de aceitação e pontuação, e a criação de diagramas de fluxo de dados (DFD).

+

A adoção do PBB foi fundamental para a organização do backlog do projeto. A equipe conseguiu dividir as tarefas de maneira mais eficiente e priorizar as entregas com base nas necessidades do cliente.

+

O SAFe foi introduzido para escalonar as práticas ágeis em toda a equipe. Isso trouxe uma estrutura mais robusta para a gestão do projeto, promovendo melhor colaboração entre os membros e facilitando a coordenação de tarefas.

+

A criação do MVP foi um dos pontos altos desta unidade. A equipe se concentrou em desenvolver uma versão básica, mas funcional, do produto, que pudesse ser apresentada ao cliente para feedback inicial.

+

Os critérios de aceitação foram definidos com clareza para cada funcionalidade do projeto. Isso garantiu que todos os membros da equipe tivessem um entendimento comum sobre o que era necessário para considerar uma tarefa concluída com sucesso.

+

Por fim, a elaboração dos diagramas de fluxo de dados (DFD) foi crucial para entender melhor o fluxo de informações dentro do sistema.

+

Em resumo, a segunda unidade foi marcada por um avanço significativo nas práticas de desenvolvimento e na organização da equipe. As metodologias e ferramentas implementadas ajudaram a melhorar a eficiência e a eficácia do projeto, preparando a equipe para os desafios das próximas etapas.

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/licoes-missao2/index.html b/licoes-missao2/index.html new file mode 100644 index 00000000..6493f85a --- /dev/null +++ b/licoes-missao2/index.html @@ -0,0 +1,1199 @@ + + + + + + + + + + + + + + + + + + + + + + + Lições Aprendidas - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Lições Aprendidas

+ +

Durante a segunda unidade, a equipe continuou a desenvolver suas habilidades e aprofundou seus conhecimentos em metodologias ágeis e práticas de desenvolvimento de software. Um dos principais focos foi a implementação de PBB (Product Backlog Building), SAFe (Scaled Agile Framework), MVP (Minimum Viable Product), critérios de aceitação e pontuação.

+

A adoção do PBB foi fundamental para a organização do backlog do projeto. A equipe conseguiu dividir as tarefas de maneira mais eficiente e priorizar as entregas com base nas necessidades do cliente.

+

O SAFe foi introduzido para escalonar as práticas ágeis em toda a equipe. Isso trouxe uma estrutura mais robusta para a gestão do projeto, promovendo melhor colaboração entre os membros e facilitando a coordenação de tarefas.

+

A criação do MVP foi um dos pontos altos desta unidade. A equipe se concentrou em desenvolver uma versão básica, mas funcional, do produto, que pudesse ser apresentada ao cliente para feedback inicial.

+

Os critérios de aceitação foram definidos com clareza para cada funcionalidade do projeto. Isso garantiu que todos os membros da equipe tivessem um entendimento comum sobre o que era necessário para considerar uma tarefa concluída com sucesso.

+

Em resumo, a segunda unidade foi marcada por um avanço significativo nas práticas de desenvolvimento e na organização da equipe. As metodologias e ferramentas implementadas ajudaram a melhorar a eficiência e a eficácia do projeto, preparando a equipe para os desafios das próximas etapas.

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/licoes-missao3/index.html b/licoes-missao3/index.html new file mode 100644 index 00000000..a7699c1e --- /dev/null +++ b/licoes-missao3/index.html @@ -0,0 +1,1196 @@ + + + + + + + + + + + + + + + + + + + + + + + Lições Aprendidas - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Lições Aprendidas

+ +

Nessa missão, dois conceitos chave estudados foram o User Story Mapping (USM) e o Product Backlog Building (PBB), que desempenham papéis cruciais na organização e priorização dos requisitos. +Aplicando o USM, percebemos como é possível alinhar as necessidades dos stakeholders com o backlog do produto, facilitando a comunicação entre as equipes e o entendimento do que realmente é crítico para o sucesso do projeto. +Ao longo do semestre, compreendemos a importância de técnicas como USM e PBB para o desenvolvimento de produtos de software que atendam às expectativas dos usuários e aos objetivos de negócio. Essas práticas são essenciais para garantir que o processo de desenvolvimento seja ágil, eficiente e focado na entrega de valor.

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/missao2-criterios-aceitacao/index.html b/missao2-criterios-aceitacao/index.html new file mode 100644 index 00000000..4f5c9273 --- /dev/null +++ b/missao2-criterios-aceitacao/index.html @@ -0,0 +1,1543 @@ + + + + + + + + + + + + + + + + + + + + + + + Critérios de Aceitação - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Critérios de Aceitação

+

Critérios de aceitação são fundamentais no processo de Desenvolvimento de Software, fornecendo definições claras e objetivas que definem quando determinada funcionalidade ou requisito é considerado satisfatoriamente implementado. Esses critérios são estabelecidos em colaboração com os stakeholder(s), cliente(s), usuário(s) e membro(s) da equipe de desenvolvimento, para garantir uma compreensão comum das expectativas e padrões de qualidade esperados.

+

As imagens a seguir, apresentam os Critérios de Aceitação para cada uma das Histórias de Usuários presentes no MVP, provisoriamente definidos pelo time e stakeholder(s) na Missão 2.

+

Critérios de Aceitação FE01 - CRUD Turma

+

Critérios de Aceitação FE01 - CRUD Turma

+

Critérios de Aceitação FE02 - CRUD Aluno

+

Critérios de Aceitação FE02 - CRUD Aluno

+

Critérios de Aceitação FE03 - CRUD Monitor

+

Critérios de Aceitação FE03 - CRUD Monitor

+

Critérios de Aceitação FE04 - CRUD Grupo

+

Critérios de Aceitação FE04 - CRUD Grupo

+

Critérios de Aceitação FE05 - CRUD Conteúdo

+

Não entrou no MVP.

+

Critérios de Aceitação FE06 - CRUD Atividade

+

Critérios de Aceitação FE06 - CRUD Atividade

+

Critérios de Aceitação FE07 - Emitir Planilhas

+

Critérios de Aceitação FE07 - Emitir Planilhas

+

Critérios de Aceitação FE08 - Corrigir Atividades

+

Critérios de Aceitação FE08 - Corrigir Atividades

+

Critérios de Aceitação FE09 - CRUD Professor

+

Critérios de Aceitação FE09 - CRUD Professor

+ + +

Critérios de Aceitação FE10 - Inserir Feedback

+

Não entrou no MVP.

+

Critérios de Aceitação FE11 - Submeter Atividades

+

Critérios de Aceitação FE11 - Submeter Atividades

+

Critérios de Aceitação FE12 - Entrar e Sair de Grupos

+

Critérios de Aceitação FE12 - Entrar e sair de grupos

+

Critérios de Aceitação FE14 - Professor/Admin Login e Logout

+

Critérios de Aceitação FE14 - Professor/Admin Login e Logout

+

Critérios de Aceitação FE15 - Aluno/Monitor Login e Logout

+

Critérios de Aceitação FE15 - Aluno/Monitor Login e Logout

+

Critérios de Aceitação FE13 - Visualizar e Baixar Conteúdos

+

Não entrou no MVP.

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/missao2-mvp/index.html b/missao2-mvp/index.html new file mode 100644 index 00000000..7e8787f9 --- /dev/null +++ b/missao2-mvp/index.html @@ -0,0 +1,1509 @@ + + + + + + + + + + + + + + + + + + + + + + + MVP - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

MVP (Minimum Viable Product)

+

O conceito de MVP (Minimum Viable Product), ou Produto Mínimo Viável, é fundamental na engenharia de software e no desenvolvimento de produtos. Um MVP é a versão mais simples e funcional de um produto, contendo apenas as características essenciais necessárias para atender às necessidades básicas dos usuários iniciais e validar a viabilidade da ideia no mercado. Ele permite que as empresas lancem rapidamente um produto para obter feedback real dos usuários, reduzindo riscos e orientando melhorias contínuas com base nas respostas recebidas. Essa abordagem ágil ajuda a garantir que o desenvolvimento siga na direção certa, otimizando recursos e aumentando as chances de sucesso.

+

+

US's que fazem parte do MVP

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ÉpicoUSDescrição
EP01 - ProfessorUS01Eu como professor, quero ser capaz de criar uma turma, para que os Alunos possam ser inseridos
EP01 - ProfessorUS02Eu como professor, quero ser capaz de visualizar uma turma, para verificar os alunos nela inseridos
EP01 - ProfessorUS03Eu como professor, quero ser capaz de deletar uma turma, para caso ela não seja necessária
EP01 - ProfessorUS04Eu como professor, quero ser capaz de criar um aluno, para que ele possa exercer suas funções
EP01 - ProfessorUS05Eu como professor, quero ser capaz de visualizar os alunos, para verificar suas informações
EP01 - ProfessorUS06Eu como professor, quero ser capaz de editar um aluno, para mudar as informações do mesmo
EP01 - ProfessorUS07Eu como professor, quero ser capaz de deletar um aluno, para caso ele não seja necessário
EP01 - ProfessorUS08Eu como professor, quero ser capaz de criar um monitor, para que ele possa exercer suas funções
EP01 - ProfessorUS09Eu como professor, quero ser capaz de visualizar os monitores, para verificar suas informações
EP01 - ProfessorUS10Eu como professor, quero ser capaz de editar um monitor, para mudar as informações do mesmo
EP01 - ProfessorUS11Eu como professor, quero ser capaz de deletar um monitor, para caso ele não seja necessário
EP01 - ProfessorUS12Eu como professor, quero ser capaz de criar um grupo, para que os Alunos possam entrar ou sair
EP01 - ProfessorUS13Eu como professor, quero ser capaz de visualizar um grupo, para verificar os alunos nele inseridos
EP01 - ProfessorUS14Eu como professor, quero ser capaz de editar um grupo, para mudar as informações do mesmo
EP01 - ProfessorUS15Eu como professor, quero ser capaz de deletar um grupo, para caso ele não seja necessário
EP01 - ProfessorUS20Eu como professor, quero ser capaz criar uma atividade e inserir na plataforma para que os alunos possam realiza-las
EP01 - ProfessorUS21Eu como professor, quero ser capaz de visualizar uma atividade inserida na plataforma para facilitar na organização
EP01 - ProfessorUS22Eu como professor, quero ser capaz de editar uma atividade, para mudar a descrição ou resposta da mesma
EP01 - ProfessorUS23Eu como professor, quero ser capaz de deletar uma atividade para caso ela não seja mais necessária
EP01 - ProfessorUS24Eu como professor quero emitir planilhas de grupos formados para facilitar a organização dos mesmos
EP01 - ProfessorUS25Eu como professor quero emitir planilhas de turmas para facilitar a organização das mesmas
EP01 - ProfessorUS26Eu como professor quero corrigir as atividades dos alunos para poder atribuir notas
EP01 - ProfessorUS27Eu como professor Admin, quero ser capaz de cadastrar um professor para que ele consiga exercer suas funções
EP01 - ProfessorUS28Eu como professor Admin, quero ser capaz de editar um professor para alterar suas informações
EP01 - ProfessorUS29Eu como professor Admin, quero ser capaz de visualizar um professor para verificar suas informações
EP01 - ProfessorUS30Eu como professor Admin, quero ser capaz de deletar um professor para caso ele não seja necessário
EP01 - ProfessorUS40Eu como Professor/Admin desejo fazer login para ter acesso às funcionalidades
EP01 - ProfessorUS41Eu como Professor/Admin desejo fazer logout para sair da plataforma de maneira segura
EP02, EP03 - Aluno/MonitorUS38Eu como aluno/monitor desejo fazer login para ter acesso às funcionalidades
EP02, EP03 - Aluno/MonitorUS39Eu como aluno/monitor desejo fazer logout para sair da plataforma de maneira segura
EP03 - AlunosUS32Eu como aluno desejo responder atividades de múltipla escolha para poder ser avaliado
EP03 - AlunosUS33Eu como aluno desejo responder atividades de código para poder ser avaliado
EP03 - AlunosUS34Eu como aluno desejo responder atividades de envio de imagem para poder ser avaliado
EP03 - AlunosUS35Eu como aluno desejo entrar em um grupo para que eu possa participar das atividades da disciplina
EP03 - AlunosUS36Eu como aluno desejo sair de um grupo para caso eu não esteja mais nele
+

+

+

US's que não fazem parte do MVP

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ÉpicoUSDescrição
EP01 - ProfessorUS16Eu como professor, quero ser capaz de disponibilizar conteúdo sobre a matéria na plataforma para facilitar o ensino 
EP01 - ProfessorUS17Eu como professor, quero ser capaz de visualizar um conteúdo inserido na plataforma para ajudar na organização e ensino
EP01 - ProfessorUS18Eu como professor, quero ser capaz de editar um conteúdo, para mudar as informações
EP01 - ProfessorUS19Eu como professor, quero ser capaz de deletar um conteúdo para caso ele não seja mais necessário
EP02 - MonitorUS31Eu como monitor desejo fornecer feedback para os alunos para auxiliar no desenvolvimento de atividades
EP03 - AlunosUS37Eu como aluno desejo visualizar  conteúdos disponibilizados pelo professor e fazer o download para auxiliar nos meus estudos
+

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/missao2-safe/index.html b/missao2-safe/index.html new file mode 100644 index 00000000..b0ff1ca1 --- /dev/null +++ b/missao2-safe/index.html @@ -0,0 +1,1396 @@ + + + + + + + + + + + + + + + + + + + + + + + SAFe - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + +

Diagrama SAFe

+

O diagrama SAFe (Scaled Agile Framework) é uma visualização das práticas e princípios do SAFe, utilizado para aplicar metodologias ágeis em grandes organizações. Ele facilita a coordenação entre múltiplos times para entrega contínua de valor.

+

SAFe

+

Tema Estratégico

+

Iniciativa de alto nível que alinha a execução do trabalho ágil com os objetivos estratégicos do projeto. Neste caso, estão divididos de acordo com as áreas do sistema.

+

Temas Estratégicos

+

Épicos

+

Representam grandes iniciativas ou grandes marcos para o projeto, também representa um grande esforço que requer a coordenação de múltiplas equipes no projeto. Em nosso caso, separamos em 3 Épicos, que representam os módulos da aplicação.

+

Épicos

+

Capacidades

+

São conjuntos de funcionalidades de nível mais alto, estão dividos de acordo com as funcionalidades fornecem valor significativo para os stakeholders.

+

Capacidades

+

Features

+

São unidades de trabalho que entregam valor direto aos stakeholders. Representam pedaços significativos de funcinalidades que podem ser desenvolvidos, testados e entregues de forma incremental.

+

Features - Professor e Professor Admin

+

Features - Professor e Professor Admin

+

Features - Monitor

+

Features - Monitor

+

Features - Alunos

+

Features - Alunos

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/pontuacao/index.html b/pontuacao/index.html new file mode 100644 index 00000000..0403bdc4 --- /dev/null +++ b/pontuacao/index.html @@ -0,0 +1,1579 @@ + + + + + + + + + + + + + + + + + + + + + + + Pontuação e Priorização de US's - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Pontuação das Histórias de Usuário (User Stories)

+

Valor de Negócio

+

Refere-se à importância ou impacto que uma história de usuário terá para o negócio.

+

+

Tabela 1 - Pontuação de Valor de Negócio

+ + + + + + + + + + + + + + + + + + + + + + + + + +
PontuaçãoValor de Negócio
1Valor de negócio Baixo
2Valor de negócio Médio
3Valor de negócio Alto
4Valor de negócio Muito Alto
+

+

Dificuldade

+

A dificuldade mede o esforço necessário para implementar uma história de usuário. Esse conceito ajuda a avaliar o tempo e os recursos que serão necessários para concluir uma tarefa.

+

+

Tabela 2 - Pontuação de Dificuldade

+ + + + + + + + + + + + + + + + + + + + + +
PontuaçãoDificuldade
1Muito Difícil
2Médio
3Relativamente Fácil
+

+

Pontuação

+

A pontuação é a soma do valor de negócio e da dificuldade. Essa métrica é útil para dar uma visão geral de quais histórias de usuários devem ser priorizadas, levando em conta tanto o impacto para o negócio quanto o esforço necessário para sua implementação. A pontuação ajuda a equilibrar a priorização, considerando tanto a importância da tarefa quanto a viabilidade de sua conclusão.

+

Por exemplo, na tabela, a história de usuário "US01" tem um valor de negócio 4 (muito alto) e uma dificuldade 3 (relativamente fácil), resultando em uma pontuação total de 7. Essa história de usuário seria considerada de alta prioridade, pois oferece um alto valor de negócio com um esforço relativamente baixo para sua implementação.

+

+

Tabela 3 - Pontuação das User Stories

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
USValor de NegócioDificuldadePontuação
US01437
US05437
US13437
US24437
US25437
US26437
US27437
US28437
US29437
US30437
US35437
US36437
US04426
US08426
US12426
US20336
US21336
US22336
US23336
US32426
US34426
US02325
US06325
US07235
US09235
US10235
US14325
US15235
US33415
US11134
US03213
US38337
US39337
US40337
US41337
+

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/processo-desenvolvimento/index.html b/processo-desenvolvimento/index.html new file mode 100644 index 00000000..7335a88f --- /dev/null +++ b/processo-desenvolvimento/index.html @@ -0,0 +1,1507 @@ + + + + + + + + + + + + + + + + + + + + + + + Processo de Desenvolvimento de Software - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Processo de Desenvolvimento de Software

+ +

Abordagem Ágil:

+

Considerando que nossa ferramenta será uma peça fundamental no ambiente de trabalho do cliente, é essencial mantermos um fluxo de feedback contínuo. A comunicação informal é favorecida devido ao envolvimento prévio de um dos nossos integrantes com o cliente, além do contexto de equipe reduzida.

+

Dada a restrição de tempo e a necessidade de adaptação rápida às demandas e preferências do cliente, a abordagem Ágil emerge como a escolha mais apropriada. Essa metodologia nos permite ser flexíveis e ágeis na entrega de valor, ajustando-nos de maneira eficaz às mudanças e às especificidades do projeto.

+

Abordagem Agil

+

Ciclo de Vida: Ágil (Iterativo e Incremental)

+

No contexto do ciclo de vida ágil, adotamos uma abordagem iterativa e incremental que se alinha perfeitamente com as necessidades de acesso antecipado do cliente a funcionalidades específicas, mesmo antes da conclusão final do software.

+

Destacamos a participação ativa do cliente com Feedback como um pilar fundamental. A colaboração entre o grupo e cliente é maximizada, permitindo um entendimento mais profundo das necessidades em evolução e aprimorando a capacidade de adaptação do produto às expectativas em constante mudança.

+

Essa abordagem promove não apenas um maior alinhamento entre as partes envolvidas, mas também permite a entrega de valor de forma progressiva e tangível ao longo do ciclo de desenvolvimento, garantindo que o software evolua de maneira colaborativa e eficiente para atender às necessidades e expectativas do cliente.

+

Processo: ScrumXP

+

o ScrumXP é uma abordagem que combina a gestão de projeto do Scrum com as práticas técnicas do eXtreme Programming (XP), oferecendo um ambiente propício para a flexibilidade, feedback constante, ritmo de entrega sustentável e entregas constantes e incrementais.

+
    +
  • +

    Flexibilidade dos Requisitos: O ScrumXP permite a flexibilidade dos requisitos ao adotar ciclos curtos de desenvolvimento (sprints), nos quais os requisitos podem ser ajustados e priorizados de acordo com as necessidades do cliente e as condições do mercado em constante mudança.

    +
  • +
  • +

    Feedback Constante: Com o ScrumXP, o feedback contínuo é incorporado ao processo através de revisões frequentes de incrementos do produto e cerimônias como reuniões diárias (daily stand-ups), revisões de sprint e retrospectivas. Isso garante que a equipe esteja sempre alinhada com as expectativas dos stakeholders e possa realizar ajustes rapidamente.

    +
  • +
  • +

    Ritmo de Entrega: A metodologia ScrumXP promove um ritmo de entrega consistente e previsível, com a conclusão de incrementos de produto funcionais no final de cada sprint. Isso permite que a equipe entregue valor de forma regular ao longo do tempo, mantendo um fluxo de trabalho estável e eficiente.

    +
  • +
  • +

    Práticas de Testes Integradas: No ScrumXP, os testes são incorporados desde o início do desenvolvimento. A metodologia promove o desenvolvimento orientado por testes (TDD - Test-Driven Development), onde os testes são escritos antes da implementação do código. Isso garante que cada incremento de funcionalidade seja acompanhado por testes automatizados que validam seu comportamento esperado.

    +
  • +
+

Srum

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nome da AtividadeMétodoFerramentasEntrega
Elicitação e DescobertaReunião com o Cliente, BrainstormingGoogle Meet, Google DocsDefinir RFs e RNFs iniciais e entendimento geral do projeto.
Análise e ConsensoFeedbackGoogle Meet, Google DocsRefinar RFs e RNFs finais e sugestão de funcionalidades.
DeclaraçãoFeedback, Tema, Épicos e Histórias de UsuárioGoogle Meet, Google SheetsEspecificação dos RFs e Histórias de Usuário.
RepresentaçãoPrototipação rápidaFigmaProtótipo básico.
Verificação e ValidaçãoFeedbackGithub ProjectsBacklog e Priorização de RFs.
Organização e AtualizaçãoKanban (Scrum board)Github ProjectsBacklog e Priorização de RFs.
+

Atividades de Requisitos

+

Elicitação e Descoberta:

+

Durante esta fase inicial, realizamos reuniões com o cliente e sessões de brainstorming para identificar e entender as necessidades e requisitos iniciais do projeto. Isso nos permitiu definir os RFs e RNFs iniciais e obter uma compreensão geral do escopo do projeto. Durante as iterações pode ocorrer a adição ou correção de algum RF ou RNF de acordo com as necessidades do projeto.

+

Análise e Consenso:

+

Aqui, o feedback obtido durante a elicitação é analisado em detalhes. Os requisitos são refinados com base nas informações coletadas, e são propostas sugestões de funcionalidades específicas. O objetivo é chegar a um consenso sobre os requisitos finais que atendam às necessidades do cliente.

+

Declaração:

+

Após a análise, os requisitos refinados são formalizados nesta fase. Isso inclui a documentação detalhada dos RFs, temas, épicos e histórias de usuário. Esta é a etapa onde os requisitos são especificados de forma clara e completa.

+

Verificação e Validação:

+

Uma vez especificados, os requisitos passarão por uma revisão detalhada para garantir sua precisão, completude e consistência. O feedback contínuo é incorporado ao processo através de revisões regulares dos requisitos e da validação com o cliente a cada iteração. E também serão desenvolvidos testes de software para ajudar na validação dos requisitos do sistema.

+

Representação:

+

Durante todo o processo, os requisitos serão representados por meio de prototipagem rápida. Isso permite uma visualização mais tangível e uma melhor compreensão dos requisitos por parte do cliente.

+

Organização e Atualização:

+

Por fim, os requisitos serão organizados e atualizados continuamente ao longo do desenvolvimento. Isso será feito através de um Kanban (Scrum board) em uma ferramenta de gerenciamento de projetos como o GitHub Projects, garantindo que os requisitos sejam gerenciados de forma eficaz e priorizados corretamente.

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/produto-objetivos/index.html b/produto-objetivos/index.html new file mode 100644 index 00000000..5954c367 --- /dev/null +++ b/produto-objetivos/index.html @@ -0,0 +1,1283 @@ + + + + + + + + + + + + + + + + + + + + + + + Objetivos do Produto - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Visão Geral do Produto

+

Objetivos do Produto

+

Nosso objetivo é desenvolver uma plataforma abrangente que otimize o desempenho organizacional dos alunos e facilite a interação eficaz entre professores e estudantes no ambiente acadêmico. Para alcançar esse objetivo, nossa plataforma será projetada para:

+
    +
  • +

    Simplificar a formação de grupos para trabalhos finais, promovendo a colaboração entre alunos.

    +
  • +
  • +

    Introduzir elementos de gamificação na experiência de aprendizagem, transformando as atividades avaliativas em missões envolventes propostas pelo professor.

    +
  • +
  • +

    Agilizar o processo de correção das atividades, oferecendo ferramentas eficientes para avaliação e feedback.

    +
  • +
  • +

    Facilitar o acesso dos alunos às suas notas em cada atividade e prova, proporcionando transparência e acompanhamento contínuo do desempenho acadêmico.

    +
  • +
  • +

    Além disso, nossos objetivos secundários incluem:

    +
  • +
  • +

    Simplificar o envio de atividades em Python, permitindo a execução de um arquivo ou a interpretação de um código escrito na própria plataforma.

    +
  • +
  • +

    Criar uma página dedicada à apresentação e compartilhamento dos trabalhos finais da disciplina, oferecendo um espaço centralizado para avaliação e reconhecimento dos projetos desenvolvidos pelos alunos.

    +
  • +
+

Com essas funcionalidades, buscamos promover a eficiência acadêmica e facilitar a interação dinâmica entre professores e alunos, enriquecendo significativamente o processo educacional.

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/produto-posicao/index.html b/produto-posicao/index.html new file mode 100644 index 00000000..7a90d39c --- /dev/null +++ b/produto-posicao/index.html @@ -0,0 +1,1289 @@ + + + + + + + + + + + + + + + + + + + + + + + Declaração de Posição do Produto - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Visão Geral do Produto

+

Declaração de Posição do Produto

+

Com base nos cenários mencionados, foi apresentada ao Professor a proposta da plataforma denominada ObjeX. Trata-se de uma solução web, concebida com o intuito de oferecer um ambiente de aprendizado gamificado. Por meio dessa plataforma, os alunos serão inscritos pelo professor e terão a oportunidade de aprimorar seus conhecimentos através de uma estrutura de "Missões", as quais serão cadastradas pelo docente. Ademais, a capacidade de formação de grupos e a integração da funcionalidade de envio de tarefas em conjunto revestem-se de importância fundamental para a disciplina. Além disso, a plataforma possibilitará a disponibilização dos trabalhos finais dos alunos, permitindo que outros estudantes os testem e promovam uma colaboração mais ampla e enriquecedora.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParaProfessor Da Disciplina de Orientação a Objetos
QuemEstudantes da Disciplina de Orientação a Objetos, do curso de Engenharia de Software da UnB
O (nome do produto)ObjeX é uma plataforma de ensino e gestão de turmas.
QueFacilita o processo de aprendizado e formação de grupos de acordo com a necessidade do professor.
Ao contrárioBeeCrowd, Brilliant, Excel.
Nosso produtoJunta funções de ferramentas diversas em uma só plataforma, às unificando e facilitando para o usuário final.
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/produto-problema/index.html b/produto-problema/index.html new file mode 100644 index 00000000..44ed9820 --- /dev/null +++ b/produto-problema/index.html @@ -0,0 +1,1268 @@ + + + + + + + + + + + + + + + + + + + + + + + Problema - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Visão Geral do Produto

+

Problema

+

O Professor da disciplina de Orientação a Objetos enfrenta desafios significativos ao ministrar sua disciplina devido a duas questões iniciais:

+

Dificuldade na formação de grupos:

+
    +
  • Durante o processo de formação de grupos, ocorrem diversos problemas. Alunos que acabam saindo da matéria, mudança de grupos. Assim dificultando o controle de grupos.
  • +
+

Dificuldade no lançamento de notas:

+
    +
  • Devido a grande quantidade de alunos, o processo de correção e lançamento de notas é extenso e exaustivo. Dificultando a entrega de notas e até mesmo gerar um feedback aos alunos para que eles possam melhorar nos pontos em que falharam.
  • +
+

Esses desafios impactam negativamente o andamento do curso, tornando necessário um sistema eficiente e organizado para a resolução dos problemas citados acima. Com isso, aliado ao desejo do professor em gamificar a disciplina, surgiu a ideia do ObjeX.

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/produto-tecnologias/index.html b/produto-tecnologias/index.html new file mode 100644 index 00000000..8d11a3b2 --- /dev/null +++ b/produto-tecnologias/index.html @@ -0,0 +1,1265 @@ + + + + + + + + + + + + + + + + + + + + + + + Tecnologias a Serem Utilizadas - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Visão Geral do Produto

+

Tecnologias a Serem Utilizadas

+

API

+

Tecnologias

+

Banco de dados

+

Tecnologias

+

FrontEnd

+

Tecnologias

+ + + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/projeto-visao/index.html b/projeto-visao/index.html new file mode 100644 index 00000000..cad498fd --- /dev/null +++ b/projeto-visao/index.html @@ -0,0 +1,1705 @@ + + + + + + + + + + + + + + + + + + + + + + + Visão Geral do Projeto - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Visão Geral do Projeto

+ +

Organização do Projeto

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PapelAtribuiçõesResponsávelParticipantes
DesenvolvedorCodificar o produto, codificar testes unitários, realizar refatoraçãoFabricioGustavo, Caio, Arthur, Nicollas, Rayene, Manoel e Fabricio
DesignerPrototipação no Figma, UX/UIFabricioFabricio, Gustavo, Arthur
Dono do ProjetoAtualizar o escopo do produto, organizar o escopo das sprints, validar as entregaGustavoCaio, Nicollas e Gustavo
Engenheiro de RequisitosElicitação e descoberta, Análise e Consenso, Comunicar Requisitos ao cliente, Representação, Verificação e Validação, Organização e AtualizaçãoManoelLuan Mateus, Gustavo, Caio, Arthur, Nicollas, Rayene, Manoel e Fabricio
Análista de QualidadeGarantir a qualidade do produto, garantir o cumprimento do conceito de pronto, realizar inspeções de códigoArthurLuan Mateus, Rayene, Manoel e Arthur
ClienteComunicar as expectativas para o projeto, incluindo especificações técnicas e funcionalidades desejadas. Além de realizar a revisão e aceitação das entregas do projeto.Prof. da Disciplina de Orientação a ObjetosProf. da Disciplina de Orientação a Objetos
+

Planejamento das Fases e/ou Iterações do Projeto

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SprintAtividadesEntregaData InícioData Fim
Sprint 1Visão Geral do Produto, Definição de Abordagem, Ciclo de Vida e Processo de Desenvolvimento, Organização do Projeto, Tecnologias, PlanejamentoEntrega da Missão 1, Gitpages, Visão Geral do Produto, Processo de Desenvolvimento de Software, Visão Geral do Projeto.02/04/202418/04/2024
Sprint 2MVP e Planejamento do Projeto, Definição das US, Backlog do produto.Backlog, US's, MVP, Requisitos Funcionais e Não Funcionais.25/04/202409/05/2024
Sprint 3Protótipos, Desenvolvimento de Testes, Módulo de autenticação e criação de Usuários, Módulo de grupos.Entrega Missão 2, Módulo de Autenticação, Criaçao de usuarios e Módulo de grupos.09/05/202423/05/2024
Sprint 4Protótipos, Desenvolvimento de Testes, Formular Gamificação, Módulo de Atividades.Gamificação, Módulo de atividades.23/05/202406/06/2024
Sprint 5Entrega Missão 3, Protótipos, Desenvolvimento de Testes, Módulo de correção.Módulo de correção.06/06/202420/06/2024
Sprint 6Correções, Elementos fora do MVP (caso haja tempo), Refatorações (se necessário).Entrega Missão 4, Entrega do Produto Final.20/06/202404/07/2024
+

Matriz de Comunicação

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DescriçãoÁrea/EnvolvidosPeriodicidadeProdutos Gerados
Acompanhamento das Atividades em Andamento / Acompanhamento dos Riscos, Compromissos, Ações Pendentes, IndicadoresEquipe, Líder EstelarQuinzenalAta de reunião , Relatório de situação do projeto
Reunião “Daily”EquipeDiáriaRelatório de tarefas a serem realizadas no dia.
Comunicar situação do projetoEquipe, Professor, Líder EstelarSemanalAta de reunião e Relatório de Situação do Projeto
Reunião com o clienteEquipe, ClienteSemanalAta de reunião, Relatório de Situação do Projeto, Homologação, Feedback, Relatório do projeto
+

Atas de reuniões

+ +

Relatório de tarefas - Daily

+ +

Relatório de Situação do projeto

+ +

Gerenciamento de Riscos

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProbabilidadeDescriçãoValor
NenhumaNão há possibilidade de acontecer.0
RaraPequena chance de acontecer1
ProvávelProvavelmente vai acontecer2
Quase certaVai acontecer3
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ImpactoDescriçãoValor
NenhumNenhum impacto ao projeto.0
PequenoPequeno impacto ao projeto.1
MédioMédio impacto ao projeto.2
AltoAlto impacto ao projeto.3
+

Riscos

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDRiscoCategoriaConsequênciaRespostaAçãoRisco/Impacto
1Trocar tecnologiaTecnologiaRetrabalhar funções, aprendizadoAceitarTreinamentos e refatoração2/3
2Trancar disciplinaEquipeCarga de trabalho nos integrantes restantesAceitarRedistribuição das atribuições1/2
3GreveExternaParalização das aulas, consequentemente do projetoMitigarAproveitar o tempo para aprendizado2/3
4Mudança de requisitos pelo clienteOrganizacionalRetrabalhar, adaptar as sprintsAceitarAdaptar as mudanças requisitadas1/3
5Provas de outras matériasExternoIndisponibilidade de integrantes do timeMitigarRedistribuição das atribuições3/2
6Falta de disponibilidade de horáriosOrganizacionalEntregas podem atrasar, comunicação do time é prejudicadaPrevenirHeatmap para definir horários em que a maioria pode se reunir2/2
7Features não aceitas pelo clienteTécnicaRetrabalhoPrevenirAdaptar as necessidades do cliente1/3
+

Critérios de Replanejamento

+
    +
  • +

    Tempo disponível: Durante o desenvolvimento do projeto, podemos enfrentar atrasos significativos em relação ao cronograma inicialmente estabelecido. Se esses atrasos impactarem negativamente o progresso do desenvolvimento, será necessário realizar um replanejamento para garantir que o projeto esteja pronto dentro dos prazos definidos.

    +
  • +
  • +

    Feedback: Caso o cliente manifeste insatisfação com o produto, será necessário realizar uma revisão no projeto e, se viável, um replanejamento das funcionalidades.

    +
  • +
  • +

    Inviabilidade da Tecnologia: Se as tecnologias utilizadas no projeto não conseguirem atender adequadamente aos requisitos, a equipe deverá realizar uma avaliação crítica e uma revisão do projeto.

    +
  • +
  • +

    Adição de novos requisitos: Conforme o projeto progride, é possível que surjam novos requisitos que necessitem da implementação de funcionalidades adicionais ou aumento do escopo de funcionalidades já existentes.

    +
  • +
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/rnf/index.html b/rnf/index.html new file mode 100644 index 00000000..ab8dbda6 --- /dev/null +++ b/rnf/index.html @@ -0,0 +1,1335 @@ + + + + + + + + + + + + + + + + + + + + + + + Requisitos Não Funcionais - ObjeX + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Requisitos Não Funcionais

+ +

Requisitos não funcionais são critérios que definem as características e restrições que um sistema ou software deve possuir, além das suas funcionalidades. Eles se concentram em aspectos que não estão diretamente relacionados às operações específicas do sistema, mas são cruciais para garantir seu desempenho, segurança, usabilidade e eficiência.

+

Objetivo

+

O objetivo dos requisitos não funcionais é assegurar que o sistema seja eficiente, seguro, acessível e fácil de usar. Esses requisitos complementam os requisitos funcionais, garantindo que o sistema não apenas execute suas tarefas, mas também o faça de maneira eficaz e confiável.

+

Metodologia

+

Para definir os requisitos não funcionais do projeto, foram considerados os aspectos de compatibilidade, responsividade, design, desempenho, usabilidade e acessibilidade. Esses requisitos foram estabelecidos com base nas necessidades dos usuários e nas melhores práticas de desenvolvimento de software.

+

Tabela de Requisitos Não Funcionais

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NúmeroTipoDescrição
RNF01CompatibilidadeO site deve ser compatível com os principais navegadores Web em suas versões a partir de 2024: Chrome, Microsoft Edge, Opera, Firefox, Brave e Safari.
RNF02ResponsividadeO site deve ser responsivo, se adaptando a diferentes tamanhos de tela e dispositivos, como smartphones, tablets, notebooks e desktops.
RNF03DesignO site deve manter um design minimalista e consistente em toda a interface: cores, fontes, ícones.
RNF04DesempenhoO site deve ser capaz de lidar com um volume de tráfego de ao menos 1 turma simultânea.
RNF05UsabilidadeO site deve ser intuitivo e fácil de usar, permitindo que usuários com qualquer nível de experiência consigam navegar e encontrar o que querem com facilidade.
RNF06AcessibilidadeO site deve ser acessível seguindo as diretrizes estabelecidas pelo padrão WCAG, no nível AA.
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 00000000..031d8807 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["pt"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Hist\u00f3ria da Fac\u00e7\u00e3o","text":""},{"location":"#cyberhunterz","title":"CyberHunterz","text":"

Kairos e Shin j\u00e1 se conheciam, pois eram do mesmo planeta e testemunharam de perto os efeitos da corrup\u00e7\u00e3o que empobrecia seu mundo. Incapazes de mudar a situa\u00e7\u00e3o, decidiram partir na esperan\u00e7a de evitar que outros planetas sofressem nas m\u00e3os de grandes conglomerados. Foi durante uma miss\u00e3o que encontraram Vincent.

Cada um seguia seu caminho at\u00e9 que Kairos, Shin e Vincent se encontraram em uma miss\u00e3o para extrair dados do grupo Apache. Percebendo sua afinidade e habilidades complementares, decidiram formar um grupo de ca\u00e7adores de recompensas chamado Cyber Hunterz (ainda n\u00e3o oficialmente ligado ao Comando Estelar).

Em busca de vingan\u00e7a, Sim\u00e3o contatou os Cyber Hunterz para prejudicar o conglomerado Celestia. Com o tempo, o grupo se aproximou de Sim\u00e3o, aproveitando suas conex\u00f5es e servi\u00e7os para facilitar suas miss\u00f5es.

Durante uma batalha em um planeta distante, a fac\u00e7\u00e3o - composta por Kairos, Shin, Vincent e Sim\u00e3o - encontrou Dronada. Ela os atacou por engano, acreditando que eles estavam ligados \u00e0 Slitherium, aliada da Spark Tech, que havia destru\u00eddo seu planeta. Ap\u00f3s um longo interrogat\u00f3rio, as tens\u00f5es diminu\u00edram. Reconhecendo o talento de Dronada, os Cyber Hunterz a convidaram para se juntar \u00e0 fac\u00e7\u00e3o, que havia mudado seu c\u00f3digo de conduta e n\u00e3o realizava mais trabalhos sujos.

N\u00e3o se sabe por que Black Star espionava a fac\u00e7\u00e3o, mas mostrou grande habilidade, levando o grupo a recrut\u00e1-lo para seus objetivos misteriosos.

708145 come\u00e7ou a acompanhar os Cyber Hunterz por causa das habilidades de Shin em fabricar bombas brilhantes e do cabelo perfumado a p\u00f3lvora da mo\u00e7a de fogo. Com o tempo, os membros da fac\u00e7\u00e3o a adotaram como parte do grupo.

"},{"location":"#kairos","title":"Kairos","text":"

Caio Moreira Sulz Gonsalves\u00a0\u00a0\u00a0\u00a0

Em um universo distante, no planeta Diafthor\u00e1, um planeta conhecido pela imensa corrup\u00e7\u00e3o que o assolava, surge a hist\u00f3ria de Kairos, um jovem destemido e perspicaz. Desde tenra idade, Kairos foi criado pelo seu pai que sempre o ensinou a andar contra a mar\u00e9 e o sistema, a corrup\u00e7\u00e3o.

O momento decisivo que mudou o destino de Kairos, ocorreu quando seu pai foi obrigado por poderosos pol\u00edticos a assumir um esquema de corrup\u00e7\u00e3o que ele mesmo n\u00e3o teria participado. Kairos testemunhou a seu pai negando e por isso sendo morto. Sentindo-se impotente diante da crueldade que assolava seu lar, foi nesse momento que ele percebeu que n\u00e3o podia mais ficar \u00e0 margem, enquanto outros sofriam.

A partir disso, Kairos cresceu com uma natureza implicante, sendo opositor a tudo que lhe diziam ou sugeriam. Mas encontrou consolo no que seu pai tinha deixado de ensinamento, um c\u00f3digo de honra a ser seguido, por isso ingressou na fac\u00e7\u00e3o dos Ca\u00e7adores de Recompensa. Ele desenvolveu um senso agu\u00e7ado de justi\u00e7a por causa de seu pai e uma determina\u00e7\u00e3o inabal\u00e1vel, caracter\u00edsticas que o ajudaram a enfrentar os desafios que surgiram ao longo do caminho.

Desde ent\u00e3o, viaja pela vastid\u00e3o do espa\u00e7o, enfrentando perigos inimagin\u00e1veis \u200b\u200be buscando recompensas por criminosos procurados. Apesar de sua natureza implicante e de sua reputa\u00e7\u00e3o como um ca\u00e7ador incans\u00e1vel, Kairos \u00e9 conhecido por sua generosidade e lealdade aos seus amigos. Ele se tornou uma figura respeitada entre os ca\u00e7adores de recompensas, um verdadeiro ca\u00e7ador no universo em constante\u00a0expans\u00e3o.

"},{"location":"#vincent","title":"Vincent","text":"

Gustavo Costa de Jesus\u00a0\u00a0\u00a0\u00a0

Vincent, um nativo do planeta NSA, cresceu em meio \u00e0s sombras da cidade de Nocturne Falls, dominada pelo sinistro Conglomerado Apache. Desde jovem, ele testemunhou a explora\u00e7\u00e3o desenfreada do seu lar pelas m\u00e3os gananciosas dessa corpora\u00e7\u00e3o militar, que lucrava com guerras induzidas e caos espalhado.

Determinado a fazer a diferen\u00e7a, Vincent ingressou no ex\u00e9rcito aos 18 anos, acreditando que poderia melhorar as condi\u00e7\u00f5es de sua fam\u00edlia. No entanto, Vincent n\u00e3o imaginava que as t\u00e3o constantes guerras eram causadas pelos interesses do Grupo Apache, que manipulava o governo de NSA.

Durante uma dessas batalhas, Vincent sofreu um terr\u00edvel acidente que custou-lhe um de seus bra\u00e7os, for\u00e7ando-o a se aposentar do servi\u00e7o militar. Sem muitas op\u00e7\u00f5es, ele acabou se juntando \u00e0 corpora\u00e7\u00e3o de Apache, pensando que poderia, de alguma forma, ainda fazer a diferen\u00e7a.

O pre\u00e7o da sua lealdade se mostrou alto quando foi obrigado a cometer seu primeiro ato criminoso, empurrado pelo pr\u00f3prio Apache para eliminar um suposto espi\u00e3o da rival Celestia. A verdade sobre os m\u00e9todos corruptos e criminosos do Grupo Apache come\u00e7ou a se revelar para Vincent quando ele foi encarregado de eliminar outro suposto espi\u00e3o durante um vazamento de informa\u00e7\u00f5es. Investigando mais a fundo, ele descobriu as atrocidades que a corpora\u00e7\u00e3o cometia em nome do lucro.

Percebendo que agora era um alvo, Vincent teve que fugir de Nocturne Falls para salvar sua pr\u00f3pria vida. Refugiando-se em uma fac\u00e7\u00e3o rebelde, ele decidiu lutar contra as injusti\u00e7as perpetradas pelas grandes corpora\u00e7\u00f5es, especialmente contra o Grupo Apache, jurando que sua cidade natal um dia seria livre do jugo opressor que a aprisionava. Assim, equipado com sua determina\u00e7\u00e3o e habilidades adquiridas, Vincent se tornou uma for\u00e7a a ser reconhecida na luta contra o dom\u00ednio corporativo em seu mundo.

"},{"location":"#simao","title":"Sim\u00e3o","text":"

Arthur Rodrigues Sousa\u00a0\u00a0\u00a0\u00a0

Saindo de um planeta humilde, onde a vida n\u00e3o era f\u00e1cil, Sim\u00e3o viu-se mergulhado no mundo do crime em busca de oportunidades para sobreviver. No entanto, o conglomerado de Celestia, na sua \u00e2nsia por semear o caos e promover conflitos, manipulou alguns dos aliados de Sim\u00e3o, resultando na perda de milh\u00f5es de cr\u00e9ditos para ele.

Movido pela sede de retalia\u00e7\u00e3o, Sim\u00e3o decidiu agir e entrou em contato com a fac\u00e7\u00e3o CyberHunterz. Ele viu nessa associa\u00e7\u00e3o uma oportunidade de atingir seus objetivos e prejudicar o conglomerado de Celestia, buscando vingan\u00e7a pela trai\u00e7\u00e3o que sofrera. Ao se unir aos CyberHunterz, Sim\u00e3o planejava n\u00e3o apenas recuperar o que perdera, mas tamb\u00e9m desmantelar as opera\u00e7\u00f5es corruptas que prejudicavam tantos em sua gal\u00e1xia.

"},{"location":"#shin","title":"Shin","text":"

Fabr\u00edcio Macedo de Queiroz\u00a0\u00a0\u00a0\u00a0

Shin n\u00e3o se juntou a fac\u00e7\u00e3o Cyber Hunterz por interesse em fama ou respeito. Tendo nascido em uma regi\u00e3o pobre do planeta Diafthor\u00e1, levou uma vida marcada por desafios, que puderam ser superados com uma boa adaptabilidade. Ele e seu amigo Kairos conseguiram se juntar a uma fac\u00e7\u00e3o determinada (no que diz respeito aos seus interesses). Ele preza muito pelo ganho monet\u00e1rio e de informa\u00e7\u00f5es, tendo em vista suas origens. Tem como hobbie projetar, criar e vender equipamentos para seus companheiros. Enxerga como vantagem ser enviado em algumas invas\u00f5es orquestradas pela Slitherium, j\u00e1 que nessas miss\u00f5es de reconhecimento, \u00e9 plaus\u00edvel que encontre materiais raros desej\u00e1veis para suas cria\u00e7\u00f5es. Mesmo tendo uma personalidade mesquinha, ele preza muito por seus companheiros, e trabalha como um informante do Comando Estelar, passando informa\u00e7\u00f5es privilegiadas dos planos da Slitherium dos quais tenha\u00a0conhecimento.

"},{"location":"#dronada","title":"Dronada","text":"

Rayene Ferreira Almeida\u00a0\u00a0\u00a0\u00a0

Dronada nasceu sob os c\u00e9us avermelhados do exoplaneta Gliese 876d, um mundo onde os extremos eram a norma e a adapta\u00e7\u00e3o era a chave para a sobreviv\u00eancia. Criada por seus pais em uma comunidade subterr\u00e2nea, Dronada aprendeu os segredos da sobreviv\u00eancia em um ambiente hostil. Seu pai, um engenheiro habilidoso, ensinou-lhe a arte de construir dispositivos que podiam resistir \u00e0s for\u00e7as brutais do planeta, enquanto sua m\u00e3e, uma curandeira talentosa, transmitiu-lhe o conhecimento ancestral das plantas e ervas que cresciam em cavernas profundas. Dronada a Gliesiana encontrou seu caminho como ca\u00e7adora de recompensas ap\u00f3s uma trag\u00e9dia sombria que mudou sua vida para sempre. Quando Dronada era jovem, sua fam\u00edlia foi abruptamente assassinada quando um conglomerado chamado Spark Tech, motivado por gan\u00e2ncia e poder, atacou sua comunidade em busca dos recursos tecnol\u00f3gicos do seu povo. Durante o ataque brutal, deixando-a \u00f3rf\u00e3 e consumida pela dor e pela sede de vingan\u00e7a, ela jurou ca\u00e7ar e destruir aqueles respons\u00e1veis pelo ataque. Para honrar os ensinamentos de seus pais ela seguiu em frente com sua fac\u00e7\u00e3o completando as miss\u00f5es em busca de recompensas com \u00e9tica e respeito por aqueles que n\u00e3o carregam a culpa, em busca de justi\u00e7a e vingan\u00e7a por aqueles que injustamente\u00a0se\u00a0foram.

"},{"location":"#black-star","title":"Black Star","text":"

Nicollas Garbield Oliveira Sousa\u00a0\u00a0\u00a0\u00a0

Black Star, um indiv\u00edduo frio e observador, \u00e9 guiado por seus interesses, que frequentemente envolvem dinheiro. No entanto, ele segue a \u00e9tica e a disciplina de seu grupo. Black aprecia as batalhas e as recompensas que elas trazem. Apesar de uma hist\u00f3ria de vida tumultuada, ele \u00e9 um guerreiro leal e competente, sempre vigilante em rela\u00e7\u00e3o a tudo e a todos. Desde a inf\u00e2ncia, envolveu-se em diversos problemas, mas isso lhe proporcionou experi\u00eancia e habilidades\u00a0valiosas.

"},{"location":"#708145","title":"708145","text":"

Manoel Castro Moura Filho\u00a0\u00a0\u00a0\u00a0

20 pontos de qi.

\u2591\u2591\u2591\u2591\u2584\u2584\u2584\u2584\u2580\u2580\u2580\u2580\u2580\u2580\u2580\u2580\u2584\u2584\u2584\u2584\u2584\u2584 \u2591\u2591\u2591\u2591\u2588\u2591\u2591\u2591\u2591\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2591\u2591\u2580\u2580\u2584 \u2591\u2591\u2591\u2588\u2591\u2591\u2591\u2592\u2592\u2592\u2592\u2592\u2592\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2592\u2592\u2592\u2591\u2591\u2588 \u2591\u2591\u2588\u2591\u2591\u2591\u2591\u2591\u2591\u2584\u2588\u2588\u2580\u2584\u2584\u2591\u2591\u2591\u2591\u2591\u2584\u2584\u2584\u2591\u2591\u2591\u2588 \u2591\u2580\u2592\u2584\u2584\u2584\u2592\u2591\u2588\u2580\u2580\u2580\u2580\u2584\u2584\u2588\u2591\u2591\u2591\u2588\u2588\u2584\u2584\u2588\u2591\u2591\u2591\u2588 \u2588\u2592\u2588\u2592\u2584\u2591\u2580\u2584\u2584\u2584\u2580\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2588\u2591\u2591\u2591\u2592\u2592\u2592\u2592\u2592\u2588 \u2588\u2592\u2588\u2591\u2588\u2580\u2584\u2584\u2591\u2591\u2591\u2591\u2591\u2588\u2580\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2584\u2580\u2580\u2580\u2584\u2592\u2588 \u2591\u2588\u2580\u2584\u2591\u2588\u2584\u2591\u2588\u2580\u2584\u2584\u2591\u2580\u2591\u2580\u2580\u2591\u2584\u2584\u2580\u2591\u2591\u2591\u2591\u2588\u2591\u2591\u2588 \u2591\u2591\u2588\u2591\u2591\u2580\u2584\u2580\u2588\u2584\u2584\u2591\u2588\u2580\u2580\u2580\u2584\u2584\u2584\u2584\u2580\u2580\u2588\u2580\u2588\u2588\u2591\u2588 \u2591\u2591\u2591\u2588\u2591\u2591\u2588\u2588\u2591\u2591\u2580\u2588\u2584\u2584\u2584\u2588\u2584\u2584\u2588\u2584\u2588\u2588\u2588\u2588\u2591\u2588 \u2591\u2591\u2591\u2591\u2588\u2591\u2591\u2591\u2580\u2580\u2584\u2591\u2588\u2591\u2591\u2591\u2588\u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2588 \u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2591\u2591\u2591\u2580\u2580\u2584\u2584\u2584\u2588\u2584\u2588\u2584\u2588\u2584\u2588\u2584\u2580\u2591\u2591\u2588 \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2584\u2591\u2592\u2592\u2592\u2592\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2588 \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2580\u2584\u2584\u2591\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2592\u2591\u2588 \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2580\u2584\u2584\u2584\u2584\u2584\u2591\u2591\u2591\u2591\u2591\u2588

"},{"location":"comun-eventos/","title":"USM - ComunEventos","text":"

User Story Mapping (USM) \u00e9 uma t\u00e9cnica de visualiza\u00e7\u00e3o usada para entender as necessidades e jornadas dos usu\u00e1rios ao interagir com um produto ou servi\u00e7o. Ela ajuda equipes de desenvolvimento, designers e stakeholders a organizarem e priorizarem as funcionalidades e requisitos do produto de forma colaborativa.

"},{"location":"comun-eventos/#comuneventos","title":"ComunEventos","text":"

A ComunEventos \u00e9 uma startup criada por tr\u00eas jovens empreendedores que, ap\u00f3s participar de eventos comunit\u00e1rios, identificaram a necessidade de otimizar a experi\u00eancia para organizadores e participantes. A miss\u00e3o da empresa \u00e9 desenvolver uma plataforma online que facilite a organiza\u00e7\u00e3o e promo\u00e7\u00e3o desses eventos, promovendo um ecossistema digital para que a comunidade se conecte e participe de atividades que reflitam seus valores. Eventos comunit\u00e1rios, como feiras, workshops e atividades culturais, s\u00e3o importantes para fortalecer la\u00e7os sociais e promover a coes\u00e3o na comunidade, permitindo que as pessoas se conectem, aprendam e trabalhem juntas para melhorar seu ambiente.

A plataforma ir\u00e1 permitir que Organizadores de Eventos consigam contatar Patrocinadores e Volunt\u00e1rios para organizar os eventos e tamb\u00e9m promov\u00ea-los por meio da plataforma, para que os Participantes interessados consigam ver os detalhes dos eventos, comprar ingressos e ir aos eventos.

"},{"location":"comun-eventos/#usm","title":"USM:","text":"

Foram produzidas 88 Hist\u00f3rias de Usu\u00e1rios, portanto nas tabelas abaixo s\u00f3 foi poss\u00edvel apresentar os T\u00edtulos. Para verificar as Hist\u00f3rias de Usu\u00e1rio \u00e9 necess\u00e1rio expandir os Cards de T\u00edtulo de Hist\u00f3ria de Usu\u00e1rio no Miro (acima), conforme o tutorial:

"},{"location":"comun-eventos/#como-verificar-as-historias-de-usuario","title":"Como verificar as Hist\u00f3rias de Usu\u00e1rio:","text":"

Primeiramente, coloque em tela cheia para facilitar a visualiza\u00e7\u00e3o:

Aproxime do Card que deseja verificar a US, em seguida selecione-o, por fim, aperte o bot\u00e3o com \u00edcone de Expadir:

Des\u00e7a at\u00e9 a descri\u00e7\u00e3o do Card, onde se encontra a Hist\u00f3ria de Usu\u00e1rio:

Observa\u00e7\u00e3o: Caso seja necess\u00e1rio necess\u00e1rio fazer auditoria do \u00faltimo hor\u00e1rio onde foram realizadas modifica\u00e7\u00f5es no quadro Miro para verificar fraude, por favor entrar em contato com a equipe, pois apenas membros com permiss\u00e3o de edi\u00e7\u00e3o conseguem visualizar o hist\u00f3rico do quadro. E a mensagem de \"\u00daltima Modifica\u00e7\u00e3o\" apresentada ao abrir o quadro, geralmente \u00e9 atualizada mesmo sem modifica\u00e7\u00f5es relevantes.

"},{"location":"comun-eventos/#visualizacao-como-tabela-nao-detalha-as-uss","title":"Visualiza\u00e7\u00e3o como Tabela (N\u00e3o detalha as US's)","text":"

Organizador do Evento

Objetivos do Usu\u00e1rio Jornada do Usu\u00e1rio T\u00edtulo das Hist\u00f3rias Fechar com patrocinadores Buscar patrocinadores - Pesquisar patrocinadores que se encaixam com o evento - Criar uma lista de potenciais patrocinadores - Contatar os potenciais patrocinadores Fechar com patrocinadores Apresentar proposta para patrocinadores - Enviar proposta aos patrocinadores - Acompanhar o retorno Fechar com patrocinadores Formalizar contrato - Visualizar os termos do contrato - Assinar o contrato Fechar com fornecedores Encontrar fornecedores - Definir os servi\u00e7os ou produtos - Criar lista de fornecedores em potencial - Contatar esses fornecedores Fechar com fornecedores Estabelecer um acordo - Visualizar os termos do acordo - Assinar o contrato Recrutar volunt\u00e1rios Recrutar volunt\u00e1rios - Definir as atividades do volunt\u00e1rio - Publicar vaga de volunt\u00e1rio - Receber inscri\u00e7\u00f5es - Selecionar volunt\u00e1rios Recrutar volunt\u00e1rios Orientar os volunt\u00e1rios - Criar um plano de orienta\u00e7\u00e3o Recrutar volunt\u00e1rios Treinar os volunt\u00e1rios - Estabelecer o conte\u00fado do treinamento - Vincular esse conte\u00fado com as atividades Planejar Evento Definir tipo de evento - Escolher o conte\u00fado do evento - Escolher o formato do evento - Definir o p\u00fablico-alvo - Definir o objetivo do evento Planejar Evento Definir data, hora e local - Pesquisar a disponibilidade do p\u00fablico-alvo - Definir o local do evento - Escolher o conte\u00fado do evento para ter um tema definido Planejar Evento Planejar log\u00edstica - Definir a hospedagem - Estabelecer a forma de transporte - Definir a alimenta\u00e7\u00e3o Organizar inscri\u00e7\u00e3o Gerenciar processo de inscri\u00e7\u00f5es - Criar formul\u00e1rio de inscri\u00e7\u00e3o - Publicar formul\u00e1rio de inscri\u00e7\u00e3o - Selecionar canais de promo\u00e7\u00e3o - Criar o conte\u00fado da promo\u00e7\u00e3o Organizar inscri\u00e7\u00e3o Processar pagamentos - Criar pagamentos - Monitorar os resultados Organizar inscri\u00e7\u00e3o Emitir ingressos e informa\u00e7\u00f5es aos participantes - Estabelecer os termos do an\u00fancio - Criar o an\u00fancio - Enviar o an\u00fancio - Criar o conte\u00fado da promo\u00e7\u00e3o Divulgar evento Definir estrat\u00e9gia de promo\u00e7\u00e3o do evento e p\u00fablico alvo - Definir os objetivos da promo\u00e7\u00e3o - Definir como promover o evento - Selecionar canais de promo\u00e7\u00e3o - Criar o conte\u00fado da promo\u00e7\u00e3o Divulgar evento Fazer publica\u00e7\u00f5es nas redes sociais - Criar publica\u00e7\u00f5es - Monitorar os resultados Divulgar evento Anunciar em sites e outros meios - Estabelecer os termos do an\u00fancio - Criar o an\u00fancio - Enviar o an\u00fancio Realizar evento Coordenar fornecedores e volunt\u00e1rios - Entregar feedback para fornecedores - Entregar feedback para volunt\u00e1rios Realizar evento Garantir espa\u00e7o e equipamentos - Receber o espa\u00e7o e equipamentos - Monitorar o espa\u00e7o e equipamentos Realizar evento Garantir materiais promocionais - Receber os materiais promocionais - Analisar materiais Realizar evento Gerenciar entrada e sa\u00edda dos participantes - Monitorar a entrada e sa\u00edda de cada participante - Criar um plano de entrada e sa\u00edda

Patrocinador

Objetivos do usu\u00e1rio Jornada do usu\u00e1rio T\u00edtulo das hist\u00f3rias Fechar com organizadores Recebe proposta dos organizadores - Avaliar o prop\u00f3sito do evento Fechar com organizadores Negocia com os organizadores - Estabelecer o escopo do patroc\u00ednio - Determinar direitos e deveres das partes Ampliar visibilidade da marca Promove o evento - Elaborar an\u00fancios publicit\u00e1rios - Divulgar conte\u00fado Ampliar visibilidade da marca Cria la\u00e7os com o p\u00fablico - Interagir com os participantes Gerenciar o impacto da participa\u00e7\u00e3o Coleta feedback de satisfa\u00e7\u00e3o - Realizar pesquisas de satisfa\u00e7\u00e3o Gerenciar o impacto da participa\u00e7\u00e3o Avalia o engajamento da empresa nas redes sociais - Conferir o n\u00famero de seguidores - Conferir o n\u00famero de \"curtidas\" Gerenciar o impacto da participa\u00e7\u00e3o Compara as vendas da empresa antes e depois do patroc\u00ednio - Avaliar o volume das vendas - Avaliar o valor das vendas

Volunt\u00e1rios

Objetivos do usu\u00e1rio Jornada do usu\u00e1rio T\u00edtulo das hist\u00f3rias Obter informa\u00e7\u00f5es sobre o evento Procura por evento de interesse - Procurar por eventos de interesse - Procurar por meio de palavras-chave de interesse - Se informar sobre o evento Participar do processo de inscri\u00e7\u00e3o Se inscreve como volunt\u00e1rio (a) no evento - Localizar e preenche formul\u00e1rio de inscri\u00e7\u00e3o - Selecionar as atividades desejadas - Enviar a inscri\u00e7\u00e3o Participar do processo de inscri\u00e7\u00e3o Se comunica com os organizadores - Acessar o canal de comunica\u00e7\u00e3o com os organizadores - Receber mensagens - Enviar mensagens Realizar treinamento Recebe instru\u00e7\u00f5es de suas atividades e responsabilidades - Acessar a p\u00e1gina de instru\u00e7\u00f5es - Receber as informa\u00e7\u00f5es b\u00e1sicas do evento Realizar treinamento Recebe feedback do organizador - Receber feedback por parte do organizador

Participante

Objetivos do usu\u00e1rio Jornada do usu\u00e1rio T\u00edtulo das hist\u00f3rias Ir em um evento Procurar por eventos - Pesquisar por eventos de interesse Ir em um evento Obter informa\u00e7\u00f5es sobre o evento - Checar detalhes do evento, como data e local Ir em um evento Inscrever-se no evento - Visualizar informa\u00e7\u00f5es do evento - Realizar cadastro na plataforma - Adquirir ingressos - Escolher ingressos, preencher dados e confirmar compra Ir em um evento Ir ao evento - Ler a programa\u00e7\u00e3o e hor\u00e1rios do evento - Navegar at\u00e9 o local do evento Dar Feedback Publicar feedback - Publicar um coment\u00e1rio sobre o evento

"},{"location":"entrega-missao1/","title":"Entregas","text":""},{"location":"entrega-missao1/#apresentacao-da-faccao","title":"Apresenta\u00e7\u00e3o da fac\u00e7\u00e3o","text":""},{"location":"entrega-missao1/#material-apresentacao-de-processo-de-desenvolvimento-de-software","title":"Material Apresenta\u00e7ao de Processo de Desenvolvimento de Software","text":""},{"location":"entrega-missao1/#video-da-entrega","title":"V\u00eddeo da Entrega","text":""},{"location":"entrega-missao2/","title":"V\u00eddeo da Entrega","text":""},{"location":"entrega-missao2/#video-da-entrega","title":"V\u00eddeo da Entrega","text":""},{"location":"entrega-missao3/","title":"V\u00eddeo da Entrega","text":""},{"location":"entrega-missao3/#video-da-entrega","title":"V\u00eddeo da Entrega","text":""},{"location":"healthnet-pbb/","title":"PBB - HealthNet","text":"

Product Backlog Building (PBB) \u00e9 um m\u00e9todo sistem\u00e1tico para criar e refinar o backlog de produto. Ele visa maximizar o valor entregue ao cliente, otimizando o esfor\u00e7o da equipe de desenvolvimento. O PBB \u00e9 aplicado para identificar problemas, expectativas e necessidades das personas, definindo e priorizando itens no backlog de forma colaborativa para uma vis\u00e3o hol\u00edstica do produto. O PBB \u00e9 um processo cont\u00ednuo que come\u00e7a antes do in\u00edcio do projeto e continua durante todo o ciclo de vida do projeto. Ele \u00e9 usado para garantir que o projeto esteja sempre alinhado com as necessidades do neg\u00f3cio e dos usu\u00e1rios, e para garantir que o trabalho do time de desenvolvimento esteja sempre focado nas coisas mais importantes.

"},{"location":"healthnet-pbb/#healthnet","title":"HealthNet","text":"

A \"HealthNet\" enfrenta um desafio significativo devido \u00e0 falta de uma estrutura unificada para a gest\u00e3o de dados de pacientes em suas diversas unidades espalhadas por v\u00e1rios estados. Os profissionais de sa\u00fade lidam com sistemas desatualizados e incompat\u00edveis, resultando em prontu\u00e1rios isolados que n\u00e3o se comunicam entre si. Isso atrasa os processos, aumenta o risco de erros m\u00e9dicos e dificulta o acesso a informa\u00e7\u00f5es completas e atualizadas. Al\u00e9m disso, os sistemas de agendamento de consultas s\u00e3o ineficientes, causando longos tempos de espera e frustra\u00e7\u00e3o. O controle de medicamentos tamb\u00e9m \u00e9 prejudicado, dificultando o rastreamento de prescri\u00e7\u00f5es e aumentando o risco de complica\u00e7\u00f5es m\u00e9dicas. A depend\u00eancia de processos manuais e papelada agrava ainda mais a situa\u00e7\u00e3o, tornando as opera\u00e7\u00f5es lentas, propensas a erros, e complicando a conformidade com regulamenta\u00e7\u00f5es de prote\u00e7\u00e3o de dados de sa\u00fade.

A atividade de PBB foi realizada com a cria\u00e7\u00e3o de 3 Frames no Miro, sendo o primeiro (PBB) o diagrama PBB em si, detalhando os Problemas e Expectativas acerca de como \u00e9 feito atualmente e como as personas esperam que seja. Detalha as personas, informando o que elas fazem e o que elas esperam fazer no produto.

Em seguido h\u00e1 o detalhamento das features, que s\u00e3o derivadas das expectativas de cada persona. As features tem \u00e0 esquerda os problemas ou necessidades associados, e \u00e0 direita os benef\u00edcios que essa feature traz.

Logo em seguida, s\u00e3o mostrados os Itens do Product Backlog, que s\u00e3o as Hist\u00f3rias de Usu\u00e1rios geradas com base em cada uma das Features informadas anteriormente, e cada um desses itens s\u00e3o detalhados em forma de US no Frame US's logo abaixo.

A prioriza\u00e7\u00e3o das US's foi feita em seguida, no Frame chamado PRIORIZA\u00c7\u00c3O COORG, utilizando o m\u00e9todo de prioriza\u00e7\u00e3o COORG, onde a prioriza\u00e7\u00e3o \u00e9 realizada verticalmente e horizontalmente, onde, verticalmente representa a prioridade (quanto mais alta, maior), e horizontalmente representando a sequ\u00eancia l\u00f3gica de ordem.

"},{"location":"healthnet-pbb/#pbb-do-projeto-objex","title":"PBB do Projeto (ObjeX)","text":"

A t\u00edtulo de curiosidade, segue o PBB do nosso pr\u00f3prio projeto.

A cria\u00e7\u00e3o segue a mesma apresentada no PBB da atividade (HealthNet), com a diferen\u00e7a de que s\u00f3 possui dois Frames no Miro, o primeiro sendo o PBB em si, e o segundo (Pontua\u00e7\u00e3o VN DFD) sendo a prioriza\u00e7\u00e3o das US's seguindo o m\u00e9todo de Prioriza\u00e7\u00e3o Dificuldade + Valor\u00a0de\u00a0Neg\u00f3cio.

"},{"location":"licoes-missao1/","title":"Li\u00e7\u00f5es Aprendidas","text":""},{"location":"licoes-missao1/#unidade-1","title":"Unidade 1","text":"

Durante a nossa primeira tarefa, a equipe teve a oportunidade de adquirir v\u00e1rias li\u00e7\u00f5es significativas. Encontramos alguns obst\u00e1culos devido a conflitos de hor\u00e1rios entre os membros da equipe, mas todos se mostraram dispostos a contribuir quando podiam.

A maior dificuldade que o grupo enfrentou foi em rela\u00e7\u00e3o \u00e0 documenta\u00e7\u00e3o do projeto. Isso nos levou a gastar um tempo consider\u00e1vel em reuni\u00f5es, pois havia muitas d\u00favidas e opini\u00f5es diferentes a serem consideradas. A complexidade da documenta\u00e7\u00e3o exigiu que todos os membros da equipe estivessem na mesma p\u00e1gina, o que se mostrou um desafio. No entanto, a equipe se mostrou resiliente e disposta a superar esses obst\u00e1culos.

Apesar desses desafios, uma das li\u00e7\u00f5es mais positivas que tiramos foi o interesse e o empenho demonstrados pelos membros da equipe. Todos compartilhavam uma vis\u00e3o unificada e um entendimento aprofundado do projeto, o que facilitou bastante o processo de desenvolvimento. Esse alinhamento permitiu que a equipe superasse as dificuldades encontradas na documenta\u00e7\u00e3o e mantivesse o foco no objetivo final.

Ap\u00f3s uma reuni\u00e3o produtiva com o professor (cliente), a equipe conseguiu chegar a um consenso sobre os objetivos principais do projeto com facilidade. Isso nos permitiu definir as metas e diretrizes estabelecidas, resultando em um planejamento mais robusto e uma execu\u00e7\u00e3o mais fluida. A participa\u00e7\u00e3o de todos na reuni\u00e3o foi crucial para garantir que todos estivessem alinhados com os objetivos do projeto. Isso, por sua vez, facilitou a coordena\u00e7\u00e3o e a colabora\u00e7\u00e3o dentro da equipe, permitindo uma execu\u00e7\u00e3o mais suave do projeto.

"},{"location":"licoes-missao1/#unidade-2","title":"Unidade 2","text":"

Durante a segunda unidade, a equipe continuou a desenvolver suas habilidades e aprofundou seus conhecimentos em metodologias \u00e1geis e pr\u00e1ticas de desenvolvimento de software. Um dos principais focos foi a implementa\u00e7\u00e3o de PBB (Product Backlog Building), SAFe (Scaled Agile Framework), MVP (Minimum Viable Product), crit\u00e9rios de aceita\u00e7\u00e3o e pontua\u00e7\u00e3o, e a cria\u00e7\u00e3o de diagramas de fluxo de dados (DFD).

A ado\u00e7\u00e3o do PBB foi fundamental para a organiza\u00e7\u00e3o do backlog do projeto. A equipe conseguiu dividir as tarefas de maneira mais eficiente e priorizar as entregas com base nas necessidades do cliente.

O SAFe foi introduzido para escalonar as pr\u00e1ticas \u00e1geis em toda a equipe. Isso trouxe uma estrutura mais robusta para a gest\u00e3o do projeto, promovendo melhor colabora\u00e7\u00e3o entre os membros e facilitando a coordena\u00e7\u00e3o de tarefas.

A cria\u00e7\u00e3o do MVP foi um dos pontos altos desta unidade. A equipe se concentrou em desenvolver uma vers\u00e3o b\u00e1sica, mas funcional, do produto, que pudesse ser apresentada ao cliente para feedback inicial.

Os crit\u00e9rios de aceita\u00e7\u00e3o foram definidos com clareza para cada funcionalidade do projeto. Isso garantiu que todos os membros da equipe tivessem um entendimento comum sobre o que era necess\u00e1rio para considerar uma tarefa conclu\u00edda com sucesso.

Por fim, a elabora\u00e7\u00e3o dos diagramas de fluxo de dados (DFD) foi crucial para entender melhor o fluxo de informa\u00e7\u00f5es dentro do sistema.

Em resumo, a segunda unidade foi marcada por um avan\u00e7o significativo nas pr\u00e1ticas de desenvolvimento e na organiza\u00e7\u00e3o da equipe. As metodologias e ferramentas implementadas ajudaram a melhorar a efici\u00eancia e a efic\u00e1cia do projeto, preparando a equipe para os desafios das pr\u00f3ximas etapas.

"},{"location":"licoes-missao2/","title":"Li\u00e7\u00f5es Aprendidas","text":"

Durante a segunda unidade, a equipe continuou a desenvolver suas habilidades e aprofundou seus conhecimentos em metodologias \u00e1geis e pr\u00e1ticas de desenvolvimento de software. Um dos principais focos foi a implementa\u00e7\u00e3o de PBB (Product Backlog Building), SAFe (Scaled Agile Framework), MVP (Minimum Viable Product), crit\u00e9rios de aceita\u00e7\u00e3o e pontua\u00e7\u00e3o.

A ado\u00e7\u00e3o do PBB foi fundamental para a organiza\u00e7\u00e3o do backlog do projeto. A equipe conseguiu dividir as tarefas de maneira mais eficiente e priorizar as entregas com base nas necessidades do cliente.

O SAFe foi introduzido para escalonar as pr\u00e1ticas \u00e1geis em toda a equipe. Isso trouxe uma estrutura mais robusta para a gest\u00e3o do projeto, promovendo melhor colabora\u00e7\u00e3o entre os membros e facilitando a coordena\u00e7\u00e3o de tarefas.

A cria\u00e7\u00e3o do MVP foi um dos pontos altos desta unidade. A equipe se concentrou em desenvolver uma vers\u00e3o b\u00e1sica, mas funcional, do produto, que pudesse ser apresentada ao cliente para feedback inicial.

Os crit\u00e9rios de aceita\u00e7\u00e3o foram definidos com clareza para cada funcionalidade do projeto. Isso garantiu que todos os membros da equipe tivessem um entendimento comum sobre o que era necess\u00e1rio para considerar uma tarefa conclu\u00edda com sucesso.

Em resumo, a segunda unidade foi marcada por um avan\u00e7o significativo nas pr\u00e1ticas de desenvolvimento e na organiza\u00e7\u00e3o da equipe. As metodologias e ferramentas implementadas ajudaram a melhorar a efici\u00eancia e a efic\u00e1cia do projeto, preparando a equipe para os desafios das pr\u00f3ximas etapas.

"},{"location":"licoes-missao3/","title":"Li\u00e7\u00f5es Aprendidas","text":"

Nessa miss\u00e3o, dois conceitos chave estudados foram o User Story Mapping (USM) e o Product Backlog Building (PBB), que desempenham pap\u00e9is cruciais na organiza\u00e7\u00e3o e prioriza\u00e7\u00e3o dos requisitos. Aplicando o USM, percebemos como \u00e9 poss\u00edvel alinhar as necessidades dos stakeholders com o backlog do produto, facilitando a comunica\u00e7\u00e3o entre as equipes e o entendimento do que realmente \u00e9 cr\u00edtico para o sucesso do projeto. Ao longo do semestre, compreendemos a import\u00e2ncia de t\u00e9cnicas como USM e PBB para o desenvolvimento de produtos de software que atendam \u00e0s expectativas dos usu\u00e1rios e aos objetivos de neg\u00f3cio. Essas pr\u00e1ticas s\u00e3o essenciais para garantir que o processo de desenvolvimento seja \u00e1gil, eficiente e focado na entrega de valor.

"},{"location":"missao2-criterios-aceitacao/","title":"Crit\u00e9rios de Aceita\u00e7\u00e3o","text":"

Crit\u00e9rios de aceita\u00e7\u00e3o s\u00e3o fundamentais no processo de Desenvolvimento de Software, fornecendo defini\u00e7\u00f5es claras e objetivas que definem quando determinada funcionalidade ou requisito \u00e9 considerado satisfatoriamente implementado. Esses crit\u00e9rios s\u00e3o estabelecidos em colabora\u00e7\u00e3o com os stakeholder(s), cliente(s), usu\u00e1rio(s) e membro(s) da equipe de desenvolvimento, para garantir uma compreens\u00e3o comum das expectativas e padr\u00f5es de qualidade esperados.

As imagens a seguir, apresentam os Crit\u00e9rios de Aceita\u00e7\u00e3o para cada uma das Hist\u00f3rias de Usu\u00e1rios presentes no MVP, provisoriamente definidos pelo time e stakeholder(s) na Miss\u00e3o 2.

"},{"location":"missao2-criterios-aceitacao/#criterios-de-aceitacao-fe01-crud-turma","title":"Crit\u00e9rios de Aceita\u00e7\u00e3o FE01 - CRUD Turma","text":""},{"location":"missao2-criterios-aceitacao/#criterios-de-aceitacao-fe02-crud-aluno","title":"Crit\u00e9rios de Aceita\u00e7\u00e3o FE02 - CRUD Aluno","text":""},{"location":"missao2-criterios-aceitacao/#criterios-de-aceitacao-fe03-crud-monitor","title":"Crit\u00e9rios de Aceita\u00e7\u00e3o FE03 - CRUD Monitor","text":""},{"location":"missao2-criterios-aceitacao/#criterios-de-aceitacao-fe04-crud-grupo","title":"Crit\u00e9rios de Aceita\u00e7\u00e3o FE04 - CRUD Grupo","text":""},{"location":"missao2-criterios-aceitacao/#criterios-de-aceitacao-fe05-crud-conteudo","title":"Crit\u00e9rios de Aceita\u00e7\u00e3o FE05 - CRUD Conte\u00fado","text":"

N\u00e3o entrou no MVP.

"},{"location":"missao2-criterios-aceitacao/#criterios-de-aceitacao-fe06-crud-atividade","title":"Crit\u00e9rios de Aceita\u00e7\u00e3o FE06 - CRUD Atividade","text":""},{"location":"missao2-criterios-aceitacao/#criterios-de-aceitacao-fe07-emitir-planilhas","title":"Crit\u00e9rios de Aceita\u00e7\u00e3o FE07 - Emitir Planilhas","text":""},{"location":"missao2-criterios-aceitacao/#criterios-de-aceitacao-fe08-corrigir-atividades","title":"Crit\u00e9rios de Aceita\u00e7\u00e3o FE08 - Corrigir Atividades","text":""},{"location":"missao2-criterios-aceitacao/#criterios-de-aceitacao-fe09-crud-professor","title":"Crit\u00e9rios de Aceita\u00e7\u00e3o FE09 - CRUD Professor","text":""},{"location":"missao2-criterios-aceitacao/#criterios-de-aceitacao-fe10-inserir-feedback","title":"Crit\u00e9rios de Aceita\u00e7\u00e3o FE10 - Inserir Feedback","text":"

N\u00e3o entrou no MVP.

"},{"location":"missao2-criterios-aceitacao/#criterios-de-aceitacao-fe11-submeter-atividades","title":"Crit\u00e9rios de Aceita\u00e7\u00e3o FE11 - Submeter Atividades","text":""},{"location":"missao2-criterios-aceitacao/#criterios-de-aceitacao-fe12-entrar-e-sair-de-grupos","title":"Crit\u00e9rios de Aceita\u00e7\u00e3o FE12 - Entrar e Sair de Grupos","text":""},{"location":"missao2-criterios-aceitacao/#criterios-de-aceitacao-fe14-professoradmin-login-e-logout","title":"Crit\u00e9rios de Aceita\u00e7\u00e3o FE14 - Professor/Admin Login e Logout","text":""},{"location":"missao2-criterios-aceitacao/#criterios-de-aceitacao-fe15-alunomonitor-login-e-logout","title":"Crit\u00e9rios de Aceita\u00e7\u00e3o FE15 - Aluno/Monitor Login e Logout","text":""},{"location":"missao2-criterios-aceitacao/#criterios-de-aceitacao-fe13-visualizar-e-baixar-conteudos","title":"Crit\u00e9rios de Aceita\u00e7\u00e3o FE13 - Visualizar e Baixar Conte\u00fados","text":"

N\u00e3o entrou no MVP.

"},{"location":"missao2-mvp/","title":"MVP (Minimum Viable Product)","text":"

O conceito de MVP (Minimum Viable Product), ou Produto M\u00ednimo Vi\u00e1vel, \u00e9 fundamental na engenharia de software e no desenvolvimento de produtos. Um MVP \u00e9 a vers\u00e3o mais simples e funcional de um produto, contendo apenas as caracter\u00edsticas essenciais necess\u00e1rias para atender \u00e0s necessidades b\u00e1sicas dos usu\u00e1rios iniciais e validar a viabilidade da ideia no mercado. Ele permite que as empresas lancem rapidamente um produto para obter feedback real dos usu\u00e1rios, reduzindo riscos e orientando melhorias cont\u00ednuas com base nas respostas recebidas. Essa abordagem \u00e1gil ajuda a garantir que o desenvolvimento siga na dire\u00e7\u00e3o certa, otimizando recursos e aumentando as chances de sucesso.

"},{"location":"missao2-mvp/#uss-que-fazem-parte-do-mvp","title":"US's que fazem parte do MVP","text":"\u00c9pico US Descri\u00e7\u00e3o EP01 - Professor US01 Eu como professor, quero ser capaz de criar uma turma, para que os Alunos possam ser inseridos EP01 - Professor US02 Eu como professor, quero ser capaz de visualizar uma turma, para verificar os alunos nela inseridos EP01 - Professor US03 Eu como professor, quero ser capaz de deletar uma turma, para caso ela n\u00e3o seja necess\u00e1ria EP01 - Professor US04 Eu como professor, quero ser capaz de criar um aluno, para que ele possa exercer suas fun\u00e7\u00f5es EP01 - Professor US05 Eu como professor, quero ser capaz de visualizar os alunos, para verificar suas informa\u00e7\u00f5es EP01 - Professor US06 Eu como professor, quero ser capaz de editar um aluno, para mudar as informa\u00e7\u00f5es do mesmo EP01 - Professor US07 Eu como professor, quero ser capaz de deletar um aluno, para caso ele n\u00e3o seja necess\u00e1rio EP01 - Professor US08 Eu como professor, quero ser capaz de criar um monitor, para que ele possa exercer suas fun\u00e7\u00f5es EP01 - Professor US09 Eu como professor, quero ser capaz de visualizar os monitores, para verificar suas informa\u00e7\u00f5es EP01 - Professor US10 Eu como professor, quero ser capaz de editar um monitor, para mudar as informa\u00e7\u00f5es do mesmo EP01 - Professor US11 Eu como professor, quero ser capaz de deletar um monitor, para caso ele n\u00e3o seja necess\u00e1rio EP01 - Professor US12 Eu como professor, quero ser capaz de criar um grupo, para que os Alunos possam entrar ou sair EP01 - Professor US13 Eu como professor, quero ser capaz de visualizar um grupo, para verificar os alunos nele inseridos EP01 - Professor US14 Eu como professor, quero ser capaz de editar um grupo, para mudar as informa\u00e7\u00f5es do mesmo EP01 - Professor US15 Eu como professor, quero ser capaz de deletar um grupo, para caso ele n\u00e3o seja necess\u00e1rio EP01 - Professor US20 Eu como professor, quero ser capaz criar uma atividade e inserir na plataforma para que os alunos possam realiza-las EP01 - Professor US21 Eu como professor, quero ser capaz de visualizar uma atividade inserida na plataforma para facilitar na organiza\u00e7\u00e3o EP01 - Professor US22 Eu como professor, quero ser capaz de editar uma atividade, para mudar a descri\u00e7\u00e3o ou resposta da mesma EP01 - Professor US23 Eu como professor, quero ser capaz de deletar uma atividade para caso ela n\u00e3o seja mais necess\u00e1ria EP01 - Professor US24 Eu como professor quero emitir planilhas de grupos formados para facilitar a organiza\u00e7\u00e3o dos mesmos EP01 - Professor US25 Eu como professor quero emitir planilhas de turmas para facilitar a organiza\u00e7\u00e3o das mesmas EP01 - Professor US26 Eu como professor quero corrigir as atividades dos alunos para poder atribuir notas EP01 - Professor US27 Eu como professor Admin, quero ser capaz de cadastrar um professor para que ele consiga exercer suas fun\u00e7\u00f5es EP01 - Professor US28 Eu como professor Admin, quero ser capaz de editar um professor para alterar suas informa\u00e7\u00f5es EP01 - Professor US29 Eu como professor Admin, quero ser capaz de visualizar um professor para verificar suas informa\u00e7\u00f5es EP01 - Professor US30 Eu como professor Admin, quero ser capaz de deletar um professor\u00a0para caso ele n\u00e3o seja necess\u00e1rio EP01 - Professor US40 Eu como Professor/Admin desejo fazer login para ter acesso \u00e0s funcionalidades EP01 - Professor US41 Eu como Professor/Admin desejo fazer logout para sair da plataforma de maneira segura EP02, EP03 - Aluno/Monitor US38 Eu como aluno/monitor desejo fazer login\u00a0para ter acesso \u00e0s funcionalidades EP02, EP03 - Aluno/Monitor US39 Eu como aluno/monitor desejo fazer logout\u00a0para sair da plataforma de maneira segura EP03 - Alunos US32 Eu como aluno desejo responder atividades de m\u00faltipla escolha para poder ser avaliado EP03 - Alunos US33 Eu como aluno desejo responder atividades de c\u00f3digo para poder ser avaliado EP03 - Alunos US34 Eu como aluno desejo responder atividades de envio de imagem para poder ser avaliado EP03 - Alunos US35 Eu como aluno desejo entrar em um grupo para que eu possa participar das atividades da disciplina EP03 - Alunos US36 Eu como aluno desejo sair de um grupo para caso eu n\u00e3o esteja mais nele

"},{"location":"missao2-mvp/#uss-que-nao-fazem-parte-do-mvp","title":"US's que n\u00e3o fazem parte do MVP","text":"\u00c9pico US Descri\u00e7\u00e3o EP01 - Professor US16 Eu como professor, quero ser capaz de disponibilizar conte\u00fado sobre a mat\u00e9ria na plataforma para facilitar o ensino\u00a0 EP01 - Professor US17 Eu como professor, quero ser capaz de visualizar um conte\u00fado inserido na plataforma para ajudar na organiza\u00e7\u00e3o e ensino EP01 - Professor US18 Eu como professor, quero ser capaz de editar um conte\u00fado, para mudar as informa\u00e7\u00f5es EP01 - Professor US19 Eu como professor, quero ser capaz de deletar um conte\u00fado para caso ele n\u00e3o seja mais necess\u00e1rio EP02 - Monitor US31 Eu como monitor desejo fornecer feedback para os alunos para auxiliar no desenvolvimento de atividades EP03 - Alunos US37 Eu como aluno desejo visualizar\u00a0 conte\u00fados disponibilizados pelo professor e fazer o download para auxiliar nos meus estudos"},{"location":"missao2-safe/","title":"Diagrama SAFe","text":"

O diagrama SAFe (Scaled Agile Framework) \u00e9 uma visualiza\u00e7\u00e3o das pr\u00e1ticas e princ\u00edpios do SAFe, utilizado para aplicar metodologias \u00e1geis em grandes organiza\u00e7\u00f5es. Ele facilita a coordena\u00e7\u00e3o entre m\u00faltiplos times para entrega cont\u00ednua de valor.

"},{"location":"missao2-safe/#tema-estrategico","title":"Tema Estrat\u00e9gico","text":"

Iniciativa de alto n\u00edvel que alinha a execu\u00e7\u00e3o do trabalho \u00e1gil com os objetivos estrat\u00e9gicos do projeto. Neste caso, est\u00e3o divididos de acordo com as \u00e1reas do sistema.

"},{"location":"missao2-safe/#epicos","title":"\u00c9picos","text":"

Representam grandes iniciativas ou grandes marcos para o projeto, tamb\u00e9m representa um grande esfor\u00e7o que requer a coordena\u00e7\u00e3o de m\u00faltiplas equipes no projeto. Em nosso caso, separamos em 3 \u00c9picos, que representam os m\u00f3dulos da aplica\u00e7\u00e3o.

"},{"location":"missao2-safe/#capacidades","title":"Capacidades","text":"

S\u00e3o conjuntos de funcionalidades de n\u00edvel mais alto, est\u00e3o dividos de acordo com as funcionalidades fornecem valor significativo para os stakeholders.

"},{"location":"missao2-safe/#features","title":"Features","text":"

S\u00e3o unidades de trabalho que entregam valor direto aos stakeholders. Representam peda\u00e7os significativos de funcinalidades que podem ser desenvolvidos, testados e entregues de forma incremental.

"},{"location":"missao2-safe/#features-professor-e-professor-admin","title":"Features - Professor e Professor Admin","text":""},{"location":"missao2-safe/#features-monitor","title":"Features - Monitor","text":""},{"location":"missao2-safe/#features-alunos","title":"Features - Alunos","text":""},{"location":"pontuacao/","title":"Pontua\u00e7\u00e3o das Hist\u00f3rias de Usu\u00e1rio (User Stories)","text":""},{"location":"pontuacao/#valor-de-negocio","title":"Valor de Neg\u00f3cio","text":"

Refere-se \u00e0 import\u00e2ncia ou impacto que uma hist\u00f3ria de usu\u00e1rio ter\u00e1 para o neg\u00f3cio.

Tabela 1 - Pontua\u00e7\u00e3o de Valor de Neg\u00f3cio

Pontua\u00e7\u00e3o Valor de Neg\u00f3cio 1 Valor de neg\u00f3cio Baixo 2 Valor de neg\u00f3cio M\u00e9dio 3 Valor de neg\u00f3cio Alto 4 Valor de neg\u00f3cio Muito Alto

"},{"location":"pontuacao/#dificuldade","title":"Dificuldade","text":"

A dificuldade mede o esfor\u00e7o necess\u00e1rio para implementar uma hist\u00f3ria de usu\u00e1rio. Esse conceito ajuda a avaliar o tempo e os recursos que ser\u00e3o necess\u00e1rios para concluir uma tarefa.

Tabela 2 - Pontua\u00e7\u00e3o de Dificuldade

Pontua\u00e7\u00e3o Dificuldade 1 Muito Dif\u00edcil 2 M\u00e9dio 3 Relativamente F\u00e1cil

"},{"location":"pontuacao/#pontuacao","title":"Pontua\u00e7\u00e3o","text":"

A pontua\u00e7\u00e3o \u00e9 a soma do valor de neg\u00f3cio e da dificuldade. Essa m\u00e9trica \u00e9 \u00fatil para dar uma vis\u00e3o geral de quais hist\u00f3rias de usu\u00e1rios devem ser priorizadas, levando em conta tanto o impacto para o neg\u00f3cio quanto o esfor\u00e7o necess\u00e1rio para sua implementa\u00e7\u00e3o. A pontua\u00e7\u00e3o ajuda a equilibrar a prioriza\u00e7\u00e3o, considerando tanto a import\u00e2ncia da tarefa quanto a viabilidade de sua conclus\u00e3o.

Por exemplo, na tabela, a hist\u00f3ria de usu\u00e1rio \"US01\" tem um valor de neg\u00f3cio 4 (muito alto) e uma dificuldade 3 (relativamente f\u00e1cil), resultando em uma pontua\u00e7\u00e3o total de 7. Essa hist\u00f3ria de usu\u00e1rio seria considerada de alta prioridade, pois oferece um alto valor de neg\u00f3cio com um esfor\u00e7o relativamente baixo para sua implementa\u00e7\u00e3o.

Tabela 3 - Pontua\u00e7\u00e3o das User Stories

US Valor de Neg\u00f3cio Dificuldade Pontua\u00e7\u00e3o US01 4 3 7 US05 4 3 7 US13 4 3 7 US24 4 3 7 US25 4 3 7 US26 4 3 7 US27 4 3 7 US28 4 3 7 US29 4 3 7 US30 4 3 7 US35 4 3 7 US36 4 3 7 US04 4 2 6 US08 4 2 6 US12 4 2 6 US20 3 3 6 US21 3 3 6 US22 3 3 6 US23 3 3 6 US32 4 2 6 US34 4 2 6 US02 3 2 5 US06 3 2 5 US07 2 3 5 US09 2 3 5 US10 2 3 5 US14 3 2 5 US15 2 3 5 US33 4 1 5 US11 1 3 4 US03 2 1 3 US38 3 3 7 US39 3 3 7 US40 3 3 7 US41 3 3 7

"},{"location":"processo-desenvolvimento/","title":"Processo de Desenvolvimento de Software","text":""},{"location":"processo-desenvolvimento/#abordagem-agil","title":"Abordagem \u00c1gil:","text":"

Considerando que nossa ferramenta ser\u00e1 uma pe\u00e7a fundamental no ambiente de trabalho do cliente, \u00e9 essencial mantermos um fluxo de feedback cont\u00ednuo. A comunica\u00e7\u00e3o informal \u00e9 favorecida devido ao envolvimento pr\u00e9vio de um dos nossos integrantes com o cliente, al\u00e9m do contexto de equipe reduzida.

Dada a restri\u00e7\u00e3o de tempo e a necessidade de adapta\u00e7\u00e3o r\u00e1pida \u00e0s demandas e prefer\u00eancias do cliente, a abordagem \u00c1gil emerge como a escolha mais apropriada. Essa metodologia nos permite ser flex\u00edveis e \u00e1geis na entrega de valor, ajustando-nos de maneira eficaz \u00e0s mudan\u00e7as e \u00e0s especificidades do projeto.

"},{"location":"processo-desenvolvimento/#ciclo-de-vida-agil-iterativo-e-incremental","title":"Ciclo de Vida: \u00c1gil (Iterativo e Incremental)","text":"

No contexto do ciclo de vida \u00e1gil, adotamos uma abordagem iterativa e incremental que se alinha perfeitamente com as necessidades de acesso antecipado do cliente a funcionalidades espec\u00edficas, mesmo antes da conclus\u00e3o final do software.

Destacamos a participa\u00e7\u00e3o ativa do cliente com Feedback como um pilar fundamental. A colabora\u00e7\u00e3o entre o grupo e cliente \u00e9 maximizada, permitindo um entendimento mais profundo das necessidades em evolu\u00e7\u00e3o e aprimorando a capacidade de adapta\u00e7\u00e3o do produto \u00e0s expectativas em constante mudan\u00e7a.

Essa abordagem promove n\u00e3o apenas um maior alinhamento entre as partes envolvidas, mas tamb\u00e9m permite a entrega de valor de forma progressiva e tang\u00edvel ao longo do ciclo de desenvolvimento, garantindo que o software evolua de maneira colaborativa e eficiente para atender \u00e0s necessidades e expectativas do cliente.

"},{"location":"processo-desenvolvimento/#processo-scrumxp","title":"Processo: ScrumXP","text":"

o ScrumXP \u00e9 uma abordagem que combina a gest\u00e3o de projeto do Scrum com as pr\u00e1ticas t\u00e9cnicas do eXtreme Programming (XP), oferecendo um ambiente prop\u00edcio para a flexibilidade, feedback constante, ritmo de entrega sustent\u00e1vel e entregas constantes e incrementais.

  • Flexibilidade dos Requisitos: O ScrumXP permite a flexibilidade dos requisitos ao adotar ciclos curtos de desenvolvimento (sprints), nos quais os requisitos podem ser ajustados e priorizados de acordo com as necessidades do cliente e as condi\u00e7\u00f5es do mercado em constante mudan\u00e7a.

  • Feedback Constante: Com o ScrumXP, o feedback cont\u00ednuo \u00e9 incorporado ao processo atrav\u00e9s de revis\u00f5es frequentes de incrementos do produto e cerim\u00f4nias como reuni\u00f5es di\u00e1rias (daily stand-ups), revis\u00f5es de sprint e retrospectivas. Isso garante que a equipe esteja sempre alinhada com as expectativas dos stakeholders e possa realizar ajustes rapidamente.

  • Ritmo de Entrega: A metodologia ScrumXP promove um ritmo de entrega consistente e previs\u00edvel, com a conclus\u00e3o de incrementos de produto funcionais no final de cada sprint. Isso permite que a equipe entregue valor de forma regular ao longo do tempo, mantendo um fluxo de trabalho est\u00e1vel e eficiente.

  • Pr\u00e1ticas de Testes Integradas: No ScrumXP, os testes s\u00e3o incorporados desde o in\u00edcio do desenvolvimento. A metodologia promove o desenvolvimento orientado por testes (TDD - Test-Driven Development), onde os testes s\u00e3o escritos antes da implementa\u00e7\u00e3o do c\u00f3digo. Isso garante que cada incremento de funcionalidade seja acompanhado por testes automatizados que validam seu comportamento esperado.

Nome da Atividade M\u00e9todo Ferramentas Entrega Elicita\u00e7\u00e3o e Descoberta Reuni\u00e3o com o Cliente, Brainstorming Google Meet, Google Docs Definir RFs e RNFs iniciais e entendimento geral do projeto. An\u00e1lise e Consenso Feedback Google Meet, Google Docs Refinar RFs e RNFs finais e sugest\u00e3o de funcionalidades. Declara\u00e7\u00e3o Feedback, Tema, \u00c9picos e Hist\u00f3rias de Usu\u00e1rio Google Meet, Google Sheets Especifica\u00e7\u00e3o dos RFs e Hist\u00f3rias de Usu\u00e1rio. Representa\u00e7\u00e3o Prototipa\u00e7\u00e3o r\u00e1pida Figma Prot\u00f3tipo b\u00e1sico. Verifica\u00e7\u00e3o e Valida\u00e7\u00e3o Feedback Github Projects Backlog e Prioriza\u00e7\u00e3o de RFs. Organiza\u00e7\u00e3o e Atualiza\u00e7\u00e3o Kanban (Scrum board) Github Projects Backlog e Prioriza\u00e7\u00e3o de RFs."},{"location":"processo-desenvolvimento/#atividades-de-requisitos","title":"Atividades de Requisitos","text":""},{"location":"processo-desenvolvimento/#elicitacao-e-descoberta","title":"Elicita\u00e7\u00e3o e Descoberta:","text":"

Durante esta fase inicial, realizamos reuni\u00f5es com o cliente e sess\u00f5es de brainstorming para identificar e entender as necessidades e requisitos iniciais do projeto. Isso nos permitiu definir os RFs e RNFs iniciais e obter uma compreens\u00e3o geral do escopo do projeto. Durante as itera\u00e7\u00f5es pode ocorrer a adi\u00e7\u00e3o ou corre\u00e7\u00e3o de algum RF ou RNF de acordo com as necessidades do projeto.

"},{"location":"processo-desenvolvimento/#analise-e-consenso","title":"An\u00e1lise e Consenso:","text":"

Aqui, o feedback obtido durante a elicita\u00e7\u00e3o \u00e9 analisado em detalhes. Os requisitos s\u00e3o refinados com base nas informa\u00e7\u00f5es coletadas, e s\u00e3o propostas sugest\u00f5es de funcionalidades espec\u00edficas. O objetivo \u00e9 chegar a um consenso sobre os requisitos finais que atendam \u00e0s necessidades do cliente.

"},{"location":"processo-desenvolvimento/#declaracao","title":"Declara\u00e7\u00e3o:","text":"

Ap\u00f3s a an\u00e1lise, os requisitos refinados s\u00e3o formalizados nesta fase. Isso inclui a documenta\u00e7\u00e3o detalhada dos RFs, temas, \u00e9picos e hist\u00f3rias de usu\u00e1rio. Esta \u00e9 a etapa onde os requisitos s\u00e3o especificados de forma clara e completa.

"},{"location":"processo-desenvolvimento/#verificacao-e-validacao","title":"Verifica\u00e7\u00e3o e Valida\u00e7\u00e3o:","text":"

Uma vez especificados, os requisitos passar\u00e3o por uma revis\u00e3o detalhada para garantir sua precis\u00e3o, completude e consist\u00eancia. O feedback cont\u00ednuo \u00e9 incorporado ao processo atrav\u00e9s de revis\u00f5es regulares dos requisitos e da valida\u00e7\u00e3o com o cliente a cada itera\u00e7\u00e3o. E tamb\u00e9m ser\u00e3o desenvolvidos testes de software para ajudar na valida\u00e7\u00e3o dos requisitos do sistema.

"},{"location":"processo-desenvolvimento/#representacao","title":"Representa\u00e7\u00e3o:","text":"

Durante todo o processo, os requisitos ser\u00e3o representados por meio de prototipagem r\u00e1pida. Isso permite uma visualiza\u00e7\u00e3o mais tang\u00edvel e uma melhor compreens\u00e3o dos requisitos por parte do cliente.

"},{"location":"processo-desenvolvimento/#organizacao-e-atualizacao","title":"Organiza\u00e7\u00e3o e Atualiza\u00e7\u00e3o:","text":"

Por fim, os requisitos ser\u00e3o organizados e atualizados continuamente ao longo do desenvolvimento. Isso ser\u00e1 feito atrav\u00e9s de um Kanban (Scrum board) em uma ferramenta de gerenciamento de projetos como o GitHub Projects, garantindo que os requisitos sejam gerenciados de forma eficaz e priorizados corretamente.

"},{"location":"produto-objetivos/","title":"Vis\u00e3o Geral do Produto","text":""},{"location":"produto-objetivos/#objetivos-do-produto","title":"Objetivos do Produto","text":"

Nosso objetivo \u00e9 desenvolver uma plataforma abrangente que otimize o desempenho organizacional dos alunos e facilite a intera\u00e7\u00e3o eficaz entre professores e estudantes no ambiente acad\u00eamico. Para alcan\u00e7ar esse objetivo, nossa plataforma ser\u00e1 projetada para:

  • Simplificar a forma\u00e7\u00e3o de grupos para trabalhos finais, promovendo a colabora\u00e7\u00e3o entre alunos.

  • Introduzir elementos de gamifica\u00e7\u00e3o na experi\u00eancia de aprendizagem, transformando as atividades avaliativas em miss\u00f5es envolventes propostas pelo professor.

  • Agilizar o processo de corre\u00e7\u00e3o das atividades, oferecendo ferramentas eficientes para avalia\u00e7\u00e3o e feedback.

  • Facilitar o acesso dos alunos \u00e0s suas notas em cada atividade e prova, proporcionando transpar\u00eancia e acompanhamento cont\u00ednuo do desempenho acad\u00eamico.

  • Al\u00e9m disso, nossos objetivos secund\u00e1rios incluem:

  • Simplificar o envio de atividades em Python, permitindo a execu\u00e7\u00e3o de um arquivo ou a interpreta\u00e7\u00e3o de um c\u00f3digo escrito na pr\u00f3pria plataforma.

  • Criar uma p\u00e1gina dedicada \u00e0 apresenta\u00e7\u00e3o e compartilhamento dos trabalhos finais da disciplina, oferecendo um espa\u00e7o centralizado para avalia\u00e7\u00e3o e reconhecimento dos projetos desenvolvidos pelos alunos.

Com essas funcionalidades, buscamos promover a efici\u00eancia acad\u00eamica e facilitar a intera\u00e7\u00e3o din\u00e2mica entre professores e alunos, enriquecendo significativamente o processo educacional.

"},{"location":"produto-posicao/","title":"Vis\u00e3o Geral do Produto","text":""},{"location":"produto-posicao/#declaracao-de-posicao-do-produto","title":"Declara\u00e7\u00e3o de Posi\u00e7\u00e3o do Produto","text":"

Com base nos cen\u00e1rios mencionados, foi apresentada ao Professor a proposta da plataforma denominada ObjeX. Trata-se de uma solu\u00e7\u00e3o web, concebida com o intuito de oferecer um ambiente de aprendizado gamificado. Por meio dessa plataforma, os alunos ser\u00e3o inscritos pelo professor e ter\u00e3o a oportunidade de aprimorar seus conhecimentos atrav\u00e9s de uma estrutura de \"Miss\u00f5es\", as quais ser\u00e3o cadastradas pelo docente. Ademais, a capacidade de forma\u00e7\u00e3o de grupos e a integra\u00e7\u00e3o da funcionalidade de envio de tarefas em conjunto revestem-se de import\u00e2ncia fundamental para a disciplina. Al\u00e9m disso, a plataforma possibilitar\u00e1 a disponibiliza\u00e7\u00e3o dos trabalhos finais dos alunos, permitindo que outros estudantes os testem e promovam uma colabora\u00e7\u00e3o mais ampla e enriquecedora.

Para Professor Da Disciplina de Orienta\u00e7\u00e3o a Objetos Quem Estudantes da Disciplina de Orienta\u00e7\u00e3o a Objetos, do curso de Engenharia de Software da UnB O (nome do produto) ObjeX \u00e9 uma plataforma de ensino e gest\u00e3o de turmas. Que Facilita o processo de aprendizado e forma\u00e7\u00e3o de grupos de acordo com a necessidade do professor. Ao contr\u00e1rio BeeCrowd, Brilliant, Excel. Nosso produto Junta fun\u00e7\u00f5es de ferramentas diversas em uma s\u00f3 plataforma, \u00e0s unificando e facilitando para o usu\u00e1rio final."},{"location":"produto-problema/","title":"Vis\u00e3o Geral do Produto","text":""},{"location":"produto-problema/#problema","title":"Problema","text":"

O Professor da disciplina de Orienta\u00e7\u00e3o a Objetos enfrenta desafios significativos ao ministrar sua disciplina devido a duas quest\u00f5es iniciais:

Dificuldade na forma\u00e7\u00e3o de grupos:

  • Durante o processo de forma\u00e7\u00e3o de grupos, ocorrem diversos problemas. Alunos que acabam saindo da mat\u00e9ria, mudan\u00e7a de grupos. Assim dificultando o controle de grupos.

Dificuldade no lan\u00e7amento de notas:

  • Devido a grande quantidade de alunos, o processo de corre\u00e7\u00e3o e lan\u00e7amento de notas \u00e9 extenso e exaustivo. Dificultando a entrega de notas e at\u00e9 mesmo gerar um feedback aos alunos para que eles possam melhorar nos pontos em que falharam.

Esses desafios impactam negativamente o andamento do curso, tornando necess\u00e1rio um sistema eficiente e organizado para a resolu\u00e7\u00e3o dos problemas citados acima. Com isso, aliado ao desejo do professor em gamificar a disciplina, surgiu a ideia do ObjeX.

"},{"location":"produto-tecnologias/","title":"Vis\u00e3o Geral do Produto","text":""},{"location":"produto-tecnologias/#tecnologias-a-serem-utilizadas","title":"Tecnologias a Serem Utilizadas","text":"

API

Banco de dados

FrontEnd

"},{"location":"projeto-visao/","title":"Vis\u00e3o Geral do Projeto","text":""},{"location":"projeto-visao/#organizacao-do-projeto","title":"Organiza\u00e7\u00e3o do Projeto","text":"Papel Atribui\u00e7\u00f5es Respons\u00e1vel Participantes Desenvolvedor Codificar o produto, codificar testes unit\u00e1rios, realizar refatora\u00e7\u00e3o Fabricio Gustavo, Caio, Arthur, Nicollas, Rayene, Manoel e Fabricio Designer Prototipa\u00e7\u00e3o no Figma, UX/UI Fabricio Fabricio, Gustavo, Arthur Dono do Projeto Atualizar o escopo do produto, organizar o escopo das sprints, validar as entrega Gustavo Caio, Nicollas e Gustavo Engenheiro de Requisitos Elicita\u00e7\u00e3o e descoberta, An\u00e1lise e Consenso, Comunicar Requisitos ao cliente, Representa\u00e7\u00e3o, Verifica\u00e7\u00e3o e Valida\u00e7\u00e3o, Organiza\u00e7\u00e3o e Atualiza\u00e7\u00e3o Manoel Luan Mateus, Gustavo, Caio, Arthur, Nicollas, Rayene, Manoel e Fabricio An\u00e1lista de Qualidade Garantir a qualidade do produto, garantir o cumprimento do conceito de pronto, realizar inspe\u00e7\u00f5es de c\u00f3digo Arthur Luan Mateus, Rayene, Manoel e Arthur Cliente Comunicar as expectativas para o projeto, incluindo especifica\u00e7\u00f5es t\u00e9cnicas e funcionalidades desejadas. Al\u00e9m de realizar a revis\u00e3o e aceita\u00e7\u00e3o das entregas do projeto. Prof. da Disciplina de Orienta\u00e7\u00e3o a Objetos Prof. da Disciplina de Orienta\u00e7\u00e3o a Objetos"},{"location":"projeto-visao/#planejamento-das-fases-eou-iteracoes-do-projeto","title":"Planejamento das Fases e/ou Itera\u00e7\u00f5es do Projeto","text":"Sprint Atividades Entrega Data In\u00edcio Data Fim Sprint 1 Vis\u00e3o Geral do Produto, Defini\u00e7\u00e3o de Abordagem, Ciclo de Vida e Processo de Desenvolvimento, Organiza\u00e7\u00e3o do Projeto, Tecnologias, Planejamento Entrega da Miss\u00e3o 1, Gitpages, Vis\u00e3o Geral do Produto, Processo de Desenvolvimento de Software, Vis\u00e3o Geral do Projeto. 02/04/2024 18/04/2024 Sprint 2 MVP e Planejamento do Projeto, Defini\u00e7\u00e3o das US, Backlog do produto. Backlog, US's, MVP, Requisitos Funcionais e N\u00e3o Funcionais. 25/04/2024 09/05/2024 Sprint 3 Prot\u00f3tipos, Desenvolvimento de Testes, M\u00f3dulo de autentica\u00e7\u00e3o e cria\u00e7\u00e3o de Usu\u00e1rios, M\u00f3dulo de grupos. Entrega Miss\u00e3o 2, M\u00f3dulo de Autentica\u00e7\u00e3o, Cria\u00e7ao de usuarios e M\u00f3dulo de grupos. 09/05/2024 23/05/2024 Sprint 4 Prot\u00f3tipos, Desenvolvimento de Testes, Formular Gamifica\u00e7\u00e3o, M\u00f3dulo de Atividades. Gamifica\u00e7\u00e3o, M\u00f3dulo de atividades. 23/05/2024 06/06/2024 Sprint 5 Entrega Miss\u00e3o 3, Prot\u00f3tipos, Desenvolvimento de Testes, M\u00f3dulo de corre\u00e7\u00e3o. M\u00f3dulo de corre\u00e7\u00e3o. 06/06/2024 20/06/2024 Sprint 6 Corre\u00e7\u00f5es, Elementos fora do MVP (caso haja tempo), Refatora\u00e7\u00f5es (se necess\u00e1rio). Entrega Miss\u00e3o 4, Entrega do Produto Final. 20/06/2024 04/07/2024"},{"location":"projeto-visao/#matriz-de-comunicacao","title":"Matriz de Comunica\u00e7\u00e3o","text":"Descri\u00e7\u00e3o \u00c1rea/Envolvidos Periodicidade Produtos Gerados Acompanhamento das Atividades em Andamento / Acompanhamento dos Riscos, Compromissos, A\u00e7\u00f5es Pendentes, Indicadores Equipe, L\u00edder Estelar Quinzenal Ata de reuni\u00e3o , Relat\u00f3rio de situa\u00e7\u00e3o do projeto Reuni\u00e3o \u201cDaily\u201d Equipe Di\u00e1ria Relat\u00f3rio de tarefas a serem realizadas no dia. Comunicar situa\u00e7\u00e3o do projeto Equipe, Professor, L\u00edder Estelar Semanal Ata de reuni\u00e3o e Relat\u00f3rio de Situa\u00e7\u00e3o do Projeto Reuni\u00e3o com o cliente Equipe, Cliente Semanal Ata de reuni\u00e3o, Relat\u00f3rio de Situa\u00e7\u00e3o do Projeto, Homologa\u00e7\u00e3o, Feedback, Relat\u00f3rio do projeto"},{"location":"projeto-visao/#atas-de-reunioes","title":"Atas de reuni\u00f5es","text":"
  • Reuni\u00e3o 28/03/2024
"},{"location":"projeto-visao/#relatorio-de-tarefas-daily","title":"Relat\u00f3rio de tarefas - Daily","text":"
  • Relat\u00f3rio de tarefas 02/04/2024
  • Relat\u00f3rio de tarefas 06/04/2024
  • Relat\u00f3rio de tarefas 10/04/2024
  • Relat\u00f3rio de tarefas 17/04/2024
"},{"location":"projeto-visao/#relatorio-de-situacao-do-projeto","title":"Relat\u00f3rio de Situa\u00e7\u00e3o do projeto","text":"
  • A fazer
"},{"location":"projeto-visao/#gerenciamento-de-riscos","title":"Gerenciamento de Riscos","text":"Probabilidade Descri\u00e7\u00e3o Valor Nenhuma N\u00e3o h\u00e1 possibilidade de acontecer. 0 Rara Pequena chance de acontecer 1 Prov\u00e1vel Provavelmente vai acontecer 2 Quase certa Vai acontecer 3 Impacto Descri\u00e7\u00e3o Valor Nenhum Nenhum impacto ao projeto. 0 Pequeno Pequeno impacto ao projeto. 1 M\u00e9dio M\u00e9dio impacto ao projeto. 2 Alto Alto impacto ao projeto. 3"},{"location":"projeto-visao/#riscos","title":"Riscos","text":"ID Risco Categoria Consequ\u00eancia Resposta A\u00e7\u00e3o Risco/Impacto 1 Trocar tecnologia Tecnologia Retrabalhar fun\u00e7\u00f5es, aprendizado Aceitar Treinamentos e refatora\u00e7\u00e3o 2/3 2 Trancar disciplina Equipe Carga de trabalho nos integrantes restantes Aceitar Redistribui\u00e7\u00e3o das atribui\u00e7\u00f5es 1/2 3 Greve Externa Paraliza\u00e7\u00e3o das aulas, consequentemente do projeto Mitigar Aproveitar o tempo para aprendizado 2/3 4 Mudan\u00e7a de requisitos pelo cliente Organizacional Retrabalhar, adaptar as sprints Aceitar Adaptar as mudan\u00e7as requisitadas 1/3 5 Provas de outras mat\u00e9rias Externo Indisponibilidade de integrantes do time Mitigar Redistribui\u00e7\u00e3o das atribui\u00e7\u00f5es 3/2 6 Falta de disponibilidade de hor\u00e1rios Organizacional Entregas podem atrasar, comunica\u00e7\u00e3o do time \u00e9 prejudicada Prevenir Heatmap para definir hor\u00e1rios em que a maioria pode se reunir 2/2 7 Features n\u00e3o aceitas pelo cliente T\u00e9cnica Retrabalho Prevenir Adaptar as necessidades do cliente 1/3"},{"location":"projeto-visao/#criterios-de-replanejamento","title":"Crit\u00e9rios de Replanejamento","text":"
  • Tempo dispon\u00edvel: Durante o desenvolvimento do projeto, podemos enfrentar atrasos significativos em rela\u00e7\u00e3o ao cronograma inicialmente estabelecido. Se esses atrasos impactarem negativamente o progresso do desenvolvimento, ser\u00e1 necess\u00e1rio realizar um replanejamento para garantir que o projeto esteja pronto dentro dos prazos definidos.

  • Feedback: Caso o cliente manifeste insatisfa\u00e7\u00e3o com o produto, ser\u00e1 necess\u00e1rio realizar uma revis\u00e3o no projeto e, se vi\u00e1vel, um replanejamento das funcionalidades.

  • Inviabilidade da Tecnologia: Se as tecnologias utilizadas no projeto n\u00e3o conseguirem atender adequadamente aos requisitos, a equipe dever\u00e1 realizar uma avalia\u00e7\u00e3o cr\u00edtica e uma revis\u00e3o do projeto.

  • Adi\u00e7\u00e3o de novos requisitos: Conforme o projeto progride, \u00e9 poss\u00edvel que surjam novos requisitos que necessitem da implementa\u00e7\u00e3o de funcionalidades adicionais ou aumento do escopo de funcionalidades j\u00e1 existentes.

"},{"location":"rnf/","title":"Requisitos N\u00e3o Funcionais","text":"

Requisitos n\u00e3o funcionais s\u00e3o crit\u00e9rios que definem as caracter\u00edsticas e restri\u00e7\u00f5es que um sistema ou software deve possuir, al\u00e9m das suas funcionalidades. Eles se concentram em aspectos que n\u00e3o est\u00e3o diretamente relacionados \u00e0s opera\u00e7\u00f5es espec\u00edficas do sistema, mas s\u00e3o cruciais para garantir seu desempenho, seguran\u00e7a, usabilidade e efici\u00eancia.

"},{"location":"rnf/#objetivo","title":"Objetivo","text":"

O objetivo dos requisitos n\u00e3o funcionais \u00e9 assegurar que o sistema seja eficiente, seguro, acess\u00edvel e f\u00e1cil de usar. Esses requisitos complementam os requisitos funcionais, garantindo que o sistema n\u00e3o apenas execute suas tarefas, mas tamb\u00e9m o fa\u00e7a de maneira eficaz e confi\u00e1vel.

"},{"location":"rnf/#metodologia","title":"Metodologia","text":"

Para definir os requisitos n\u00e3o funcionais do projeto, foram considerados os aspectos de compatibilidade, responsividade, design, desempenho, usabilidade e acessibilidade. Esses requisitos foram estabelecidos com base nas necessidades dos usu\u00e1rios e nas melhores pr\u00e1ticas de desenvolvimento de software.

"},{"location":"rnf/#tabela-de-requisitos-nao-funcionais","title":"Tabela de Requisitos N\u00e3o Funcionais","text":"N\u00famero Tipo Descri\u00e7\u00e3o RNF01 Compatibilidade O site deve ser compat\u00edvel com os principais navegadores Web em suas vers\u00f5es a partir de 2024: Chrome, Microsoft Edge, Opera, Firefox, Brave e Safari. RNF02 Responsividade O site deve ser responsivo, se adaptando a diferentes tamanhos de tela e dispositivos, como smartphones, tablets, notebooks e desktops. RNF03 Design O site deve manter um design minimalista e consistente em toda a interface: cores, fontes, \u00edcones. RNF04 Desempenho O site deve ser capaz de lidar com um volume de tr\u00e1fego de ao menos 1 turma simult\u00e2nea. RNF05 Usabilidade O site deve ser intuitivo e f\u00e1cil de usar, permitindo que usu\u00e1rios com qualquer n\u00edvel de experi\u00eancia consigam navegar e encontrar o que querem com facilidade. RNF06 Acessibilidade O site deve ser acess\u00edvel seguindo as diretrizes estabelecidas pelo padr\u00e3o WCAG, no n\u00edvel AA."}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..0f8724ef --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 00000000..f2ab0f57 Binary files /dev/null and b/sitemap.xml.gz differ diff --git a/stylesheets/extra.css b/stylesheets/extra.css new file mode 100644 index 00000000..882eaa22 --- /dev/null +++ b/stylesheets/extra.css @@ -0,0 +1,15 @@ +:root { + --md-primary-fg-color: #d81619; + --md-primary-fg-color--light: #d87375; + --md-primary-fg-color--dark: #971012; + } + +@font-face { /* Importando fonte */ + font-family: "Cyberpunk"; + src: url("/assets/fonts/Cyberpunk/Cyberpunk.ttf"); +} + +.classe-titulo { + font-family: "Cyberpunk","roboto"; + font-size: 32px; +} \ No newline at end of file