diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..c22b243 --- /dev/null +++ b/404.html @@ -0,0 +1,2461 @@ + + + + + + + + + + + + + + + + + + + Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/assets/escolaridade.png b/assets/escolaridade.png new file mode 100644 index 0000000..be0e290 Binary files /dev/null and b/assets/escolaridade.png differ diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 0000000..01ab9c2 Binary files /dev/null and b/assets/favicon.ico differ diff --git a/assets/frequencia.png b/assets/frequencia.png new file mode 100644 index 0000000..5d8e64e Binary files /dev/null and b/assets/frequencia.png differ diff --git a/assets/idade.png b/assets/idade.png new file mode 100644 index 0000000..45093f7 Binary files /dev/null and b/assets/idade.png differ diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000..1cf13b9 Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/javascripts/bundle.fe8b6f2b.min.js b/assets/javascripts/bundle.fe8b6f2b.min.js new file mode 100644 index 0000000..cf778d4 --- /dev/null +++ b/assets/javascripts/bundle.fe8b6f2b.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var Fi=Object.create;var gr=Object.defineProperty;var ji=Object.getOwnPropertyDescriptor;var Wi=Object.getOwnPropertyNames,Dt=Object.getOwnPropertySymbols,Ui=Object.getPrototypeOf,xr=Object.prototype.hasOwnProperty,no=Object.prototype.propertyIsEnumerable;var oo=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,R=(e,t)=>{for(var r in t||(t={}))xr.call(t,r)&&oo(e,r,t[r]);if(Dt)for(var r of Dt(t))no.call(t,r)&&oo(e,r,t[r]);return e};var io=(e,t)=>{var r={};for(var o in e)xr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Dt)for(var o of Dt(e))t.indexOf(o)<0&&no.call(e,o)&&(r[o]=e[o]);return r};var yr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Di=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Wi(t))!xr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=ji(t,n))||o.enumerable});return e};var Vt=(e,t,r)=>(r=e!=null?Fi(Ui(e)):{},Di(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var ao=(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 co=yr((Er,so)=>{(function(e,t){typeof Er=="object"&&typeof so!="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 mt=H.type,ze=H.tagName;return!!(ze==="INPUT"&&a[mt]&&!H.readOnly||ze==="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 Yr=yr((Rt,Kr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Rt=="object"&&typeof Kr=="object"?Kr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Rt=="object"?Rt.ClipboardJS=r():t.ClipboardJS=r()})(Rt,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Ii}});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 mt=function(){var _=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},M=_.action,j=M===void 0?"copy":M,D=_.container,Y=_.target,ke=_.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(ke)return J(ke,{container:D});if(Y)return j==="cut"?w(Y):J(Y,{container:D})},ze=mt;function Ie(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Ie=function(M){return typeof M}:Ie=function(M){return M&&typeof Symbol=="function"&&M.constructor===Symbol&&M!==Symbol.prototype?"symbol":typeof M},Ie(V)}function _i(V,_){if(!(V instanceof _))throw new TypeError("Cannot call a class as a function")}function ro(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 Ai(V,_,M){return _&&ro(V.prototype,_),M&&ro(V,M),V}function Ci(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 Hi(V){var _=Pi();return function(){var j=Wt(V),D;if(_){var Y=Wt(this).constructor;D=Reflect.construct(j,arguments,Y)}else D=j.apply(this,arguments);return ki(this,D)}}function ki(V,_){return _&&(Ie(_)==="object"||typeof _=="function")?_:$i(V)}function $i(V){if(V===void 0)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return V}function Pi(){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 Wt(V){return Wt=Object.setPrototypeOf?Object.getPrototypeOf:function(M){return M.__proto__||Object.getPrototypeOf(M)},Wt(V)}function vr(V,_){var M="data-clipboard-".concat(V);if(_.hasAttribute(M))return _.getAttribute(M)}var Ri=function(V){Ci(M,V);var _=Hi(M);function M(j,D){var Y;return _i(this,M),Y=_.call(this),Y.resolveOptions(D),Y.listenClick(j),Y}return Ai(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=Ie(D.container)==="object"?D.container:document.body}},{key:"listenClick",value:function(D){var Y=this;this.listener=c()(D,"click",function(ke){return Y.onClick(ke)})}},{key:"onClick",value:function(D){var Y=D.delegateTarget||D.currentTarget,ke=this.action(Y)||"copy",Ut=ze({action:ke,container:this.container,target:this.target(Y),text:this.text(Y)});this.emit(Ut?"success":"error",{action:ke,text:Ut,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,ke=!!document.queryCommandSupported;return Y.forEach(function(Ut){ke=ke&&!!document.queryCommandSupported(Ut)}),ke}}]),M}(s()),Ii=Ri},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;p{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var ts=/["'&<>]/;ei.exports=rs;function rs(e){var t=""+e,r=ts.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i0&&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 mo(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 de=="function"?de(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 ft(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=ft(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 Fe=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=de(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=de(f),h=u.next();!h.done;h=u.next()){var w=h.value;try{fo(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)fo(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=Fe.EMPTY;function qt(e){return e instanceof Fe||e&&"closed"in e&&k(e.remove)&&k(e.add)&&k(e.unsubscribe)}function fo(e){k(e)?e():e.unsubscribe()}var $e={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var ut={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 Fe(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 Eo(r,o)},t}(F);var Eo=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 Lt={now:function(){return(Lt.delegate||Date).now()},delegate:void 0};var _t=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=Lt);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}(vt);var So=function(e){re(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(gt);var Hr=new So(To);var Oo=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=bt.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&&(bt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(vt);var Mo=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}(gt);var me=new Mo(Oo);var O=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 xt=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[ht])}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 Gi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var er=Gi();function tr(e){return k(e==null?void 0:e[er])}function rr(e){return lo(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 Ji(e);if(xt(e))return Xi(e);if(Gt(e))return Zi(e);if(Xt(e))return Lo(e);if(tr(e))return ea(e);if(or(e))return ta(e)}throw Zt(e)}function Ji(e){return new F(function(t){var r=e[ht]();if(k(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Xi(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?Be(t):zo(function(){return new ir}))}}function Fr(e){return e<=0?function(){return O}: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,mt){h++,!A&&!w&&te();var ze=u=u!=null?u:r();mt.add(function(){h--,h===0&&!A&&!w&&(f=Wr(J,p))}),ze.subscribe(mt),!l&&h>0&&(l=new at({next:function(Ie){return ze.next(Ie)},error:function(Ie){A=!0,te(),f=Wr(ie,n,Ie),ze.error(Ie)},complete:function(){w=!0,te(),f=Wr(ie,a),ze.complete()}}),W(H).subscribe(l))})(c)}}function Wr(e,t){for(var r=[],o=2;oe.next(document)),e}function $(e,t=document){return Array.from(t.querySelectorAll(e))}function P(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 Re(){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 xa=S(d(document.body,"focusin"),d(document.body,"focusout")).pipe(_e(1),Q(void 0),m(()=>Re()||document.body),G(1));function et(e){return xa.pipe(m(t=>e.contains(t)),K())}function kt(e,t){return C(()=>S(d(e,"mouseenter").pipe(m(()=>!0)),d(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ht(r=>Me(+!r*t)):le,Q(e.matches(":hover"))))}function Bo(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)Bo(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)Bo(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 wt(e){let t=x("script",{src:e});return C(()=>(document.head.appendChild(t),S(d(t,"load"),d(t,"error").pipe(v(()=>$r(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),L(()=>document.head.removeChild(t)),Te(1))))}var Go=new g,ya=C(()=>typeof ResizeObserver=="undefined"?wt("https://unpkg.com/resize-observer-polyfill"):I(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>Go.next(t)))),v(e=>S(Ke,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 ya.pipe(E(r=>r.observe(t)),v(r=>Go.pipe(b(o=>o.target===t),L(()=>r.unobserve(t)))),m(()=>ce(e)),Q(ce(e)))}function Tt(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 Jo(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 Ue(e){return{x:e.offsetLeft,y:e.offsetTop}}function Xo(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function Zo(e){return S(d(window,"load"),d(window,"resize")).pipe(Le(0,me),m(()=>Ue(e)),Q(Ue(e)))}function pr(e){return{x:e.scrollLeft,y:e.scrollTop}}function De(e){return S(d(e,"scroll"),d(window,"scroll"),d(window,"resize")).pipe(Le(0,me),m(()=>pr(e)),Q(pr(e)))}var en=new g,Ea=C(()=>I(new IntersectionObserver(e=>{for(let t of e)en.next(t)},{threshold:0}))).pipe(v(e=>S(Ke,I(e)).pipe(L(()=>e.disconnect()))),G(1));function tt(e){return Ea.pipe(E(t=>t.observe(e)),v(t=>en.pipe(b(({target:r})=>r===e),L(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function tn(e,t=16){return De(e).pipe(m(({y:r})=>{let o=ce(e),n=Tt(e);return r>=n.height-o.height-t}),K())}var lr={drawer:P("[data-md-toggle=drawer]"),search:P("[data-md-toggle=search]")};function rn(e){return lr[e].checked}function Je(e,t){lr[e].checked!==t&&lr[e].click()}function Ve(e){let t=lr[e];return d(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function wa(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 Ta(){return S(d(window,"compositionstart").pipe(m(()=>!0)),d(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function on(){let e=d(window,"keydown").pipe(b(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:rn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),b(({mode:t,type:r})=>{if(t==="global"){let o=Re();if(typeof o!="undefined")return!wa(o,r)}return!0}),pe());return Ta().pipe(v(t=>t?O:e))}function xe(){return new URL(location.href)}function pt(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 nn(){return new g}function an(){return location.hash.slice(1)}function sn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Sa(e){return S(d(window,"hashchange"),e).pipe(m(an),Q(an()),b(t=>t.length>0),G(1))}function cn(e){return Sa(e).pipe(m(t=>fe(`[id="${t}"]`)),b(t=>typeof t!="undefined"))}function $t(e){let t=matchMedia(e);return ar(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function pn(){let e=matchMedia("print");return S(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():O))}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 Ne(e,t){return zr(e,t).pipe(v(r=>r.text()),m(r=>JSON.parse(r)),G(1))}function ln(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 mn(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 fn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function un(){return S(d(window,"scroll",{passive:!0}),d(window,"resize",{passive:!0})).pipe(m(fn),Q(fn()))}function dn(){return{width:innerWidth,height:innerHeight}}function hn(){return d(window,"resize",{passive:!0}).pipe(m(dn),Q(dn()))}function bn(){return z([un(),hn()]).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(()=>Ue(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 Oa(e){return d(e,"message",t=>t.data)}function Ma(e){let t=new g;return t.subscribe(r=>e.postMessage(r)),t}function vn(e,t=new Worker(e)){let r=Oa(t),o=Ma(t),n=new g;n.subscribe(o);let i=o.pipe(X(),ne(!0));return n.pipe(X(),Pe(r.pipe(U(i))),pe())}var La=P("#__config"),St=JSON.parse(La.textContent);St.base=`${new URL(St.base,xe())}`;function ye(){return St}function B(e){return St.features.includes(e)}function Ee(e,t){return typeof t!="undefined"?St.translations[e].replace("#",t.toString()):St.translations[e]}function Se(e,t=document){return P(`[data-md-component=${e}]`,t)}function ae(e,t=document){return $(`[data-md-component=${e}]`,t)}function _a(e){let t=P(".md-typeset > :first-child",e);return d(t,"click",{once:!0}).pipe(m(()=>P(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function gn(e){if(!B("announce.dismiss")||!e.childElementCount)return O;if(!e.hidden){let t=P(".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)}),_a(e).pipe(E(r=>t.next(r)),L(()=>t.complete()),m(r=>R({ref:e},r)))})}function Aa(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function xn(e,t){let r=new g;return r.subscribe(({hidden:o})=>{e.hidden=o}),Aa(e,t).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))}function Pt(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 yn(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function En(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},Pt(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},Pt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function wn(e){return x("button",{class:"md-clipboard md-icon",title:Ee("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}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,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 Tn(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 Sn(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 Qr(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 On(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function Ca(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 Mn(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(Ca)))}var Ha=0;function ka(e){let t=z([et(e),kt(e)]).pipe(m(([o,n])=>o||n),K()),r=C(()=>Jo(e)).pipe(oe(De),ct(1),m(()=>Xo(e)));return t.pipe(Ae(o=>o),v(()=>z([t,r])),m(([o,n])=>({active:o,offset:n})),pe())}function $a(e,t){let{content$:r,viewport$:o}=t,n=`__tooltip2_${Ha++}`;return C(()=>{let i=new g,a=new _r(!1);i.pipe(X(),ne(!1)).subscribe(a);let s=a.pipe(Ht(c=>Me(+!c*250,Hr)),K(),v(c=>c?r:O),E(c=>c.id=n),pe());z([i.pipe(m(({active:c})=>c)),s.pipe(v(c=>kt(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(P(":scope > *",c));c.style.setProperty("--md-tooltip-width",`${l.width}px`),c.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(K(),be(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")}),ka(e).pipe(E(c=>i.next(c)),L(()=>i.complete()),m(c=>R({ref:e},c)))})}function lt(e,{viewport$:t},r=document.body){return $a(e,{content$:new F(o=>{let n=e.title,i=yn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t})}function Pa(e,t){let r=C(()=>z([Zo(e),De(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 Ln(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)}),S(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(ct(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=Re())==null||c.blur()}}),r.pipe(U(a),b(s=>s===o),Ge(125)).subscribe(()=>e.focus()),Pa(e,t).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))})}function Ra(e){return e.tagName==="CODE"?$(".c, .c1, .cm",e):[e]}function Ia(e){let t=[];for(let r of Ra(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 _n(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 Ia(t)){let[,p]=s.textContent.match(/\((\d+)\)/);fe(`:scope > li:nth-child(${p})`,e)&&(a.set(p,En(p,i)),s.replaceWith(a.get(p)))}return a.size===0?O:C(()=>{let s=new g,p=s.pipe(X(),ne(!0)),c=[];for(let[l,f]of a)c.push([P(".md-typeset",f),P(`: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?_n(f,u):_n(u,f)}),S(...[...a].map(([,l])=>Ln(l,t,{target$:r}))).pipe(L(()=>s.complete()),pe())})}function An(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return An(t)}}function Cn(e,t){return C(()=>{let r=An(e);return typeof r!="undefined"?fr(r,e,t):O})}var Hn=Vt(Yr());var Fa=0;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 ja(e){return ge(e).pipe(m(({width:t})=>({scrollable:Tt(e).width>t})),Z("scrollable"))}function $n(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(Hn.default.isSupported()&&(e.closest(".copy")||B("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${Fa++}`;let l=wn(c.id);c.insertBefore(l,e),B("content.tooltips")&&a.push(lt(l,{viewport$}))}let s=e.closest(".highlight");if(s instanceof HTMLElement){let c=kn(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:O)))}}return $(":scope > span[id]",e).length&&e.classList.add("md-code__content"),ja(e).pipe(E(c=>n.next(c)),L(()=>n.complete()),m(c=>R({ref:e},c)),Pe(...a))});return B("content.lazy")?tt(e).pipe(b(n=>n),Te(1),v(()=>o)):o}function Wa(e,{target$:t,print$:r}){let o=!0;return S(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 Pn(e,t){return C(()=>{let r=new g;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Wa(e,t).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}var Rn=".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 Br,Da=0;function Va(){return typeof mermaid=="undefined"||mermaid instanceof Element?wt("https://unpkg.com/mermaid@10/dist/mermaid.min.js"):I(void 0)}function In(e){return e.classList.remove("mermaid"),Br||(Br=Va().pipe(E(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Rn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),G(1))),Br.subscribe(()=>ao(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${Da++}`,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)})),Br.pipe(m(()=>({ref:e})))}var Fn=x("table");function jn(e){return e.replaceWith(Fn),Fn.replaceWith(On(e)),I({ref:e})}function Na(e){let t=e.find(r=>r.checked)||e[0];return S(...e.map(r=>d(r,"change").pipe(m(()=>P(`label[for="${r.id}"]`))))).pipe(Q(P(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Wn(e,{viewport$:t,target$:r}){let o=P(".tabbed-labels",e),n=$(":scope > input",e),i=Qr("prev");e.append(i);let a=Qr("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=Ue(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([De(o),ge(o)]).pipe(U(p)).subscribe(([c,l])=>{let f=Tt(o);i.hidden=c.x<16,a.hidden=c.x>f.width-l.width-16}),S(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=P(`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 $("[data-tabs]"))for(let A of $(":scope > input",w)){let te=P(`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 $("audio, video",e))c.pause()}),Na(n).pipe(E(c=>s.next(c)),L(()=>s.complete()),m(c=>R({ref:e},c)))}).pipe(Qe(se))}function Un(e,{viewport$:t,target$:r,print$:o}){return S(...$(".annotate:not(.highlight)",e).map(n=>Cn(n,{target$:r,print$:o})),...$("pre:not(.mermaid) > code",e).map(n=>$n(n,{target$:r,print$:o})),...$("pre.mermaid",e).map(n=>In(n)),...$("table:not([class])",e).map(n=>jn(n)),...$("details",e).map(n=>Pn(n,{target$:r,print$:o})),...$("[data-tabs]",e).map(n=>Wn(n,{viewport$:t,target$:r})),...$("[title]",e).filter(()=>B("content.tooltips")).map(n=>lt(n,{viewport$:t})))}function za(e,{alert$:t}){return t.pipe(v(r=>S(I(!0),I(!1).pipe(Ge(2e3))).pipe(m(o=>({message:r,active:o})))))}function Dn(e,t){let r=P(".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}),za(e,t).pipe(E(n=>o.next(n)),L(()=>o.complete()),m(n=>R({ref:e},n)))})}var qa=0;function Qa(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"?De(o):I({x:0,y:0}),i=S(et(t),kt(t)).pipe(K());return z([i,n]).pipe(m(([a,s])=>{let{x:p,y:c}=Ue(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 Vn(e){let t=e.title;if(!t.length)return O;let r=`__tooltip_${qa++}`,o=Pt(r,"inline"),n=P(".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")}}),S(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(ct(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")}}),Qa(o,e).pipe(E(a=>i.next(a)),L(()=>i.complete()),m(a=>R({ref:e},a)))}).pipe(Qe(se))}function Ka({viewport$:e}){if(!B("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Ye(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),K()),o=Ve("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),K(),v(n=>n?r:I(!1)),Q(!1))}function Nn(e,t){return C(()=>z([ge(e),Ka(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),K((r,o)=>r.height===o.height&&r.hidden===o.hidden),G(1))}function zn(e,{header$:t,main$:r}){return C(()=>{let o=new g,n=o.pipe(X(),ne(!0));o.pipe(Z("active"),We(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=ue($("[title]",e)).pipe(b(()=>B("content.tooltips")),oe(a=>Vn(a)));return r.subscribe(o),t.pipe(U(n),m(a=>R({ref:e},a)),Pe(i.pipe(U(n))))})}function Ya(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 qn(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"?O:Ya(o,t).pipe(E(n=>r.next(n)),L(()=>r.complete()),m(n=>R({ref:e},n)))})}function Qn(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 Ba(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 Kn(e){let t=$("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=$t("(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(be(se)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),Ba(t).pipe(U(n.pipe(Ce(1))),st(),E(a=>i.next(a)),L(()=>i.complete()),m(a=>R({ref:e},a)))})}function Yn(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 Gr=Vt(Yr());function Ga(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 Bn({alert$:e}){Gr.default.isSupported()&&new F(t=>{new Gr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Ga(P(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(E(t=>{t.trigger.focus()}),m(()=>Ee("clipboard.copied"))).subscribe(e)}function Gn(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function Ja(e,t){let r=new Map;for(let o of $("url",e)){let n=P("loc",o),i=[Gn(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let a of $("[rel=alternate]",o)){let s=a.getAttribute("href");s!=null&&i.push(Gn(new URL(s),t))}}return r}function ur(e){return mn(new URL("sitemap.xml",e)).pipe(m(t=>Ja(t,new URL(e))),ve(()=>I(new Map)))}function Xa(e,t){if(!(e.target instanceof Element))return O;let r=e.target.closest("a");if(r===null)return O;if(r.target||e.metaKey||e.ctrlKey)return O;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),I(new URL(r.href))):O}function Jn(e){let t=new Map;for(let r of $(":scope > *",e.head))t.set(r.outerHTML,r);return t}function Xn(e){for(let t of $("[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 Za(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=Jn(document);for(let[o,n]of Jn(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 je($("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),O}),X(),ne(document))}function Zn({location$:e,viewport$:t,progress$:r}){let o=ye();if(location.protocol==="file:")return O;let n=ur(o.base);I(document).subscribe(Xn);let i=d(document.body,"click").pipe(We(n),v(([p,c])=>Xa(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)}),S(i,a).subscribe(e);let s=e.pipe(Z("pathname"),v(p=>ln(p,{progress$:r}).pipe(ve(()=>(pt(p,!0),O)))),v(Xn),v(Za),pe());return S(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",sn(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 ri=Vt(ti());function oi(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,ri.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function It(e){return e.type===1}function dr(e){return e.type===3}function ni(e,t){let r=vn(e);return S(I(location.protocol!=="file:"),Ve("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 ii({document$:e}){let t=ye(),r=Ne(new URL("../versions.json",t.base)).pipe(ve(()=>O)),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?O:(i.preventDefault(),I(p))}}return O}),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=>pt(n,!0)),z([r,o]).subscribe(([n,i])=>{P(".md-header__topic").appendChild(Mn(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 ns(e,{worker$:t}){let{searchParams:r}=xe();r.has("q")&&(Je("search",!0),e.value=r.get("q"),e.focus(),Ve("search").pipe(Ae(i=>!i)).subscribe(()=>{let i=xe();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=et(e),n=S(t.pipe(Ae(It)),d(e,"keyup"),o).pipe(m(()=>e.value),K());return z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),G(1))}function ai(e,{worker$:t}){let r=new g,o=r.pipe(X(),ne(!0));z([t.pipe(Ae(It)),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=P("header [for=__search]");return d(n,"click").subscribe(()=>e.focus()),ns(e,{worker$:t}).pipe(E(i=>r.next(i)),L(()=>r.complete()),m(i=>R({ref:e},i)),G(1))}function si(e,{worker$:t,query$:r}){let o=new g,n=tn(e.parentElement).pipe(b(Boolean)),i=e.parentElement,a=P(":scope > :first-child",e),s=P(":scope > :last-child",e);Ve("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(ee(r),Ur(t.pipe(Ae(It)))).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})=>S(I(...l.slice(0,10)),I(...l.slice(10)).pipe(Ye(4),Vr(n),v(([f])=>f)))),m(Tn),pe());return p.subscribe(l=>s.appendChild(l)),p.pipe(oe(l=>{let f=fe("details",l);return typeof f=="undefined"?O: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=>R({ref:e},l)))}function is(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 ci(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()),is(e,t).pipe(E(n=>r.next(n)),L(()=>r.complete()),m(n=>R({ref:e},n)))}function pi(e,{worker$:t,keyboard$:r}){let o=new g,n=Se("search-query"),i=S(d(n,"keydown"),d(n,"focus")).pipe(be(se),m(()=>n.value),K());return o.pipe(We(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 li(e,{index$:t,keyboard$:r}){let o=ye();try{let n=ni(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=Re();switch(p.type){case"Enter":if(c===i){let l=new Map;for(let f of $(":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,...$(":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!==Re()&&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=ai(i,{worker$:n});return S(s,si(a,{worker$:n,query$:s})).pipe(Pe(...ae("search-share",e).map(p=>ci(p,{query$:s})),...ae("search-suggest",e).map(p=>pi(p,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ke}}function mi(e,{index$:t,location$:r}){return z([t,r.pipe(Q(xe()),b(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>oi(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 as(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 Jr(e,o){var n=o,{header$:t}=n,r=io(n,["header$"]);let i=P(".md-sidebar__scrollwrap",e),{y:a}=Ue(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 $(".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($("label[tabindex]",e)).pipe(oe(l=>d(l,"click").pipe(be(se),m(()=>l),U(p)))).subscribe(l=>{let f=P(`[id="${l.htmlFor}"]`);P(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),as(e,r).pipe(E(l=>s.next(l)),L(()=>s.complete()),m(l=>R({ref:e},l)))})}function fi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return Ct(Ne(`${r}/releases/latest`).pipe(ve(()=>O),m(o=>({version:o.tag_name})),Be({})),Ne(r).pipe(ve(()=>O),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),Be({}))).pipe(m(([o,n])=>R(R({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return Ne(r).pipe(m(o=>({repositories:o.public_repos})),Be({}))}}function ui(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return Ne(r).pipe(ve(()=>O),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Be({}))}function di(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return fi(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return ui(r,o)}return O}var ss;function cs(e){return ss||(ss=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 O}return di(e.href).pipe(E(o=>__md_set("__source",o,sessionStorage)))}).pipe(ve(()=>O),b(t=>Object.keys(t).length>0),m(t=>({facts:t})),G(1)))}function hi(e){let t=P(":scope > :last-child",e);return C(()=>{let r=new g;return r.subscribe(({facts:o})=>{t.appendChild(Sn(o)),t.classList.add("md-source__repository--active")}),cs(e).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}function ps(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 bi(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}):ps(e,t)).pipe(E(o=>r.next(o)),L(()=>r.complete()),m(o=>R({ref:e},o)))})}function ls(e,{viewport$:t,header$:r}){let o=new Map,n=$(".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=P(":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))),We(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:[]}),Ye(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=S(t.pipe(_e(1),m(()=>{})),t.pipe(_e(250),m(()=>"smooth")));i.pipe(b(({prev:p})=>p.length>0),We(o.pipe(be(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))),st({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}`)}),ls(e,{viewport$:t,header$:r}).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))})}function ms(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Ye(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),st({delay:250}),m(a=>({hidden:a})))}function gi(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})}),ms(e,{viewport$:t,main$:o,target$:n}).pipe(E(s=>i.next(s)),L(()=>i.complete()),m(s=>R({ref:e},s)))}function xi({document$:e,viewport$:t}){e.pipe(v(()=>$(".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")?lt(n,{viewport$:t}).pipe(U(e.pipe(Ce(1))),L(()=>n.removeAttribute("title"))):O})).subscribe(),B("content.tooltips")&&e.pipe(v(()=>$(".md-status")),oe(r=>lt(r,{viewport$:t}))).subscribe()}function yi({document$:e,tablet$:t}){e.pipe(v(()=>$(".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 fs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Ei({document$:e}){e.pipe(v(()=>$("[data-md-scrollfix]")),E(t=>t.removeAttribute("data-md-scrollfix")),b(fs),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 wi({viewport$:e,tablet$:t}){z([Ve("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 us(){return location.protocol==="file:"?wt(`${new URL("search/search_index.js",Xr.base)}`).pipe(m(()=>__index),G(1)):Ne(new URL("search/search_index.json",Xr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ot=Yo(),jt=nn(),Ot=cn(jt),Zr=on(),Oe=bn(),hr=$t("(min-width: 960px)"),Si=$t("(min-width: 1220px)"),Oi=pn(),Xr=ye(),Mi=document.forms.namedItem("search")?us():Ke,eo=new g;Bn({alert$:eo});var to=new g;B("navigation.instant")&&Zn({location$:jt,viewport$:Oe,progress$:to}).subscribe(ot);var Ti;((Ti=Xr.version)==null?void 0:Ti.provider)==="mike"&&ii({document$:ot});S(jt,Ot).pipe(Ge(125)).subscribe(()=>{Je("drawer",!1),Je("search",!1)});Zr.pipe(b(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=fe("link[rel=prev]");typeof t!="undefined"&&pt(t);break;case"n":case".":let r=fe("link[rel=next]");typeof r!="undefined"&&pt(r);break;case"Enter":let o=Re();o instanceof HTMLLabelElement&&o.click()}});xi({viewport$:Oe,document$:ot});yi({document$:ot,tablet$:hr});Ei({document$:ot});wi({viewport$:Oe,tablet$:hr});var rt=Nn(Se("header"),{viewport$:Oe}),Ft=ot.pipe(m(()=>Se("main")),v(e=>Qn(e,{viewport$:Oe,header$:rt})),G(1)),ds=S(...ae("consent").map(e=>xn(e,{target$:Ot})),...ae("dialog").map(e=>Dn(e,{alert$:eo})),...ae("header").map(e=>zn(e,{viewport$:Oe,header$:rt,main$:Ft})),...ae("palette").map(e=>Kn(e)),...ae("progress").map(e=>Yn(e,{progress$:to})),...ae("search").map(e=>li(e,{index$:Mi,keyboard$:Zr})),...ae("source").map(e=>hi(e))),hs=C(()=>S(...ae("announce").map(e=>gn(e)),...ae("content").map(e=>Un(e,{viewport$:Oe,target$:Ot,print$:Oi})),...ae("content").map(e=>B("search.highlight")?mi(e,{index$:Mi,location$:jt}):O),...ae("header-title").map(e=>qn(e,{viewport$:Oe,header$:rt})),...ae("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Nr(Si,()=>Jr(e,{viewport$:Oe,header$:rt,main$:Ft})):Nr(hr,()=>Jr(e,{viewport$:Oe,header$:rt,main$:Ft}))),...ae("tabs").map(e=>bi(e,{viewport$:Oe,header$:rt})),...ae("toc").map(e=>vi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Ot})),...ae("top").map(e=>gi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Ot})))),Li=ot.pipe(v(()=>hs),Pe(ds),G(1));Li.subscribe();window.document$=ot;window.location$=jt;window.target$=Ot;window.keyboard$=Zr;window.viewport$=Oe;window.tablet$=hr;window.screen$=Si;window.print$=Oi;window.alert$=eo;window.progress$=to;window.component$=Li;})(); +//# sourceMappingURL=bundle.fe8b6f2b.min.js.map + diff --git a/assets/javascripts/bundle.fe8b6f2b.min.js.map b/assets/javascripts/bundle.fe8b6f2b.min.js.map new file mode 100644 index 0000000..8263585 --- /dev/null +++ b/assets/javascripts/bundle.fe8b6f2b.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.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 * 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 * 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 * 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 +

+

3. Histórico de Versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoAutorDescriçãoRevisorData
1.0Jefferson SenaAdicionando os requisitos e User story mapTiago Albuquerque01/04/2024
1.1Jefferson SenaAdicionando requisitos não funcionaisTiago Albuquerque05/04/2024
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/requisitos/fluxograma_de_navegabilidade/index.html b/requisitos/fluxograma_de_navegabilidade/index.html new file mode 100644 index 0000000..174fb45 --- /dev/null +++ b/requisitos/fluxograma_de_navegabilidade/index.html @@ -0,0 +1,2631 @@ + + + + + + + + + + + + + + + + + + + + + + + Fluxograma de Navegabilidade - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Fluxograma de Navegabilidade da Revista Darcy

+

1. Objetivo

+

O intuito é fornecer uma representação visual clara e organizada de como os usuários podem se mover através do site. Alguns benefícios que esperamos:

+
    +
  1. Visualização da Estrutura: Ajuda a visualizar a estrutura e a hierarquia das páginas do site, mostrando a relação entre elas.
  2. +
  3. Facilitação do Planejamento: Auxilia no planejamento e na organização do conteúdo do site, garantindo que todas as páginas e links necessários sejam incluídos.
  4. +
  5. Identificação de Problemas: Permite identificar e corrigir possíveis problemas de navegação, como links quebrados ou caminhos complexos.
  6. +
  7. Melhoria da Experiência do Usuário: Ajuda a garantir uma experiência de navegação intuitiva e eficiente para os usuários, facilitando a localização de informações.
  8. +
  9. Comunicação Clara: Serve como uma ferramenta de comunicação clara entre desenvolvedores, designers e outras partes interessadas, garantindo que todos tenham uma compreensão comum da navegação do site.
  10. +
  11. Documentação: Funciona como uma documentação do fluxo de navegação do site, útil para manutenção futura e para novos membros da equipe.
  12. +
+

2. Fluxograma de Navegabilidade

+

+ +

+

3. Histórico de Versões

+ + + + + + + + + + + + + + + + + + + +
VersãoAutorDescriçãoRevisorData
1.0José AndréFluxograma de NavegabilidadeTiago Albuquerque02/07/2024
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/requisitos/perfil_dos_usuarios/index.html b/requisitos/perfil_dos_usuarios/index.html new file mode 100644 index 0000000..ab476b6 --- /dev/null +++ b/requisitos/perfil_dos_usuarios/index.html @@ -0,0 +1,2933 @@ + + + + + + + + + + + + + + + + + + + + + + + Perfil dos Usuários - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + +

Perfil dos Usuários da Revista

+

Perfil do Usuário

+

A partir dos dados obtidos com o formulário, foi possível definir o Perfil do Usuários e leitores do site:

+
    +
  • +

    Estudantes da UnB entre 19 e 22 anos. O público também compõe, em sua minoria, servidores e técnicos administrativos da UnB.

    +
  • +
  • +

    O site e as edições da Revista são lidos, em sua maioria, sempre que novas edições são lançadas.

    +
  • +
  • +

    Muitos estudantes evidenciam não ter conhecimento sobre o site ou a revista.

    +
  • +
+

Análises dos Dados do Formulário

+

Com o objetivo de obter mais detalhes do Perfil de Usuários da Revista, foi proposto a divulgação de um formulário com perguntas pertinentes. Com isso, segue aqui uma análise dos dados obtidos a partir das respostas dos leitores da revista.

+

Questão 01

+

formulario

+

Questão 02

+

formulario

+

Questão 03

+

formulario

+

Questão 04

+

formulario

+

Questão 05

+

formulario

+

Questão 06

+

formulario

+

Questão 07

+

formulario

+

Questão 08

+

formulario

+

Questão 09

+

formulario

+

Questão 10

+

Há algo no site que te desagrada ou poderia ser aperfeiçoado?

+
    +
  • Gostaria que ele fosse tão atraente visualmente, como é a revista impressa e, na medida do possível, fosse interativo.
  • +
  • As matérias poderiam estar disponíveis em html e o visual poderia ser atualizado +Layout
  • +
  • Navegação pela versão digital da revista (em pdf) não facilita a leitura, não há ferramenta de buscas por palavras-chave ou data de publicação dos conteúdos, é necessário fazer vários cliques para chegar a um conteúdo específico (mesmo da nova edição), a disposição de textos e imagens na leitura dentro do site não é muito bacana (legendas das imagens, por exemplo, não têm um tamanho próprio)
  • +
  • Novos elementos e melhor intuitividade
  • +
  • A forma como carrega as páginas da revista no Issuuu
  • +
  • Poderia ser melhor trabalhado os conteúdos audiovisuais.
  • +
  • O menu de navegação para acesso à revista.
  • +
  • O design do site.
  • +
  • O layout da página inicial é sempre meio confuso. a parte para assinatura da revista não funciona, já me inscrevi diversas vezes e nunca recebo atualizações sobre a Darcy no endereço cadastrado.
  • +
+

Questão 11

+

O que no site te agrada e pode ser entendido como essencial?

+
    +
  • O fato de todas as edições estarem disponíveis.
  • +
  • Fácil disponibilização das edições passadas.
  • +
  • A busca rápida por outras edições da revista
  • +
  • Disponibilização da íntegra da revista.
  • +
  • A organização em menus principais acima (o que facilita as buscas de conteúdos), as caixinhas de destaques (mesmo que não estejam em um leiaute bonito e adequado, acredito que o próximo site deva incluir caixinhas de destaque com fotos)
  • +
  • A leitura das edições na plataforma e imagens.
  • +
  • A riqueza de imagens, a identidade visual das reportagens de acordo com o tema, e os infográficos, além da linguagem acessível mesmo em temas complexos.
  • +
  • Bonito e bem organizado, com banners e links em destaque
  • +
  • O conteúdo e a leveza das cores e da diagramação.
  • +
  • A organização das edições.
  • +
  • As capas das revistas devem ter destaque.
  • +
  • As abas estão bem divididas.
  • +
  • os arquivos poderem ser baixados em pdf.
  • +
  • Página para download de todas a edições, página para leitura online, contato.
  • +
+

Questão 12

+

Há alguma sugestão de melhorias em qualquer aspecto (visual, textual, usabilidade, funcionalidade, etc.)?

+
    +
  • Uma arquitetura da informação mais orgânica, que facilitasse o acesso a reportagens de várias edições, talvez com a aplicação de tags (ou agregadores). Visualmente, o site também não faz jus à revista. Por fim, sugiro agregar plugins que tornassem o ambiente interativo, na medida do possível.
  • +
  • Mudanças simples no carrossel dos destaques e a possibilidade de alguma interatividade com infográficos e outras imagens
  • +
  • Uma revista digital interativa
  • +
  • Página inicial visualmente mais bonita; reavaliação dos menus para evitar duplicatas de conteúdo; valorização dos conteúdos multimídia.
  • +
  • É necessário adaptar a usabilidade em celular, incluir ferramentas de buscas dos conteúdos (por palavras-chave e por data), incluir na home mais caixinhas para conteúdos multimídia, retirar o banner principal (se o uso for somente para o leitor ser encaminhado para a nova edição, não faz sentido, pois já há outra caixinha abaixo que leva para a última publicação), reorganizar a disposição dos destaques, de forma harmônica (exemplo: destaque de vídeos aparece antes do Leia mais; há uma caixinha com endereço do campus, sendo que essa informação se repete no pé do site). A disposição atual dá impressão de uma certa desorganização na home do site, já que as caixinhas não estão organizadas de forma padronizada.
  • +
  • Mais funções para deixar mais intuitivo e melhor identidade visual
  • +
  • Aplicativo, talvez.
  • +
  • Se fosse viável, poderia haver a versão web da revista completa, mais interativa, sem ser PDF
  • +
  • Acredito que se a revista fosse mais visual, tipo, não precisasse clicar em varias abas para abrir seria mais intuitivo. Como por exemplo a Gazeta de Alagoas. Segue link: https://www.gazetadealagoas.com.br/edicao-digital
  • +
  • Acho que a revista tem de ser mais divulgada. Iniciar uma visita a cada departamento, em busca de pautas e de leitores.
  • +
  • Sim, tornar a hierarquia das informações mais intuitivas como as plataformas de mídia estão fazendo, e facilitar a busca por notícias de interesse.
  • +
  • Criar estratégias de divulgação nas mídias sociais com entrevistas, divulgação de temas e conexão com o PAS para maior alcance dos alunos da Educação Básica.
  • +
+

5. Histórico de Versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoAutorDescriçãoRevisorData
1.0Jefferson SenaAdicionando Dados do FormulárioTiago Albuquerque17/04/2024
1.1Jefferson SenaDefinindo Perfil dos UsuáriosTiago Albuquerque17/04/2024
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/requisitos/visao_de_produto/index.html b/requisitos/visao_de_produto/index.html new file mode 100644 index 0000000..153cb54 --- /dev/null +++ b/requisitos/visao_de_produto/index.html @@ -0,0 +1,2768 @@ + + + + + + + + + + + + + + + + + + + + + + + Visão de Produto - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + +

Visão Geral do Produto

+

1. Problema

+

Foi identificado uma dificuldade quanto a ferramenta atualmente utilizada pela secretaria de Comunicação da Universidade de Brasília. Por utilizarem o Joomla, um sistema de gerenciamento de conteúdo (CMS) de código aberto usado para construir websites e aplicativos online. Enfrentam dificuldades em atualizar os conteúdos pela alta complexidade desse sistema. Surgindo então, a necessidade de uma migração de plataforma.

+

Além disso, a Revista Darcy, como veículo de divulgação das principais atividades da Universidade, busca ampliar sua base de leitores. Para alcançar esse objetivo, é essencial contar com uma plataforma intuitiva e prática, que facilite o acesso e a interação com diversos perfis de leitores.

+

Diagrama de Causa e Efeito

+ + +

2. Posição do Produto

+

Uma plataforma WEB intuitiva e com recursos visuais que proporcionem uma experiência de leitura agradável, assim como o formato impresso da revista, é essencial para o sucesso da Revista Darcy. Além disso, é importante que esta ferramenta expanda o alcance a diferentes tipos de leitores, oferecendo recursos para interação, como comentários e compartilhamento de conteúdo. Adicionalmente, a plataforma é adaptável a diversos dispositivos, o que garante uma experiência consistente e acessível em computadores, tablets e smartphones.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParaLeitores da Revista Darcy
QuemPúblico interessado em conhecer sobre as edições da Revista Darcy e Universidade de Brasília
Revista DarcyÉ uma Plataforma WEB e WordPress
QueProporciona uma experiência de Leitura Intuitiva e agradável
Ao contrárioJoomla
Nosso produtoDisponibiliza Recursos e identidade visual que proporcionam maior interatividade com a leitura.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParaEditores da Revista Darcy
QuemEditores que realizam publicações e edições na plataforma
Revista DarcyÉ uma Plataforma WEB em WordPress
QueFacilita públicações e edições da Revista Darcy
Ao contrárioJoomla
Nosso produtoDisponibiliza ferramentas e recursos que facilitem a publicação de reportagens e edições da Revista, aumenta a independência dos jornalistas sem a necessidade de um funcionário de TI para auxiliar nas publicações e edições da revista
+

3. Objetivos do produto

+
    +
  • Facilidade na publicação de edições e posts
  • +
  • Modernização na identidade visual inserindo aspectos da revista
  • +
  • Utilizar galerias de imagens dinâmicas das reportagens
  • +
  • Integração com plataformas externas: YouTube e Instagram
  • +
  • Integração entre a Revista Darcy e a UnB Ciência
  • +
+

4. Tecnologias a serem utilizadas

+
    +
  • Comunicação : Telegram, Discord e Teams.
  • +
  • Documentação : Mkdocs, GitHub
  • +
  • IDE's: Visual Studio Code
  • +
  • Design: WordPress, Figma
  • +
+

5. Histórico de Versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoAutorDescriçãoRevisorData
1.0Jefferson Sena e Luís FilipeAdicionando Visão do ProdutoTiago Albuquerque02/03/2024
1.1José AndréPadronização de TópicosJefferson Sena11/03/2024
1.2Tiago AlbuquerqueDiagrama de Causa e EfeitoJefferson Sena11/03/2024
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/requisitos/visao_de_projeto/index.html b/requisitos/visao_de_projeto/index.html new file mode 100644 index 0000000..8748277 --- /dev/null +++ b/requisitos/visao_de_projeto/index.html @@ -0,0 +1,2807 @@ + + + + + + + + + + + + + + + + + + + + + + + Visão de Projeto - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + +

Visão Geral do Projeto

+

1. Organização do Projeto

+

A tabela a seguir possui os integrantes definidos para cada divisão de atribuições de tarefas a serem cumpridas.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PAPELATRIBUIÇÕESINTEGRANTE
Product OwnerCoordenar as fases do projeto, atualizar escopo do produto, validar as entregas e gerenciar prazos.Jefferson Sena
DesenvolvedorCodificar e construir o software definido a partir dos requisitos analisados.Equipe
Scrum MasterGarantir a compreensão e adoção do Scrum pela equipe. Estimular a comunicação eficaz e a colaboração dentro da equipe Scrum.José André
Design e prototipagem de interfacesPrototipa possíveis interfaces a serem implementadas no software, mantendo padrões definidos.Equipe
Análise de requisitosDescobre, propõe e analisa os requisitos do produto, documentando e esclarecendo possíveis dúvidas aos envolvidos.Equipe
ClienteValida o produto e propõe requisitos que o mesmo necessita que exista na aplicação.Secretaria de Comunicação UnB
+

2. Planejamento das sprints do projeto

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SPRINTPRODUTO(ENTREGAS)INÍCIOFIM
0Reuniões inicias, criação da página de documentação e cronograma26/02/2023404/03/2024
1Planejamento, definição de backlog, requisitos brutos e validação.04/03/202311/03/2024
2Configuração do ambiente Wordpress, refinamento do backlog, requisitos brutos e validação. Formulário de pesquisa e obtenção de dados.11/03/202325/03/2024
3Criação de páginas; refinamento do backlog; testes de usabilidade; definição do roadmap.25/03/202308/04/2024
4Insights dos dados do formulário; Evolução do projeto open source GOV-br, injeção de código no tema08/04/202322/04/2024
+

3. Roadmap da Organização do Projeto

+
+ +
+

+

4. Gerenciamento de riscos

+

Os riscos identificados para o projeto foram:

+
    +
  • Falta de horários disponíveis para todos os integrantes se reunirem para as reuniões.
      +
    • Solução: + Definição de horários disponíveis para todos os membros e negociação em relação a carga horária semanal.
    • +
    +
  • +
  • Indisponibilidade de algum dos integrantes.
      +
    • Solução: + Replanejamento das atribuições designadas e replanejamento das fases de desenvolvimento.
    • +
    +
  • +
+

5. Critérios de Replanejamento

+
    +
  • Diminuição dos membros da equipe
  • +
+

Caso haja mudanças na formação da equipe, é importante reavaliar as atividades definidas, com reajuste de prazos, tarefas e complexidade do desenvolvimento, a fim de reduzir os impactos no projeto.

+
    +
  • Não cumprimento de prazos
  • +
+

Caso a equipe não consiga cumprir os prazos pré-definidos, é possível que haja um reajuste dos requisitos e sua complexidade, a fim de que ao final seja possível realizar a entrega do produto ao cliente.

+
    +
  • Insatisfação do Cliente
  • +
+

Caso haja insatisfação por parte do cliente, é importante que a equipe refaça a análise dos defeitos apontados, com o objetivo de trazer as causas da insatisfação e assim trazer uma melhoria para tal aspecto.

+

6. Histórico de Versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VersãoAutorDescriçãoRevisorData
1.0Tiago AlbuquerqueCriação da visão de projetoJosé André05/03/2024
1.1José AndréCorreção de Tópicos e Adição de SprintTiago Albuquerque11/03/2024
1.2Jefferson SenaAdicionando RoadMapTiago Albuquerque26/03/2024
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 0000000..0b9b411 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["pt"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Revista Darcy","text":""},{"location":"#plataformas","title":"Plataformas","text":"
  • Revista Darcy - Site Atual
  • Revista Darcy - Ambiente de Testes TIC BRISA
  • Revista Darcy - Ambiente de Homologa\u00e7\u00e3o - Servidores da UnB
"},{"location":"#sobre-a-revista-darcy","title":"Sobre a Revista Darcy","text":"
  • Descri\u00e7\u00e3o: A Revista Darcy, criada em 2009 e sob a responsabilidade da Secretaria de Comunica\u00e7\u00e3o da Universidade de Bras\u00edlia, destaca-se como uma publica\u00e7\u00e3o dedicada ao jornalismo cient\u00edfico e cultural. Projetada como uma vitrine da produ\u00e7\u00e3o acad\u00eamica da UnB, a revista apresenta reportagens que comunicam, de maneira acess\u00edvel, as atividades de pesquisa e extens\u00e3o desenvolvidas na institui\u00e7\u00e3o, oferecendo uma vis\u00e3o cativante e informativa do cen\u00e1rio acad\u00eamico.

  • Problemas atuais: Atualmente, utilizam o Joomla, que \u00e9 um sistema de gerenciamento de conte\u00fado (CMS) de c\u00f3digo aberto usado para construir websites e aplicativos online. No entanto, enfrentam dificuldades em atualizar os conte\u00fados pela alta complexidade desse sistema. Surgindo ent\u00e3o, a necessidade de uma migra\u00e7\u00e3o de plataforma.

  • Resultados esperados: Uma plataforma, em Wordpress, mais intuitiva e acess\u00edvel para os editores e jornalistas e que possibilite uma comunica\u00e7\u00e3o mais f\u00e1cil com os leitores da revista.

  • Habilidades necess\u00e1rias/preferenciais: Conhecimento em WordPress; Conhecimento em HTML; Conhecimento em CSS.

  • Mentores: Vanessa, editora-chefe da Revista Darcy.

  • Tamanho do projeto: M\u00e9dio/Grande.

  • Dificuldade: M\u00e9dia.

"},{"location":"#realizacao","title":"Realiza\u00e7\u00e3o","text":"

Este projeto \u00e9 fruto do programa de Resid\u00eancia em TIC, conduzido pela BRISA \u2013 Sociedade para o Desenvolvimento da Tecnologia da Informa\u00e7\u00e3o \u2013, em parceria com a Faculdade UnB Gama, com apoio da SOFTEX \u2013 Associa\u00e7\u00e3o para Promo\u00e7\u00e3o da Excel\u00eancia do Software Brasileiro \u2013 e do MCTI \u2013 Minist\u00e9rio da Ci\u00eancia, Tecnologia e Inova\u00e7\u00e3o.

"},{"location":"#equipe","title":"Equipe","text":"Jos\u00e9 Andr\u00e9 Jefferson Sena Tiago Albuquerque Gabriel Morais Lu\u00eds Filipe Joselito Prado"},{"location":"atas/equipe/ata00/","title":"Ata da Reuni\u00e3o 0 - 26/02","text":""},{"location":"atas/equipe/ata00/#1-lista-de-presenca","title":"1. Lista de presen\u00e7a","text":"Nome Presente Jos\u00e9 Andr\u00e9 Sim Jefferson Sena Sim Joselito Prado Sim Tiago Albuquerque Sim Lu\u00eds Filipe Sim Hor\u00e1rio de In\u00edcio Hor\u00e1rio de T\u00e9rmino Local 14:00 16:00 Sala 313 - LTDEA"},{"location":"atas/equipe/ata00/#2-pautas","title":"2. Pautas","text":"
  • Planejamento da Sprint 00
  • Organiza\u00e7\u00e3o do time
  • Escopo geral do projeto
"},{"location":"atas/equipe/ata00/#3-atividades-definidas","title":"3. Atividades Definidas","text":"

Atividades, Prazos e Respons\u00e1veis

"},{"location":"atas/equipe/ata01/","title":"Ata da Reuni\u00e3o 1 - 04/03","text":""},{"location":"atas/equipe/ata01/#1-lista-de-presenca","title":"1. Lista de presen\u00e7a","text":"Nome Presente Jos\u00e9 Andr\u00e9 Sim Jefferson Sena Sim Joselito Prado Sim Tiago Albuquerque Sim Lu\u00eds Filipe Sim Hor\u00e1rio de In\u00edcio Hor\u00e1rio de T\u00e9rmino Local 14:00 16:00 Sala 313 - LTDEA"},{"location":"atas/equipe/ata01/#2-pautas","title":"2. Pautas","text":"
  • Review da Sprint 00
  • Planejamento da Sprint 01
  • Pol\u00edticas do time
  • Vis\u00e3o do produto
  • Vis\u00e3o do projeto
"},{"location":"atas/equipe/ata01/#3-atividades-definidas","title":"3. Atividades Definidas","text":"

Atividades, Prazos e Respons\u00e1veis

"},{"location":"atas/equipe/ata02/","title":"Ata da Reuni\u00e3o 2 - 11/03","text":""},{"location":"atas/equipe/ata02/#1-lista-de-presenca","title":"1. Lista de presen\u00e7a","text":"Nome Presente Jos\u00e9 Andr\u00e9 Sim Jefferson Sena Sim Joselito Prado Sim Tiago Albuquerque Sim Lu\u00eds Filipe Sim Hor\u00e1rio de In\u00edcio Hor\u00e1rio de T\u00e9rmino Local 14:00 16:00 Sala 313 - LTDEA"},{"location":"atas/equipe/ata02/#2-pautas","title":"2. Pautas","text":"
  • Review da Sprint 01
  • Planejamento da Sprint 02
  • Refinamento de Requisitos
  • Configura\u00e7\u00e3o do ambiente Wordpress
  • Implementa\u00e7\u00e3o da SKIN GOVBR
  • Identidade Visual da Darcy
"},{"location":"atas/equipe/ata02/#3-atividades-definidas","title":"3. Atividades Definidas","text":"

Atividades, Prazos e Respons\u00e1veis

"},{"location":"atas/equipe/ata03/","title":"Ata da Reuni\u00e3o 3 - 25/03","text":""},{"location":"atas/equipe/ata03/#1-lista-de-presenca","title":"1. Lista de presen\u00e7a","text":"Nome Presente Jos\u00e9 Andr\u00e9 Sim Jefferson Sena Sim Joselito Prado Sim Tiago Albuquerque Sim Lu\u00eds Filipe Sim Gabriel Morais Sim Hor\u00e1rio de In\u00edcio Hor\u00e1rio de T\u00e9rmino Local 13:30 15:00 Sala 313 - LTDEA"},{"location":"atas/equipe/ata03/#2-pautas","title":"2. Pautas","text":"
  • Review da Sprint 02
  • Planejamento da Sprint 03
  • Evolu\u00e7\u00e3o do MVP
"},{"location":"atas/equipe/ata03/#3-atividades-definidas","title":"3. Atividades Definidas","text":"

Atividades, Prazos e Respons\u00e1veis

"},{"location":"atas/equipe/ata04/","title":"Ata da Reuni\u00e3o 4 - 09/04","text":""},{"location":"atas/equipe/ata04/#1-lista-de-presenca","title":"1. Lista de presen\u00e7a","text":"Nome Presente Jos\u00e9 Andr\u00e9 Sim Jefferson Sena Sim Joselito Prado Sim Tiago Albuquerque Sim Lu\u00eds Filipe Sim Gabriel Morais Sim Hor\u00e1rio de In\u00edcio Hor\u00e1rio de T\u00e9rmino Local 15:30 16:00 Sala 313 - LTDEA"},{"location":"atas/equipe/ata04/#2-pautas","title":"2. Pautas","text":"
  • Reflex\u00e3o sobre a Release 1
  • Review da Sprint 03
  • Planejamento da Sprint 04
  • Possibilidade de evoluir o tema via inje\u00e7\u00e3o de c\u00f3digo
"},{"location":"atas/equipe/ata04/#3-atividades-definidas","title":"3. Atividades Definidas","text":"

Atividades, Prazos e Respons\u00e1veis

"},{"location":"atas/equipe/ata05/","title":"Ata da Reuni\u00e3o 5 - 22/04","text":""},{"location":"atas/equipe/ata05/#1-lista-de-presenca","title":"1. Lista de presen\u00e7a","text":"Nome Presente Jos\u00e9 Andr\u00e9 Sim Jefferson Sena Sim Joselito Prado Sim Tiago Albuquerque Sim Lu\u00eds Filipe Sim Gabriel Morais Sim Hor\u00e1rio de In\u00edcio Hor\u00e1rio de T\u00e9rmino Local 11:00 12:00 CoCreation"},{"location":"atas/equipe/ata05/#2-pautas","title":"2. Pautas","text":"
  • Review e Retrospective da Sprint 04.
  • Planejamento da Sprint 05.
"},{"location":"atas/equipe/ata05/#3-atividades-definidas","title":"3. Atividades Definidas","text":"

Atividades, Prazos e Respons\u00e1veis

"},{"location":"atas/equipe/ata06/","title":"Ata da Reuni\u00e3o 6 - 06/05","text":""},{"location":"atas/equipe/ata06/#1-lista-de-presenca","title":"1. Lista de presen\u00e7a","text":"Nome Presente Jos\u00e9 Andr\u00e9 Sim Jefferson Sena Sim Joselito Prado Sim Tiago Albuquerque Sim Lu\u00eds Filipe Sim Gabriel Morais Sim Hor\u00e1rio de In\u00edcio Hor\u00e1rio de T\u00e9rmino Local 14:00 15:00 LTDEA - Sala 313"},{"location":"atas/equipe/ata06/#2-pautas","title":"2. Pautas","text":"
  • Review e Retrospective da Sprint 05.
  • Planejamento da Sprint 06.
"},{"location":"atas/equipe/ata06/#3-atividades-definidas","title":"3. Atividades Definidas","text":"

Atividades, Prazos e Respons\u00e1veis

"},{"location":"atas/equipe/ata07/","title":"Ata da Reuni\u00e3o 7 - 20/05","text":""},{"location":"atas/equipe/ata07/#1-lista-de-presenca","title":"1. Lista de presen\u00e7a","text":"Nome Presente Jos\u00e9 Andr\u00e9 Sim Jefferson Sena Sim Joselito Prado Sim Tiago Albuquerque Sim Lu\u00eds Filipe Sim Gabriel Morais Sim Hor\u00e1rio de In\u00edcio Hor\u00e1rio de T\u00e9rmino Local 15:00 16:00 LTDEA - Sala 313"},{"location":"atas/equipe/ata07/#2-pautas","title":"2. Pautas","text":"
  • Review e Retrospective da Sprint 06.
  • Planejamento da Sprint 07.
"},{"location":"atas/equipe/ata07/#3-atividades-definidas","title":"3. Atividades Definidas","text":"

Atividades, Prazos e Respons\u00e1veis

"},{"location":"atas/equipe/ata08/","title":"Ata da Reuni\u00e3o 8 - 03/06","text":""},{"location":"atas/equipe/ata08/#1-lista-de-presenca","title":"1. Lista de presen\u00e7a","text":"Nome Presente Jos\u00e9 Andr\u00e9 Sim Jefferson Sena Sim Joselito Prado Sim Tiago Albuquerque Sim Lu\u00eds Filipe Sim Gabriel Morais Sim Hor\u00e1rio de In\u00edcio Hor\u00e1rio de T\u00e9rmino Local 15:00 16:00 LTDEA - Sala 313"},{"location":"atas/equipe/ata08/#2-pautas","title":"2. Pautas","text":"
  • Review e Retrospective da Sprint 07.
  • Planejamento da Sprint 08.
"},{"location":"atas/equipe/ata08/#3-atividades-definidas","title":"3. Atividades Definidas","text":"

Atividades, Prazos e Respons\u00e1veis

"},{"location":"atas/equipe/ata09/","title":"Ata da Reuni\u00e3o 9 - 17/06","text":""},{"location":"atas/equipe/ata09/#1-lista-de-presenca","title":"1. Lista de presen\u00e7a","text":"Nome Presente Jos\u00e9 Andr\u00e9 Sim Jefferson Sena Sim Joselito Prado Sim Tiago Albuquerque Sim Lu\u00eds Filipe Sim Gabriel Morais Sim Hor\u00e1rio de In\u00edcio Hor\u00e1rio de T\u00e9rmino Local 13:00 14:00 LTDEA - Sala 313"},{"location":"atas/equipe/ata09/#2-pautas","title":"2. Pautas","text":"
  • Review e Retrospective da Sprint 08.
  • Planejamento da Sprint 09.
"},{"location":"atas/equipe/ata09/#3-atividades-definidas","title":"3. Atividades Definidas","text":"

Atividades, Prazos e Respons\u00e1veis

"},{"location":"atas/equipe_cliente/ata01/","title":"Reuni\u00e3o 1","text":"

PROJETO BRISA \u2013 LAPPIS/FGA/UNB. REFORMULA\u00c7\u00c3O DO SITE DA REVISTA DARCY

"},{"location":"atas/equipe_cliente/ata01/#ata-da-reuniao-1","title":"Ata da Reuni\u00e3o 1","text":"
  • Data: 29 de fevereiro de 2024
  • Hor\u00e1rio: 10h00
  • Local: Microsoft Teams
"},{"location":"atas/equipe_cliente/ata01/#1-participantes-da-equipe-tic-brisa","title":"1. Participantes da Equipe TIC Brisa","text":"
  • Jefferson Sena: Product Owner
  • Jos\u00e9 Andr\u00e9: Scrum Master
  • Tiago Albuquerque: Dev Team
  • Joselito Prado: Dev Team
  • Lu\u00eds Filipe: Dev Team
"},{"location":"atas/equipe_cliente/ata01/#2-participantes-da-revista-darcy","title":"2. Participantes da Revista Darcy","text":"
  • Vanessa: Editora-Chefe da Revista Darcy
"},{"location":"atas/equipe_cliente/ata01/#3-objetivos-da-reuniao","title":"3. Objetivos da Reuni\u00e3o","text":"
  1. Apresenta\u00e7\u00e3o da Equipe.
  2. Vis\u00e3o geral do projeto.
  3. Kick-off.
"},{"location":"atas/equipe_cliente/ata01/#4-topicos-discutidos","title":"4. T\u00f3picos Discutidos","text":"
  1. Prazos e cronograma.
  2. Metodologias que v\u00e3o ser utilizadas.
  3. Compreens\u00e3o inicial do problema.
  4. Discuss\u00e3o inicial de todos os par\u00e2metros.
"},{"location":"atas/equipe_cliente/ata01/#5-decisoes-tomadas","title":"5. Decis\u00f5es Tomadas","text":"
  1. Ter uma reuni\u00e3o entre a equipe TIC BRISA com os designers, editores e apoio de TI da SECOM.
  2. Elaborar um cronograma de trabalho inicial.
  3. Iniciar o levantamento de requisitos com o PBB.
  4. Defini\u00e7\u00e3o da din\u00e2mica entre equipe-cliente.
"},{"location":"atas/equipe_cliente/ata01/#6-gravacao-da-reuniao","title":"6. Grava\u00e7\u00e3o da Reuni\u00e3o","text":"

Clique Aqui (D\u00edspon\u00edvel apenas para pessoas em UnB.br).

"},{"location":"atas/equipe_cliente/ata01/#7-proxima-reuniao","title":"7. Pr\u00f3xima Reuni\u00e3o","text":"
  • Data: 07 de mar\u00e7o de 2024.
  • Hor\u00e1rio: 10h00.
  • Objetivo: Apresenta\u00e7\u00e3o inicial do PBB; Integra\u00e7\u00e3o da Equipe com os membros da SECOM.
"},{"location":"atas/equipe_cliente/ata01/#8-responsaveis-pela-ata","title":"8. Respons\u00e1veis pela Ata","text":"Autor Descri\u00e7\u00e3o Revisor Data Jos\u00e9 Andr\u00e9 Cria\u00e7\u00e3o da Ata Vanessa 11/03/2024"},{"location":"atas/equipe_cliente/ata02/","title":"Reuni\u00e3o 2","text":"

PROJETO BRISA \u2013 LAPPIS/FGA/UNB. REFORMULA\u00c7\u00c3O DO SITE DA REVISTA DARCY

"},{"location":"atas/equipe_cliente/ata02/#ata-da-reuniao-2","title":"Ata da Reuni\u00e3o 2","text":"
  • Data: 07 de mar\u00e7o de 2024
  • Hor\u00e1rio: 10h00
  • Local: Microsoft Teams
"},{"location":"atas/equipe_cliente/ata02/#1-participantes-da-equipe-tic-brisa","title":"1. Participantes da Equipe TIC Brisa","text":"
  • Jefferson Sena: Product Owner
  • Jos\u00e9 Andr\u00e9: Scrum Master
  • Tiago Albuquerque: Dev Team
  • Joselito Prado: Dev Team
  • Lu\u00eds Filipe: Dev Team
"},{"location":"atas/equipe_cliente/ata02/#2-participantes-da-revista-darcy","title":"2. Participantes da Revista Darcy","text":"
  • Vanessa: Editora-Chefe da Revista Darcy
  • Danilo Xavier: TI da SECOM
  • Matheus Luis Rosa: TI da SECOM
  • Francisco George Lopes: Editor de Design da Revista Darcy
"},{"location":"atas/equipe_cliente/ata02/#3-objetivos-da-reuniao","title":"3. Objetivos da Reuni\u00e3o","text":"
  1. Apresenta\u00e7\u00e3o das equipes Secom e Brisa.
  2. Di\u00e1logo sobre vis\u00e3o geral do produto e do projeto.
  3. Apresenta\u00e7\u00e3o da Metodologia de Trabalho.
"},{"location":"atas/equipe_cliente/ata02/#4-topicos-discutidos","title":"4. T\u00f3picos Discutidos","text":"
  1. Apresenta\u00e7\u00e3o da Equipe da SECOM e da TIC BRISA.
  2. Apresentamos nosso site de documenta\u00e7\u00e3o e o PBB inicial atrav\u00e9s do Miro.
  3. Editores da Revista discorreram sobre alguns problemas da atual plataforma de divulga\u00e7\u00e3o de conte\u00fado (Joomla).
  4. Os t\u00e9cnicos de TI da Secom compartilharam informa\u00e7\u00f5es sobre o Padr\u00e3o Digital de Governo para sites, dispon\u00edvel no endere\u00e7o: https://www.gov.br/ds/home.
  5. Discutimos o modelo de usabilidade do governo (eMAG) e sua aplicabilidade no projeto.
"},{"location":"atas/equipe_cliente/ata02/#5-decisoes-tomadas","title":"5. Decis\u00f5es Tomadas","text":"
  1. SECOM ir\u00e1 fazer uma reuni\u00e3o interna para validar o PBB bruto e fazer colabora\u00e7\u00f5es, al\u00e9m de trazer na pr\u00f3xima reuni\u00e3o refer\u00eancias de templates.
  2. Iremos elaborar um formul\u00e1rio para captar dados do p\u00fablico geral sobre a vis\u00e3o e expectativa do produto. Esse formul\u00e1rio ser\u00e1 refinado e validado pela SECOM.
  3. Equipe BRISA se comprometeu em trazer refer\u00eancias externas.
  4. Equipe de T.I da SECOM se comprometeu em trazer as diretrizes t\u00e9cnicas para entendermos como funciona o processo de implanta\u00e7\u00e3o no .GOV e no UnB.br.
"},{"location":"atas/equipe_cliente/ata02/#6-gravacao-da-reuniao","title":"6. Grava\u00e7\u00e3o da Reuni\u00e3o","text":"

Clique Aqui (D\u00edspon\u00edvel apenas para pessoas em UnB.br).

"},{"location":"atas/equipe_cliente/ata02/#7-proxima-reuniao","title":"7. Pr\u00f3xima Reuni\u00e3o","text":"
  • Data: 14 de mar\u00e7o de 2024.
  • Hor\u00e1rio: 10h00.
  • Objetivo: Valida\u00e7\u00e3o e Evolu\u00e7\u00e3o do PBB; Novos encaminhamentos.
"},{"location":"atas/equipe_cliente/ata02/#8-responsaveis-pela-ata","title":"8. Respons\u00e1veis pela Ata","text":"Autor Descri\u00e7\u00e3o Revisor Data Jos\u00e9 Andr\u00e9 Cria\u00e7\u00e3o da Ata Vanessa 11/03/2024"},{"location":"atas/equipe_cliente/ata03/","title":"Reuni\u00e3o 3","text":"

PROJETO BRISA \u2013 LAPPIS/FGA/UNB. REFORMULA\u00c7\u00c3O DO SITE DA REVISTA DARCY

"},{"location":"atas/equipe_cliente/ata03/#ata-da-reuniao-3","title":"Ata da Reuni\u00e3o 3","text":"
  • Data: 02 de abril de 2024
  • Hor\u00e1rio: 10h00
  • Local: Microsoft Teams
"},{"location":"atas/equipe_cliente/ata03/#1-participantes-da-equipe-tic-brisa","title":"1. Participantes da Equipe TIC Brisa","text":"
  • Jefferson Sena: Product Owner
  • Jos\u00e9 Andr\u00e9: Scrum Master
  • Tiago Albuquerque: Dev Team
  • Joselito Prado: Dev Team
  • Lu\u00eds Filipe: Dev Team
"},{"location":"atas/equipe_cliente/ata03/#2-participantes-da-revista-darcy","title":"2. Participantes da Revista Darcy","text":"
  • Vanessa: Editora-Chefe da Revista Darcy
  • Marcelo Reis Jatoba: Coordenador de Design da SECOM
"},{"location":"atas/equipe_cliente/ata03/#3-objetivos-da-reuniao","title":"3. Objetivos da Reuni\u00e3o","text":"
  1. Apresenta\u00e7\u00e3o do prot\u00f3tipo e valida\u00e7\u00e3o.
  2. Quest\u00f5es sobre identidade visual.
  3. Refinamento dos requisitos.
"},{"location":"atas/equipe_cliente/ata03/#4-topicos-discutidos","title":"4. T\u00f3picos Discutidos","text":"
  1. Prot\u00f3tipo teste WordPress produzido.
  2. Prefer\u00eancia por solu\u00e7\u00f5es open source inicialmente.
  3. Plugin da leitura da revista e possibilidade da aquisi\u00e7\u00e3o do Issuu.
  4. Integra\u00e7\u00e3o da plataforma com a UnB Ci\u00eancia.
  5. Problemas da atual plataforma (disposi\u00e7\u00e3o de grids e publica\u00e7\u00e3o duplicada).
  6. Necessidade da prototipa\u00e7\u00e3o por parte da equipe de design da SECOM.
"},{"location":"atas/equipe_cliente/ata03/#5-decisoes-tomadas","title":"5. Decis\u00f5es Tomadas","text":"
  1. SECOM ir\u00e1 compreender internamente com a STI e os t\u00e9cnicos quem est\u00e1 dispon\u00edvel no momento para contribuir ao projeto.
  2. Aguardaremos uma semana para analisar os dados recebidos do formul\u00e1rio.
  3. Equipe BRISA se comprometeu em integrar a atual plataforma em desenvolvimento com a UnB Ci\u00eancia e exibir not\u00edcias recentes da plataforma. Al\u00e9m de continuar com a busca de solu\u00e7\u00f5es open source vi\u00e1veis para o produto.
  4. SECOM ir\u00e1 verificar a possibilidade da realiza\u00e7\u00e3o de um briefing inicial entre os designers da Revista e a equipe TIC BRISA.
  5. H\u00e1 a possibilidade da equipe de Desgin da SECOM realizar a prototipa\u00e7\u00e3o visual da Revista Darcy de acordo com os dados levantados do formul\u00e1rio.
"},{"location":"atas/equipe_cliente/ata03/#6-gravacao-da-reuniao","title":"6. Grava\u00e7\u00e3o da Reuni\u00e3o","text":"

Clique Aqui (D\u00edspon\u00edvel apenas para pessoas em UnB.br).

"},{"location":"atas/equipe_cliente/ata03/#7-proxima-reuniao","title":"7. Pr\u00f3xima Reuni\u00e3o","text":"
  • Data: 04 de abril de 2024.
  • Hor\u00e1rio: 10h00.
  • Objetivo: Perspectiva de identidade visual a partir da programadora visual da SECOM.
"},{"location":"atas/equipe_cliente/ata03/#8-responsaveis-pela-ata","title":"8. Respons\u00e1veis pela Ata","text":"Autor Descri\u00e7\u00e3o Revisor Data Jos\u00e9 Andr\u00e9 Cria\u00e7\u00e3o da Ata Vanessa 02/04/2024"},{"location":"atas/equipe_cliente/ata04/","title":"Reuni\u00e3o 4","text":"

PROJETO BRISA \u2013 LAPPIS/FGA/UNB. REFORMULA\u00c7\u00c3O DO SITE DA REVISTA DARCY

"},{"location":"atas/equipe_cliente/ata04/#ata-da-reuniao-4","title":"Ata da Reuni\u00e3o 4","text":"
  • Data: 04 de abril de 2024
  • Hor\u00e1rio: 10h00
  • Local: Microsoft Teams
"},{"location":"atas/equipe_cliente/ata04/#1-participantes-da-equipe-tic-brisa","title":"1. Participantes da Equipe TIC Brisa","text":"
  • Jefferson Sena: Product Owner
  • Jos\u00e9 Andr\u00e9: Scrum Master
  • Tiago Albuquerque: Dev Team
  • Joselito Prado: Dev Team
  • Lu\u00eds Filipe: Dev Team
  • Gabriel Morais: Dev Team
"},{"location":"atas/equipe_cliente/ata04/#2-participantes-da-revista-darcy","title":"2. Participantes da Revista Darcy","text":"
  • Vanessa: Editora-Chefe da Revista Darcy
  • Virginia Maria Soares: Programadora Visual de Design da SECOM
"},{"location":"atas/equipe_cliente/ata04/#3-objetivos-da-reuniao","title":"3. Objetivos da Reuni\u00e3o","text":"
  1. Refinar requisitos de identidade.
  2. Apresentar o tema GOVBR e potenciais plugins.
  3. Debater sobre o design system da UnB.
"},{"location":"atas/equipe_cliente/ata04/#4-topicos-discutidos","title":"4. T\u00f3picos Discutidos","text":"
  1. O porqu\u00ea da decis\u00e3o em migrar plataformas do Joomla para o Wordpress. (A documenta\u00e7\u00e3o de uso do Joomla tornou-se obsoleta devido \u00e0 sa\u00edda gradual dos funcion\u00e1rios respons\u00e1veis pela sua manuten\u00e7\u00e3o na institui\u00e7\u00e3o. Essa evas\u00e3o dificultou a atualiza\u00e7\u00e3o e manuten\u00e7\u00e3o das informa\u00e7\u00f5es pelos servidores subsequentes.)
  2. Vis\u00e3o geral sobre o design system da UnB.
  3. Possibilidade de aquisi\u00e7\u00e3o de ferramentas.
  4. Usabilidade da nova plataforma.
  5. Trabalho em andamento da equipe de design da UnB para criar templates pro Wordpress.
  6. Migra\u00e7\u00e3o dos dados do Joomla para o Wordpress.
"},{"location":"atas/equipe_cliente/ata04/#5-decisoes-tomadas","title":"5. Decis\u00f5es Tomadas","text":"
  1. SECOM compartilhar\u00e1 os par\u00e2metros do Design System da UnB que est\u00e1 em desenvolvimento para que a Revista Darcy seja consistente.
  2. A equipe BRISA se comprometeu em buscar e cogitar apenas solu\u00e7\u00f5es gratu\u00edtas.
  3. Briefing com a equipe de design posteriormente para compartilhamento de prot\u00f3tipos e quest\u00f5es relativas \u00e0 hierarquia da informa\u00e7\u00e3o.
  4. Buscar informa\u00e7\u00f5es a respeito da pesquisa sobre o plugin de migra\u00e7\u00e3o de dados do Joomla realizada pela STI.
"},{"location":"atas/equipe_cliente/ata04/#6-gravacao-da-reuniao","title":"6. Grava\u00e7\u00e3o da Reuni\u00e3o","text":"

Clique Aqui (D\u00edspon\u00edvel apenas para pessoas em UnB.br).

"},{"location":"atas/equipe_cliente/ata04/#7-proxima-reuniao","title":"7. Pr\u00f3xima Reuni\u00e3o","text":"
  • Data: 11 de abril de 2024.
  • Hor\u00e1rio: 10h00.
  • Objetivo: An\u00e1lise dos dados do formul\u00e1rio; Briefing com os designers da SECOM.
"},{"location":"atas/equipe_cliente/ata04/#8-responsaveis-pela-ata","title":"8. Respons\u00e1veis pela Ata","text":"Autor Descri\u00e7\u00e3o Revisor Data Jos\u00e9 Andr\u00e9 Cria\u00e7\u00e3o da Ata Vanessa 04/04/2024"},{"location":"atas/equipe_cliente/ata05/","title":"Reuni\u00e3o 5","text":"

PROJETO BRISA \u2013 LAPPIS/FGA/UNB. REFORMULA\u00c7\u00c3O DO SITE DA REVISTA DARCY

"},{"location":"atas/equipe_cliente/ata05/#ata-da-reuniao-5","title":"Ata da Reuni\u00e3o 5","text":"
  • Data: 18 de abril de 2024
  • Hor\u00e1rio: 10h00
  • Local: Microsoft Teams
"},{"location":"atas/equipe_cliente/ata05/#1-participantes-da-equipe-tic-brisa","title":"1. Participantes da Equipe TIC Brisa","text":"
  • Jefferson Sena: Product Owner
  • Joselito Prado: Dev Team
  • Lu\u00eds Filipe: Dev Team
  • Gabriel Morais: Dev Team
"},{"location":"atas/equipe_cliente/ata05/#2-participantes-da-revista-darcy","title":"2. Participantes da Revista Darcy","text":"
  • Vanessa: Editora-Chefe da Revista Darcy
"},{"location":"atas/equipe_cliente/ata05/#3-objetivos-da-reuniao","title":"3. Objetivos da Reuni\u00e3o","text":"
  1. Analisar os dados obtidos atrav\u00e9s do formul\u00e1rio.
  2. Avaliar refer\u00eancias de design externas.
  3. Discutir a din\u00e2mica de trabalho durante a greve.
"},{"location":"atas/equipe_cliente/ata05/#4-topicos-discutidos","title":"4. T\u00f3picos Discutidos","text":"
  1. Arquitetura da informa\u00e7\u00e3o.
  2. Refer\u00eancias de design da Vanessa.
  3. Brainstorming com base nas refer\u00eancias.
"},{"location":"atas/equipe_cliente/ata05/#5-decisoes-tomadas","title":"5. Decis\u00f5es Tomadas","text":"
  1. Vanessa ir\u00e1 elaborar um documento com refer\u00eancias de design.
  2. A equipe BRISA ir\u00e1 prototipar com base nas refer\u00eancias criadas sem perder a hierarquia do GOV-UnB.
  3. Aguardar o decorrer da greve dos servidores para posteriores valida\u00e7\u00f5es da equipe de design.
"},{"location":"atas/equipe_cliente/ata05/#6-gravacao-da-reuniao","title":"6. Grava\u00e7\u00e3o da Reuni\u00e3o","text":"

Clique Aqui (D\u00edspon\u00edvel apenas para pessoas em UnB.br).

"},{"location":"atas/equipe_cliente/ata05/#7-proxima-reuniao","title":"7. Pr\u00f3xima Reuni\u00e3o","text":"
  • Data: 25 de abril de 2024.
  • Hor\u00e1rio: 10h00
  • Objetivo: An\u00e1lise dos prot\u00f3tipos de alta fidelidade com base nas refer\u00eancias.
"},{"location":"atas/equipe_cliente/ata05/#8-responsaveis-pela-ata","title":"8. Respons\u00e1veis pela Ata","text":"Autor Descri\u00e7\u00e3o Revisor Data Jos\u00e9 Andr\u00e9 Lu\u00eds Filipe Cria\u00e7\u00e3o da Ata Vanessa 18/04/2024"},{"location":"atas/equipe_cliente/ata06/","title":"Reuni\u00e3o 6","text":"

PROJETO BRISA \u2013 LAPPIS/FGA/UNB. REFORMULA\u00c7\u00c3O DO SITE DA REVISTA DARCY

"},{"location":"atas/equipe_cliente/ata06/#ata-da-reuniao-6","title":"Ata da Reuni\u00e3o 6","text":"
  • Data: 25 de abril de 2024
  • Hor\u00e1rio: 10h00
  • Local: Microsoft Teams
"},{"location":"atas/equipe_cliente/ata06/#1-participantes-da-equipe-tic-brisa","title":"1. Participantes da Equipe TIC Brisa","text":"
  • Jefferson Sena: Product Owner
  • Jos\u00e9 Andr\u00e9: Scrum Master
  • Joselito Prado: Dev Team
  • Lu\u00eds Filipe: Dev Team
  • Gabriel Morais: Dev Team
"},{"location":"atas/equipe_cliente/ata06/#2-participantes-da-revista-darcy","title":"2. Participantes da Revista Darcy","text":"
  • Vanessa: Editora-Chefe da Revista Darcy
"},{"location":"atas/equipe_cliente/ata06/#3-objetivos-da-reuniao","title":"3. Objetivos da Reuni\u00e3o","text":"
  1. Analisar os prot\u00f3tipos de alta fidelidade realizado ap\u00f3s o envio das refer\u00eancias.
  2. Novos encaminhamentos.
"},{"location":"atas/equipe_cliente/ata06/#4-topicos-discutidos","title":"4. T\u00f3picos Discutidos","text":"
  1. Os dois prot\u00f3tipos feitos a partir das refer\u00eancias.
  2. Infer\u00eancias a partir do prot\u00f3tipo.
"},{"location":"atas/equipe_cliente/ata06/#5-decisoes-tomadas","title":"5. Decis\u00f5es Tomadas","text":"
  1. A equipe de design da SECOM ir\u00e1 entregar o material inicial de design at\u00e9 a pr\u00f3xima quinta-feira (02/05).
  2. A SECOM criar\u00e1 um usu\u00e1rio no Joomla para a equipe BRISA iniciar a migra\u00e7\u00e3o dos dados.
  3. A SECOM juntamente a STI iniciar\u00e1 a din\u00e2mica para a equipe BRISA implementar o prot\u00f3tipo em um subdom\u00ednio da UnB.
  4. A equipe BRISA estudar\u00e1 uma forma de implementar uma se\u00e7\u00e3o de pesquisa direcionada.
  5. A equipe BRISA ir\u00e1 prototipar as p\u00e1ginas internas com base na landing page aprovada pela SECOM.
"},{"location":"atas/equipe_cliente/ata06/#6-gravacao-da-reuniao","title":"6. Grava\u00e7\u00e3o da Reuni\u00e3o","text":"

Clique Aqui (D\u00edspon\u00edvel apenas para pessoas em UnB.br).

"},{"location":"atas/equipe_cliente/ata06/#7-proxima-reuniao","title":"7. Pr\u00f3xima Reuni\u00e3o","text":"
  • Data: 02 de maio de 2024.
  • Hor\u00e1rio: 10h00.
  • Objetivo: Encaminhamentos da equipe de design.
"},{"location":"atas/equipe_cliente/ata06/#8-responsaveis-pela-ata","title":"8. Respons\u00e1veis pela Ata","text":"Autor Descri\u00e7\u00e3o Revisor Data Jos\u00e9 Andr\u00e9 Cria\u00e7\u00e3o da Ata Vanessa 25/04/2024"},{"location":"atas/equipe_cliente/ata07/","title":"Reuni\u00e3o 7","text":"

PROJETO BRISA \u2013 LAPPIS/FGA/UNB. REFORMULA\u00c7\u00c3O DO SITE DA REVISTA DARCY

"},{"location":"atas/equipe_cliente/ata07/#ata-da-reuniao-7","title":"Ata da Reuni\u00e3o 7","text":"
  • Data: 09 de maio de 2024
  • Hor\u00e1rio: 10h00
  • Local: Microsoft Teams
"},{"location":"atas/equipe_cliente/ata07/#1-participantes-da-equipe-tic-brisa","title":"1. Participantes da Equipe TIC Brisa","text":"
  • Jefferson Sena: Product Owner
  • Tiago Albuquerque: Dev Team
  • Joselito Prado: Dev Team
  • Lu\u00eds Filipe: Dev Team
  • Gabriel Morais: Dev Team
"},{"location":"atas/equipe_cliente/ata07/#2-participantes-da-revista-darcy","title":"2. Participantes da Revista Darcy","text":"
  • Vanessa: Editora-Chefe da Revista Darcy
  • Marcelo Reis: Programador visual da SECOM
  • Isabel Landim: Programadora visual da SECOM
"},{"location":"atas/equipe_cliente/ata07/#3-objetivos-da-reuniao","title":"3. Objetivos da Reuni\u00e3o","text":"
  1. Validar o prot\u00f3tipo de alta fidelidade da homepage evoluida pela equipe de design da SECOM.
  2. Apresentar uma nova solu\u00e7\u00e3o de leitura WEB.
"},{"location":"atas/equipe_cliente/ata07/#4-topicos-discutidos","title":"4. T\u00f3picos Discutidos","text":"
  1. Prot\u00f3tipo da homepage.
  2. Migra\u00e7\u00e3o de dados.
"},{"location":"atas/equipe_cliente/ata07/#5-decisoes-tomadas","title":"5. Decis\u00f5es Tomadas","text":"
  1. A equipe da revista realizar\u00e1 uma valida\u00e7\u00e3o final do prot\u00f3tipo da home at\u00e9 a pr\u00f3xima quinta-feira (16/05).
  2. A equipe de design da SECOM iniciar\u00e1 a evolu\u00e7\u00e3o dos prot\u00f3tipos das p\u00e1ginas internas.
  3. A equipe BRISA iniciar\u00e1 a implementa\u00e7\u00e3o da homepage evoluida.
  4. A equipe BRISA ir\u00e1 continuar os tr\u00e2mites com a respons\u00e1vel da STI pelo acesso ao banco de dados do CMS, para que seja viabilizada a migra\u00e7\u00e3o dos dados.
"},{"location":"atas/equipe_cliente/ata07/#6-gravacao-da-reuniao","title":"6. Grava\u00e7\u00e3o da Reuni\u00e3o","text":"

Clique Aqui (D\u00edspon\u00edvel apenas para pessoas em UnB.br).

"},{"location":"atas/equipe_cliente/ata07/#7-proxima-reuniao","title":"7. Pr\u00f3xima Reuni\u00e3o","text":"
  • Data: 16 de maio de 2024.
  • Hor\u00e1rio: 10h00.
  • Objetivo: Valida\u00e7\u00e3o das p\u00e1ginas internas.
"},{"location":"atas/equipe_cliente/ata07/#8-responsaveis-pela-ata","title":"8. Respons\u00e1veis pela Ata","text":"Autor Descri\u00e7\u00e3o Revisor Data Jos\u00e9 Andr\u00e9 Cria\u00e7\u00e3o da Ata Vanessa 09/05/2024"},{"location":"atas/equipe_cliente/ata08/","title":"Reuni\u00e3o 8","text":"

PROJETO BRISA \u2013 LAPPIS/FGA/UNB. REFORMULA\u00c7\u00c3O DO SITE DA REVISTA DARCY

"},{"location":"atas/equipe_cliente/ata08/#ata-da-reuniao-8","title":"Ata da Reuni\u00e3o 8","text":"
  • Data: 16 de maio de 2024
  • Hor\u00e1rio: 10h00
  • Local: Microsoft Teams
"},{"location":"atas/equipe_cliente/ata08/#1-participantes-da-equipe-tic-brisa","title":"1. Participantes da Equipe TIC Brisa","text":"
  • Jefferson Sena: Product Owner
  • Jos\u00e9 Andr\u00e9: Scrum Master
  • Joselito Prado: Dev Team
  • Lu\u00eds Filipe: Dev Team
  • Gabriel Morais: Dev Team
"},{"location":"atas/equipe_cliente/ata08/#2-participantes-da-revista-darcy","title":"2. Participantes da Revista Darcy","text":"
  • Vanessa: Editora-Chefe da Revista Darcy
  • Marcelo Reis: Programador visual da SECOM
  • Isabel Landim: Programadora visual da SECOM
"},{"location":"atas/equipe_cliente/ata08/#3-objetivos-da-reuniao","title":"3. Objetivos da Reuni\u00e3o","text":"
  1. Apresenta\u00e7\u00e3o do prot\u00f3tipo da ra\u00edz da edi\u00e7\u00e3o por parte da SECOM.
  2. Encaminhamentos da STI para implanta\u00e7\u00e3o do sistema.
"},{"location":"atas/equipe_cliente/ata08/#4-topicos-discutidos","title":"4. T\u00f3picos Discutidos","text":"
  1. Sugest\u00f5es de altera\u00e7\u00e3o na homepage e na ra\u00edz da edi\u00e7\u00e3o.
  2. Migra\u00e7\u00e3o de dados.
  3. Jornada do usu\u00e1rio editor.
  4. Nova solu\u00e7\u00e3o preferida pela STI.
"},{"location":"atas/equipe_cliente/ata08/#5-decisoes-tomadas","title":"5. Decis\u00f5es Tomadas","text":"
  1. A equipe da revista realizar\u00e1 uma valida\u00e7\u00e3o final do prot\u00f3tipo da home e da ra\u00edz da edi\u00e7\u00e3o.
  2. A equipe BRISA iniciar\u00e1 a solicita\u00e7\u00e3o do ambiente de homologa\u00e7\u00e3o indicado pela STI.
  3. A equipe BRISA, ap\u00f3s implantar o prot\u00f3tipo no ambiente de homologa\u00e7\u00e3o, integrar\u00e1 a nova plataforma com o backup de dados disponibilizado pela STI.
"},{"location":"atas/equipe_cliente/ata08/#6-gravacao-da-reuniao","title":"6. Grava\u00e7\u00e3o da Reuni\u00e3o","text":"

Clique Aqui (D\u00edspon\u00edvel apenas para pessoas em UnB.br).

"},{"location":"atas/equipe_cliente/ata08/#7-proxima-reuniao","title":"7. Pr\u00f3xima Reuni\u00e3o","text":"
  • Data: 23 de maio de 2024.
  • Hor\u00e1rio: 10h00.
  • Objetivo: Valida\u00e7\u00e3o e implanta\u00e7\u00e3o no ambiente de homologa\u00e7\u00e3o.
"},{"location":"atas/equipe_cliente/ata08/#8-responsaveis-pela-ata","title":"8. Respons\u00e1veis pela Ata","text":"Autor Descri\u00e7\u00e3o Revisor Data Jos\u00e9 Andr\u00e9 Cria\u00e7\u00e3o da Ata Vanessa 16/05/2024"},{"location":"atas/equipe_cliente/ata09/","title":"Reuni\u00e3o 9","text":"

PROJETO BRISA \u2013 LAPPIS/FGA/UNB. REFORMULA\u00c7\u00c3O DO SITE DA REVISTA DARCY

"},{"location":"atas/equipe_cliente/ata09/#ata-da-reuniao-9","title":"Ata da Reuni\u00e3o 9","text":"
  • Data: 23 de maio de 2024
  • Hor\u00e1rio: 10h00
  • Local: Microsoft Teams
"},{"location":"atas/equipe_cliente/ata09/#1-participantes-da-equipe-tic-brisa","title":"1. Participantes da Equipe TIC Brisa","text":"
  • Jefferson Sena: Product Owner
  • Jos\u00e9 Andr\u00e9: Scrum Master
  • Joselito Prado: Dev Team
  • Tiago Albuquerque: Dev Team
  • Lu\u00eds Filipe: Dev Team
  • Gabriel Morais: Dev Team
"},{"location":"atas/equipe_cliente/ata09/#2-participantes-da-revista-darcy","title":"2. Participantes da Revista Darcy","text":"
  • Vanessa: Editora-Chefe da Revista Darcy
  • Marcelo Reis: Programador visual da SECOM
  • Isabel Landim: Programadora visual da SECOM
"},{"location":"atas/equipe_cliente/ata09/#3-objetivos-da-reuniao","title":"3. Objetivos da Reuni\u00e3o","text":"
  1. Apresenta\u00e7\u00e3o das altera\u00e7\u00f5es do prot\u00f3tipo da home por parte da SECOM.
  2. Discutir possibilidades para as sub-p\u00e1ginas.
"},{"location":"atas/equipe_cliente/ata09/#4-topicos-discutidos","title":"4. T\u00f3picos Discutidos","text":"
  1. Insights para implementa\u00e7\u00f5es na homepage.
  2. Acessibilidade da plataforma.
  3. Hierarquia da informa\u00e7\u00e3o.
"},{"location":"atas/equipe_cliente/ata09/#5-decisoes-tomadas","title":"5. Decis\u00f5es Tomadas","text":"
  1. A equipe de Design da Revista trabalhar\u00e1 num padr\u00e3o de texto para ser implementado.
  2. A equipe da Revista realizar\u00e1 uma valida\u00e7\u00e3o final do prot\u00f3tipo da home com os demais integrantes da SECOM.
  3. A equipe BRISA iniciar\u00e1 a migra\u00e7\u00e3o dos dados atrav\u00e9s do backup disponibilizado pela STI.
  4. A equipe BRISA documentar\u00e1 todas as solu\u00e7\u00f5es tecnol\u00f3gicas de modo que contribua para a manuten\u00e7\u00e3o futura.
"},{"location":"atas/equipe_cliente/ata09/#6-gravacao-da-reuniao","title":"6. Grava\u00e7\u00e3o da Reuni\u00e3o","text":"

Clique Aqui (D\u00edspon\u00edvel apenas para pessoas em UnB.br).

"},{"location":"atas/equipe_cliente/ata09/#7-proxima-reuniao","title":"7. Pr\u00f3xima Reuni\u00e3o","text":"
  • Data: 06 de junho de 2024.
  • Hor\u00e1rio: 10h00.
  • Objetivo: Valida\u00e7\u00e3o e implanta\u00e7\u00e3o no ambiente de homologa\u00e7\u00e3o.
"},{"location":"atas/equipe_cliente/ata09/#8-responsaveis-pela-ata","title":"8. Respons\u00e1veis pela Ata","text":"Autor Descri\u00e7\u00e3o Revisor Data Jos\u00e9 Andr\u00e9 Cria\u00e7\u00e3o da Ata Vanessa 23/05/2024"},{"location":"atas/equipe_cliente/ata10/","title":"Reuni\u00e3o 10","text":"

PROJETO BRISA \u2013 LAPPIS/FGA/UNB. REFORMULA\u00c7\u00c3O DO SITE DA REVISTA DARCY

"},{"location":"atas/equipe_cliente/ata10/#ata-da-reuniao-10","title":"Ata da Reuni\u00e3o 10","text":"
  • Data: 06 de junho de 2024
  • Hor\u00e1rio: 10h00
  • Local: Microsoft Teams
"},{"location":"atas/equipe_cliente/ata10/#1-participantes-da-equipe-tic-brisa","title":"1. Participantes da Equipe TIC Brisa","text":"
  • Jefferson Sena: Product Owner
  • Jos\u00e9 Andr\u00e9: Scrum Master
  • Joselito Prado: Dev Team
  • Tiago Albuquerque: Dev Team
  • Lu\u00eds Filipe: Dev Team
  • Gabriel Morais: Dev Team
"},{"location":"atas/equipe_cliente/ata10/#2-participantes-da-revista-darcy","title":"2. Participantes da Revista Darcy","text":"
  • Vanessa: Editora-Chefe da Revista Darcy
  • Marcelo Reis: Programador visual da SECOM
"},{"location":"atas/equipe_cliente/ata10/#3-objetivos-da-reuniao","title":"3. Objetivos da Reuni\u00e3o","text":"
  1. Apresenta\u00e7\u00e3o das altera\u00e7\u00f5es do prot\u00f3tipo da home por parte da SECOM.
  2. Discutir estrat\u00e9gia de migra\u00e7\u00e3o do conte\u00fado.
  3. Apresenta\u00e7\u00e3o da implementa\u00e7\u00e3o inicial da homepage no ambiente de homologa\u00e7\u00e3o.
"},{"location":"atas/equipe_cliente/ata10/#4-topicos-discutidos","title":"4. T\u00f3picos Discutidos","text":"
  1. As duas possibilidades de implanta\u00e7\u00e3o comunicadas pela STI.
  2. Altera\u00e7\u00f5es do prot\u00f3tipo no figma e implementa\u00e7\u00e3o inicial.
"},{"location":"atas/equipe_cliente/ata10/#5-decisoes-tomadas","title":"5. Decis\u00f5es Tomadas","text":"
  1. A equipe da SECOM tentar\u00e1 negociar com a STI a possibilidade da utiliza\u00e7\u00e3o do plugin de migra\u00e7\u00e3o dos dados.
  2. A equipe da SECOM solicitar\u00e1 a instala\u00e7\u00e3o da fam\u00edlia tipogr\u00e1fica UnBPRO no ambiente de homologa\u00e7\u00e3o.
  3. A equipe BRISA continuar\u00e1 a migra\u00e7\u00e3o dos dados atrav\u00e9s do backup disponibilizado pela STI de forma manual.
  4. A equipe BRISA implementar\u00e1 a sub-p\u00e1gina de artigo prototipada pela equipe de design da SECOM.
"},{"location":"atas/equipe_cliente/ata10/#6-gravacao-da-reuniao","title":"6. Grava\u00e7\u00e3o da Reuni\u00e3o","text":"

Clique Aqui (D\u00edspon\u00edvel apenas para pessoas em UnB.br).

"},{"location":"atas/equipe_cliente/ata10/#7-proxima-reuniao","title":"7. Pr\u00f3xima Reuni\u00e3o","text":"
  • Data: 13 de junho de 2024.
  • Hor\u00e1rio: 10h00.
  • Objetivo: Valida\u00e7\u00e3o da implementa\u00e7\u00e3o da home e da p\u00e1gina de artigos.
"},{"location":"atas/equipe_cliente/ata10/#8-responsaveis-pela-ata","title":"8. Respons\u00e1veis pela Ata","text":"Autor Descri\u00e7\u00e3o Revisor Data Jos\u00e9 Andr\u00e9 Cria\u00e7\u00e3o da Ata Vanessa 06/06/2024"},{"location":"atas/equipe_cliente/ata11/","title":"Reuni\u00e3o 11","text":"

PROJETO BRISA \u2013 LAPPIS/FGA/UNB. REFORMULA\u00c7\u00c3O DO SITE DA REVISTA DARCY

"},{"location":"atas/equipe_cliente/ata11/#ata-da-reuniao-11","title":"Ata da Reuni\u00e3o 11","text":"
  • Data: 13 de junho de 2024
  • Hor\u00e1rio: 10h00
  • Local: Microsoft Teams
"},{"location":"atas/equipe_cliente/ata11/#1-participantes-da-equipe-tic-brisa","title":"1. Participantes da Equipe TIC Brisa","text":"
  • Jefferson Sena: Product Owner
  • Jos\u00e9 Andr\u00e9: Scrum Master
  • Joselito Prado: Dev Team
  • Lu\u00eds Filipe: Dev Team
  • Gabriel Morais: Dev Team
"},{"location":"atas/equipe_cliente/ata11/#2-participantes-da-revista-darcy","title":"2. Participantes da Revista Darcy","text":"
  • Vanessa: Editora-Chefe da Revista Darcy
  • Isabel Landim: Programadora visual da SECOM
"},{"location":"atas/equipe_cliente/ata11/#3-objetivos-da-reuniao","title":"3. Objetivos da Reuni\u00e3o","text":"
  1. Apresenta\u00e7\u00e3o da implementa\u00e7\u00e3o das sub-p\u00e1ginas de artigos no ambiente de homologa\u00e7\u00e3o.
  2. Apresenta\u00e7\u00e3o das altera\u00e7\u00f5es do prot\u00f3tipo por parte da SECOM.
  3. Discutir responsividade.
"},{"location":"atas/equipe_cliente/ata11/#4-topicos-discutidos","title":"4. T\u00f3picos Discutidos","text":"
  1. Implementa\u00e7\u00e3o das sub-p\u00e1ginas de artigos.
  2. Poss\u00edveis altera\u00e7\u00f5es na disposi\u00e7\u00e3o dos elementos do UnB Ci\u00eancia.
"},{"location":"atas/equipe_cliente/ata11/#5-decisoes-tomadas","title":"5. Decis\u00f5es Tomadas","text":"
  1. A equipe de design SECOM realizar\u00e1 altera\u00e7\u00f5es no prot\u00f3tipo de alta fidelidade de modo que haja uma diminui\u00e7\u00e3o na carga de informa\u00e7\u00f5es na p\u00e1gina de artigos.
  2. A equipe BRISA seguir\u00e1 realizando a alimenta\u00e7\u00e3o do site com posts das edi\u00e7\u00f5es anteriores.
  3. A equipe da SECOM discutir\u00e1 a estrat\u00e9gia de responsividade do site para mobile.
"},{"location":"atas/equipe_cliente/ata11/#6-gravacao-da-reuniao","title":"6. Grava\u00e7\u00e3o da Reuni\u00e3o","text":"

Clique Aqui (D\u00edspon\u00edvel apenas para pessoas em UnB.br).

"},{"location":"atas/equipe_cliente/ata11/#7-proxima-reuniao","title":"7. Pr\u00f3xima Reuni\u00e3o","text":"
  • Data: 20 de junho de 2024.
  • Hor\u00e1rio: 10h00.
  • Objetivo: Apresenta\u00e7\u00e3o das altera\u00e7\u00f5es no prot\u00f3tipo de alta fidelidade; Novos encaminhamentos.
"},{"location":"atas/equipe_cliente/ata11/#8-responsaveis-pela-ata","title":"8. Respons\u00e1veis pela Ata","text":"Autor Descri\u00e7\u00e3o Revisor Data Jos\u00e9 Andr\u00e9 Cria\u00e7\u00e3o da Ata Vanessa 13/06/2024"},{"location":"atas/equipe_cliente/ata12/","title":"Reuni\u00e3o 12","text":"

PROJETO BRISA \u2013 LAPPIS/FGA/UNB. REFORMULA\u00c7\u00c3O DO SITE DA REVISTA DARCY

"},{"location":"atas/equipe_cliente/ata12/#ata-da-reuniao-12","title":"Ata da Reuni\u00e3o 12","text":"
  • Data: 27 de junho de 2024
  • Hor\u00e1rio: 09h00
  • Local: Microsoft Teams
"},{"location":"atas/equipe_cliente/ata12/#1-participantes-da-equipe-tic-brisa","title":"1. Participantes da Equipe TIC Brisa","text":"
  • Jefferson Sena: Product Owner
  • Jos\u00e9 Andr\u00e9: Scrum Master
  • Tiago Albuquerque: Dev Team
  • Joselito Prado: Dev Team
  • Lu\u00eds Filipe: Dev Team
  • Gabriel Morais: Dev Team
"},{"location":"atas/equipe_cliente/ata12/#2-participantes-da-revista-darcy","title":"2. Participantes da Revista Darcy","text":"
  • Vanessa: Editora-Chefe da Revista Darcy
  • Isabel Landim: Programadora visual da SECOM
  • Marcelo Reis: Programador visual da SECOM
  • Vanessa Oliveira: Coordenadora de conte\u00fado da SECOM
"},{"location":"atas/equipe_cliente/ata12/#3-objetivos-da-reuniao","title":"3. Objetivos da Reuni\u00e3o","text":"
  1. Apresenta\u00e7\u00e3o da altera\u00e7\u00f5es realizadas na implementa\u00e7\u00e3o das sub-p\u00e1ginas de artigos no ambiente de homologa\u00e7\u00e3o.
  2. Apresenta\u00e7\u00e3o das altera\u00e7\u00f5es do prot\u00f3tipo por parte da SECOM.
  3. Apresenta\u00e7\u00e3o da implementa\u00e7\u00e3o inicial da responsividade para mobile.
"},{"location":"atas/equipe_cliente/ata12/#4-topicos-discutidos","title":"4. T\u00f3picos Discutidos","text":"
  1. Filtro de categorias para o usu\u00e1rio.
  2. Hierarquia da informa\u00e7\u00e3o.
  3. Plugin de leitura online.
  4. Altera\u00e7\u00f5es do prot\u00f3tipo.
  5. Lan\u00e7amento do site em produ\u00e7\u00e3o em meio \u00e0 greve.
"},{"location":"atas/equipe_cliente/ata12/#5-decisoes-tomadas","title":"5. Decis\u00f5es Tomadas","text":"
  1. A equipe de design SECOM realizar\u00e1 evolu\u00e7\u00f5es no prot\u00f3tipo da p\u00e1gina de todas as edi\u00e7\u00f5es e do ensaio visual.
  2. A equipe BRISA seguir\u00e1 realizando a alimenta\u00e7\u00e3o do site com posts das edi\u00e7\u00f5es anteriores.
  3. A equipe BRISA desenvolver\u00e1 um fluxograma de navegabilidade por parte do leitor.
  4. A equipe BRISA continuar\u00e1 o desenvolvimento das p\u00e1ginas prototipadas.
"},{"location":"atas/equipe_cliente/ata12/#6-gravacao-da-reuniao","title":"6. Grava\u00e7\u00e3o da Reuni\u00e3o","text":"

Clique Aqui (D\u00edspon\u00edvel apenas para pessoas em UnB.br).

"},{"location":"atas/equipe_cliente/ata12/#7-proxima-reuniao","title":"7. Pr\u00f3xima Reuni\u00e3o","text":"
  • Data: 04 de julho de 2024.
  • Hor\u00e1rio: 10h00.
  • Objetivo: Apresenta\u00e7\u00e3o das altera\u00e7\u00f5es no prot\u00f3tipo de alta fidelidade; Novos encaminhamentos.
"},{"location":"atas/equipe_cliente/ata12/#8-responsaveis-pela-ata","title":"8. Respons\u00e1veis pela Ata","text":"Autor Descri\u00e7\u00e3o Revisor Data Jos\u00e9 Andr\u00e9 Cria\u00e7\u00e3o da Ata Vanessa 27/06/2024"},{"location":"atas/equipe_cliente/ata13/","title":"Reuni\u00e3o 13","text":"

PROJETO BRISA \u2013 LAPPIS/FGA/UNB. REFORMULA\u00c7\u00c3O DO SITE DA REVISTA DARCY

"},{"location":"atas/equipe_cliente/ata13/#ata-da-reuniao-13","title":"Ata da Reuni\u00e3o 13","text":"
  • Data: 04 de julho de 2024
  • Hor\u00e1rio: 10h00
  • Local: Microsoft Teams
"},{"location":"atas/equipe_cliente/ata13/#1-participantes-da-equipe-tic-brisa","title":"1. Participantes da Equipe TIC Brisa","text":"
  • Jefferson Sena: Product Owner
  • Jos\u00e9 Andr\u00e9: Scrum Master
  • Tiago Albuquerque: Dev Team
  • Lu\u00eds Filipe: Dev Team
  • Gabriel Morais: Dev Team
"},{"location":"atas/equipe_cliente/ata13/#2-participantes-da-revista-darcy","title":"2. Participantes da Revista Darcy","text":"
  • Vanessa: Editora-Chefe da Revista Darcy
"},{"location":"atas/equipe_cliente/ata13/#3-objetivos-da-reuniao","title":"3. Objetivos da Reuni\u00e3o","text":"
  1. Apresenta\u00e7\u00e3o da altera\u00e7\u00f5es realizadas na implementa\u00e7\u00e3o das p\u00e1ginas no ambiente de homologa\u00e7\u00e3o.
  2. Fluxograma de navegabilidade.
"},{"location":"atas/equipe_cliente/ata13/#4-topicos-discutidos","title":"4. T\u00f3picos Discutidos","text":"
  1. Implementa\u00e7\u00e3o da ra\u00edz da edi\u00e7\u00e3o.
  2. Navegabilidade dos menus.
  3. Apresenta\u00e7\u00e3o da primeira vers\u00e3o do fluxograma de navegabilidade.
"},{"location":"atas/equipe_cliente/ata13/#5-decisoes-tomadas","title":"5. Decis\u00f5es Tomadas","text":"
  1. A equipe BRISA produzir\u00e1 uma vers\u00e3o atualizada do fluxograma de navegabilidade de acordo com os novos requisitos da Vanessa.
  2. A equipe BRISA ir\u00e1 ajustar elementos que ainda est\u00e3o distantes do prot\u00f3tipo.
  3. A equipe BRISA iniciar\u00e1 o desenvolvimento das p\u00e1ginas de formul\u00e1rio.
"},{"location":"atas/equipe_cliente/ata13/#6-gravacao-da-reuniao","title":"6. Grava\u00e7\u00e3o da Reuni\u00e3o","text":"

Clique Aqui (D\u00edspon\u00edvel apenas para pessoas em UnB.br).

"},{"location":"atas/equipe_cliente/ata13/#7-proxima-reuniao","title":"7. Pr\u00f3xima Reuni\u00e3o","text":"
  • Data: 09 de julho de 2024.
  • Hor\u00e1rio: 10h00.
  • Objetivo: Novos encaminhamentos.
"},{"location":"atas/equipe_cliente/ata13/#8-responsaveis-pela-ata","title":"8. Respons\u00e1veis pela Ata","text":"Autor Descri\u00e7\u00e3o Revisor Data Jos\u00e9 Andr\u00e9 Cria\u00e7\u00e3o da Ata Vanessa 04/07/2024"},{"location":"politicas/branches/","title":"Branches","text":""},{"location":"politicas/branches/#1-padronizacao-das-branches","title":"1. Padroniza\u00e7\u00e3o das Branches","text":"

A padroniza\u00e7\u00e3o de branches no GitHub \u00e9 crucial para o desenvolvimento eficiente de software, proporcionando vantagens fundamentais na organiza\u00e7\u00e3o e colabora\u00e7\u00e3o. Essa pr\u00e1tica aprimora significativamente a qualidade do c\u00f3digo-fonte, contribuindo para o sucesso do projeto. Como esse projeto de migra\u00e7\u00e3o do site da Revista Darcy ser\u00e1 realizada em WordPress, o time decidiu por manter apenas a main branch. Dessa forma, op\u00e7\u00f5es de padroniza\u00e7\u00e3o de branches n\u00e3o ser\u00e3o aplciados a esse projeto, como prefixos.

"},{"location":"politicas/branches/#11-formato","title":"1.1 Formato","text":"
#n\u00famero da issue/assunto\n

N\u00e3o esquecer de dividir as palavras(sempre min\u00fasculas) do assunto com \"-\". Exemplo:

#87/novo-menu\n
"},{"location":"politicas/branches/#12-branch","title":"1.2 Branch","text":"
  • Branch main: Branch que cont\u00e9m o c\u00f3digo mais consolidado existente na aplica\u00e7\u00e3o. Nenhum integrante dos times \u00e9 autorizado a fazer commits diretamente na main, o que \u00e9 garantido atrav\u00e9s da rule criada no GitHub.
"},{"location":"politicas/branches/#2-historico-de-versoes","title":"2. Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Autor Descri\u00e7\u00e3o Revisor Data 1.0 Joselito Prado Cria\u00e7\u00e3o da pol\u00edtica de branch Jos\u00e9 Andr\u00e9 04/03/2024 1.1 Jos\u00e9 Andr\u00e9 Padroniza\u00e7\u00e3o de T\u00f3picos Joselito Prado 11/03/2024"},{"location":"politicas/branches/#3-referencias","title":"3. Refer\u00eancias","text":"

DULCETTI, Bruno. Padr\u00f5es e nomenclaturas no Git. BrunoDulcetti. Dispon\u00edvel em: https://www.brunodulcetti.com/padroes-e-nomenclaturas-no-git/. Acesso em: 04 de mar\u00e7o de 2024.

HADLER, Mikael. Utilizando o fluxo Git Flow. Medium. Dispon\u00edvel em: https://medium.com/trainingcenter/utilizando-o-fluxo-git-flow-e63d5e0d5e04. Acesso em: 04 de mar\u00e7o de 2024.

"},{"location":"politicas/commit/","title":"Commit","text":""},{"location":"politicas/commit/#1-padronizacao-dos-commits","title":"1. Padroniza\u00e7\u00e3o dos Commits","text":"

Os commits devem seguir o padr\u00e3o descrito a seguir.

"},{"location":"politicas/commit/#11-commits-atomicos","title":"1.1 Commits at\u00f4micos","text":"

Sempre dividir em pequenos e significativos commits, fazendo com que cada commit tenha apenas uma funcionalidade.

"},{"location":"politicas/commit/#12-commits-em-portugues","title":"1.2 Commits em portugu\u00eas","text":"

Por ser um projeto voltado totalmente para um p\u00fablico brasileiro e por toda equipe ter mais afinidade com o portugu\u00eas, foi decidido que todos os commits ser\u00e3o em pt-BR.

"},{"location":"politicas/commit/#2-formato","title":"2. Formato","text":"
(#n\u00famero da issue): assunto\n
"},{"location":"politicas/commit/#21-assunto","title":"2.1 Assunto","text":"
  • Deve possuir no m\u00e1ximo 50 caracteres

Exemplo de commit:

git commit -m \"(#02): bot\u00e3o na p\u00e1gina inicial\"\n
"},{"location":"politicas/commit/#3-historico-de-versoes","title":"3. Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Autor Descri\u00e7\u00e3o Revisor Data 1.0 Joselito Prado Cria\u00e7\u00e3o da pol\u00edtica de commits Jos\u00e9 Andr\u00e9 04/03/2024 1.1 Jos\u00e9 Andr\u00e9 Padroniza\u00e7\u00e3o de T\u00f3picos Joselito Prado 11/03/2024"},{"location":"politicas/commit/#4-referencias","title":"4. Refer\u00eancias","text":"

DARTORA, Jo\u00e3o. Tudo o que voc\u00ea precisa saber sobre commits sem\u00e2nticos. Ilegra. Dispon\u00edvel em: https://ilegra.com/blog/tudo-o-que-voce-precisa-saber-sobre-commits-semanticos/. Acesso em: 04 de mar\u00e7o de 2024.

"},{"location":"politicas/conduta/","title":"Conduta","text":""},{"location":"politicas/conduta/#1-proposito","title":"1. Prop\u00f3sito","text":"

Residentes do projeto de imers\u00e3o TIC Brisa Lappis administram o projeto. Com o objetivo de promover um ambiente inclusivo e acolhedor, os residentes comprometem-se a envolver-se ativamente na execu\u00e7\u00e3o do projeto e na comunidade, garantindo uma experi\u00eancia isenta de qualquer forma de ass\u00e9dio para todos os participantes, tanto como colaboradores quanto como respons\u00e1veis pelo projeto.

"},{"location":"politicas/conduta/#2-comportamento","title":"2. Comportamento","text":""},{"location":"politicas/conduta/#21-atitudes-aceitaveis","title":"2.1 Atitudes aceit\u00e1veis","text":"
  • Reconhecimento e aprecia\u00e7\u00e3o de diversas opini\u00f5es, perspectivas e viv\u00eancias.
  • Est\u00edmulo \u00e0 pr\u00e1tica de cr\u00edticas construtivas, tanto ao oferecer quanto ao receber feedback.
  • Assun\u00e7\u00e3o de responsabilidade por eventuais equ\u00edvocos, buscando aprendizado com as experi\u00eancias.
  • Emprego de linguagem acolhedora e inclusiva.
  • Express\u00e3o de empatia em rela\u00e7\u00e3o aos membros da comunidade.
"},{"location":"politicas/conduta/#22-atitudes-inaceitaveis","title":"2.2 Atitudes inaceit\u00e1veis","text":"
  • Uso de linguagem ou imagens com conota\u00e7\u00e3o sexual.
  • Comportamentos provocativos, insultuosos, depreciativos, ataques pessoais ou pol\u00edticos.
  • Ass\u00e9dio, seja p\u00fablico ou privado.
  • Viola\u00e7\u00e3o da privacidade, incluindo o compartilhamento n\u00e3o autorizado de informa\u00e7\u00f5es pessoais de terceiros, como fotos ou endere\u00e7os de e-mail.
  • Qualquer outra conduta que, dentro dos limites da razoabilidade, possa ser considerada inadequada em um ambiente profissional.
"},{"location":"politicas/conduta/#3-responsabilidades","title":"3. Responsabilidades","text":"

Os mantenedores do projeto t\u00eam a responsabilidade de esclarecer os padr\u00f5es de conduta estabelecidos no c\u00f3digo. Em caso de d\u00favida, \u00e9 incumb\u00eancia deles tomar medidas corretivas justas em resposta a quaisquer comportamentos inaceit\u00e1veis. Eles tamb\u00e9m possuem o direito e a responsabilidade de editar, remover ou rejeitar coment\u00e1rios, confirma\u00e7\u00f5es, c\u00f3digo e outras contribui\u00e7\u00f5es que n\u00e3o estejam em conformidade com este C\u00f3digo de Conduta. Al\u00e9m disso, devem comunicar aos respons\u00e1veis pela resid\u00eancia caso qualquer colaborador demonstre comportamentos considerados inadequados, amea\u00e7adores, ofensivos ou prejudiciais.

"},{"location":"politicas/conduta/#4-escopo","title":"4. Escopo","text":"

Este C\u00f3digo de Conduta se aplica tanto dentro do \u00e2mbito do projeto quanto em locais p\u00fablicos onde um indiv\u00edduo represente o projeto ou sua comunidade. Isso inclui situa\u00e7\u00f5es como o uso do reposit\u00f3rio oficial relacionado ao projeto ou a participa\u00e7\u00e3o em reuni\u00f5es onde atue como representante.

"},{"location":"politicas/conduta/#5-execucao","title":"5. Execu\u00e7\u00e3o","text":"

Situa\u00e7\u00f5es de comportamento inadequado podem ser relatadas entrando em contato com os monitores da resid\u00eancia. Todos os relatos ser\u00e3o minuciosamente avaliados e investigados, com a subsequente implementa\u00e7\u00e3o de uma resposta apropriada para a circunst\u00e2ncia. A equipe do projeto \u00e9 comprometida com a preserva\u00e7\u00e3o da confidencialidade em rela\u00e7\u00e3o ao denunciante de um incidente.

"},{"location":"politicas/conduta/#6-historico-de-versoes","title":"6. Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Autor Descri\u00e7\u00e3o Revisor Data 1.0 Joselito Prado Abertura do Documento Jos\u00e9 Andr\u00e9 04/03/2024 1.1 Jos\u00e9 Andr\u00e9 Padroniza\u00e7\u00e3o de T\u00f3picos Joselito Prado 11/03/2024"},{"location":"politicas/conduta/#7-referencia","title":"7. Refer\u00eancia","text":"

ORGANIZATION FOR ETHICAL SOURCE. Contributor Covenant, 2014. Latest Version. Dispon\u00edvel em: https://www.contributor-covenant.org/version/2/1/code_of_conduct/. Acesso em: 04 de mar\u00e7o de 2024.

"},{"location":"politicas/plano-de-comunicacao/","title":"Plano de Comunica\u00e7\u00e3o","text":""},{"location":"politicas/plano-de-comunicacao/#1-objetivo","title":"1. Objetivo","text":"

O prop\u00f3sito deste documento \u00e9 formalizar os canais de comunica\u00e7\u00e3o entre os membros do projeto, delineando desde as ferramentas empregadas at\u00e9 os procedimentos essenciais para garantir a adequada armazenagem, organiza\u00e7\u00e3o e distribui\u00e7\u00e3o das informa\u00e7\u00f5es.

"},{"location":"politicas/plano-de-comunicacao/#2-entradas-e-ferramentas-para-o-processo","title":"2. Entradas e Ferramentas para o Processo","text":"\u00cdcone Ferramenta Descri\u00e7\u00e3o GitHub Sistema de controle de vers\u00e3o, que abriga os c\u00f3digos do produto, e por meio desse sistema s\u00e3o realizados coment\u00e1rios nas quest\u00f5es (issues) que est\u00e3o sendo trabalhadas. Telegram Utilizado para a comunica\u00e7\u00e3o r\u00e1pida e do dia a dia, para dinamizar a troca de informa\u00e7\u00f5es entre a equipe. Discord Utilizado para reuni\u00f5es como pr\u00e9-planejamento e planejamento da sprint, sprint review, daily e quaisquer outras reuni\u00f5es que forem marcadas. Teams Utilizado para reuni\u00f5es com stakeholders e transa\u00e7\u00e3o de documentos."},{"location":"politicas/plano-de-comunicacao/#3-diretrizes-e-procedimentos-usados-para-comunicar","title":"3. Diretrizes e procedimentos usados para comunicar","text":""},{"location":"politicas/plano-de-comunicacao/#31-comunicacao-geral","title":"3.1 Comunica\u00e7\u00e3o Geral","text":"

A comunica\u00e7\u00e3o \u00e9 a chave principal para o bom progresso do projeto. Tendo isso em vista, \u00e9 importante zelar pela clareza nas intera\u00e7\u00f5es. Portanto, os pontos cruciais a serem levados como pilares s\u00e3o:

  1. Seguir os rituais \u00e1geis, para conseguir manter a comunica\u00e7\u00e3o eficaz do projeto (daily e review);
  2. Manter as partes interessadas \"alinhadas\", evitando ao m\u00e1ximo ru\u00eddos e sempre comunicar ao haver novidades acerca de t\u00f3pcicos.
"},{"location":"politicas/plano-de-comunicacao/#32-gerencia-de-reunioes","title":"3.2 Ger\u00eancia de Reuni\u00f5es","text":""},{"location":"politicas/plano-de-comunicacao/#321-planejamento-da-sprint","title":"3.2.1 Planejamento da Sprint","text":"

Num encontro semanal, todos os membros se re\u00fanem para decidir, coletivamente, as atividades e funcionalidades a serem realizadas pelos integrantes, alinhando-se com as disponibilidades e o calend\u00e1rio de todos. Ap\u00f3s, todos integrantes dividem as que ficar\u00e3o alocadas entre os membros de acordo com dificuldade e disponibilidade. Al\u00e9m disso tamb\u00e9m s\u00e3o levantadas quais melhorias podem ser feitas.

"},{"location":"politicas/plano-de-comunicacao/#322-daily","title":"3.2.2 Daily","text":"

Tarefa realizada pelo discord, onde cada integrante explica de forma clara: o que foi feito desde a \u00faltima reuni\u00e3o e o que pretende fazer at\u00e9 a pr\u00f3xima, dessa forma os integrantes est\u00e3o se mantendo informados do andamento da sprint.

"},{"location":"politicas/plano-de-comunicacao/#323-sprint-review","title":"3.2.3 Sprint Review","text":"

Reuni\u00e3o para mostrar os resultados positivos da sprint, cada membro mostra o trabalho que fez para que o time possa fornecer e obter feedback.

"},{"location":"politicas/plano-de-comunicacao/#4-historico-de-versoes","title":"4. Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Autor Descri\u00e7\u00e3o Revisor Data 1.0 Joselito Prado Cria\u00e7\u00e3o da pol\u00edtica de commits Jos\u00e9 Andr\u00e9 04/03/2024 1.1 Jos\u00e9 Andr\u00e9 Padroniza\u00e7\u00e3o de T\u00f3picos Joselito Prado 11/03/2024"},{"location":"politicas/plano-de-comunicacao/#5-referencias","title":"5. Refer\u00eancias","text":"

IEEE (2012), IEEE Guide--Adoption of the Project Management Institute (PMI) Standard A Guide to the Project Management Body of Knowledge (PMBOK Guide)--Fifth Edition.

FELIPE, Caio; FREITAS, Gesiel; BUSCHE, Jo\u00e3o Paulo; CARVALHO, Vin\u00edcius; PINHEIRO, Vinicius. SIGS - Plano de Gerenciamento de Comunica\u00e7\u00e3o. Dispon\u00edvel em: https://github.com/fga-eps-mds/2017.1-SIGS/wiki/Plano-de-Gerenciamento-de-Comunica%C3%A7%C3%A3o#32-gerencia-de-reuni%C3%B5es. Acesso em: 04 de mar\u00e7o de 2024.

"},{"location":"release/release1/","title":"Release 1","text":""},{"location":"release/release1/#1-contexto","title":"1. Contexto","text":"

\u2003\u2003 Durante o desenvolvimento do projeto, foram definidas sprints que resultaram em incrementos ao longo do tempo. Como resultado, a release 1 compreende o desenvolvimento realizado durante as Sprints 0, 1, 2 e 3, incluindo a implementa\u00e7\u00e3o inicial de um MVP do produto.

\u2003\u2003 Ap\u00f3s realizar t\u00e9cnicas de elicita\u00e7\u00e3o, an\u00e1lise e prioriza\u00e7\u00e3o de requisitos, foram definidas as User Stories (US) que foram implementadas no desenvolvimento do MVP. Entre as t\u00e9cnicas utilizadas, destacam-se:

  • Formula\u00e7\u00e3o de formul\u00e1rios para identificar as opini\u00f5es dos usu\u00e1rios da plataforma atual e identificar as personas e antipersonas do site.
  • Entrevistas com a equipe t\u00e9cnica e editores da revista para extrair insights significativos sobre o fluxo de opera\u00e7\u00f5es no site, necessidades e desejos dos usu\u00e1rios.
  • Utiliza\u00e7\u00e3o do User Story Map para organizar as hist\u00f3rias de usu\u00e1rios e do MoSCoW para prioriza\u00e7\u00e3o.

\u2003\u2003 A partir destas t\u00e9cnicas utilizadas, a tabela das User Stories pode ser visualizada abaixo:

"},{"location":"release/release1/#2-tabela-de-uss","title":"2. Tabela de US's","text":"

ID Hist\u00f3rias de Usu\u00e1rio 01 Como usu\u00e1rio leitor, quero poder visualizar o conte\u00fado das edi\u00e7\u00f5es da revista diretamente no navegador para uma experi\u00eancia de leitura mais intuitiva. 02 Como usu\u00e1rio leitor, quero realizar o download da revista, para que eu possa ler offline. 03 US 3 - Como usu\u00e1rio leitor, quero poder visualizar as capas das edi\u00e7\u00f5es para ter uma ideia r\u00e1pida do conte\u00fado de cada uma antes de selecionar para ler. 04 Como usu\u00e1rio leitor, quero poder visualizar v\u00eddeos de not\u00edcias para ter um maior engajamento no site. 05 Eu, como usu\u00e1rio leitor, desejo entrar em contato com a equipe editorial, para comunicar-me com a equipe da revista. 06 Como usu\u00e1rio leitor, desejo poder realizar assinaturas para ser notificado quando ser lan\u00e7ado novas edi\u00e7\u00f5es. 07 Como usu\u00e1rio leitor, quero poder visualizar not\u00edcias relevantes para saber mais sobre a universidade.

"},{"location":"release/release1/#3-minimo-produto-viavel-mvp","title":"3. M\u00ednimo Produto Vi\u00e1vel - MVP","text":"

\u2003\u2003 O MVP consiste na configura\u00e7\u00e3o inicial do site em WordPress, utilizando o Tema GOVBR que segue os padr\u00f5es governamentais. Desenvolvido como uma iniciativa Open Source pelo IBICT - Instituto Brasileiro de Informa\u00e7\u00e3o em Ci\u00eancia e Tecnologia, este tema estabelece a base para a constru\u00e7\u00e3o da identidade visual do site. O objetivo \u00e9 criar um produto \u00fanico, seguindo as diretrizes necess\u00e1rias em rela\u00e7\u00e3o \u00e0 hierarquia da informa\u00e7\u00e3o.

"},{"location":"release/release1/#4-historico-de-versoes","title":"4. Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Autor Descri\u00e7\u00e3o Revisor Data 1.0 Jefferson Sena Cria\u00e7\u00e3o do Documento de Releases Tiago Albuquerque 09/04/2024"},{"location":"requisitos/backlog/","title":"Backlog","text":""},{"location":"requisitos/backlog/#1-requisitos","title":"1. Requisitos","text":"

\u2003\u2003 A partir do processo de Elicita\u00e7\u00e3o de Requisitos, identificamos e definimos as funcionalidades essenciais para o novo site da revista Darcy. Esses requisitos foram cuidadosamente selecionados devido ao valor de neg\u00f3cio do produto. Para esta etapa inicial, foi utilizado entrevistas com a editora-chefe da revista, juntamente com a equipe de programadores e designers. Esse m\u00e9todo proporcionou insights valiosos auxiliando no entendimento das necessidades do cliente.

Tabela de Requisitos: ID Requisitos 01 Ler Edi\u00e7\u00e3o Online 02 Baixar Edi\u00e7\u00e3o em PDF 03 Vizualizar todas as edi\u00e7\u00f5es 04 Vizualizar v\u00eddeos de not\u00edcias 05 Entrar em Contato com equipe editorial 06 Assinar notifica\u00e7\u00e3o de nova edi\u00e7\u00e3o 07 Vizualizar Not\u00edcias Relevantes da Universidade

Tabela de Requisitos N\u00e3o Funcionais:

ID Requisitos N\u00e3o Funcionais 01 Responsividade 02 Acessibilidade com Libras 03 Acessibilidade com Alto Contraste 04 Conformidade com padr\u00f5es governamentais

"},{"location":"requisitos/backlog/#2-user-storymap","title":"2. User StoryMap","text":"

\u2003\u2003 A partir da an\u00e1lise e consenso dos requisitos, foram definidas as funcionalidades iniciais, as quais foram representadas e organizadas utilizando o User Story Map. Al\u00e9m disso, empregamos a t\u00e9cnica MoSCoW para priorizar os requisitos a serem implementados nesta Release. A esquematiza\u00e7\u00e3o pode ser vista a seguir:

"},{"location":"requisitos/backlog/#3-historico-de-versoes","title":"3. Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Autor Descri\u00e7\u00e3o Revisor Data 1.0 Jefferson Sena Adicionando os requisitos e User story map Tiago Albuquerque 01/04/2024 1.1 Jefferson Sena Adicionando requisitos n\u00e3o funcionais Tiago Albuquerque 05/04/2024"},{"location":"requisitos/fluxograma_de_navegabilidade/","title":"Fluxograma de Navegabilidade da Revista Darcy","text":""},{"location":"requisitos/fluxograma_de_navegabilidade/#1-objetivo","title":"1. Objetivo","text":"

O intuito \u00e9 fornecer uma representa\u00e7\u00e3o visual clara e organizada de como os usu\u00e1rios podem se mover atrav\u00e9s do site. Alguns benef\u00edcios que esperamos:

  1. Visualiza\u00e7\u00e3o da Estrutura: Ajuda a visualizar a estrutura e a hierarquia das p\u00e1ginas do site, mostrando a rela\u00e7\u00e3o entre elas.
  2. Facilita\u00e7\u00e3o do Planejamento: Auxilia no planejamento e na organiza\u00e7\u00e3o do conte\u00fado do site, garantindo que todas as p\u00e1ginas e links necess\u00e1rios sejam inclu\u00eddos.
  3. Identifica\u00e7\u00e3o de Problemas: Permite identificar e corrigir poss\u00edveis problemas de navega\u00e7\u00e3o, como links quebrados ou caminhos complexos.
  4. Melhoria da Experi\u00eancia do Usu\u00e1rio: Ajuda a garantir uma experi\u00eancia de navega\u00e7\u00e3o intuitiva e eficiente para os usu\u00e1rios, facilitando a localiza\u00e7\u00e3o de informa\u00e7\u00f5es.
  5. Comunica\u00e7\u00e3o Clara: Serve como uma ferramenta de comunica\u00e7\u00e3o clara entre desenvolvedores, designers e outras partes interessadas, garantindo que todos tenham uma compreens\u00e3o comum da navega\u00e7\u00e3o do site.
  6. Documenta\u00e7\u00e3o: Funciona como uma documenta\u00e7\u00e3o do fluxo de navega\u00e7\u00e3o do site, \u00fatil para manuten\u00e7\u00e3o futura e para novos membros da equipe.
"},{"location":"requisitos/fluxograma_de_navegabilidade/#2-fluxograma-de-navegabilidade","title":"2. Fluxograma de Navegabilidade","text":"

"},{"location":"requisitos/fluxograma_de_navegabilidade/#3-historico-de-versoes","title":"3. Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Autor Descri\u00e7\u00e3o Revisor Data 1.0 Jos\u00e9 Andr\u00e9 Fluxograma de Navegabilidade Tiago Albuquerque 02/07/2024"},{"location":"requisitos/perfil_dos_usuarios/","title":"Perfil dos Usu\u00e1rios da Revista","text":""},{"location":"requisitos/perfil_dos_usuarios/#perfil-do-usuario","title":"Perfil do Usu\u00e1rio","text":"

A partir dos dados obtidos com o formul\u00e1rio, foi poss\u00edvel definir o Perfil do Usu\u00e1rios e leitores do site:

  • Estudantes da UnB entre 19 e 22 anos. O p\u00fablico tamb\u00e9m comp\u00f5e, em sua minoria, servidores e t\u00e9cnicos administrativos da UnB.

  • O site e as edi\u00e7\u00f5es da Revista s\u00e3o lidos, em sua maioria, sempre que novas edi\u00e7\u00f5es s\u00e3o lan\u00e7adas.

  • Muitos estudantes evidenciam n\u00e3o ter conhecimento sobre o site ou a revista.

"},{"location":"requisitos/perfil_dos_usuarios/#analises-dos-dados-do-formulario","title":"An\u00e1lises dos Dados do Formul\u00e1rio","text":"

Com o objetivo de obter mais detalhes do Perfil de Usu\u00e1rios da Revista, foi proposto a divulga\u00e7\u00e3o de um formul\u00e1rio com perguntas pertinentes. Com isso, segue aqui uma an\u00e1lise dos dados obtidos a partir das respostas dos leitores da revista.

"},{"location":"requisitos/perfil_dos_usuarios/#questao-01","title":"Quest\u00e3o 01","text":""},{"location":"requisitos/perfil_dos_usuarios/#questao-02","title":"Quest\u00e3o 02","text":""},{"location":"requisitos/perfil_dos_usuarios/#questao-03","title":"Quest\u00e3o 03","text":""},{"location":"requisitos/perfil_dos_usuarios/#questao-04","title":"Quest\u00e3o 04","text":""},{"location":"requisitos/perfil_dos_usuarios/#questao-05","title":"Quest\u00e3o 05","text":""},{"location":"requisitos/perfil_dos_usuarios/#questao-06","title":"Quest\u00e3o 06","text":""},{"location":"requisitos/perfil_dos_usuarios/#questao-07","title":"Quest\u00e3o 07","text":""},{"location":"requisitos/perfil_dos_usuarios/#questao-08","title":"Quest\u00e3o 08","text":""},{"location":"requisitos/perfil_dos_usuarios/#questao-09","title":"Quest\u00e3o 09","text":""},{"location":"requisitos/perfil_dos_usuarios/#questao-10","title":"Quest\u00e3o 10","text":"

H\u00e1 algo no site que te desagrada ou poderia ser aperfei\u00e7oado?

  • Gostaria que ele fosse t\u00e3o atraente visualmente, como \u00e9 a revista impressa e, na medida do poss\u00edvel, fosse interativo.
  • As mat\u00e9rias poderiam estar dispon\u00edveis em html e o visual poderia ser atualizado Layout
  • Navega\u00e7\u00e3o pela vers\u00e3o digital da revista (em pdf) n\u00e3o facilita a leitura, n\u00e3o h\u00e1 ferramenta de buscas por palavras-chave ou data de publica\u00e7\u00e3o dos conte\u00fados, \u00e9 necess\u00e1rio fazer v\u00e1rios cliques para chegar a um conte\u00fado espec\u00edfico (mesmo da nova edi\u00e7\u00e3o), a disposi\u00e7\u00e3o de textos e imagens na leitura dentro do site n\u00e3o \u00e9 muito bacana (legendas das imagens, por exemplo, n\u00e3o t\u00eam um tamanho pr\u00f3prio)
  • Novos elementos e melhor intuitividade
  • A forma como carrega as p\u00e1ginas da revista no Issuuu
  • Poderia ser melhor trabalhado os conte\u00fados audiovisuais.
  • O menu de navega\u00e7\u00e3o para acesso \u00e0 revista.
  • O design do site.
  • O layout da p\u00e1gina inicial \u00e9 sempre meio confuso. a parte para assinatura da revista n\u00e3o funciona, j\u00e1 me inscrevi diversas vezes e nunca recebo atualiza\u00e7\u00f5es sobre a Darcy no endere\u00e7o cadastrado.
"},{"location":"requisitos/perfil_dos_usuarios/#questao-11","title":"Quest\u00e3o 11","text":"

O que no site te agrada e pode ser entendido como essencial?

  • O fato de todas as edi\u00e7\u00f5es estarem dispon\u00edveis.
  • F\u00e1cil disponibiliza\u00e7\u00e3o das edi\u00e7\u00f5es passadas.
  • A busca r\u00e1pida por outras edi\u00e7\u00f5es da revista
  • Disponibiliza\u00e7\u00e3o da \u00edntegra da revista.
  • A organiza\u00e7\u00e3o em menus principais acima (o que facilita as buscas de conte\u00fados), as caixinhas de destaques (mesmo que n\u00e3o estejam em um leiaute bonito e adequado, acredito que o pr\u00f3ximo site deva incluir caixinhas de destaque com fotos)
  • A leitura das edi\u00e7\u00f5es na plataforma e imagens.
  • A riqueza de imagens, a identidade visual das reportagens de acordo com o tema, e os infogr\u00e1ficos, al\u00e9m da linguagem acess\u00edvel mesmo em temas complexos.
  • Bonito e bem organizado, com banners e links em destaque
  • O conte\u00fado e a leveza das cores e da diagrama\u00e7\u00e3o.
  • A organiza\u00e7\u00e3o das edi\u00e7\u00f5es.
  • As capas das revistas devem ter destaque.
  • As abas est\u00e3o bem divididas.
  • os arquivos poderem ser baixados em pdf.
  • P\u00e1gina para download de todas a edi\u00e7\u00f5es, p\u00e1gina para leitura online, contato.
"},{"location":"requisitos/perfil_dos_usuarios/#questao-12","title":"Quest\u00e3o 12","text":"

H\u00e1 alguma sugest\u00e3o de melhorias em qualquer aspecto (visual, textual, usabilidade, funcionalidade, etc.)?

  • Uma arquitetura da informa\u00e7\u00e3o mais org\u00e2nica, que facilitasse o acesso a reportagens de v\u00e1rias edi\u00e7\u00f5es, talvez com a aplica\u00e7\u00e3o de tags (ou agregadores). Visualmente, o site tamb\u00e9m n\u00e3o faz jus \u00e0 revista. Por fim, sugiro agregar plugins que tornassem o ambiente interativo, na medida do poss\u00edvel.
  • Mudan\u00e7as simples no carrossel dos destaques e a possibilidade de alguma interatividade com infogr\u00e1ficos e outras imagens
  • Uma revista digital interativa
  • P\u00e1gina inicial visualmente mais bonita; reavalia\u00e7\u00e3o dos menus para evitar duplicatas de conte\u00fado; valoriza\u00e7\u00e3o dos conte\u00fados multim\u00eddia.
  • \u00c9 necess\u00e1rio adaptar a usabilidade em celular, incluir ferramentas de buscas dos conte\u00fados (por palavras-chave e por data), incluir na home mais caixinhas para conte\u00fados multim\u00eddia, retirar o banner principal (se o uso for somente para o leitor ser encaminhado para a nova edi\u00e7\u00e3o, n\u00e3o faz sentido, pois j\u00e1 h\u00e1 outra caixinha abaixo que leva para a \u00faltima publica\u00e7\u00e3o), reorganizar a disposi\u00e7\u00e3o dos destaques, de forma harm\u00f4nica (exemplo: destaque de v\u00eddeos aparece antes do Leia mais; h\u00e1 uma caixinha com endere\u00e7o do campus, sendo que essa informa\u00e7\u00e3o se repete no p\u00e9 do site). A disposi\u00e7\u00e3o atual d\u00e1 impress\u00e3o de uma certa desorganiza\u00e7\u00e3o na home do site, j\u00e1 que as caixinhas n\u00e3o est\u00e3o organizadas de forma padronizada.
  • Mais fun\u00e7\u00f5es para deixar mais intuitivo e melhor identidade visual
  • Aplicativo, talvez.
  • Se fosse vi\u00e1vel, poderia haver a vers\u00e3o web da revista completa, mais interativa, sem ser PDF
  • Acredito que se a revista fosse mais visual, tipo, n\u00e3o precisasse clicar em varias abas para abrir seria mais intuitivo. Como por exemplo a Gazeta de Alagoas. Segue link: https://www.gazetadealagoas.com.br/edicao-digital
  • Acho que a revista tem de ser mais divulgada. Iniciar uma visita a cada departamento, em busca de pautas e de leitores.
  • Sim, tornar a hierarquia das informa\u00e7\u00f5es mais intuitivas como as plataformas de m\u00eddia est\u00e3o fazendo, e facilitar a busca por not\u00edcias de interesse.
  • Criar estrat\u00e9gias de divulga\u00e7\u00e3o nas m\u00eddias sociais com entrevistas, divulga\u00e7\u00e3o de temas e conex\u00e3o com o PAS para maior alcance dos alunos da Educa\u00e7\u00e3o B\u00e1sica.
"},{"location":"requisitos/perfil_dos_usuarios/#5-historico-de-versoes","title":"5. Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Autor Descri\u00e7\u00e3o Revisor Data 1.0 Jefferson Sena Adicionando Dados do Formul\u00e1rio Tiago Albuquerque 17/04/2024 1.1 Jefferson Sena Definindo Perfil dos Usu\u00e1rios Tiago Albuquerque 17/04/2024"},{"location":"requisitos/visao_de_produto/","title":"Vis\u00e3o Geral do Produto","text":""},{"location":"requisitos/visao_de_produto/#1-problema","title":"1. Problema","text":"

Foi identificado uma dificuldade quanto a ferramenta atualmente utilizada pela secretaria de Comunica\u00e7\u00e3o da Universidade de Bras\u00edlia. Por utilizarem o Joomla, um sistema de gerenciamento de conte\u00fado (CMS) de c\u00f3digo aberto usado para construir websites e aplicativos online. Enfrentam dificuldades em atualizar os conte\u00fados pela alta complexidade desse sistema. Surgindo ent\u00e3o, a necessidade de uma migra\u00e7\u00e3o de plataforma.

Al\u00e9m disso, a Revista Darcy, como ve\u00edculo de divulga\u00e7\u00e3o das principais atividades da Universidade, busca ampliar sua base de leitores. Para alcan\u00e7ar esse objetivo, \u00e9 essencial contar com uma plataforma intuitiva e pr\u00e1tica, que facilite o acesso e a intera\u00e7\u00e3o com diversos perfis de leitores.

"},{"location":"requisitos/visao_de_produto/#diagrama-de-causa-e-efeito","title":"Diagrama de Causa e Efeito","text":""},{"location":"requisitos/visao_de_produto/#2-posicao-do-produto","title":"2. Posi\u00e7\u00e3o do Produto","text":"

Uma plataforma WEB intuitiva e com recursos visuais que proporcionem uma experi\u00eancia de leitura agrad\u00e1vel, assim como o formato impresso da revista, \u00e9 essencial para o sucesso da Revista Darcy. Al\u00e9m disso, \u00e9 importante que esta ferramenta expanda o alcance a diferentes tipos de leitores, oferecendo recursos para intera\u00e7\u00e3o, como coment\u00e1rios e compartilhamento de conte\u00fado. Adicionalmente, a plataforma \u00e9 adapt\u00e1vel a diversos dispositivos, o que garante uma experi\u00eancia consistente e acess\u00edvel em computadores, tablets e smartphones.

Para Leitores da Revista Darcy Quem P\u00fablico interessado em conhecer sobre as edi\u00e7\u00f5es da Revista Darcy e Universidade de Bras\u00edlia Revista Darcy \u00c9 uma Plataforma WEB e WordPress Que Proporciona uma experi\u00eancia de Leitura Intuitiva e agrad\u00e1vel Ao contr\u00e1rio Joomla Nosso produto Disponibiliza Recursos e identidade visual que proporcionam maior interatividade com a leitura. Para Editores da Revista Darcy Quem Editores que realizam publica\u00e7\u00f5es e edi\u00e7\u00f5es na plataforma Revista Darcy \u00c9 uma Plataforma WEB em WordPress Que Facilita p\u00fablica\u00e7\u00f5es e edi\u00e7\u00f5es da Revista Darcy Ao contr\u00e1rio Joomla Nosso produto Disponibiliza ferramentas e recursos que facilitem a publica\u00e7\u00e3o de reportagens e edi\u00e7\u00f5es da Revista, aumenta a independ\u00eancia dos jornalistas sem a necessidade de um funcion\u00e1rio de TI para auxiliar nas publica\u00e7\u00f5es e edi\u00e7\u00f5es da revista"},{"location":"requisitos/visao_de_produto/#3-objetivos-do-produto","title":"3. Objetivos do produto","text":"
  • Facilidade na publica\u00e7\u00e3o de edi\u00e7\u00f5es e posts
  • Moderniza\u00e7\u00e3o na identidade visual inserindo aspectos da revista
  • Utilizar galerias de imagens din\u00e2micas das reportagens
  • Integra\u00e7\u00e3o com plataformas externas: YouTube e Instagram
  • Integra\u00e7\u00e3o entre a Revista Darcy e a UnB Ci\u00eancia
"},{"location":"requisitos/visao_de_produto/#4-tecnologias-a-serem-utilizadas","title":"4. Tecnologias a serem utilizadas","text":"
  • Comunica\u00e7\u00e3o : Telegram, Discord e Teams.
  • Documenta\u00e7\u00e3o : Mkdocs, GitHub
  • IDE's: Visual Studio Code
  • Design: WordPress, Figma
"},{"location":"requisitos/visao_de_produto/#5-historico-de-versoes","title":"5. Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Autor Descri\u00e7\u00e3o Revisor Data 1.0 Jefferson Sena e Lu\u00eds Filipe Adicionando Vis\u00e3o do Produto Tiago Albuquerque 02/03/2024 1.1 Jos\u00e9 Andr\u00e9 Padroniza\u00e7\u00e3o de T\u00f3picos Jefferson Sena 11/03/2024 1.2 Tiago Albuquerque Diagrama de Causa e Efeito Jefferson Sena 11/03/2024"},{"location":"requisitos/visao_de_projeto/","title":"Vis\u00e3o Geral do Projeto","text":""},{"location":"requisitos/visao_de_projeto/#1-organizacao-do-projeto","title":"1. Organiza\u00e7\u00e3o do Projeto","text":"

A tabela a seguir possui os integrantes definidos para cada divis\u00e3o de atribui\u00e7\u00f5es de tarefas a serem cumpridas.

PAPEL ATRIBUI\u00c7\u00d5ES INTEGRANTE Product Owner Coordenar as fases do projeto, atualizar escopo do produto, validar as entregas e gerenciar prazos. Jefferson Sena Desenvolvedor Codificar e construir o software definido a partir dos requisitos analisados. Equipe Scrum Master Garantir a compreens\u00e3o e ado\u00e7\u00e3o do Scrum pela equipe. Estimular a comunica\u00e7\u00e3o eficaz e a colabora\u00e7\u00e3o dentro da equipe Scrum. Jos\u00e9 Andr\u00e9 Design e prototipagem de interfaces Prototipa poss\u00edveis interfaces a serem implementadas no software, mantendo padr\u00f5es definidos. Equipe An\u00e1lise de requisitos Descobre, prop\u00f5e e analisa os requisitos do produto, documentando e esclarecendo poss\u00edveis d\u00favidas aos envolvidos. Equipe Cliente Valida o produto e prop\u00f5e requisitos que o mesmo necessita que exista na aplica\u00e7\u00e3o. Secretaria de Comunica\u00e7\u00e3o UnB"},{"location":"requisitos/visao_de_projeto/#2-planejamento-das-sprints-do-projeto","title":"2. Planejamento das sprints do projeto","text":"SPRINT PRODUTO(ENTREGAS) IN\u00cdCIO FIM 0 Reuni\u00f5es inicias, cria\u00e7\u00e3o da p\u00e1gina de documenta\u00e7\u00e3o e cronograma 26/02/20234 04/03/2024 1 Planejamento, defini\u00e7\u00e3o de backlog, requisitos brutos e valida\u00e7\u00e3o. 04/03/2023 11/03/2024 2 Configura\u00e7\u00e3o do ambiente Wordpress, refinamento do backlog, requisitos brutos e valida\u00e7\u00e3o. Formul\u00e1rio de pesquisa e obten\u00e7\u00e3o de dados. 11/03/2023 25/03/2024 3 Cria\u00e7\u00e3o de p\u00e1ginas; refinamento do backlog; testes de usabilidade; defini\u00e7\u00e3o do roadmap. 25/03/2023 08/04/2024 4 Insights dos dados do formul\u00e1rio; Evolu\u00e7\u00e3o do projeto open source GOV-br, inje\u00e7\u00e3o de c\u00f3digo no tema 08/04/2023 22/04/2024"},{"location":"requisitos/visao_de_projeto/#3-roadmap-da-organizacao-do-projeto","title":"3. Roadmap da Organiza\u00e7\u00e3o do Projeto","text":""},{"location":"requisitos/visao_de_projeto/#4-gerenciamento-de-riscos","title":"4. Gerenciamento de riscos","text":"

Os riscos identificados para o projeto foram:

  • Falta de hor\u00e1rios dispon\u00edveis para todos os integrantes se reunirem para as reuni\u00f5es.
    • Solu\u00e7\u00e3o: Defini\u00e7\u00e3o de hor\u00e1rios dispon\u00edveis para todos os membros e negocia\u00e7\u00e3o em rela\u00e7\u00e3o a carga hor\u00e1ria semanal.
  • Indisponibilidade de algum dos integrantes.
    • Solu\u00e7\u00e3o: Replanejamento das atribui\u00e7\u00f5es designadas e replanejamento das fases de desenvolvimento.
"},{"location":"requisitos/visao_de_projeto/#5-criterios-de-replanejamento","title":"5. Crit\u00e9rios de Replanejamento","text":"
  • Diminui\u00e7\u00e3o dos membros da equipe

Caso haja mudan\u00e7as na forma\u00e7\u00e3o da equipe, \u00e9 importante reavaliar as atividades definidas, com reajuste de prazos, tarefas e complexidade do desenvolvimento, a fim de reduzir os impactos no projeto.

  • N\u00e3o cumprimento de prazos

Caso a equipe n\u00e3o consiga cumprir os prazos pr\u00e9-definidos, \u00e9 poss\u00edvel que haja um reajuste dos requisitos e sua complexidade, a fim de que ao final seja poss\u00edvel realizar a entrega do produto ao cliente.

  • Insatisfa\u00e7\u00e3o do Cliente

Caso haja insatisfa\u00e7\u00e3o por parte do cliente, \u00e9 importante que a equipe refa\u00e7a a an\u00e1lise dos defeitos apontados, com o objetivo de trazer as causas da insatisfa\u00e7\u00e3o e assim trazer uma melhoria para tal aspecto.

"},{"location":"requisitos/visao_de_projeto/#6-historico-de-versoes","title":"6. Hist\u00f3rico de Vers\u00f5es","text":"Vers\u00e3o Autor Descri\u00e7\u00e3o Revisor Data 1.0 Tiago Albuquerque Cria\u00e7\u00e3o da vis\u00e3o de projeto Jos\u00e9 Andr\u00e9 05/03/2024 1.1 Jos\u00e9 Andr\u00e9 Corre\u00e7\u00e3o de T\u00f3picos e Adi\u00e7\u00e3o de Sprint Tiago Albuquerque 11/03/2024 1.2 Jefferson Sena Adicionando RoadMap Tiago Albuquerque 26/03/2024"},{"location":"sprints/sprint00/planejamento/","title":"Planejamento","text":""},{"location":"sprints/sprint00/planejamento/#1-o-planejado","title":"1. O planejado","text":"

O objetivo dessa sprint \u00e9 nos organizarmos internamente, definindo os pap\u00e9is dos membros de acordo com o SCRUM. Al\u00e9m disso, precisamos configurar nosso reposit\u00f3rio do github e definir regras de prote\u00e7\u00e3o de branch, al\u00e9m de padr\u00f5es de issue e pull request. \u00c9 necess\u00e1rio a cria\u00e7\u00e3o de uma gitpage com MKDOCS para documentarmos nosso processo de trabalho. Ideal que essa gitpage seja automatizada com o github actions assim como os padr\u00f5es de commit e pull request.

\u00c9 esperado que nessa sprint tenhamos a primeira reuni\u00e3o com a cliente, devemos realizar perguntas coesas e objetivas para termos uma vis\u00e3o geral do projeto e do produto, de modo que possamos definir um cronograma de trabalho.

"},{"location":"sprints/sprint00/planejamento/#_1","title":"Planejamento","text":""},{"location":"sprints/sprint00/planejamento/#2-duracao-da-sprint","title":"2. Dura\u00e7\u00e3o da Sprint","text":"

In\u00edcio: 26/02/2024

Fim: 04/03/2024

Dura\u00e7\u00e3o: 7 dias

"},{"location":"sprints/sprint00/planejamento/#3-issues","title":"3. Issues","text":"Issue T\u00edtulo Respons\u00e1veis #2 Sprint 0 - Ambienta\u00e7\u00e3o Geral e Defini\u00e7\u00e3o de Pap\u00e9is do Time SCRUM [Todos] #1 Sprint 0 - Cria\u00e7\u00e3o do MKDOCS para a Documenta\u00e7\u00e3o Tiago Albuquerque #8 Sprint 0 - Kickoff Meeting e Defini\u00e7\u00e3o do Cronograma Inicial [Todos] #15 Sprint 0 - Configura\u00e7\u00e3o e Ger\u00eancia do Reposit\u00f3rio Jefferson Sena e Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint00/planejamento/#4-papeis-da-equipe","title":"4. Pap\u00e9is da Equipe","text":"Fun\u00e7\u00e3o Nome Scrum Master Jos\u00e9 Andr\u00e9 Product Owner Jefferson Sena Dev Team Joselito Prado Dev Team Tiago Albuquerque Dev Team Lu\u00eds Filipe"},{"location":"sprints/sprint00/planejamento/#5-historico-de-versoes","title":"5. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 05/03/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint00/resultados/","title":"Resultados","text":""},{"location":"sprints/sprint00/resultados/#1-o-que-foi-feito","title":"1. O que foi feito","text":"

Nessa sprint conseguimos nos organizar como equipe, estabelecemos as fun\u00e7\u00f5es de cada membro de acordo com o SCRUM. Al\u00e9m disso, organizamos nossos canais de comunica\u00e7\u00e3o e configuramos nosso reposit\u00f3rio do github, estabelecendo padr\u00f5es de commit e pull request. Tamb\u00e9m configuramos prote\u00e7\u00f5es para a branch main para evitar inconsist\u00eancias em nosso reposit\u00f3rio. Tamb\u00e9m configuramos uma gitpage no reposit\u00f3rio com nossa documenta\u00e7\u00e3o utilizando o MKDocs.

Tivemos tamb\u00e9m a reuni\u00e3o de kickoff com a cliente onde pudemos ter uma vis\u00e3o geral do projeto e do produto, o que nos possibilitou estabelecer um cronograma de trabalho inicial.

"},{"location":"sprints/sprint00/resultados/#_1","title":"Resultados","text":""},{"location":"sprints/sprint00/resultados/#2-issues","title":"2. Issues","text":"Issue T\u00edtulo Status #2 Sprint 0 - Ambienta\u00e7\u00e3o Geral e Defini\u00e7\u00e3o de Pap\u00e9is do Time SCRUM Conclu\u00eddo #1 Sprint 0 - Cria\u00e7\u00e3o do MKDOCS para a Documenta\u00e7\u00e3o Conclu\u00eddo #8 Sprint 0 - Kickoff Meeting e Defini\u00e7\u00e3o do Cronograma Inicial Conclu\u00eddo #15 Sprint 0 - Configura\u00e7\u00e3o e Ger\u00eancia do Reposit\u00f3rio Conclu\u00eddo"},{"location":"sprints/sprint00/resultados/#3-reunioes","title":"3. Reuni\u00f5es","text":"

Nessa Sprint 00 tivemos duas reuni\u00f5es.

Data Tema Ata 27/02/2024 Reuni\u00e3o Interna - Apresenta\u00e7\u00e3o e ambienta\u00e7\u00e3o 28/02/2024 Reuni\u00e3o com a Cliente - Kickoff Clique Aqui"},{"location":"sprints/sprint00/resultados/#4-avaliacao-do-scrum-master","title":"4. Avalia\u00e7\u00e3o do Scrum Master","text":"

Durante esta sprint, observamos uma evolu\u00e7\u00e3o significativa na intera\u00e7\u00e3o entre os membros da equipe, assim como na familiariza\u00e7\u00e3o deles com o projeto. Al\u00e9m disso, tivemos a oportunidade de conhecer mais sobre a cliente e compreender melhor tanto o projeto quanto o produto esperado.

"},{"location":"sprints/sprint00/resultados/#5-historico-de-versoes","title":"5. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 05/03/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint01/planejamento/","title":"Planejamento","text":""},{"location":"sprints/sprint01/planejamento/#1-o-planejado","title":"1. O planejado","text":"

A Sprint 01 visa estabelecer as bases necess\u00e1rias para o sucesso do projeto, desde a defini\u00e7\u00e3o dos requisitos iniciais atrav\u00e9s do PBB at\u00e9 a cria\u00e7\u00e3o de pol\u00edticas internas e aprimoramento da documenta\u00e7\u00e3o. Ao alcan\u00e7ar esses objetivos, estaremos preparados para avan\u00e7ar para as pr\u00f3ximas etapas do desenvolvimento com clareza e efici\u00eancia.

"},{"location":"sprints/sprint01/planejamento/#_1","title":"Planejamento","text":""},{"location":"sprints/sprint01/planejamento/#2-duracao-da-sprint","title":"2. Dura\u00e7\u00e3o da Sprint","text":"

In\u00edcio: 04/03/2024

Fim: 11/03/2024

Dura\u00e7\u00e3o: 7 dias

"},{"location":"sprints/sprint01/planejamento/#3-issues","title":"3. Issues","text":"Issue T\u00edtulo Respons\u00e1veis #7 Sprint 1 - Posi\u00e7\u00e3o do Produto Jefferson Sena e Lu\u00eds Filipe #12 Sprint 1 - Cria\u00e7\u00e3o das pol\u00edticas internas Joselito Prado #14 Sprint 1 - Criar vis\u00e3o de projeto Tiago Albuquerque #18 Sprint 1 - Documenta\u00e7\u00e3o da Sprint 00 e Reorganiza\u00e7\u00e3o da Estrutura de Navega\u00e7\u00e3o do MKDOCS Jos\u00e9 Andr\u00e9 #19 Sprint 1 - Corre\u00e7\u00e3o de T\u00f3picos e Padroniza\u00e7\u00e3o no MKDOCS. Adi\u00e7\u00e3o das Atas 00 e 01. Jos\u00e9 Andr\u00e9 #20 Sprint 1 - Formul\u00e1rio de perfil de usu\u00e1rio Todos"},{"location":"sprints/sprint01/planejamento/#4-historico-de-versoes","title":"4. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 11/03/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint01/resultados/","title":"Resultados","text":""},{"location":"sprints/sprint01/resultados/#1-o-que-foi-feito","title":"1. O que foi feito","text":"

Nessa sprint, realizamos a primeira vers\u00e3o do levantamento de requisitos, utilizando a metodologia Product Backlog Building(PBB). Apresentamos para os stakeholders e a partir da pr\u00f3xima sprint refinaremos colaborativamente. Pudemos tamb\u00e9m definir a vis\u00e3o de produto e de projeto iniciais. Al\u00e9m disso, definimos pol\u00edticas internas do grupo para nos guiar durante o projeto.

"},{"location":"sprints/sprint01/resultados/#_1","title":"Resultados","text":""},{"location":"sprints/sprint01/resultados/#2-issues","title":"2. Issues","text":"Issue T\u00edtulo Status #7 Sprint 1 - Posi\u00e7\u00e3o do Produto Conclu\u00eddo #12 Sprint 1 - Cria\u00e7\u00e3o das pol\u00edticas internas Conclu\u00eddo #14 Sprint 1 - Criar vis\u00e3o de projeto Conclu\u00eddo #18 Sprint 1 - Documenta\u00e7\u00e3o da Sprint 00 e Reorganiza\u00e7\u00e3o da Estrutura de Navega\u00e7\u00e3o do MKDOCS Conclu\u00eddo #19 Sprint 1 - Corre\u00e7\u00e3o de T\u00f3picos e Padroniza\u00e7\u00e3o no MKDOCS. Adi\u00e7\u00e3o das Atas 00 e 01. Conclu\u00eddo #20 Sprint 1 - Formul\u00e1rio de perfil de usu\u00e1rio Conclu\u00eddo"},{"location":"sprints/sprint01/resultados/#3-reunioes","title":"3. Reuni\u00f5es","text":"

Nessa Sprint 01 tivemos quatro reuni\u00f5es.

Data Tema Ata 04/03/2024 Sprint Planning 07/03/2024 Reuni\u00e3o com a Equipe da SECOM Clique Aqui 11/03/2024 Sprint Review 11/03/2024 Sprint Retrospective"},{"location":"sprints/sprint01/resultados/#4-avaliacao-do-scrum-master","title":"4. Avalia\u00e7\u00e3o do Scrum Master","text":"

Durante esta sprint, pudemos evoluir como equipe definindo padr\u00f5es internos. As reuni\u00f5es foram realizadas como planejado e a equipe tem sido colaborativa.

"},{"location":"sprints/sprint01/resultados/#5-historico-de-versoes","title":"5. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 11/03/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint02/planejamento/","title":"Planejamento","text":""},{"location":"sprints/sprint02/planejamento/#1-o-planejado","title":"1. O planejado","text":"

A Sprint 02 tem por objetivo a configura\u00e7\u00e3o de um ambiente de desenvolvimento colaborativo no Wordpress, a fim de todos os membros da equipe come\u00e7arem a se ambientar com a plataforma em termos de skins e plugins. Tendo por objetivo implementar o tema GOVbr produzido pela Instituto Brasileiro de Informa\u00e7\u00e3o em Ci\u00eancia e Tecnologia (IBICT).

Al\u00e9m disso, se faz necess\u00e1rio a divulga\u00e7\u00e3o do formul\u00e1rio de pesquisa para que possamos analisar os dados a fim de continuar o refinamento dos requisitos.

A sprint ter\u00e1 uma dura\u00e7\u00e3o de duas semanas em decorr\u00eancia da indisponibilidade do cliente durante a primeira semana para reuni\u00f5es.

"},{"location":"sprints/sprint02/planejamento/#2-duracao-da-sprint","title":"2. Dura\u00e7\u00e3o da Sprint","text":"

In\u00edcio: 11/03/2024

Fim: 25/03/2024

Dura\u00e7\u00e3o: 14 dias

"},{"location":"sprints/sprint02/planejamento/#3-issues","title":"3. Issues","text":"Issue T\u00edtulo Respons\u00e1veis #21 Sprint 2 - Coleta de Dados e Insights do Formul\u00e1rio de Perfil de Usu\u00e1rio [Todos] #22 Sprint 2 - Cria\u00e7\u00e3o de Heat Map para defini\u00e7\u00e3o de hor\u00e1rios em comum Jefferson Sena #24 Sprint 2 - Configura\u00e7\u00e3o do ambiente de desenvolvimento no WordPress [Todos] #25 Sprint 2 - Estudo de Potenciais Plugins - FG Joomla [Todos] #28 Sprint 2 - Estudar e Implementar o tema GOVbr [Todos] #29 Sprint 2 - Resolu\u00e7\u00e3o do problema de acessibilidade em rela\u00e7\u00e3o ao plugin VLibras Lu\u00eds Filipe #30 Sprint 2 - Estudar sobre Identidade Visual da UnB e identificar fontes e paletas de cores utilizadas na Revista Darcy Lu\u00eds Filipe"},{"location":"sprints/sprint02/planejamento/#4-historico-de-versoes","title":"4. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 11/03/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint02/resultados/","title":"Resultados","text":""},{"location":"sprints/sprint02/resultados/#1-o-que-foi-feito","title":"1. O que foi feito","text":"

Nessa sprint, come\u00e7amos a implementa\u00e7\u00e3o da plataforma com um dom\u00ednio teste. Realizamos a configura\u00e7\u00e3o do Wordpress para que pudessemos trabalhar em equipe colaborativamente e com possibilidade de auditoria. Ap\u00f3s, come\u00e7amos os estudos de temas e plugins, o que nos levou at\u00e9 o tema GOVbr, desenvolvido em 2023 pela IBICT justamente para facilitar o desenvolvimento de sites governamentais em Wordpress. Fizemos a implementa\u00e7\u00e3o desse tema no nosso projeto. Al\u00e9m disso, estudamos e implementamos um plugin para facilitar a leitura da Revista na WEB, o que \u00e9 requisito do usu\u00e1rio. Durante toda a sprint, fizemos um levantamento de identidade visual (tipografia e cores) da atual plataforma da revista. Infelizmente, devido \u00e0 greve dos t\u00e9cnicos da universidade, n\u00e3o tivemos nenhuma reuni\u00e3o com a equipe da SECOM. Por causa disso, n\u00e3o pudemos evoluir e refinar os requisitos. Al\u00e9m de n\u00e3o apresentar o incremento.

"},{"location":"sprints/sprint02/resultados/#_1","title":"Resultados","text":""},{"location":"sprints/sprint02/resultados/#2-issues","title":"2. Issues","text":"Issue T\u00edtulo Status #21 Sprint 2 - Coleta de Dados e Insights do Formul\u00e1rio de Perfil de Usu\u00e1rio Em pausa #22 Sprint 2 - Cria\u00e7\u00e3o de Heat Map para defini\u00e7\u00e3o de hor\u00e1rios em comum Conclu\u00eddo #24 Sprint 2 - Configura\u00e7\u00e3o do ambiente de desenvolvimento no WordPress Conclu\u00eddo #25 Sprint 2 - Estudo de Potenciais Plugins - FG Joomla Conclu\u00eddo #28 Sprint 2 - Estudar e Implementar o tema GOVbr Conclu\u00eddo #29 Sprint 2 - Resolu\u00e7\u00e3o do problema de acessibilidade em rela\u00e7\u00e3o ao plugin VLibras Conclu\u00eddo #30 Sprint 2 - Estudar sobre Identidade Visual da UnB e identificar fontes e paletas de cores utilizadas na Revista Darcy Conclu\u00eddo"},{"location":"sprints/sprint02/resultados/#3-reunioes","title":"3. Reuni\u00f5es","text":"

Nessa Sprint 02 tivemos tr\u00eas reuni\u00f5es. Todas internas.

Data Tema Ata 11/03/2024 Sprint Planning 25/03/2024 Sprint Review 25/03/2024 Sprint Retrospective"},{"location":"sprints/sprint02/resultados/#4-avaliacao-do-scrum-master","title":"4. Avalia\u00e7\u00e3o do Scrum Master","text":"

Durante esta sprint, o time realizou o que foi planejado internamente mesmo com o contratempo com o cliente. As reuni\u00f5es foram realizadas como idealizado anteriormente e a equipe tem sido colaborativa.

"},{"location":"sprints/sprint02/resultados/#5-historico-de-versoes","title":"5. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 25/03/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint03/planejamento/","title":"Planejamento","text":""},{"location":"sprints/sprint03/planejamento/#1-o-planejado","title":"1. O planejado","text":"

Na Sprint 3, focaremos em diversas atividades essenciais para a Revista Darcy. Isso inclui a defini\u00e7\u00e3o do roadmap e refinamento dos requisitos. Al\u00e9m disso, vamos desenvolver um menu personalizado da UnB e implementar algumas p\u00e1ginas que j\u00e1 existem no site atual. Por exemplo: criaremos p\u00e1ginas para not\u00edcias, todas as edi\u00e7\u00f5es da revista e contato. E por fim, integraremos o plugin Real3D Flipbook PDF Viewer Lite para leitura online. Cada membro da equipe tem suas responsabilidades espec\u00edficas para garantir o progresso eficiente do projeto.

"},{"location":"sprints/sprint03/planejamento/#2-duracao-da-sprint","title":"2. Dura\u00e7\u00e3o da Sprint","text":"

In\u00edcio: 25/03/2024

Fim: 08/04/2024

Dura\u00e7\u00e3o: 14 dias

"},{"location":"sprints/sprint03/planejamento/#3-issues","title":"3. Issues","text":"Issue T\u00edtulo Respons\u00e1veis #33 Sprint 3 - Cria\u00e7\u00e3o do Roadmap [Todos] #34 Sprint 3 - Refinamento dos Requisitos e Defini\u00e7\u00e3o do Backlog [Todos] #36 Sprint 3 - Desenvolver e Implementar um menu personalizado da Universidade de Bras\u00edlia (UnB) no site Jos\u00e9 Andr\u00e9 #37 Sprint 3 - Implementa\u00e7\u00e3o do Sistema de Assinatura para Recebimento das Pr\u00f3ximas Edi\u00e7\u00f5es da Revista Gabriel Morais #38 Sprint 3 - Cria\u00e7\u00e3o da p\u00e1gina de not\u00edcias Tiago Albuquerque #39 Sprint 3 - Desenvolvimento de P\u00e1gina para todas as edi\u00e7\u00f5es da Revista Jefferson Sena #40 Sprint 3 - Implementa\u00e7\u00e3o do Plugin: Plugin Real3D Flipbook PDF Viewer Lite, para leitura online [Todos] #41 Sprint 3 - Desenvolvimento de prot\u00f3tipo da p\u00e1gina inicial [Todos] #42 Sprint 3 - Desenvolvimento da P\u00e1gina de Contato Joselito Prado #43 Sprint 3 - Desenvolvimento da P\u00e1gina \"V\u00eddeos\" Lu\u00eds Filipe"},{"location":"sprints/sprint03/planejamento/#4-historico-de-versoes","title":"4. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 25/03/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint03/resultados/","title":"Resultados","text":""},{"location":"sprints/sprint03/resultados/#1-o-que-foi-feito","title":"1. O que foi feito","text":"

Nessa sprint 03, avan\u00e7amos significativamente no nosso prot\u00f3tipo. Desenvolvemos p\u00e1ginas utilizando o padr\u00e3o governamental mais atual e tivemos a valida\u00e7\u00e3o da cliente em duas reuni\u00f5es.

As se\u00e7\u00f5es desenvolvidas foram feitas em efeito de teste e replica\u00e7\u00e3o da atual plataforma da Revista de uma forma mais moderna e intuitiva.

Al\u00e9m disso, realizamos teste de carga no plugin de leitura da revista que estamos estudando e utilizando na nossa aplica\u00e7\u00e3o.

A sprint foi proveitosa visto que pudemos voltar a ter contato com a cliente, o que possibilitou nosso processo de refinamento e valida\u00e7\u00e3o de requisitos. A partir disso utilizamos t\u00e9cnicas de prioriza\u00e7\u00e3o para nos nortear no desenvolvimento.

"},{"location":"sprints/sprint03/resultados/#_1","title":"Resultados","text":""},{"location":"sprints/sprint03/resultados/#2-issues","title":"2. Issues","text":"Issue T\u00edtulo Status #33 Sprint 3 - Cria\u00e7\u00e3o do Roadmap Conclu\u00eddo #34 Sprint 3 - Refinamento dos Requisitos e Defini\u00e7\u00e3o do Backlog Conclu\u00eddo #36 Sprint 3 - Desenvolver e Implementar um menu personalizado da Universidade de Bras\u00edlia (UnB) no site Em desenvolvimento #37 Sprint 3 - Implementa\u00e7\u00e3o do Sistema de Assinatura para Recebimento das Pr\u00f3ximas Edi\u00e7\u00f5es da Revista Conclu\u00eddo #38 Sprint 3 - Cria\u00e7\u00e3o da p\u00e1gina de not\u00edcias Em desenvolvimento #39 Sprint 3 - Desenvolvimento de P\u00e1gina para todas as edi\u00e7\u00f5es da Revista Em desenvolvimento #40 Sprint 3 - Implementa\u00e7\u00e3o do Plugin: Plugin Real3D Flipbook PDF Viewer Lite, para leitura online Conclu\u00eddo #41 Sprint 3 - Desenvolvimento de prot\u00f3tipo da p\u00e1gina inicial Conclu\u00eddo #42 Sprint 3 - Desenvolvimento da P\u00e1gina de Contato Conclu\u00eddo #43 Sprint 3 - Desenvolvimento da P\u00e1gina \"V\u00eddeos\" Conclu\u00eddo"},{"location":"sprints/sprint03/resultados/#3-reunioes","title":"3. Reuni\u00f5es","text":"

Nessa Sprint 03 tivemos cinco reuni\u00f5es. Tr\u00eas internas e duas externas.

Data Tema Ata 25/03/2024 Sprint Planning 02/04/2024 Reuni\u00e3o com a Equipe da SECOM Clique Aqui 04/04/2024 Reuni\u00e3o com a Equipe da SECOM Clique Aqui 08/04/2024 Sprint Review 08/04/2024 Sprint Retrospective"},{"location":"sprints/sprint03/resultados/#4-avaliacao-do-scrum-master","title":"4. Avalia\u00e7\u00e3o do Scrum Master","text":"

No decorrer desta sprint, o time realizou o que foi planejado internamente e colaborou ativamente com o projeto.

"},{"location":"sprints/sprint03/resultados/#5-historico-de-versoes","title":"5. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 08/04/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint04/planejamento/","title":"Planejamento","text":""},{"location":"sprints/sprint04/planejamento/#1-o-planejado","title":"1. O planejado","text":"

Na Sprint 4, focaremos em construir insights a partir das respostas do formul\u00e1rio. Tamb\u00e9m iremos iniciar o desenvolvimento da evolu\u00e7\u00e3o do tema gov-br via inje\u00e7\u00e3o de c\u00f3digo. Al\u00e9m disso, pretendemos evoluir nosso MVP j\u00e1 consolidado atrav\u00e9s de refer\u00eancias externas. Haver\u00e1 um briefing com os designers da SECOM para evoluirmos a identidade visual do site.

"},{"location":"sprints/sprint04/planejamento/#2-duracao-da-sprint","title":"2. Dura\u00e7\u00e3o da Sprint","text":"

In\u00edcio: 08/04/2024

Fim: 22/04/2024

Dura\u00e7\u00e3o: 14 dias

"},{"location":"sprints/sprint04/planejamento/#3-issues","title":"3. Issues","text":"Issue T\u00edtulo Respons\u00e1veis #53 Sprint 4 - Documenta\u00e7\u00e3o sobre a Release 1 Jefferson Sena #54 Sprint 4 - Cria\u00e7\u00e3o de prot\u00f3tipo para integra\u00e7\u00e3o com UnB Ci\u00eancia Lu\u00eds Filipe #57 Sprint 4 - Configura\u00e7\u00e3o de Ambiente do Projeto Open Source: GOVBR-Tema Jos\u00e9 Andr\u00e9 Lu\u00eds Filipe Tiago Albuquerque #58 Sprint 4 - Levantamento de refer\u00eancias para o site e formas de integra\u00e7\u00e3o com a UnB Ci\u00eancia Gabriel Morais Joselito Prado #59 Sprint 4 - Defini\u00e7\u00e3o das Personas e Perfil de Usu\u00e1rio Jefferson Sena"},{"location":"sprints/sprint04/planejamento/#4-historico-de-versoes","title":"4. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 09/04/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint04/resultados/","title":"Resultados","text":""},{"location":"sprints/sprint04/resultados/#1-o-que-foi-feito","title":"1. O que foi feito","text":"

Durante a sprint 04, pudemos minerar os dados obtidos a partir do formul\u00e1rio e definimos personas e perfil do usu\u00e1rio com base nas estat\u00edsticas. Tamb\u00e9m produzimos dois prot\u00f3tipos de alta fidelidade para a landing page com base nas refer\u00eancias enviadas pela Vanessa, prot\u00f3tipos que, ao fim da sprint, foram validados por ela. Pudemos tamb\u00e9m integrar nosso prot\u00f3tipo do WordPress com o UnB Ci\u00eancia, requisito declarado pela SECOM.

"},{"location":"sprints/sprint04/resultados/#_1","title":"Resultados","text":""},{"location":"sprints/sprint04/resultados/#2-issues","title":"2. Issues","text":"Issue T\u00edtulo Status #53 Sprint 4 - Documenta\u00e7\u00e3o sobre a Release 1 Conclu\u00eddo #54 Sprint 4 - Cria\u00e7\u00e3o de prot\u00f3tipo para integra\u00e7\u00e3o com UnB Ci\u00eancia Conclu\u00eddo #57 Sprint 4 - Configura\u00e7\u00e3o de Ambiente do Projeto Open Source: GOVBR-Tema Conclu\u00eddo #58 Sprint 4 - Levantamento de refer\u00eancias para o site e formas de integra\u00e7\u00e3o com a UnB Ci\u00eancia Conclu\u00eddo #59 Sprint 4 - Defini\u00e7\u00e3o das Personas e Perfil de Usu\u00e1rio Conclu\u00eddo"},{"location":"sprints/sprint04/resultados/#3-reunioes","title":"3. Reuni\u00f5es","text":"

Nessa Sprint 04 tivemos quatro reuni\u00f5es. Tr\u00eas internas e uma externa.

Data Tema Ata 08/04/2024 Sprint Planning 18/04/2024 Reuni\u00e3o com a Equipe da SECOM Clique Aqui 22/04/2024 Sprint Review 22/04/2024 Sprint Retrospective"},{"location":"sprints/sprint04/resultados/#4-avaliacao-do-scrum-master","title":"4. Avalia\u00e7\u00e3o do Scrum Master","text":"

No decorrer desta sprint, o time realizou o que foi planejado internamente e colaborou ativamente com o projeto.

"},{"location":"sprints/sprint04/resultados/#5-historico-de-versoes","title":"5. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 22/04/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint05/planejamento/","title":"Planejamento","text":""},{"location":"sprints/sprint05/planejamento/#1-o-planejado","title":"1. O planejado","text":"

O planejado para a Sprint 5 inclui a cria\u00e7\u00e3o do prot\u00f3tipo da Landing Page no Figma, alinhado com o briefing inicial fornecido. Al\u00e9m disso, vamos avan\u00e7ar com o desenvolvimento da Landing Page no WordPress. Tamb\u00e9m faremos a elabora\u00e7\u00e3o do prot\u00f3tipo das subp\u00e1ginas no Figma, com base na landing page aprovada. Estudos sobre a migra\u00e7\u00e3o de dados do Joomla para WordPress e a an\u00e1lise dos requisitos da STI para a implementa\u00e7\u00e3o de dom\u00ednios est\u00e3o igualmente na agenda. Essas iniciativas visam fortalecer e expandir a presen\u00e7a online da Revista Darcy, alinhando-se \u00e0s necessidades e diretrizes do projeto.

"},{"location":"sprints/sprint05/planejamento/#2-duracao-da-sprint","title":"2. Dura\u00e7\u00e3o da Sprint","text":"

In\u00edcio: 22/04/2024

Fim: 06/05/2024

Dura\u00e7\u00e3o: 14 dias

"},{"location":"sprints/sprint05/planejamento/#3-issues","title":"3. Issues","text":"Issue T\u00edtulo Respons\u00e1veis #64 Sprint 5 - Cria\u00e7\u00e3o do prot\u00f3tipo da Landing Page no figma com base no briefing inicial [Todos] #65 Sprint 5 - Desenvolvimento da Landing Page no WordPress Jefferson Sena, Lu\u00eds Filipe e Gabriel Morais #66 Sprint 5 - Cria\u00e7\u00e3o do prot\u00f3tipo das subp\u00e1ginas no FIGMA com base na landing page aprovada Jos\u00e9 Andr\u00e9, Joselito Prado Tiago Albuquerque #67 Sprint 5 - Estudos sobre a migra\u00e7\u00e3o de dados do Joomla para WordPress Jefferson Sena, Lu\u00eds Filipe e Gabriel Morais #68 Sprint 5 - Estudar os requisitos da STI para implementa\u00e7\u00e3o de dom\u00ednios Jos\u00e9 Andr\u00e9, Joselito Prado Tiago Albuquerque"},{"location":"sprints/sprint05/planejamento/#4-historico-de-versoes","title":"4. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 22/04/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint05/resultados/","title":"Resultados","text":""},{"location":"sprints/sprint05/resultados/#1-o-que-foi-feito","title":"1. O que foi feito","text":"

Durante a sprint 05, realizamos uma boa din\u00e2mica de prototipa\u00e7\u00e3o - desenvolvimento, os fazendo paralelamente e de forma iterativa. No entanto, devido \u00e0 greve dos t\u00e9cnicos, tivemos dificuldades em evoluir a migra\u00e7\u00e3o dos dados. Embora tenhamos obtido um usu\u00e1rio do Joomla da Revista, este usu\u00e1rio n\u00e3o tem as permiss\u00f5es necess\u00e1rias para acesso ao banco de dados. Continuamos os tr\u00e2mites para obter esse acesso por\u00e9m est\u00e1 sendo lento. O ponto positivo foi a evolu\u00e7\u00e3o do prot\u00f3tipo da home de alta fidelidade que realizamos pela equipe de design da SECOM. Ap\u00f3s a valida\u00e7\u00e3o ela j\u00e1 come\u00e7ou a ser implementada novamente.

"},{"location":"sprints/sprint05/resultados/#_1","title":"Resultados","text":""},{"location":"sprints/sprint05/resultados/#2-issues","title":"2. Issues","text":"Issue T\u00edtulo Status #64 Sprint 5 - Cria\u00e7\u00e3o do prot\u00f3tipo da Landing Page no figma com base no briefing inicial Conclu\u00eddo #65 Sprint 5 - Desenvolvimento da Landing Page no WordPress Conclu\u00eddo #66 Sprint 5 - Cria\u00e7\u00e3o do prot\u00f3tipo das subp\u00e1ginas no FIGMA com base na landing page aprovada Conclu\u00eddo #67 Sprint 5 - Estudos sobre a migra\u00e7\u00e3o de dados do Joomla para WordPress Conclu\u00eddo #68 Sprint 5 - Estudar os requisitos da STI para implementa\u00e7\u00e3o de dom\u00ednios Conclu\u00eddo"},{"location":"sprints/sprint05/resultados/#3-reunioes","title":"3. Reuni\u00f5es","text":"

Nessa Sprint 05 tivemos quatro reuni\u00f5es. Tr\u00eas internas e uma externa.

Data Tema Ata 22/04/2024 Sprint Planning 25/04/2024 Reuni\u00e3o com a Equipe da SECOM Clique Aqui 06/05/2024 Sprint Review 06/05/2024 Sprint Retrospective"},{"location":"sprints/sprint05/resultados/#4-avaliacao-do-scrum-master","title":"4. Avalia\u00e7\u00e3o do Scrum Master","text":"

No decorrer desta sprint, o time realizou o que foi planejado internamente e colaborou ativamente com o projeto.

"},{"location":"sprints/sprint05/resultados/#5-historico-de-versoes","title":"5. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 07/05/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint06/planejamento/","title":"Planejamento","text":""},{"location":"sprints/sprint06/planejamento/#1-o-planejado","title":"1. O planejado","text":"

O planejado para a Sprint 6 consiste na continua\u00e7\u00e3o da implementa\u00e7\u00e3o no wordpress das p\u00e1ginas do prot\u00f3tipo que foram validadas pela SECOM. Al\u00e9m disso, iniciaremos a evolu\u00e7\u00e3o do c\u00f3digo do tema GOVbr, para que o projeto atenda futuras demandas da Universidade. Al\u00e9m disso, continuaremos no tr\u00e2mite da migra\u00e7\u00e3o de dados do banco de dados do JOOMLA junto \u00e0 STI. Por fim, come\u00e7aremos a estudar alternativas de plugins que possam realizar uma esp\u00e9cie de versionamento de c\u00f3digo gerado pelo wordpress automaticamente no GitHub, o que foi levantado como uma necessidade na release 2, pelos coordenadores.

"},{"location":"sprints/sprint06/planejamento/#2-duracao-da-sprint","title":"2. Dura\u00e7\u00e3o da Sprint","text":"

In\u00edcio: 06/05/2024

Fim: 20/05/2024

Dura\u00e7\u00e3o: 14 dias

"},{"location":"sprints/sprint06/planejamento/#3-issues","title":"3. Issues","text":"Issue T\u00edtulo Respons\u00e1veis #77 Sprint 6 - Evolu\u00e7\u00e3o do Tema GOVbr em PHP para atender ao prot\u00f3tipo Jos\u00e9 Andr\u00e9, Jefferson Sena #78 Sprint 6 - Migra\u00e7\u00e3o dos Dados do CMS Joomla para WordPress Jefferson Sena #79 Sprint 6 - Implementa\u00e7\u00e3o da Home Page Joselito Prado, Tiago Albuquerque, Gabriel Morais #80 Sprint 6 - Estudar estrat\u00e9gias de versionamento com WordPress Jos\u00e9 Andr\u00e9, Lu\u00eds Filipe e Tiago Albuquerque"},{"location":"sprints/sprint06/planejamento/#4-historico-de-versoes","title":"4. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 07/05/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint06/resultados/","title":"Resultados","text":""},{"location":"sprints/sprint06/resultados/#1-o-que-foi-feito","title":"1. O que foi feito","text":"

Na sprint 06, tivemos que mudar a prioridade em meio \u00e0 realiza\u00e7\u00e3o das tarefas planejadas uma vez que a STI disponibilizou uma alternativa mais vi\u00e1vel para o andamento do projeto. Foi disponibilizado um ambiente de homologa\u00e7\u00e3o nos servidores da UnB que ter\u00e1 prazo de 60 dias para desenvolvermos, podendo ser estendido por mais 30 dias caso haja a necessidade. O que atende nossa deadline do projeto. Tivemos tamb\u00e9m a disponibiliza\u00e7\u00e3o do backup do Joomla.

"},{"location":"sprints/sprint06/resultados/#_1","title":"Resultados","text":""},{"location":"sprints/sprint06/resultados/#2-issues","title":"2. Issues","text":"Issue T\u00edtulo Status #77 Sprint 6 - Evolu\u00e7\u00e3o do Tema GOVbr em PHP para atender ao prot\u00f3tipo Em pausa #78 Sprint 6 - Migra\u00e7\u00e3o dos Dados do CMS Joomla para WordPress Em Andamento #79 Sprint 6 - Implementa\u00e7\u00e3o da Home Page Conclu\u00eddo #80 Sprint 6 - Estudar estrat\u00e9gias de versionamento com WordPress Conclu\u00eddo #83 Sprint 6 - Solicita\u00e7\u00e3o de Ambiente de Homologa\u00e7\u00e3o no dom\u00ednio da UnB.br Conclu\u00eddo"},{"location":"sprints/sprint06/resultados/#3-reunioes","title":"3. Reuni\u00f5es","text":"

Nessa Sprint 06 tivemos cinco reuni\u00f5es. Tr\u00eas internas e duas externas.

Data Tema Ata 06/05/2024 Sprint Planning 09/05/2024 Reuni\u00e3o com a Equipe da SECOM Clique Aqui 16/05/2024 Reuni\u00e3o com a Equipe da SECOM Clique Aqui 20/05/2024 Sprint Review 20/05/2024 Sprint Retrospective"},{"location":"sprints/sprint06/resultados/#4-avaliacao-do-scrum-master","title":"4. Avalia\u00e7\u00e3o do Scrum Master","text":"

No decorrer desta sprint, o time realizou o que foi planejado internamente e colaborou ativamente com o projeto.

"},{"location":"sprints/sprint06/resultados/#5-historico-de-versoes","title":"5. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 20/05/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint07/planejamento/","title":"Planejamento","text":""},{"location":"sprints/sprint07/planejamento/#1-o-planejado","title":"1. O planejado","text":"

O planejado para a Sprint 7 foca no desenvolvimento da homepage j\u00e1 no ambiente de homologa\u00e7\u00e3o disponibilizado pela STI. Al\u00e9m disso, iniciaremos a migra\u00e7\u00e3o dos dados atrav\u00e9s do backup recebido. Ao final, esperamos ter a homepage implementada por completa no ambiente de homologa\u00e7\u00e3o e validada pela SECOM. Al\u00e9m de ter boa parte dos dados antigos na nova plataforma.

"},{"location":"sprints/sprint07/planejamento/#2-duracao-da-sprint","title":"2. Dura\u00e7\u00e3o da Sprint","text":"

In\u00edcio: 20/05/2024

Fim: 03/06/2024

Dura\u00e7\u00e3o: 14 dias

"},{"location":"sprints/sprint07/planejamento/#3-issues","title":"3. Issues","text":"Issue T\u00edtulo Respons\u00e1veis #84 Sprint 7 - Implementa\u00e7\u00e3o do Slide 1 na Home - Vida Intergal\u00e1ctica Lu\u00eds Filipe #85 Sprint 7 - Implementa\u00e7\u00e3o dos destaques laterais abaixo de vida intergal\u00e1ctica Lu\u00eds Filipe #86 Sprint 7 - Feat: Evolu\u00e7\u00e3o de container/slide Vida Gal\u00e1ctica, destaques laterais, Cont\u00e2iner Vida Gal\u00e1ctica Lu\u00eds Filipe #87 Sprint 7 - Atualiza\u00e7\u00e3o do RoadMap Jefferson Sena #90 Sprint 7 - Feat Criando Home: Imagens Instagram UnB, Banner UnB Ci\u00eancia Lu\u00eds Filipe #91 Sprint 7 - Feat Criando Home: Banner inicial Darcy/Container Assinar(Revista) Lu\u00eds Filipe"},{"location":"sprints/sprint07/planejamento/#4-historico-de-versoes","title":"4. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 20/05/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint07/resultados/","title":"Resultados","text":""},{"location":"sprints/sprint07/resultados/#1-o-que-foi-feito","title":"1. O que foi feito","text":"

Na sprint 07, realizamos o desenvolvimento da homepage atualizada pela equipe de design da SECOM, j\u00e1 em ambiente de homologa\u00e7\u00e3o. Tamb\u00e9m tivemos trocas de informa\u00e7\u00e3o com a STI com o objetivo de discutir a melhor estrat\u00e9gia de migra\u00e7\u00e3o de dados. Al\u00e9m disso, foi iniciado a evolu\u00e7\u00e3o do prot\u00f3tipo das sub-p\u00e1ginas, especificamente a de artigos que ser\u00e1 replicada.

"},{"location":"sprints/sprint07/resultados/#_1","title":"Resultados","text":""},{"location":"sprints/sprint07/resultados/#2-issues","title":"2. Issues","text":"Issue T\u00edtulo Status #84 Sprint 7 - Implementa\u00e7\u00e3o do Slide 1 na Home - Vida Intergal\u00e1ctica Conclu\u00eddo #85 Sprint 7 - Implementa\u00e7\u00e3o dos destaques laterais abaixo de vida intergal\u00e1ctica Conclu\u00eddo #86 Sprint 7 - Feat: Evolu\u00e7\u00e3o de container/slide Vida Gal\u00e1ctica, destaques laterais, Cont\u00e2iner Vida Gal\u00e1ctica Conclu\u00eddo #87 Sprint 7 - Atualiza\u00e7\u00e3o do RoadMap Conclu\u00eddo #90 Sprint 7 - Feat Criando Home: Imagens Instagram UnB, Banner UnB Ci\u00eancia Conclu\u00eddo #91 Sprint 7 - Feat Criando Home: Banner inicial Darcy/Container Assinar(Revista) Conclu\u00eddo"},{"location":"sprints/sprint07/resultados/#3-reunioes","title":"3. Reuni\u00f5es","text":"

Nessa Sprint 07 tivemos quatro reuni\u00f5es. Tr\u00eas internas e uma externa.

Data Tema Ata 20/05/2024 Sprint Planning 09/05/2024 Reuni\u00e3o com a Equipe da SECOM Clique Aqui 03/06/2024 Sprint Review 03/06/2024 Sprint Retrospective"},{"location":"sprints/sprint07/resultados/#4-avaliacao-do-scrum-master","title":"4. Avalia\u00e7\u00e3o do Scrum Master","text":"

No decorrer desta sprint, o time realizou o que foi planejado internamente e colaborou ativamente com o projeto.

"},{"location":"sprints/sprint07/resultados/#5-historico-de-versoes","title":"5. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 03/06/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint08/planejamento/","title":"Planejamento","text":""},{"location":"sprints/sprint08/planejamento/#1-o-planejado","title":"1. O planejado","text":"

O planejado para a Sprint 8 consiste na implementa\u00e7\u00e3o da sub-p\u00e1gina de artigos, e ap\u00f3s isso, a replica\u00e7\u00e3o da mesma para os artigos do backup, afim de realizar a migra\u00e7\u00e3o dos conte\u00fados de maior prioridade. Al\u00e9m disso, se faz necess\u00e1rio documentar todos os passos (plugins utilizados e jornada do editor) realizados para uma melhor manutenibilidade futura.

"},{"location":"sprints/sprint08/planejamento/#2-duracao-da-sprint","title":"2. Dura\u00e7\u00e3o da Sprint","text":"

In\u00edcio: 03/06/2024

Fim: 17/06/2024

Dura\u00e7\u00e3o: 14 dias

"},{"location":"sprints/sprint08/planejamento/#3-issues","title":"3. Issues","text":"Issue T\u00edtulo Respons\u00e1veis #92 Sprint 08 - Feat: Desenvolvimento da P\u00e1gina de Artigos Jefferson Sena #93 Sprint 08 - Documenta\u00e7\u00e3o de Instala\u00e7\u00f5es de Plugins no Site de Homologa\u00e7\u00e3o da UnB Joselito Prado #94 Sprint 08 - Feat: Desenvolvimento de Elementos da P\u00e1gina de Artigos Tiago Albuquerque #97 Sprint 08 - Feat: Desenvolvimento da P\u00e1gina de Dossi\u00ea da 30\u00ba Edi\u00e7\u00e3o Jos\u00e9 Andr\u00e9 #98 Sprint 08 - Documenta\u00e7\u00e3o da Evolu\u00e7\u00e3o do Prot\u00f3tipo e Implementa\u00e7\u00e3o do site de Homolaga\u00e7\u00e3o Gabriel Morais #100 Sprint 08 - Mudan\u00e7a de estrutura textual no Banner Inicial da Home Luis Filipe #101 Sprint 08 - Feat: Cria\u00e7\u00e3o de Artigos referentes \u00e0 Edi\u00e7\u00e3o 30 Joselito Prado #102 Sprint 08 - Feat: Implementa\u00e7\u00e3o da p\u00e1gina de artigo da edi\u00e7\u00e3o 30 Tiago Albuquerque"},{"location":"sprints/sprint08/planejamento/#4-historico-de-versoes","title":"4. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 03/06/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint08/resultados/","title":"Resultados","text":""},{"location":"sprints/sprint08/resultados/#1-o-que-foi-feito","title":"1. O que foi feito","text":"

Na sprint 08, realizamos uma din\u00e2mica eficiente de desenvolvimento e documenta\u00e7\u00e3o, de modo que facilite a manuten\u00e7\u00e3o da plataforma posteriormente pela STI, o que foi requisitado pela cliente. Implementamos p\u00e1ginas que foram prototipadas pela equipe de design al\u00e9m de aprimorar elementos que j\u00e1 haviam sido desenvolvidos em sprints passadas.

"},{"location":"sprints/sprint08/resultados/#_1","title":"Resultados","text":""},{"location":"sprints/sprint08/resultados/#2-issues","title":"2. Issues","text":"Issue T\u00edtulo Status #92 Sprint 08 - Feat: Desenvolvimento da P\u00e1gina de Artigos Conclu\u00eddo #93 Sprint 08 - Documenta\u00e7\u00e3o de Instala\u00e7\u00f5es de Plugins no Site de Homologa\u00e7\u00e3o da UnB Conclu\u00eddo #94 Sprint 08 - Feat: Desenvolvimento de Elementos da P\u00e1gina de Artigos Conclu\u00eddo #97 Sprint 08 - Feat: Desenvolvimento da P\u00e1gina de Dossi\u00ea da 30\u00ba Edi\u00e7\u00e3o Conclu\u00eddo #98 Sprint 08 - Documenta\u00e7\u00e3o da Evolu\u00e7\u00e3o do Prot\u00f3tipo e Implementa\u00e7\u00e3o do site de Homolaga\u00e7\u00e3o Conclu\u00eddo #100 Sprint 08 - Mudan\u00e7a de estrutura textual no Banner Inicial da Home Conclu\u00eddo #101 Sprint 08 - Feat: Cria\u00e7\u00e3o de Artigos referentes \u00e0 Edi\u00e7\u00e3o 30 Conclu\u00eddo #102 Sprint 08 - Feat: Implementa\u00e7\u00e3o da p\u00e1gina de artigo da edi\u00e7\u00e3o 30 Conclu\u00eddo"},{"location":"sprints/sprint08/resultados/#3-reunioes","title":"3. Reuni\u00f5es","text":"

Nessa Sprint 08 tivemos cinco reuni\u00f5es. Tr\u00eas internas e duas externas.

Data Tema Ata 03/06/2024 Sprint Planning 06/06/2024 Reuni\u00e3o com a Equipe da SECOM Clique Aqui 13/06/2024 Reuni\u00e3o com a Equipe da SECOM Clique Aqui 17/06/2024 Sprint Review 17/06/2024 Sprint Retrospective"},{"location":"sprints/sprint08/resultados/#4-avaliacao-do-scrum-master","title":"4. Avalia\u00e7\u00e3o do Scrum Master","text":"

No decorrer desta sprint, o time realizou o que foi planejado internamente e colaborou ativamente com o projeto.

"},{"location":"sprints/sprint08/resultados/#5-historico-de-versoes","title":"5. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 17/06/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint09/planejamento/","title":"Planejamento","text":""},{"location":"sprints/sprint09/planejamento/#1-o-planejado","title":"1. O planejado","text":"

O planejado para a Sprint 9 consiste na continua\u00e7\u00e3o do desenvolvimento das p\u00e1ginas que forem prototipadas e validadas pela SECOM, al\u00e9m de prosseguir com a documenta\u00e7\u00e3o dessas etapas. Al\u00e9m disso, desenvolveremos um fluxograma de navegabilidade pela perpespectiva do usu\u00e1rio para que possamos visualizar de modo mais abrangente a jornada do usu\u00e1rio. Por fim, seguiremos evoluindo elementos comuns \u00e0s p\u00e1ginas para alcan\u00e7ar o prot\u00f3tipo de forma mais f\u00eddedigna.

"},{"location":"sprints/sprint09/planejamento/#2-duracao-da-sprint","title":"2. Dura\u00e7\u00e3o da Sprint","text":"

In\u00edcio: 17/06/2024

Fim: 01/07/2024

Dura\u00e7\u00e3o: 14 dias

"},{"location":"sprints/sprint09/planejamento/#3-issues-ainda-sendo-criadas-ao-decorrer-da-sprint","title":"3. Issues (Ainda sendo criadas ao decorrer da sprint)","text":"Issue T\u00edtulo Respons\u00e1veis #103 Sprint 09 - Criar um Fluxograma de Navegabilidade do Site pela Perspectiva do Usu\u00e1rio Jos\u00e9 Andr\u00e9 #105 Sprint 09 - Feat: Cria\u00e7\u00e3o da p\u00e1gina de leitura de edi\u00e7\u00e3o Tiago Albuquerque #106 Sprint 09 - Feat: Responsividade para celular e tablet da Home Luis Filipe #107 Sprint 09 - Feat: Cria\u00e7\u00e3o P\u00e1gina Todas Edi\u00e7\u00f5es e altera\u00e7\u00e3o para responsividade Luis Filipe #108 Sprint 09 - Implementa\u00e7\u00e3o de \u00cdcones no Menu Institucional Jos\u00e9 Andr\u00e9 #109 Sprint 09 - Ajuste de \u00edcones e funcionalidades em todas as p\u00e1ginas Jefferson Sena #110 Sprint 09 - Feat: Cria\u00e7\u00e3o de Artigos Referentes \u00e0 Edi\u00e7\u00e3o 30 Gabriel Morais #115 Sprint 09 - Implementa\u00e7\u00e3o e ajustes de posts da edi\u00e7\u00e3o 30 e suas responsividades Joselito Prado"},{"location":"sprints/sprint09/planejamento/#4-historico-de-versoes","title":"4. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 17/06/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"sprints/sprint09/resultados/","title":"Resultados","text":""},{"location":"sprints/sprint09/resultados/#1-o-que-foi-feito","title":"1. O que foi feito","text":"

Na sprint 09, continuamos o desenvolvimento das p\u00e1ginas prototipadadas pela equipe de design da SECOM. Al\u00e9m disso, ajustamos d\u00e9bitos deixados na sprint anterior, como alguns elementos mal formatados e quest\u00f5es de iconografia governamental. Tamb\u00e9m produzimos um fluxograma de navegabilidade da atual plataforma para entendermos de forma visual de que forma nossas altera\u00e7\u00f5es est\u00e3o sendo refletidas de acordo com a perspectiva do usu\u00e1rio. Al\u00e9m disso, focamos em responsividade para dispositivos mobile.

"},{"location":"sprints/sprint09/resultados/#_1","title":"Resultados","text":""},{"location":"sprints/sprint09/resultados/#2-issues","title":"2. Issues","text":"Issue T\u00edtulo Status #103 Sprint 09 - Criar um Fluxograma de Navegabilidade do Site pela Perspectiva do Usu\u00e1rio Conclu\u00eddo #105 Sprint 09 - Feat: Cria\u00e7\u00e3o da p\u00e1gina de leitura de edi\u00e7\u00e3o Conclu\u00eddo #106 Sprint 09 - Feat: Responsividade para celular e tablet da Home Conclu\u00eddo #107 Sprint 09 - Feat: Cria\u00e7\u00e3o P\u00e1gina Todas Edi\u00e7\u00f5es e altera\u00e7\u00e3o para responsividade Conclu\u00eddo #108 Sprint 09 - Implementa\u00e7\u00e3o de \u00cdcones no Menu Institucional Conclu\u00eddo #109 Sprint 09 - Ajuste de \u00edcones e funcionalidades em todas as p\u00e1ginas Conclu\u00eddo #110 Sprint 09 - Feat: Cria\u00e7\u00e3o de Artigos Referentes \u00e0 Edi\u00e7\u00e3o 30 Conclu\u00eddo #115 Sprint 09 - Implementa\u00e7\u00e3o e ajustes de posts da edi\u00e7\u00e3o 30 e suas responsividades Conclu\u00eddo"},{"location":"sprints/sprint09/resultados/#3-reunioes","title":"3. Reuni\u00f5es","text":"

Nessa Sprint 09 tivemos quatro reuni\u00f5es. Tr\u00eas internas e uma externa.

Data Tema Ata 17/06/2024 Sprint Planning 27/06/2024 Reuni\u00e3o com a Equipe da SECOM Clique Aqui 01/07/2024 Sprint Review 01/07/2024 Sprint Retrospective"},{"location":"sprints/sprint09/resultados/#4-avaliacao-do-scrum-master","title":"4. Avalia\u00e7\u00e3o do Scrum Master","text":"

No decorrer desta sprint, o time realizou o que foi planejado internamente e colaborou ativamente com o projeto.

"},{"location":"sprints/sprint09/resultados/#5-historico-de-versoes","title":"5. Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 01/07/2024 0.1 Abertura do documento Jos\u00e9 Andr\u00e9"},{"location":"workshop/comandos/","title":"O que \u00e9 o WordPress e como ele opera?","text":"

O WordPress \u00e9 um sistema de gerenciamento de conte\u00fado (CMS - Content Management System) amplamente utilizado para criar e gerenciar sites e blogs. Ele \u00e9 baseado em PHP e usa um banco de dados MySQL para armazenar conte\u00fado. O WordPress \u00e9 conhecido por sua flexibilidade, facilidade de uso e uma grande comunidade de desenvolvedores e usu\u00e1rios que contribuem com plugins e temas.

"},{"location":"workshop/comandos/#o-que-e-o-tema-govbr","title":"O que \u00e9 o tema GovBR?","text":"

Uma solu\u00e7\u00e3o open-source desenvolvida pela IBICT (Instituto Brasileiro de Informa\u00e7\u00e3o em Ci\u00eancia e Tecnologia) que visa facilitar a padroniza\u00e7\u00e3o da identidade visual do modelo Gov.BR para sites governamentais desenvolvidos em WordPress. O tema usa das tecnologias mais modernas do WordPress, incluindo os padr\u00f5es de bloco do editor de p\u00e1ginas, al\u00e9m de oferecer integra\u00e7\u00f5es com alguns plugins comumente utilizados.

Linguagens utilizadas: PHP, JavaScript, React, SCSS

"},{"location":"workshop/comandos/#por-que-ele-foi-criado","title":"Por que ele foi criado?","text":""},{"location":"workshop/comandos/#motivo-1-design-system","title":"Motivo 1: Design System","text":"

Aplica\u00e7\u00f5es de governo precisam estar corretamente adequadas ao Design System do Portal Gov.BR, com padr\u00f5es de interface que devem ser seguidos por designers e desenvolvedores para garantir a experi\u00eancia \u00fanica na intera\u00e7\u00e3o com os sistemas interativos da Administra\u00e7\u00e3o P\u00fablica Federal.

"},{"location":"workshop/comandos/#motivo-2-preco-e-acessibilidade","title":"Motivo 2: Pre\u00e7o e Acessibilidade","text":"

O Gov.BR utiliza o sistema de gest\u00e3o de conte\u00fado Plone. No entanto, diversos sites governamentais utilizam o WordPress, um dos gerenciadores de conte\u00fado mais populares do mundo. Nesse sentido, alguns \u00f3rg\u00e3os passam por desafios para adaptar seus sites e portais. O tema desenvolvido \u00e9 uma alternativa para institui\u00e7\u00f5es que n\u00e3o podem usar o Plone.

Alguns \u00f3rg\u00e3os governamentais, como a UnB, utilizam o Joomla como CMS padr\u00e3o, no entanto, a dificuldade de manuten\u00e7\u00e3o e falta de intuitividade da plataforma fez surgir uma demanda de migra\u00e7\u00e3o dos sites da Universidade para o WordPress. Ou seja, a necessidade de migra\u00e7\u00e3o para o WordPress n\u00e3o \u00e9 apenas da Revista Darcy, mas sim de todos os sites do dom\u00ednio da Universidade de Bras\u00edlia.

"},{"location":"workshop/comandos/#unindo-o-util-ao-agradavel","title":"Unindo o \u00fatil ao agrad\u00e1vel","text":"

Dessa forma, sabendo a necessidade da migra\u00e7\u00e3o dos sites governamentais para um CMS acess\u00edvel e intuitivo como o WordPress, o IBICT criou o tema GovBR. Imagine a complexidade que seria se a cada novo site governamental, houvesse a necessidade de programadores para desenvolverem todo o front-end de acordo com o Design System do Governo Brasileiro. Por isso, instanciar o tema j\u00e1 produzido e evolui-lo de acordo com sua necessidade \u00e9 o melhor caminho e tamb\u00e9m o mais r\u00e1pido.

Hoje ensinaremos como voc\u00ea poder\u00e1 iniciar o desenvolvimento de um site governamental localmente com o tema GovBR. Voc\u00ea aprender\u00e1 a instalar o WordPress, configurar o MySQL, iniciar um servidor local e conectar o tema GovBR a ele.

"},{"location":"workshop/comandos/#instalacao-no-ubuntu","title":"Instala\u00e7\u00e3o no Ubuntu","text":""},{"location":"workshop/comandos/#passo-1-instalacao-do-xampp","title":"Passo 1: Instala\u00e7\u00e3o do XAMPP","text":"

O XAMPP \u00e9 uma distribui\u00e7\u00e3o de software gratuita e de c\u00f3digo aberto que facilita a instala\u00e7\u00e3o de um servidor web local. Ele \u00e9 especialmente \u00fatil para desenvolvedores que precisam de um ambiente de desenvolvimento para testar e desenvolver websites e aplica\u00e7\u00f5es web localmente antes de coloc\u00e1-las em produ\u00e7\u00e3o. O XAMPP \u00e9 uma distribui\u00e7\u00e3o Apache contendo MySQL, PHP, and Perl

https://www.apachefriends.org/download.html

  1. Clicar em XAMPP for Linux - 8.0.30 / PHP 8.0.30 - Download (64 bits)
  2. Abra os downloads do navegador e clique em \u201cMostrar na Pasta\u201d
  3. Clique com o bot\u00e3o direito no arquivo instalador do XAMPP e clique em \u201cPropriedades\u201d e ap\u00f3s em \u201cPermiss\u00f5es\u201d.
  4. Aperte em \u201cPermitir execu\u00e7\u00e3o do arquivo como um programa\u201d e feche a tela.
  5. Abra a pasta de downloads no terminal do Ubuntu. (Clicar no vazio com o bot\u00e3o direito e clicar em \u201cAbrir no Terminal\u201d)
  6. Mude as permiss\u00f5es do instalador:

    bash chmod 755 xampp-linux-*-installer.run

  7. Rode o instalador:

    bash sudo ./xampp-linux-*-installer.run

  8. Ap\u00f3s, ir\u00e1 abrir a tela de instala\u00e7\u00e3o. Conclua a instala\u00e7\u00e3o apertando em \u201cavan\u00e7ar\u201d.

    • (Se em algum momento algu\u00e9m fechar o launcher do XAMPP, rode:

      bash sudo /opt/lampp/manager-linux-x64.run

    • Lembrando que o Apache roda na porta 80, se algu\u00e9m tiver problema na hora de inicializar, pode ser que tenha algum servi\u00e7o rodando na porta 80, ter\u00e1 que derrub\u00e1-lo.

"},{"location":"workshop/comandos/#passo-2-configuracao-do-xampp","title":"Passo 2: Configura\u00e7\u00e3o do XAMPP","text":"
  1. Com o Launcher do XAMPP aberto, clique em \u201cManage Servers\u201d.
  2. D\u00ea start nos servidores MySQL Database e Apache Web Server. O status dos dois deve estar como \u201cRunning\u201d. O servidor ProFTPD pode estar desligado.
  3. Verifique se o servidor Apache j\u00e1 est\u00e1 dispon\u00edvel em http://localhost/.
"},{"location":"workshop/comandos/#passo-3-criacao-do-banco-de-dados","title":"Passo 3: Cria\u00e7\u00e3o do Banco de Dados","text":"
  1. No servidor local, dispon\u00edvel em http://localhost/, clique em \u201cphpMyAdmin\u201d, no canto superior direito da tela.
  2. Crie um banco de dados novo, clicando em \u201cNovo\u201d, no canto superior esquerdo da tela.
  3. Crie um nome pro seu banco de dados, n\u00e3o pode conter n\u00fameros e nem caracteres especiais, e tem que ser tudo min\u00fasculo. Por exemplo: govbr. Agora clique em criar.
  4. Pronto, agora o banco de dados est\u00e1 criado. S\u00f3 falta uma coisa pro WordPress funcionar: os arquivos do WordPress.
"},{"location":"workshop/comandos/#passo-4-instalando-o-wordpress","title":"Passo 4: Instalando o WordPress","text":"
  1. Acesse https://br.wordpress.org/download/ e clique em \u201cDownload WordPress 6.5.5\u201d.
  2. Isso baixar\u00e1 um zip, que voc\u00ea dever\u00e1 manualmente mover para a pasta do XAMPP.
  3. Rode:

    bash sudo mv ~/Downloads/wordpress-6.5.5-pt_BR.zip /opt/lampp/htdocs/

  4. Extraia o zip com o comando:

    bash sudo unzip /opt/lampp/htdocs/wordpress-6.5.5-pt_BR.zip -d /opt/lampp/htdocs/

  5. Agora temos os arquivos do WordPress no local correto, dentro de htdocs. Tamb\u00e9m temos o banco de dados criado, no entanto, essas duas coisas ainda n\u00e3o se conhecem.

"},{"location":"workshop/comandos/#passo-5-configurando-o-localhost","title":"Passo 5: Configurando o LocalHost","text":"
  1. Acesse http://localhost/wordpress/.
  2. Estamos na tela de configura\u00e7\u00e3o do WordPress, clique em \u201cVamos l\u00e1\u201d.
  3. Em \u201cNome do banco de dados\u201d insira o nome colocado no Passo 3, que no exemplo foi \u201cgovbr\u201d.
  4. Em \u201cUsu\u00e1rio\u201d escreva \u201croot\u201d.
  5. Em \u201cSenha\u201d deixe vazio.
  6. Servidor e prefixo deixe como est\u00e1 e clique em enviar.
  7. Se aparecer um erro de permiss\u00e3o que diz \u201cN\u00e3o foi poss\u00edvel gravar dados no arquivo wp-config.php\u201d, siga os passos abaixo:

    1. Volte pra tela anterior do WordPress.
    2. Abra o terminal e rode:

      bash sudo chmod -R 777 /opt/lampp/htdocs/wordpress

    3. Volte at\u00e9 a tela do WordPress no localhost e tente enviar novamente.

    4. Agora, provavelmente, abriu outra tela de sucesso. Clique em \u201cinstalar\u201d.
    5. Coloque o t\u00edtulo do site, como por exemplo \u201cTeste Gov BR\u201d.
    6. Crie um nome de usu\u00e1rio, uma senha e insira seu email.
    7. Clique em \u201cInstalar o WordPress\u201d.
    8. Agora, voc\u00ea deve estar em uma tela de Sucesso. Clique em \u201cAcessar\u201d.
"},{"location":"workshop/comandos/#passo-6-download-e-ativacao-do-tema-govbr","title":"Passo 6: Download e Ativa\u00e7\u00e3o do Tema GovBR","text":"
  1. Acesse o reposit\u00f3rio do tema no GitHub: https://github.com/IBICT/wp-govbr-tema.
  2. Clique em \u201cReleases\u201d no lado direito da tela.
  3. Baixe o arquivo govbr.zip.
  4. Abra o terminal e rode:

    bash sudo mv ~/Downloads/govbr.zip /opt/lampp/htdocs/wordpress/wp-content/themes/

  5. Navegue at\u00e9 a p\u00e1gina de temas:

    bash cd /opt/lampp/htdocs/wordpress/wp-content/themes/

  6. Descompacte o tema que est\u00e1 zipado:

    bash sudo unzip govbr.zip

  7. Volte ao seu site no WordPress e atualize a p\u00e1gina de temas. O tema GovBR j\u00e1 deve aparecer dispon\u00edvel pra ser utilizado.

  8. Clique em \u201cativar\u201d o tema.
"},{"location":"workshop/comandos/#consideracoes-finais","title":"Considera\u00e7\u00f5es Finais","text":"

Agora o WordPress est\u00e1 instalado, configurado e pronto para uso com o tema GovBR. A partir desse ponto, o desenvolvedor tem a possibilidade de editar o tema apenas no WordPress, abstraindo a complexidade da codifica\u00e7\u00e3o de cada feature. Mas, caso haja a necessidade, ele poder\u00e1 alterar o c\u00f3digo apenas editando o j\u00e1 existente no arquivo do tema, com qualquer IDE ou Editor de Texto, como o VSCode, e poder\u00e1 acompanhar as altera\u00e7\u00f5es em tempo de execu\u00e7\u00e3o, uma vez que estiver com o servidor local do WordPress rodando.

"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..0f8724e --- /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 0000000..335aecd Binary files /dev/null and b/sitemap.xml.gz differ diff --git a/sprints/sprint00/planejamento/index.html b/sprints/sprint00/planejamento/index.html new file mode 100644 index 0000000..89d5d58 --- /dev/null +++ b/sprints/sprint00/planejamento/index.html @@ -0,0 +1,2760 @@ + + + + + + + + + + + + + + + + + + + + + + + Planejamento - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

1. O planejado

+

O objetivo dessa sprint é nos organizarmos internamente, definindo os papéis dos membros de acordo com o SCRUM. Além disso, precisamos configurar nosso repositório do github e definir regras de proteção de branch, além de padrões de issue e pull request. É necessário a criação de uma gitpage com MKDOCS para documentarmos nosso processo de trabalho. Ideal que essa gitpage seja automatizada com o github actions assim como os padrões de commit e pull request.

+

É esperado que nessa sprint tenhamos a primeira reunião com a cliente, devemos realizar perguntas coesas e objetivas para termos uma visão geral do projeto e do produto, de modo que possamos definir um cronograma de trabalho.

+

+

2. Duração da Sprint

+

Início: 26/02/2024

+

Fim: 04/03/2024

+

Duração: 7 dias

+

3. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloResponsáveis
#2Sprint 0 - Ambientação Geral e Definição de Papéis do Time SCRUM[Todos]
#1Sprint 0 - Criação do MKDOCS para a DocumentaçãoTiago Albuquerque
#8Sprint 0 - Kickoff Meeting e Definição do Cronograma Inicial[Todos]
#15Sprint 0 - Configuração e Gerência do RepositórioJefferson Sena e José André
+

4. Papéis da Equipe

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FunçãoNome
Scrum MasterJosé André
Product OwnerJefferson Sena
Dev TeamJoselito Prado
Dev TeamTiago Albuquerque
Dev TeamLuís Filipe
+

5. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
05/03/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint00/resultados/index.html b/sprints/sprint00/resultados/index.html new file mode 100644 index 0000000..29d885a --- /dev/null +++ b/sprints/sprint00/resultados/index.html @@ -0,0 +1,2750 @@ + + + + + + + + + + + + + + + + + + + + + + + Resultados - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

1. O que foi feito

+

Nessa sprint conseguimos nos organizar como equipe, estabelecemos as funções de cada membro de acordo com o SCRUM. Além disso, organizamos nossos canais de comunicação e configuramos nosso repositório do github, estabelecendo padrões de commit e pull request. Também configuramos proteções para a branch main para evitar inconsistências em nosso repositório. Também configuramos uma gitpage no repositório com nossa documentação utilizando o MKDocs.

+

Tivemos também a reunião de kickoff com a cliente onde pudemos ter uma visão geral do projeto e do produto, o que nos possibilitou estabelecer um cronograma de trabalho inicial.

+

+

2. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloStatus
#2Sprint 0 - Ambientação Geral e Definição de Papéis do Time SCRUMConcluído
#1Sprint 0 - Criação do MKDOCS para a DocumentaçãoConcluído
#8Sprint 0 - Kickoff Meeting e Definição do Cronograma InicialConcluído
#15Sprint 0 - Configuração e Gerência do RepositórioConcluído
+

3. Reuniões

+

Nessa Sprint 00 tivemos duas reuniões.

+ + + + + + + + + + + + + + + + + + + + +
DataTemaAta
27/02/2024Reunião Interna - Apresentação e ambientação
28/02/2024Reunião com a Cliente - KickoffClique Aqui
+

4. Avaliação do Scrum Master

+

Durante esta sprint, observamos uma evolução significativa na interação entre os membros da equipe, assim como na familiarização deles com o projeto. Além disso, tivemos a oportunidade de conhecer mais sobre a cliente e compreender melhor tanto o projeto quanto o produto esperado.

+

5. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
05/03/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint01/planejamento/index.html b/sprints/sprint01/planejamento/index.html new file mode 100644 index 0000000..48821aa --- /dev/null +++ b/sprints/sprint01/planejamento/index.html @@ -0,0 +1,2720 @@ + + + + + + + + + + + + + + + + + + + + + + + Planejamento - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

1. O planejado

+

A Sprint 01 visa estabelecer as bases necessárias para o sucesso do projeto, desde a definição dos requisitos iniciais através do PBB até a criação de políticas internas e aprimoramento da documentação. Ao alcançar esses objetivos, estaremos preparados para avançar para as próximas etapas do desenvolvimento com clareza e eficiência.

+

+

2. Duração da Sprint

+

Início: 04/03/2024

+

Fim: 11/03/2024

+

Duração: 7 dias

+

3. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloResponsáveis
#7Sprint 1 - Posição do ProdutoJefferson Sena e Luís Filipe
#12Sprint 1 - Criação das políticas internasJoselito Prado
#14Sprint 1 - Criar visão de projetoTiago Albuquerque
#18Sprint 1 - Documentação da Sprint 00 e Reorganização da Estrutura de Navegação do MKDOCSJosé André
#19Sprint 1 - Correção de Tópicos e Padronização no MKDOCS. Adição das Atas 00 e 01.José André
#20Sprint 1 - Formulário de perfil de usuárioTodos
+

4. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
11/03/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint01/resultados/index.html b/sprints/sprint01/resultados/index.html new file mode 100644 index 0000000..ebef20f --- /dev/null +++ b/sprints/sprint01/resultados/index.html @@ -0,0 +1,2771 @@ + + + + + + + + + + + + + + + + + + + + + + + Resultados - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

1. O que foi feito

+

Nessa sprint, realizamos a primeira versão do levantamento de requisitos, utilizando a metodologia Product Backlog Building(PBB). Apresentamos para os stakeholders e a partir da próxima sprint refinaremos colaborativamente. +Pudemos também definir a visão de produto e de projeto iniciais. +Além disso, definimos políticas internas do grupo para nos guiar durante o projeto.

+

+

2. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloStatus
#7Sprint 1 - Posição do ProdutoConcluído
#12Sprint 1 - Criação das políticas internasConcluído
#14Sprint 1 - Criar visão de projetoConcluído
#18Sprint 1 - Documentação da Sprint 00 e Reorganização da Estrutura de Navegação do MKDOCSConcluído
#19Sprint 1 - Correção de Tópicos e Padronização no MKDOCS. Adição das Atas 00 e 01.Concluído
#20Sprint 1 - Formulário de perfil de usuárioConcluído
+

3. Reuniões

+

Nessa Sprint 01 tivemos quatro reuniões.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataTemaAta
04/03/2024Sprint Planning
07/03/2024Reunião com a Equipe da SECOMClique Aqui
11/03/2024Sprint Review
11/03/2024Sprint Retrospective
+

4. Avaliação do Scrum Master

+

Durante esta sprint, pudemos evoluir como equipe definindo padrões internos. As reuniões foram realizadas como planejado e a equipe tem sido colaborativa.

+

5. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
11/03/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint02/planejamento/index.html b/sprints/sprint02/planejamento/index.html new file mode 100644 index 0000000..b3e6969 --- /dev/null +++ b/sprints/sprint02/planejamento/index.html @@ -0,0 +1,2698 @@ + + + + + + + + + + + + + + + + + + + + + + + Planejamento - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Planejamento

+ +

1. O planejado

+

A Sprint 02 tem por objetivo a configuração de um ambiente de desenvolvimento colaborativo no Wordpress, a fim de todos os membros da equipe começarem a se ambientar com a plataforma em termos de skins e plugins. Tendo por objetivo implementar o tema GOVbr produzido pela Instituto Brasileiro de Informação em Ciência e Tecnologia (IBICT).

+

Além disso, se faz necessário a divulgação do formulário de pesquisa para que possamos analisar os dados a fim de continuar o refinamento dos requisitos.

+

A sprint terá uma duração de duas semanas em decorrência da indisponibilidade do cliente durante a primeira semana para reuniões.

+

2. Duração da Sprint

+

Início: 11/03/2024

+

Fim: 25/03/2024

+

Duração: 14 dias

+

3. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloResponsáveis
#21Sprint 2 - Coleta de Dados e Insights do Formulário de Perfil de Usuário[Todos]
#22Sprint 2 - Criação de Heat Map para definição de horários em comumJefferson Sena
#24Sprint 2 - Configuração do ambiente de desenvolvimento no WordPress[Todos]
#25Sprint 2 - Estudo de Potenciais Plugins - FG Joomla[Todos]
#28Sprint 2 - Estudar e Implementar o tema GOVbr[Todos]
#29Sprint 2 - Resolução do problema de acessibilidade em relação ao plugin VLibrasLuís Filipe
#30Sprint 2 - Estudar sobre Identidade Visual da UnB e identificar fontes e paletas de cores utilizadas na Revista DarcyLuís Filipe
+

4. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
11/03/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint02/resultados/index.html b/sprints/sprint02/resultados/index.html new file mode 100644 index 0000000..e63b199 --- /dev/null +++ b/sprints/sprint02/resultados/index.html @@ -0,0 +1,2773 @@ + + + + + + + + + + + + + + + + + + + + + + + Resultados - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

1. O que foi feito

+

Nessa sprint, começamos a implementação da plataforma com um domínio teste. Realizamos a configuração do Wordpress para que pudessemos trabalhar em equipe colaborativamente e com possibilidade de auditoria. +Após, começamos os estudos de temas e plugins, o que nos levou até o tema GOVbr, desenvolvido em 2023 pela IBICT justamente para facilitar o desenvolvimento de sites governamentais em Wordpress. Fizemos a implementação desse tema no nosso projeto. +Além disso, estudamos e implementamos um plugin para facilitar a leitura da Revista na WEB, o que é requisito do usuário. +Durante toda a sprint, fizemos um levantamento de identidade visual (tipografia e cores) da atual plataforma da revista. +Infelizmente, devido à greve dos técnicos da universidade, não tivemos nenhuma reunião com a equipe da SECOM. Por causa disso, não pudemos evoluir e refinar os requisitos. Além de não apresentar o incremento.

+

+

2. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloStatus
#21Sprint 2 - Coleta de Dados e Insights do Formulário de Perfil de UsuárioEm pausa
#22Sprint 2 - Criação de Heat Map para definição de horários em comumConcluído
#24Sprint 2 - Configuração do ambiente de desenvolvimento no WordPressConcluído
#25Sprint 2 - Estudo de Potenciais Plugins - FG JoomlaConcluído
#28Sprint 2 - Estudar e Implementar o tema GOVbrConcluído
#29Sprint 2 - Resolução do problema de acessibilidade em relação ao plugin VLibrasConcluído
#30Sprint 2 - Estudar sobre Identidade Visual da UnB e identificar fontes e paletas de cores utilizadas na Revista DarcyConcluído
+

3. Reuniões

+

Nessa Sprint 02 tivemos três reuniões. Todas internas.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
DataTemaAta
11/03/2024Sprint Planning
25/03/2024Sprint Review
25/03/2024Sprint Retrospective
+

4. Avaliação do Scrum Master

+

Durante esta sprint, o time realizou o que foi planejado internamente mesmo com o contratempo com o cliente. As reuniões foram realizadas como idealizado anteriormente e a equipe tem sido colaborativa.

+

5. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
25/03/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint03/planejamento/index.html b/sprints/sprint03/planejamento/index.html new file mode 100644 index 0000000..c99b1c4 --- /dev/null +++ b/sprints/sprint03/planejamento/index.html @@ -0,0 +1,2711 @@ + + + + + + + + + + + + + + + + + + + + + + + Planejamento - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Planejamento

+ +

1. O planejado

+

Na Sprint 3, focaremos em diversas atividades essenciais para a Revista Darcy. Isso inclui a definição do roadmap e refinamento dos requisitos. Além disso, vamos desenvolver um menu personalizado da UnB e implementar algumas páginas que já existem no site atual. Por exemplo: criaremos páginas para notícias, todas as edições da revista e contato. E por fim, integraremos o plugin Real3D Flipbook PDF Viewer Lite para leitura online. Cada membro da equipe tem suas responsabilidades específicas para garantir o progresso eficiente do projeto.

+

2. Duração da Sprint

+

Início: 25/03/2024

+

Fim: 08/04/2024

+

Duração: 14 dias

+

3. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloResponsáveis
#33Sprint 3 - Criação do Roadmap[Todos]
#34Sprint 3 - Refinamento dos Requisitos e Definição do Backlog[Todos]
#36Sprint 3 - Desenvolver e Implementar um menu personalizado da Universidade de Brasília (UnB) no siteJosé André
#37Sprint 3 - Implementação do Sistema de Assinatura para Recebimento das Próximas Edições da RevistaGabriel Morais
#38Sprint 3 - Criação da página de notíciasTiago Albuquerque
#39Sprint 3 - Desenvolvimento de Página para todas as edições da RevistaJefferson Sena
#40Sprint 3 - Implementação do Plugin: Plugin Real3D Flipbook PDF Viewer Lite, para leitura online[Todos]
#41Sprint 3 - Desenvolvimento de protótipo da página inicial[Todos]
#42Sprint 3 - Desenvolvimento da Página de ContatoJoselito Prado
#43Sprint 3 - Desenvolvimento da Página "Vídeos"Luís Filipe
+

4. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
25/03/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint03/resultados/index.html b/sprints/sprint03/resultados/index.html new file mode 100644 index 0000000..bc1f08a --- /dev/null +++ b/sprints/sprint03/resultados/index.html @@ -0,0 +1,2797 @@ + + + + + + + + + + + + + + + + + + + + + + + Resultados - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

1. O que foi feito

+

Nessa sprint 03, avançamos significativamente no nosso protótipo. Desenvolvemos páginas utilizando o padrão governamental mais atual e tivemos a validação da cliente em duas reuniões.

+

As seções desenvolvidas foram feitas em efeito de teste e replicação da atual plataforma da Revista de uma forma mais moderna e intuitiva.

+

Além disso, realizamos teste de carga no plugin de leitura da revista que estamos estudando e utilizando na nossa aplicação.

+

A sprint foi proveitosa visto que pudemos voltar a ter contato com a cliente, o que possibilitou nosso processo de refinamento e validação de requisitos. A partir disso utilizamos técnicas de priorização para nos nortear no desenvolvimento.

+

+

2. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloStatus
#33Sprint 3 - Criação do RoadmapConcluído
#34Sprint 3 - Refinamento dos Requisitos e Definição do BacklogConcluído
#36Sprint 3 - Desenvolver e Implementar um menu personalizado da Universidade de Brasília (UnB) no siteEm desenvolvimento
#37Sprint 3 - Implementação do Sistema de Assinatura para Recebimento das Próximas Edições da RevistaConcluído
#38Sprint 3 - Criação da página de notíciasEm desenvolvimento
#39Sprint 3 - Desenvolvimento de Página para todas as edições da RevistaEm desenvolvimento
#40Sprint 3 - Implementação do Plugin: Plugin Real3D Flipbook PDF Viewer Lite, para leitura onlineConcluído
#41Sprint 3 - Desenvolvimento de protótipo da página inicialConcluído
#42Sprint 3 - Desenvolvimento da Página de ContatoConcluído
#43Sprint 3 - Desenvolvimento da Página "Vídeos"Concluído
+

3. Reuniões

+

Nessa Sprint 03 tivemos cinco reuniões. Três internas e duas externas.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataTemaAta
25/03/2024Sprint Planning
02/04/2024Reunião com a Equipe da SECOMClique Aqui
04/04/2024Reunião com a Equipe da SECOMClique Aqui
08/04/2024Sprint Review
08/04/2024Sprint Retrospective
+

4. Avaliação do Scrum Master

+

No decorrer desta sprint, o time realizou o que foi planejado internamente e colaborou ativamente com o projeto.

+

5. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
08/04/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint04/planejamento/index.html b/sprints/sprint04/planejamento/index.html new file mode 100644 index 0000000..f0ed4f9 --- /dev/null +++ b/sprints/sprint04/planejamento/index.html @@ -0,0 +1,2687 @@ + + + + + + + + + + + + + + + + + + + + + + + Planejamento - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Planejamento

+ +

1. O planejado

+

Na Sprint 4, focaremos em construir insights a partir das respostas do formulário. Também iremos iniciar o desenvolvimento da evolução do tema gov-br via injeção de código. Além disso, pretendemos evoluir nosso MVP já consolidado através de referências externas.
+Haverá um briefing com os designers da SECOM para evoluirmos a identidade visual do site.

+

2. Duração da Sprint

+

Início: 08/04/2024

+

Fim: 22/04/2024

+

Duração: 14 dias

+

3. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloResponsáveis
#53Sprint 4 - Documentação sobre a Release 1Jefferson Sena
#54Sprint 4 - Criação de protótipo para integração com UnB CiênciaLuís Filipe
#57Sprint 4 - Configuração de Ambiente do Projeto Open Source: GOVBR-TemaJosé André Luís Filipe Tiago Albuquerque
#58Sprint 4 - Levantamento de referências para o site e formas de integração com a UnB CiênciaGabriel Morais Joselito Prado
#59Sprint 4 - Definição das Personas e Perfil de UsuárioJefferson Sena
+

4. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
09/04/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint04/resultados/index.html b/sprints/sprint04/resultados/index.html new file mode 100644 index 0000000..e9c19e2 --- /dev/null +++ b/sprints/sprint04/resultados/index.html @@ -0,0 +1,2766 @@ + + + + + + + + + + + + + + + + + + + + + + + Resultados - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

1. O que foi feito

+

Durante a sprint 04, pudemos minerar os dados obtidos a partir do formulário e definimos personas e perfil do usuário com base nas estatísticas.
+Também produzimos dois protótipos de alta fidelidade para a landing page com base nas referências enviadas pela Vanessa, protótipos que, ao fim da sprint, foram validados por ela.
+Pudemos também integrar nosso protótipo do WordPress com o UnB Ciência, requisito declarado pela SECOM.

+

+

2. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloStatus
#53Sprint 4 - Documentação sobre a Release 1Concluído
#54Sprint 4 - Criação de protótipo para integração com UnB CiênciaConcluído
#57Sprint 4 - Configuração de Ambiente do Projeto Open Source: GOVBR-TemaConcluído
#58Sprint 4 - Levantamento de referências para o site e formas de integração com a UnB CiênciaConcluído
#59Sprint 4 - Definição das Personas e Perfil de UsuárioConcluído
+

3. Reuniões

+

Nessa Sprint 04 tivemos quatro reuniões. Três internas e uma externa.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataTemaAta
08/04/2024Sprint Planning
18/04/2024Reunião com a Equipe da SECOMClique Aqui
22/04/2024Sprint Review
22/04/2024Sprint Retrospective
+

4. Avaliação do Scrum Master

+

No decorrer desta sprint, o time realizou o que foi planejado internamente e colaborou ativamente com o projeto.

+

5. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
22/04/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint05/planejamento/index.html b/sprints/sprint05/planejamento/index.html new file mode 100644 index 0000000..074545d --- /dev/null +++ b/sprints/sprint05/planejamento/index.html @@ -0,0 +1,2686 @@ + + + + + + + + + + + + + + + + + + + + + + + Planejamento - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Planejamento

+ +

1. O planejado

+

O planejado para a Sprint 5 inclui a criação do protótipo da Landing Page no Figma, alinhado com o briefing inicial fornecido. Além disso, vamos avançar com o desenvolvimento da Landing Page no WordPress. Também faremos a elaboração do protótipo das subpáginas no Figma, com base na landing page aprovada. Estudos sobre a migração de dados do Joomla para WordPress e a análise dos requisitos da STI para a implementação de domínios estão igualmente na agenda. Essas iniciativas visam fortalecer e expandir a presença online da Revista Darcy, alinhando-se às necessidades e diretrizes do projeto.

+

2. Duração da Sprint

+

Início: 22/04/2024

+

Fim: 06/05/2024

+

Duração: 14 dias

+

3. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloResponsáveis
#64Sprint 5 - Criação do protótipo da Landing Page no figma com base no briefing inicial[Todos]
#65Sprint 5 - Desenvolvimento da Landing Page no WordPressJefferson Sena, Luís Filipe e Gabriel Morais
#66Sprint 5 - Criação do protótipo das subpáginas no FIGMA com base na landing page aprovadaJosé André, Joselito Prado Tiago Albuquerque
#67Sprint 5 - Estudos sobre a migração de dados do Joomla para WordPressJefferson Sena, Luís Filipe e Gabriel Morais
#68Sprint 5 - Estudar os requisitos da STI para implementação de domíniosJosé André, Joselito Prado Tiago Albuquerque
+

4. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
22/04/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint05/resultados/index.html b/sprints/sprint05/resultados/index.html new file mode 100644 index 0000000..f570913 --- /dev/null +++ b/sprints/sprint05/resultados/index.html @@ -0,0 +1,2766 @@ + + + + + + + + + + + + + + + + + + + + + + + Resultados - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

1. O que foi feito

+

Durante a sprint 05, realizamos uma boa dinâmica de prototipação - desenvolvimento, os fazendo paralelamente e de forma iterativa.
+No entanto, devido à greve dos técnicos, tivemos dificuldades em evoluir a migração dos dados. Embora tenhamos obtido um usuário do Joomla da Revista, este usuário não tem as permissões necessárias para acesso ao banco de dados. Continuamos os trâmites para obter esse acesso porém está sendo lento.
+O ponto positivo foi a evolução do protótipo da home de alta fidelidade que realizamos pela equipe de design da SECOM. Após a validação ela já começou a ser implementada novamente.

+

+

2. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloStatus
#64Sprint 5 - Criação do protótipo da Landing Page no figma com base no briefing inicialConcluído
#65Sprint 5 - Desenvolvimento da Landing Page no WordPressConcluído
#66Sprint 5 - Criação do protótipo das subpáginas no FIGMA com base na landing page aprovadaConcluído
#67Sprint 5 - Estudos sobre a migração de dados do Joomla para WordPressConcluído
#68Sprint 5 - Estudar os requisitos da STI para implementação de domíniosConcluído
+

3. Reuniões

+

Nessa Sprint 05 tivemos quatro reuniões. Três internas e uma externa.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataTemaAta
22/04/2024Sprint Planning
25/04/2024Reunião com a Equipe da SECOMClique Aqui
06/05/2024Sprint Review
06/05/2024Sprint Retrospective
+

4. Avaliação do Scrum Master

+

No decorrer desta sprint, o time realizou o que foi planejado internamente e colaborou ativamente com o projeto.

+

5. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
07/05/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint06/planejamento/index.html b/sprints/sprint06/planejamento/index.html new file mode 100644 index 0000000..cb7663a --- /dev/null +++ b/sprints/sprint06/planejamento/index.html @@ -0,0 +1,2683 @@ + + + + + + + + + + + + + + + + + + + + + + + Planejamento - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Planejamento

+ +

1. O planejado

+

O planejado para a Sprint 6 consiste na continuação da implementação no wordpress das páginas do protótipo que foram validadas pela SECOM. Além disso, iniciaremos a evolução do código do tema GOVbr, para que o projeto atenda futuras demandas da Universidade.
+Além disso, continuaremos no trâmite da migração de dados do banco de dados do JOOMLA junto à STI.
+Por fim, começaremos a estudar alternativas de plugins que possam realizar uma espécie de versionamento de código gerado pelo wordpress automaticamente no GitHub, o que foi levantado como uma necessidade na release 2, pelos coordenadores.

+

2. Duração da Sprint

+

Início: 06/05/2024

+

Fim: 20/05/2024

+

Duração: 14 dias

+

3. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloResponsáveis
#77Sprint 6 - Evolução do Tema GOVbr em PHP para atender ao protótipoJosé André, Jefferson Sena
#78Sprint 6 - Migração dos Dados do CMS Joomla para WordPressJefferson Sena
#79Sprint 6 - Implementação da Home PageJoselito Prado, Tiago Albuquerque, Gabriel Morais
#80Sprint 6 - Estudar estratégias de versionamento com WordPressJosé André, Luís Filipe e Tiago Albuquerque
+

4. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
07/05/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint06/resultados/index.html b/sprints/sprint06/resultados/index.html new file mode 100644 index 0000000..72760c5 --- /dev/null +++ b/sprints/sprint06/resultados/index.html @@ -0,0 +1,2771 @@ + + + + + + + + + + + + + + + + + + + + + + + Resultados - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

1. O que foi feito

+

Na sprint 06, tivemos que mudar a prioridade em meio à realização das tarefas planejadas uma vez que a STI disponibilizou uma alternativa mais viável para o andamento do projeto.
+Foi disponibilizado um ambiente de homologação nos servidores da UnB que terá prazo de 60 dias para desenvolvermos, podendo ser estendido por mais 30 dias caso haja a necessidade. O que atende nossa deadline do projeto.
+Tivemos também a disponibilização do backup do Joomla.

+

+

2. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloStatus
#77Sprint 6 - Evolução do Tema GOVbr em PHP para atender ao protótipoEm pausa
#78Sprint 6 - Migração dos Dados do CMS Joomla para WordPressEm Andamento
#79Sprint 6 - Implementação da Home PageConcluído
#80Sprint 6 - Estudar estratégias de versionamento com WordPressConcluído
#83Sprint 6 - Solicitação de Ambiente de Homologação no domínio da UnB.brConcluído
+

3. Reuniões

+

Nessa Sprint 06 tivemos cinco reuniões. Três internas e duas externas.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataTemaAta
06/05/2024Sprint Planning
09/05/2024Reunião com a Equipe da SECOMClique Aqui
16/05/2024Reunião com a Equipe da SECOMClique Aqui
20/05/2024Sprint Review
20/05/2024Sprint Retrospective
+

4. Avaliação do Scrum Master

+

No decorrer desta sprint, o time realizou o que foi planejado internamente e colaborou ativamente com o projeto.

+

5. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
20/05/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint07/planejamento/index.html b/sprints/sprint07/planejamento/index.html new file mode 100644 index 0000000..83136d8 --- /dev/null +++ b/sprints/sprint07/planejamento/index.html @@ -0,0 +1,2693 @@ + + + + + + + + + + + + + + + + + + + + + + + Planejamento - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Planejamento

+ +

1. O planejado

+

O planejado para a Sprint 7 foca no desenvolvimento da homepage já no ambiente de homologação disponibilizado pela STI.
+Além disso, iniciaremos a migração dos dados através do backup recebido.
+Ao final, esperamos ter a homepage implementada por completa no ambiente de homologação e validada pela SECOM. Além de ter boa parte dos dados antigos na nova plataforma.

+

2. Duração da Sprint

+

Início: 20/05/2024

+

Fim: 03/06/2024

+

Duração: 14 dias

+

3. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloResponsáveis
#84Sprint 7 - Implementação do Slide 1 na Home - Vida IntergalácticaLuís Filipe
#85Sprint 7 - Implementação dos destaques laterais abaixo de vida intergalácticaLuís Filipe
#86Sprint 7 - Feat: Evolução de container/slide Vida Galáctica, destaques laterais, Contâiner Vida GalácticaLuís Filipe
#87Sprint 7 - Atualização do RoadMapJefferson Sena
#90Sprint 7 - Feat Criando Home: Imagens Instagram UnB, Banner UnB CiênciaLuís Filipe
#91Sprint 7 - Feat Criando Home: Banner inicial Darcy/Container Assinar(Revista)Luís Filipe
+

4. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
20/05/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint07/resultados/index.html b/sprints/sprint07/resultados/index.html new file mode 100644 index 0000000..ddbbf62 --- /dev/null +++ b/sprints/sprint07/resultados/index.html @@ -0,0 +1,2771 @@ + + + + + + + + + + + + + + + + + + + + + + + Resultados - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

1. O que foi feito

+

Na sprint 07, realizamos o desenvolvimento da homepage atualizada pela equipe de design da SECOM, já em ambiente de homologação.
+Também tivemos trocas de informação com a STI com o objetivo de discutir a melhor estratégia de migração de dados.
+Além disso, foi iniciado a evolução do protótipo das sub-páginas, especificamente a de artigos que será replicada.

+

+

2. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloStatus
#84Sprint 7 - Implementação do Slide 1 na Home - Vida IntergalácticaConcluído
#85Sprint 7 - Implementação dos destaques laterais abaixo de vida intergalácticaConcluído
#86Sprint 7 - Feat: Evolução de container/slide Vida Galáctica, destaques laterais, Contâiner Vida GalácticaConcluído
#87Sprint 7 - Atualização do RoadMapConcluído
#90Sprint 7 - Feat Criando Home: Imagens Instagram UnB, Banner UnB CiênciaConcluído
#91Sprint 7 - Feat Criando Home: Banner inicial Darcy/Container Assinar(Revista)Concluído
+

3. Reuniões

+

Nessa Sprint 07 tivemos quatro reuniões. Três internas e uma externa.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataTemaAta
20/05/2024Sprint Planning
09/05/2024Reunião com a Equipe da SECOMClique Aqui
03/06/2024Sprint Review
03/06/2024Sprint Retrospective
+

4. Avaliação do Scrum Master

+

No decorrer desta sprint, o time realizou o que foi planejado internamente e colaborou ativamente com o projeto.

+

5. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
03/06/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint08/planejamento/index.html b/sprints/sprint08/planejamento/index.html new file mode 100644 index 0000000..15ed98a --- /dev/null +++ b/sprints/sprint08/planejamento/index.html @@ -0,0 +1,2702 @@ + + + + + + + + + + + + + + + + + + + + + + + Planejamento - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

Planejamento

+ +

1. O planejado

+

O planejado para a Sprint 8 consiste na implementação da sub-página de artigos, e após isso, a replicação da mesma para os artigos do backup, afim de realizar a migração dos conteúdos de maior prioridade.
+Além disso, se faz necessário documentar todos os passos (plugins utilizados e jornada do editor) realizados para uma melhor manutenibilidade futura.

+

2. Duração da Sprint

+

Início: 03/06/2024

+

Fim: 17/06/2024

+

Duração: 14 dias

+

3. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloResponsáveis
#92Sprint 08 - Feat: Desenvolvimento da Página de ArtigosJefferson Sena
#93Sprint 08 - Documentação de Instalações de Plugins no Site de Homologação da UnBJoselito Prado
#94Sprint 08 - Feat: Desenvolvimento de Elementos da Página de ArtigosTiago Albuquerque
#97Sprint 08 - Feat: Desenvolvimento da Página de Dossiê da 30º EdiçãoJosé André
#98Sprint 08 - Documentação da Evolução do Protótipo e Implementação do site de HomolagaçãoGabriel Morais
#100Sprint 08 - Mudança de estrutura textual no Banner Inicial da HomeLuis Filipe
#101Sprint 08 - Feat: Criação de Artigos referentes à Edição 30Joselito Prado
#102Sprint 08 - Feat: Implementação da página de artigo da edição 30Tiago Albuquerque
+

4. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
03/06/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint08/resultados/index.html b/sprints/sprint08/resultados/index.html new file mode 100644 index 0000000..1f85163 --- /dev/null +++ b/sprints/sprint08/resultados/index.html @@ -0,0 +1,2785 @@ + + + + + + + + + + + + + + + + + + + + + + + Resultados - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

1. O que foi feito

+

Na sprint 08, realizamos uma dinâmica eficiente de desenvolvimento e documentação, de modo que facilite a manutenção da plataforma posteriormente pela STI, o que foi requisitado pela cliente.
+Implementamos páginas que foram prototipadas pela equipe de design além de aprimorar elementos que já haviam sido desenvolvidos em sprints passadas.

+

+

2. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloStatus
#92Sprint 08 - Feat: Desenvolvimento da Página de ArtigosConcluído
#93Sprint 08 - Documentação de Instalações de Plugins no Site de Homologação da UnBConcluído
#94Sprint 08 - Feat: Desenvolvimento de Elementos da Página de ArtigosConcluído
#97Sprint 08 - Feat: Desenvolvimento da Página de Dossiê da 30º EdiçãoConcluído
#98Sprint 08 - Documentação da Evolução do Protótipo e Implementação do site de HomolagaçãoConcluído
#100Sprint 08 - Mudança de estrutura textual no Banner Inicial da HomeConcluído
#101Sprint 08 - Feat: Criação de Artigos referentes à Edição 30Concluído
#102Sprint 08 - Feat: Implementação da página de artigo da edição 30Concluído
+

3. Reuniões

+

Nessa Sprint 08 tivemos cinco reuniões. Três internas e duas externas.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataTemaAta
03/06/2024Sprint Planning
06/06/2024Reunião com a Equipe da SECOMClique Aqui
13/06/2024Reunião com a Equipe da SECOMClique Aqui
17/06/2024Sprint Review
17/06/2024Sprint Retrospective
+

4. Avaliação do Scrum Master

+

No decorrer desta sprint, o time realizou o que foi planejado internamente e colaborou ativamente com o projeto.

+

5. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
17/06/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint09/planejamento/index.html b/sprints/sprint09/planejamento/index.html new file mode 100644 index 0000000..cb7699d --- /dev/null +++ b/sprints/sprint09/planejamento/index.html @@ -0,0 +1,2703 @@ + + + + + + + + + + + + + + + + + + + + + + + Planejamento - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + +

Planejamento

+ +

1. O planejado

+

O planejado para a Sprint 9 consiste na continuação do desenvolvimento das páginas que forem prototipadas e validadas pela SECOM, além de prosseguir com a documentação dessas etapas.
+Além disso, desenvolveremos um fluxograma de navegabilidade pela perpespectiva do usuário para que possamos visualizar de modo mais abrangente a jornada do usuário. +Por fim, seguiremos evoluindo elementos comuns às páginas para alcançar o protótipo de forma mais fídedigna.

+

2. Duração da Sprint

+

Início: 17/06/2024

+

Fim: 01/07/2024

+

Duração: 14 dias

+

3. Issues (Ainda sendo criadas ao decorrer da sprint)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloResponsáveis
#103Sprint 09 - Criar um Fluxograma de Navegabilidade do Site pela Perspectiva do UsuárioJosé André
#105Sprint 09 - Feat: Criação da página de leitura de ediçãoTiago Albuquerque
#106Sprint 09 - Feat: Responsividade para celular e tablet da HomeLuis Filipe
#107Sprint 09 - Feat: Criação Página Todas Edições e alteração para responsividadeLuis Filipe
#108Sprint 09 - Implementação de Ícones no Menu InstitucionalJosé André
#109Sprint 09 - Ajuste de ícones e funcionalidades em todas as páginasJefferson Sena
#110Sprint 09 - Feat: Criação de Artigos Referentes à Edição 30Gabriel Morais
#115Sprint 09 - Implementação e ajustes de posts da edição 30 e suas responsividadesJoselito Prado
+

4. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
17/06/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/sprints/sprint09/resultados/index.html b/sprints/sprint09/resultados/index.html new file mode 100644 index 0000000..630fcc2 --- /dev/null +++ b/sprints/sprint09/resultados/index.html @@ -0,0 +1,2781 @@ + + + + + + + + + + + + + + + + + + + + + + + Resultados - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

1. O que foi feito

+

Na sprint 09, continuamos o desenvolvimento das páginas prototipadadas pela equipe de design da SECOM. Além disso, ajustamos débitos deixados na sprint anterior, como alguns elementos mal formatados e questões de iconografia governamental.
+Também produzimos um fluxograma de navegabilidade da atual plataforma para entendermos de forma visual de que forma nossas alterações estão sendo refletidas de acordo com a perspectiva do usuário.
+Além disso, focamos em responsividade para dispositivos mobile.

+

+

2. Issues

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IssueTítuloStatus
#103Sprint 09 - Criar um Fluxograma de Navegabilidade do Site pela Perspectiva do UsuárioConcluído
#105Sprint 09 - Feat: Criação da página de leitura de ediçãoConcluído
#106Sprint 09 - Feat: Responsividade para celular e tablet da HomeConcluído
#107Sprint 09 - Feat: Criação Página Todas Edições e alteração para responsividadeConcluído
#108Sprint 09 - Implementação de Ícones no Menu InstitucionalConcluído
#109Sprint 09 - Ajuste de ícones e funcionalidades em todas as páginasConcluído
#110Sprint 09 - Feat: Criação de Artigos Referentes à Edição 30Concluído
#115Sprint 09 - Implementação e ajustes de posts da edição 30 e suas responsividadesConcluído
+

3. Reuniões

+

Nessa Sprint 09 tivemos quatro reuniões. Três internas e uma externa.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataTemaAta
17/06/2024Sprint Planning
27/06/2024Reunião com a Equipe da SECOMClique Aqui
01/07/2024Sprint Review
01/07/2024Sprint Retrospective
+

4. Avaliação do Scrum Master

+

No decorrer desta sprint, o time realizou o que foi planejado internamente e colaborou ativamente com o projeto.

+

5. Histórico de Versões

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
01/07/20240.1Abertura do documentoJosé André
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/workshop/comandos/index.html b/workshop/comandos/index.html new file mode 100644 index 0000000..73c17f7 --- /dev/null +++ b/workshop/comandos/index.html @@ -0,0 +1,2635 @@ + + + + + + + + + + + + + + + + + + + + + Workshop Prático - Implementando o Tema GovBR - Revista Darcy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + +

O que é o WordPress e como ele opera?

+

O WordPress é um sistema de gerenciamento de conteúdo (CMS - Content Management System) amplamente utilizado para criar e gerenciar sites e blogs. Ele é baseado em PHP e usa um banco de dados MySQL para armazenar conteúdo. O WordPress é conhecido por sua flexibilidade, facilidade de uso e uma grande comunidade de desenvolvedores e usuários que contribuem com plugins e temas.

+

O que é o tema GovBR?

+

Uma solução open-source desenvolvida pela IBICT (Instituto Brasileiro de Informação em Ciência e Tecnologia) que visa facilitar a padronização da identidade visual do modelo Gov.BR para sites governamentais desenvolvidos em WordPress. O tema usa das tecnologias mais modernas do WordPress, incluindo os padrões de bloco do editor de páginas, além de oferecer integrações com alguns plugins comumente utilizados.

+

Linguagens utilizadas: PHP, JavaScript, React, SCSS

+

Por que ele foi criado?

+

Motivo 1: Design System

+

Aplicações de governo precisam estar corretamente adequadas ao Design System do Portal Gov.BR, com padrões de interface que devem ser seguidos por designers e desenvolvedores para garantir a experiência única na interação com os sistemas interativos da Administração Pública Federal.

+

Motivo 2: Preço e Acessibilidade

+

O Gov.BR utiliza o sistema de gestão de conteúdo Plone. No entanto, diversos sites governamentais utilizam o WordPress, um dos gerenciadores de conteúdo mais populares do mundo. Nesse sentido, alguns órgãos passam por desafios para adaptar seus sites e portais. O tema desenvolvido é uma alternativa para instituições que não podem usar o Plone.

+

Alguns órgãos governamentais, como a UnB, utilizam o Joomla como CMS padrão, no entanto, a dificuldade de manutenção e falta de intuitividade da plataforma fez surgir uma demanda de migração dos sites da Universidade para o WordPress. Ou seja, a necessidade de migração para o WordPress não é apenas da Revista Darcy, mas sim de todos os sites do domínio da Universidade de Brasília.

+

Unindo o útil ao agradável

+

Dessa forma, sabendo a necessidade da migração dos sites governamentais para um CMS acessível e intuitivo como o WordPress, o IBICT criou o tema GovBR. Imagine a complexidade que seria se a cada novo site governamental, houvesse a necessidade de programadores para desenvolverem todo o front-end de acordo com o Design System do Governo Brasileiro. Por isso, instanciar o tema já produzido e evolui-lo de acordo com sua necessidade é o melhor caminho e também o mais rápido.

+

Hoje ensinaremos como você poderá iniciar o desenvolvimento de um site governamental localmente com o tema GovBR. Você aprenderá a instalar o WordPress, configurar o MySQL, iniciar um servidor local e conectar o tema GovBR a ele.

+

Instalação no Ubuntu

+

Passo 1: Instalação do XAMPP

+

O XAMPP é uma distribuição de software gratuita e de código aberto que facilita a instalação de um servidor web local. Ele é especialmente útil para desenvolvedores que precisam de um ambiente de desenvolvimento para testar e desenvolver websites e aplicações web localmente antes de colocá-las em produção. O XAMPP é uma distribuição Apache contendo MySQL, PHP, and Perl

+

https://www.apachefriends.org/download.html

+
    +
  1. Clicar em XAMPP for Linux - 8.0.30 / PHP 8.0.30 - Download (64 bits)
  2. +
  3. Abra os downloads do navegador e clique em “Mostrar na Pasta”
  4. +
  5. Clique com o botão direito no arquivo instalador do XAMPP e clique em “Propriedades” e após em “Permissões”.
  6. +
  7. Aperte em “Permitir execução do arquivo como um programa” e feche a tela.
  8. +
  9. Abra a pasta de downloads no terminal do Ubuntu. (Clicar no vazio com o botão direito e clicar em “Abrir no Terminal”)
  10. +
  11. +

    Mude as permissões do instalador:

    +

    bash +chmod 755 xampp-linux-*-installer.run

    +
  12. +
  13. +

    Rode o instalador:

    +

    bash +sudo ./xampp-linux-*-installer.run

    +
  14. +
  15. +

    Após, irá abrir a tela de instalação. Conclua a instalação apertando em “avançar”.

    +
      +
    • +

      (Se em algum momento alguém fechar o launcher do XAMPP, rode:

      +

      bash +sudo /opt/lampp/manager-linux-x64.run

      +
    • +
    • +

      Lembrando que o Apache roda na porta 80, se alguém tiver problema na hora de inicializar, pode ser que tenha algum serviço rodando na porta 80, terá que derrubá-lo.

      +
    • +
    +
  16. +
+

Passo 2: Configuração do XAMPP

+
    +
  1. Com o Launcher do XAMPP aberto, clique em “Manage Servers”.
  2. +
  3. Dê start nos servidores MySQL Database e Apache Web Server. O status dos dois deve estar como “Running”. O servidor ProFTPD pode estar desligado.
  4. +
  5. Verifique se o servidor Apache já está disponível em http://localhost/.
  6. +
+

Passo 3: Criação do Banco de Dados

+
    +
  1. No servidor local, disponível em http://localhost/, clique em “phpMyAdmin”, no canto superior direito da tela.
  2. +
  3. Crie um banco de dados novo, clicando em “Novo”, no canto superior esquerdo da tela.
  4. +
  5. Crie um nome pro seu banco de dados, não pode conter números e nem caracteres especiais, e tem que ser tudo minúsculo. Por exemplo: govbr. Agora clique em criar.
  6. +
  7. Pronto, agora o banco de dados está criado. Só falta uma coisa pro WordPress funcionar: os arquivos do WordPress.
  8. +
+

Passo 4: Instalando o WordPress

+
    +
  1. Acesse https://br.wordpress.org/download/ e clique em “Download WordPress 6.5.5”.
  2. +
  3. Isso baixará um zip, que você deverá manualmente mover para a pasta do XAMPP.
  4. +
  5. +

    Rode:

    +

    bash +sudo mv ~/Downloads/wordpress-6.5.5-pt_BR.zip /opt/lampp/htdocs/

    +
  6. +
  7. +

    Extraia o zip com o comando:

    +

    bash +sudo unzip /opt/lampp/htdocs/wordpress-6.5.5-pt_BR.zip -d /opt/lampp/htdocs/

    +
  8. +
  9. +

    Agora temos os arquivos do WordPress no local correto, dentro de htdocs. Também temos o banco de dados criado, no entanto, essas duas coisas ainda não se conhecem.

    +
  10. +
+

Passo 5: Configurando o LocalHost

+
    +
  1. Acesse http://localhost/wordpress/.
  2. +
  3. Estamos na tela de configuração do WordPress, clique em “Vamos lá”.
  4. +
  5. Em “Nome do banco de dados” insira o nome colocado no Passo 3, que no exemplo foi “govbr”.
  6. +
  7. Em “Usuário” escreva “root”.
  8. +
  9. Em “Senha” deixe vazio.
  10. +
  11. Servidor e prefixo deixe como está e clique em enviar.
  12. +
  13. +

    Se aparecer um erro de permissão que diz “Não foi possível gravar dados no arquivo wp-config.php”, siga os passos abaixo:

    +
      +
    1. Volte pra tela anterior do WordPress.
    2. +
    3. +

      Abra o terminal e rode:

      +

      bash +sudo chmod -R 777 /opt/lampp/htdocs/wordpress

      +
    4. +
    5. +

      Volte até a tela do WordPress no localhost e tente enviar novamente.

      +
    6. +
    7. Agora, provavelmente, abriu outra tela de sucesso. Clique em “instalar”.
    8. +
    9. Coloque o título do site, como por exemplo “Teste Gov BR”.
    10. +
    11. Crie um nome de usuário, uma senha e insira seu email.
    12. +
    13. Clique em “Instalar o WordPress”.
    14. +
    15. Agora, você deve estar em uma tela de Sucesso. Clique em “Acessar”.
    16. +
    +
  14. +
+

Passo 6: Download e Ativação do Tema GovBR

+
    +
  1. Acesse o repositório do tema no GitHub: https://github.com/IBICT/wp-govbr-tema.
  2. +
  3. Clique em “Releases” no lado direito da tela.
  4. +
  5. Baixe o arquivo govbr.zip.
  6. +
  7. +

    Abra o terminal e rode:

    +

    bash +sudo mv ~/Downloads/govbr.zip /opt/lampp/htdocs/wordpress/wp-content/themes/

    +
  8. +
  9. +

    Navegue até a página de temas:

    +

    bash +cd /opt/lampp/htdocs/wordpress/wp-content/themes/

    +
  10. +
  11. +

    Descompacte o tema que está zipado:

    +

    bash +sudo unzip govbr.zip

    +
  12. +
  13. +

    Volte ao seu site no WordPress e atualize a página de temas. O tema GovBR já deve aparecer disponível pra ser utilizado.

    +
  14. +
  15. Clique em “ativar” o tema.
  16. +
+

Considerações Finais

+

Agora o WordPress está instalado, configurado e pronto para uso com o tema GovBR. A partir desse ponto, o desenvolvedor tem a possibilidade de editar o tema apenas no WordPress, abstraindo a complexidade da codificação de cada feature. Mas, caso haja a necessidade, ele poderá alterar o código apenas editando o já existente no arquivo do tema, com qualquer IDE ou Editor de Texto, como o VSCode, e poderá acompanhar as alterações em tempo de execução, uma vez que estiver com o servidor local do WordPress rodando.

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file