From 75321cb769f26e6a30f9db90d01ea54993b9c7ec Mon Sep 17 00:00:00 2001 From: BluemediaGER Date: Fri, 4 Jun 2021 21:38:26 +0200 Subject: [PATCH 1/5] Make HLS playlist and fragment lengh changeable --- Dockerfile | 2 ++ README.md | 2 ++ config/nginx-ssl.conf.skel | 4 ++-- config/nginx.conf.skel | 4 ++-- entrypoint | 2 ++ 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 21de4e2..2f94d17 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,6 +7,8 @@ LABEL maintainer="oliver@traber-info.de" ENV DEBIAN_FRONTEND noninteractive ENV RTMP_PORT 1935 ENV HTTP_PORT 8080 +ENV HLS_FRAGMENT_LENGTH 3 +ENV HLS_PLAYLIST_LENGTH 20 # Update and install packages RUN apt update -y && \ diff --git a/README.md b/README.md index c9619b4..6c19902 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,8 @@ If you want to make the web player and the HLS files available via HTTPS, you ca - `TLS_CERT` - File name of the TLS certificate file in the /cert directory inside the container. If set, encrypted ingest will be enabled on the RTMP port. - `TLS_KEY` - File name of the private key that belongs to the TLS certificate. - `STREAM_KEY` - Stream key, which is needed to ingest stream data. If the variable is not set, the key is randomly generated at container startup. +- `HLS_FRAGMENT_LENGTH` - Length of one HLS fragment in seconds. Defaults to `3`. +- `HLS_PLAYLIST_LENGTH` - Length of the HLS playlist in seconds. Defaults to `20`. ## Built with - [NGINX](https://www.nginx.com/) High Performance Load Balancer, Web Server, & Reverse Proxy diff --git a/config/nginx-ssl.conf.skel b/config/nginx-ssl.conf.skel index d78aba1..34a1c86 100644 --- a/config/nginx-ssl.conf.skel +++ b/config/nginx-ssl.conf.skel @@ -73,8 +73,8 @@ rtmp { # Turn on HLS hls on; hls_path /var/www/html/hls/; - hls_fragment 3; - hls_playlist_length 20; + hls_fragment {HLS_FRAGMENT_LENGTH}; + hls_playlist_length {HLS_PLAYLIST_LENGTH}; } } } diff --git a/config/nginx.conf.skel b/config/nginx.conf.skel index de7cb88..359dcbe 100644 --- a/config/nginx.conf.skel +++ b/config/nginx.conf.skel @@ -60,8 +60,8 @@ rtmp { # Turn on HLS hls on; hls_path /var/www/html/hls/; - hls_fragment 3; - hls_playlist_length 20; + hls_fragment {HLS_FRAGMENT_LENGTH}; + hls_playlist_length {HLS_PLAYLIST_LENGTH}; } } } diff --git a/entrypoint b/entrypoint index 121765a..7500433 100644 --- a/entrypoint +++ b/entrypoint @@ -26,6 +26,8 @@ if [ ! -f /setup.lock ]; then sed -i "s/{RTMP_PORT}/$RTMP_PORT/g" /etc/nginx/nginx.conf sed -i "s/{STREAM_KEY}/$VALID_STREAM_KEY/g" /etc/nginx/nginx.conf sed -i "s/{HTTP_PORT}/$HTTP_PORT/g" /etc/nginx/nginx.conf + sed -i "s/{HLS_FRAGMENT_LENGTH}/$HLS_FRAGMENT_LENGTH/g" /etc/nginx/nginx.conf + sed -i "s/{HLS_PLAYLIST_LENGTH}/$HLS_PLAYLIST_LENGTH/g" /etc/nginx/nginx.conf # Touch setup lock touch /setup.lock From 80202deb89b24ae2cf9e84cc06620e1e867da511 Mon Sep 17 00:00:00 2001 From: BluemediaGER Date: Fri, 30 Jul 2021 22:58:51 +0200 Subject: [PATCH 2/5] Move HLS file path to tempfs --- config/nginx-ssl.conf.skel | 16 +++++++++++----- config/nginx.conf.skel | 16 +++++++++++----- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/config/nginx-ssl.conf.skel b/config/nginx-ssl.conf.skel index 34a1c86..aad2997 100644 --- a/config/nginx-ssl.conf.skel +++ b/config/nginx-ssl.conf.skel @@ -72,7 +72,8 @@ rtmp { # Turn on HLS hls on; - hls_path /var/www/html/hls/; + hls_path /tmp/hls; + hls_fragment_naming system; hls_fragment {HLS_FRAGMENT_LENGTH}; hls_playlist_length {HLS_PLAYLIST_LENGTH}; } @@ -108,12 +109,17 @@ http { return 404; } - # Disable cache - add_header 'Cache-Control' 'no-cache'; + # Serve HLS files from tempfs + location /hls { + root /tmp; + # Don't let browsers cache HLS files + add_header Cache-Control no-cache; + } - root /var/www/html/; - index index.html index.htm; + # Serve frontend location / { + root /var/www/html; + index index.html index.htm; try_files $uri $uri/ =404; } } diff --git a/config/nginx.conf.skel b/config/nginx.conf.skel index 359dcbe..7694a6a 100644 --- a/config/nginx.conf.skel +++ b/config/nginx.conf.skel @@ -59,7 +59,8 @@ rtmp { # Turn on HLS hls on; - hls_path /var/www/html/hls/; + hls_path /tmp/hls; + hls_fragment_naming system; hls_fragment {HLS_FRAGMENT_LENGTH}; hls_playlist_length {HLS_PLAYLIST_LENGTH}; } @@ -95,12 +96,17 @@ http { return 404; } - # Disable cache - add_header 'Cache-Control' 'no-cache'; + # Serve HLS files from tempfs + location /hls { + root /tmp; + # Don't let browsers cache HLS files + add_header Cache-Control no-cache; + } - root /var/www/html/; - index index.html index.htm; + # Serve frontend location / { + root /var/www/html; + index index.html index.htm; try_files $uri $uri/ =404; } } From 65e5982ea269b7db01d45f536deef6f3498bda1c Mon Sep 17 00:00:00 2001 From: BluemediaGER Date: Sat, 31 Jul 2021 00:44:42 +0200 Subject: [PATCH 3/5] Use vanilla Clappr instead of voc-player --- README.md | 2 +- frontend/assets/js/player.js | 1144 --------------------------- frontend/assets/{css => }/style.css | 0 frontend/index.html | 34 +- 4 files changed, 26 insertions(+), 1154 deletions(-) delete mode 100644 frontend/assets/js/player.js rename frontend/assets/{css => }/style.css (100%) diff --git a/README.md b/README.md index 6c19902..6dfd3f3 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ If you want to make the web player and the HLS files available via HTTPS, you ca ## Built with - [NGINX](https://www.nginx.com/) High Performance Load Balancer, Web Server, & Reverse Proxy - [nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module) NGINX-based Media Streaming Server -- [voc-player](https://github.com/voc/voc-player) HTML5 Stream Player for MPEG-DASH and HLS +- [Clappr](https://github.com/clappr/clappr) Extensible media player for the web ## Project structure / Directories - `config/` NGINX config files with various placeholders which will be replaced by the entrypoint script. diff --git a/frontend/assets/js/player.js b/frontend/assets/js/player.js deleted file mode 100644 index 2d34bdb..0000000 --- a/frontend/assets/js/player.js +++ /dev/null @@ -1,1144 +0,0 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.VOCPlayer=t():e.VOCPlayer=t()}(window,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=9)}([function(e,t,n){var r;window,r=function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="dist/",n(n.s="./src/main.js")}({"./node_modules/babel-runtime/core-js/array/from.js": -/*!**********************************************************!*\ - !*** ./node_modules/babel-runtime/core-js/array/from.js ***! - \**********************************************************/ -/*! no static exports found */function(e,t,n){e.exports={default:n(/*! core-js/library/fn/array/from */"./node_modules/core-js/library/fn/array/from.js"),__esModule:!0}},"./node_modules/babel-runtime/core-js/get-iterator.js": -/*!************************************************************!*\ - !*** ./node_modules/babel-runtime/core-js/get-iterator.js ***! - \************************************************************/ -/*! no static exports found */function(e,t,n){e.exports={default:n(/*! core-js/library/fn/get-iterator */"./node_modules/core-js/library/fn/get-iterator.js"),__esModule:!0}},"./node_modules/babel-runtime/core-js/json/stringify.js": -/*!**************************************************************!*\ - !*** ./node_modules/babel-runtime/core-js/json/stringify.js ***! - \**************************************************************/ -/*! no static exports found */function(e,t,n){e.exports={default:n(/*! core-js/library/fn/json/stringify */"./node_modules/core-js/library/fn/json/stringify.js"),__esModule:!0}},"./node_modules/babel-runtime/core-js/object/assign.js": -/*!*************************************************************!*\ - !*** ./node_modules/babel-runtime/core-js/object/assign.js ***! - \*************************************************************/ -/*! no static exports found */function(e,t,n){e.exports={default:n(/*! core-js/library/fn/object/assign */"./node_modules/core-js/library/fn/object/assign.js"),__esModule:!0}},"./node_modules/babel-runtime/core-js/object/create.js": -/*!*************************************************************!*\ - !*** ./node_modules/babel-runtime/core-js/object/create.js ***! - \*************************************************************/ -/*! no static exports found */function(e,t,n){e.exports={default:n(/*! core-js/library/fn/object/create */"./node_modules/core-js/library/fn/object/create.js"),__esModule:!0}},"./node_modules/babel-runtime/core-js/object/define-property.js": -/*!**********************************************************************!*\ - !*** ./node_modules/babel-runtime/core-js/object/define-property.js ***! - \**********************************************************************/ -/*! no static exports found */function(e,t,n){e.exports={default:n(/*! core-js/library/fn/object/define-property */"./node_modules/core-js/library/fn/object/define-property.js"),__esModule:!0}},"./node_modules/babel-runtime/core-js/object/get-own-property-descriptor.js": -/*!**********************************************************************************!*\ - !*** ./node_modules/babel-runtime/core-js/object/get-own-property-descriptor.js ***! - \**********************************************************************************/ -/*! no static exports found */function(e,t,n){e.exports={default:n(/*! core-js/library/fn/object/get-own-property-descriptor */"./node_modules/core-js/library/fn/object/get-own-property-descriptor.js"),__esModule:!0}},"./node_modules/babel-runtime/core-js/object/keys.js": -/*!***********************************************************!*\ - !*** ./node_modules/babel-runtime/core-js/object/keys.js ***! - \***********************************************************/ -/*! no static exports found */function(e,t,n){e.exports={default:n(/*! core-js/library/fn/object/keys */"./node_modules/core-js/library/fn/object/keys.js"),__esModule:!0}},"./node_modules/babel-runtime/core-js/object/set-prototype-of.js": -/*!***********************************************************************!*\ - !*** ./node_modules/babel-runtime/core-js/object/set-prototype-of.js ***! - \***********************************************************************/ -/*! no static exports found */function(e,t,n){e.exports={default:n(/*! core-js/library/fn/object/set-prototype-of */"./node_modules/core-js/library/fn/object/set-prototype-of.js"),__esModule:!0}},"./node_modules/babel-runtime/core-js/symbol.js": -/*!******************************************************!*\ - !*** ./node_modules/babel-runtime/core-js/symbol.js ***! - \******************************************************/ -/*! no static exports found */function(e,t,n){e.exports={default:n(/*! core-js/library/fn/symbol */"./node_modules/core-js/library/fn/symbol/index.js"),__esModule:!0}},"./node_modules/babel-runtime/core-js/symbol/iterator.js": -/*!***************************************************************!*\ - !*** ./node_modules/babel-runtime/core-js/symbol/iterator.js ***! - \***************************************************************/ -/*! no static exports found */function(e,t,n){e.exports={default:n(/*! core-js/library/fn/symbol/iterator */"./node_modules/core-js/library/fn/symbol/iterator.js"),__esModule:!0}},"./node_modules/babel-runtime/helpers/classCallCheck.js": -/*!**************************************************************!*\ - !*** ./node_modules/babel-runtime/helpers/classCallCheck.js ***! - \**************************************************************/ -/*! no static exports found */function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},"./node_modules/babel-runtime/helpers/createClass.js": -/*!***********************************************************!*\ - !*** ./node_modules/babel-runtime/helpers/createClass.js ***! - \***********************************************************/ -/*! no static exports found */function(e,t,n){"use strict";t.__esModule=!0;var r,i=n(/*! ../core-js/object/define-property */"./node_modules/babel-runtime/core-js/object/define-property.js"),a=(r=i)&&r.__esModule?r:{default:r};t.default=function(){function e(e,t){for(var n=0;n]*>/,p=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,m=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,g=/^(?:body|html)$/i,y=/([A-Z])/g,v=["val","css","html","text","data","width","height","offset"],b=u.createElement("table"),_=u.createElement("tr"),A={tr:u.createElement("tbody"),tbody:b,thead:b,tfoot:b,td:_,th:_,"*":u.createElement("div")},E=/complete|loaded|interactive/,T=/^[\w-]*$/,w={},S=w.toString,k={},C=u.createElement("div"),x={tabindex:"tabIndex",readonly:"readOnly",for:"htmlFor",class:"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},R=Array.isArray||function(e){return e instanceof Array};function L(e){return null==e?String(e):w[S.call(e)]||"object"}function I(e){return"function"==L(e)}function P(e){return null!=e&&e==e.window}function j(e){return null!=e&&e.nodeType==e.DOCUMENT_NODE}function O(e){return"object"==L(e)}function D(e){return O(e)&&!P(e)&&Object.getPrototypeOf(e)==Object.prototype}function M(e){var n=!!e&&"length"in e&&e.length,r=t.type(e);return"function"!=r&&!P(e)&&("array"==r||0===n||"number"==typeof n&&n>0&&n-1 in e)}function N(e){return e.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function U(e){return e in d?d[e]:d[e]=new RegExp("(^|\\s)"+e+"(\\s|$)")}function F(e,t){return"number"!=typeof t||f[N(e)]?t:t+"px"}function B(e){return"children"in e?l.call(e.children):t.map(e.childNodes,(function(e){if(1==e.nodeType)return e}))}function K(e,t){var n,r=e?e.length:0;for(n=0;n")),void 0===n&&(n=h.test(e)&&RegExp.$1),n in A||(n="*"),(o=A[n]).innerHTML=""+e,i=t.each(l.call(o.childNodes),(function(){o.removeChild(this)}))),D(r)&&(a=t(i),t.each(r,(function(e,t){v.indexOf(e)>-1?a[e](t):a.attr(e,t)}))),i},k.Z=function(e,t){return new K(e,t)},k.isZ=function(e){return e instanceof k.Z},k.init=function(e,n){var r,i;if(!e)return k.Z();if("string"==typeof e)if("<"==(e=e.trim())[0]&&h.test(e))r=k.fragment(e,RegExp.$1,n),e=null;else{if(void 0!==n)return t(n).find(e);r=k.qsa(u,e)}else{if(I(e))return t(u).ready(e);if(k.isZ(e))return e;if(R(e))i=e,r=s.call(i,(function(e){return null!=e}));else if(O(e))r=[e],e=null;else if(h.test(e))r=k.fragment(e.trim(),RegExp.$1,n),e=null;else{if(void 0!==n)return t(n).find(e);r=k.qsa(u,e)}}return k.Z(r,e)},(t=function(e,t){return k.init(e,t)}).extend=function(e){var t,n=l.call(arguments,1);return"boolean"==typeof e&&(t=e,e=n.shift()),n.forEach((function(n){V(e,n,t)})),e},k.qsa=function(e,t){var n,r="#"==t[0],i=!r&&"."==t[0],a=r||i?t.slice(1):t,o=T.test(a);return e.getElementById&&o&&r?(n=e.getElementById(a))?[n]:[]:1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType?[]:l.call(o&&!r&&e.getElementsByClassName?i?e.getElementsByClassName(a):e.getElementsByTagName(t):e.querySelectorAll(t))},t.contains=u.documentElement.contains?function(e,t){return e!==t&&e.contains(t)}:function(e,t){for(;t&&(t=t.parentNode);)if(t===e)return!0;return!1},t.type=L,t.isFunction=I,t.isWindow=P,t.isArray=R,t.isPlainObject=D,t.isEmptyObject=function(e){var t;for(t in e)return!1;return!0},t.isNumeric=function(e){var t=Number(e),n=typeof e;return null!=e&&"boolean"!=n&&("string"!=n||e.length)&&!isNaN(t)&&isFinite(t)||!1},t.inArray=function(e,t,n){return a.indexOf.call(t,e,n)},t.camelCase=r,t.trim=function(e){return null==e?"":String.prototype.trim.call(e)},t.uuid=0,t.support={},t.expr={},t.noop=function(){},t.map=function(e,n){var r,i,a,o,s=[];if(M(e))for(i=0;i0?t.fn.concat.apply([],o):o},t.each=function(e,t){var n,r;if(M(e)){for(n=0;n=0?e:e+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each((function(){null!=this.parentNode&&this.parentNode.removeChild(this)}))},each:function(e){return a.every.call(this,(function(t,n){return!1!==e.call(t,n,t)})),this},filter:function(e){return I(e)?this.not(this.not(e)):t(s.call(this,(function(t){return k.matches(t,e)})))},add:function(e,n){return t(i(this.concat(t(e,n))))},is:function(e){return this.length>0&&k.matches(this[0],e)},not:function(e){var n=[];if(I(e)&&void 0!==e.call)this.each((function(t){e.call(this,t)||n.push(this)}));else{var r="string"==typeof e?this.filter(e):M(e)&&I(e.item)?l.call(e):t(e);this.forEach((function(e){r.indexOf(e)<0&&n.push(e)}))}return t(n)},has:function(e){return this.filter((function(){return O(e)?t.contains(this,e):t(this).find(e).size()}))},eq:function(e){return-1===e?this.slice(e):this.slice(e,+e+1)},first:function(){var e=this[0];return e&&!O(e)?e:t(e)},last:function(){var e=this[this.length-1];return e&&!O(e)?e:t(e)},find:function(e){var n=this;return e?"object"==typeof e?t(e).filter((function(){var e=this;return a.some.call(n,(function(n){return t.contains(n,e)}))})):1==this.length?t(k.qsa(this[0],e)):this.map((function(){return k.qsa(this,e)})):t()},closest:function(e,n){var r=[],i="object"==typeof e&&t(e);return this.each((function(t,a){for(;a&&!(i?i.indexOf(a)>=0:k.matches(a,e));)a=a!==n&&!j(a)&&a.parentNode;a&&r.indexOf(a)<0&&r.push(a)})),t(r)},parents:function(e){for(var n=[],r=this;r.length>0;)r=t.map(r,(function(e){if((e=e.parentNode)&&!j(e)&&n.indexOf(e)<0)return n.push(e),e}));return G(n,e)},parent:function(e){return G(i(this.pluck("parentNode")),e)},children:function(e){return G(this.map((function(){return B(this)})),e)},contents:function(){return this.map((function(){return this.contentDocument||l.call(this.childNodes)}))},siblings:function(e){return G(this.map((function(e,t){return s.call(B(t.parentNode),(function(e){return e!==t}))})),e)},empty:function(){return this.each((function(){this.innerHTML=""}))},pluck:function(e){return t.map(this,(function(t){return t[e]}))},show:function(){return this.each((function(){var e,t,n;"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=(e=this.nodeName,c[e]||(t=u.createElement(e),u.body.appendChild(t),n=getComputedStyle(t,"").getPropertyValue("display"),t.parentNode.removeChild(t),"none"==n&&(n="block"),c[e]=n),c[e]))}))},replaceWith:function(e){return this.before(e).remove()},wrap:function(e){var n=I(e);if(this[0]&&!n)var r=t(e).get(0),i=r.parentNode||this.length>1;return this.each((function(a){t(this).wrapAll(n?e.call(this,a):i?r.cloneNode(!0):r)}))},wrapAll:function(e){if(this[0]){var n;for(t(this[0]).before(e=t(e));(n=e.children()).length;)e=n.first();t(e).append(this)}return this},wrapInner:function(e){var n=I(e);return this.each((function(r){var i=t(this),a=i.contents(),o=n?e.call(this,r):e;a.length?a.wrapAll(o):i.append(o)}))},unwrap:function(){return this.parent().each((function(){t(this).replaceWith(t(this).children())})),this},clone:function(){return this.map((function(){return this.cloneNode(!0)}))},hide:function(){return this.css("display","none")},toggle:function(e){return this.each((function(){var n=t(this);(void 0===e?"none"==n.css("display"):e)?n.show():n.hide()}))},prev:function(e){return t(this.pluck("previousElementSibling")).filter(e||"*")},next:function(e){return t(this.pluck("nextElementSibling")).filter(e||"*")},html:function(e){return 0 in arguments?this.each((function(n){var r=this.innerHTML;t(this).empty().append(H(this,e,n,r))})):0 in this?this[0].innerHTML:null},text:function(e){return 0 in arguments?this.each((function(t){var n=H(this,e,t,this.textContent);this.textContent=null==n?"":""+n})):0 in this?this.pluck("textContent").join(""):null},attr:function(t,n){var r;return"string"!=typeof t||1 in arguments?this.each((function(r){if(1===this.nodeType)if(O(t))for(e in t)Y(this,e,t[e]);else Y(this,t,H(this,n,r,this.getAttribute(t)))})):0 in this&&1==this[0].nodeType&&null!=(r=this[0].getAttribute(t))?r:void 0},removeAttr:function(e){return this.each((function(){1===this.nodeType&&e.split(" ").forEach((function(e){Y(this,e)}),this)}))},prop:function(e,t){return e=x[e]||e,1 in arguments?this.each((function(n){this[e]=H(this,t,n,this[e])})):this[0]&&this[0][e]},removeProp:function(e){return e=x[e]||e,this.each((function(){delete this[e]}))},data:function(e,t){var n="data-"+e.replace(y,"-$1").toLowerCase(),r=1 in arguments?this.attr(n,t):this.attr(n);return null!==r?W(r):void 0},val:function(e){return 0 in arguments?(null==e&&(e=""),this.each((function(t){this.value=H(this,e,t,this.value)}))):this[0]&&(this[0].multiple?t(this[0]).find("option").filter((function(){return this.selected})).pluck("value"):this[0].value)},offset:function(e){if(e)return this.each((function(n){var r=t(this),i=H(this,e,n,r.offset()),a=r.offsetParent().offset(),o={top:i.top-a.top,left:i.left-a.left};"static"==r.css("position")&&(o.position="relative"),r.css(o)}));if(!this.length)return null;if(u.documentElement!==this[0]&&!t.contains(u.documentElement,this[0]))return{top:0,left:0};var n=this[0].getBoundingClientRect();return{left:n.left+window.pageXOffset,top:n.top+window.pageYOffset,width:Math.round(n.width),height:Math.round(n.height)}},css:function(n,i){if(arguments.length<2){var a=this[0];if("string"==typeof n){if(!a)return;return a.style[r(n)]||getComputedStyle(a,"").getPropertyValue(n)}if(R(n)){if(!a)return;var o={},s=getComputedStyle(a,"");return t.each(n,(function(e,t){o[t]=a.style[r(t)]||s.getPropertyValue(t)})),o}}var l="";if("string"==L(n))i||0===i?l=N(n)+":"+F(n,i):this.each((function(){this.style.removeProperty(N(n))}));else for(e in n)n[e]||0===n[e]?l+=N(e)+":"+F(e,n[e])+";":this.each((function(){this.style.removeProperty(N(e))}));return this.each((function(){this.style.cssText+=";"+l}))},index:function(e){return e?this.indexOf(t(e)[0]):this.parent().children().indexOf(this[0])},hasClass:function(e){return!!e&&a.some.call(this,(function(e){return this.test(z(e))}),U(e))},addClass:function(e){return e?this.each((function(r){if("className"in this){n=[];var i=z(this);H(this,e,r,i).split(/\s+/g).forEach((function(e){t(this).hasClass(e)||n.push(e)}),this),n.length&&z(this,i+(i?" ":"")+n.join(" "))}})):this},removeClass:function(e){return this.each((function(t){if("className"in this){if(void 0===e)return z(this,"");n=z(this),H(this,e,t,n).split(/\s+/g).forEach((function(e){n=n.replace(U(e)," ")})),z(this,n.trim())}}))},toggleClass:function(e,n){return e?this.each((function(r){var i=t(this);H(this,e,r,z(this)).split(/\s+/g).forEach((function(e){(void 0===n?!i.hasClass(e):n)?i.addClass(e):i.removeClass(e)}))})):this},scrollTop:function(e){if(this.length){var t="scrollTop"in this[0];return void 0===e?t?this[0].scrollTop:this[0].pageYOffset:this.each(t?function(){this.scrollTop=e}:function(){this.scrollTo(this.scrollX,e)})}},scrollLeft:function(e){if(this.length){var t="scrollLeft"in this[0];return void 0===e?t?this[0].scrollLeft:this[0].pageXOffset:this.each(t?function(){this.scrollLeft=e}:function(){this.scrollTo(e,this.scrollY)})}},position:function(){if(this.length){var e=this[0],n=this.offsetParent(),r=this.offset(),i=g.test(n[0].nodeName)?{top:0,left:0}:n.offset();return r.top-=parseFloat(t(e).css("margin-top"))||0,r.left-=parseFloat(t(e).css("margin-left"))||0,i.top+=parseFloat(t(n[0]).css("border-top-width"))||0,i.left+=parseFloat(t(n[0]).css("border-left-width"))||0,{top:r.top-i.top,left:r.left-i.left}}},offsetParent:function(){return this.map((function(){for(var e=this.offsetParent||u.body;e&&!g.test(e.nodeName)&&"static"==t(e).css("position");)e=e.offsetParent;return e}))}},t.fn.detach=t.fn.remove,["width","height"].forEach((function(e){var n=e.replace(/./,(function(e){return e[0].toUpperCase()}));t.fn[e]=function(r){var i,a=this[0];return void 0===r?P(a)?a["inner"+n]:j(a)?a.documentElement["scroll"+n]:(i=this.offset())&&i[e]:this.each((function(n){(a=t(this)).css(e,H(this,r,n,a[e]()))}))}})),["after","prepend","before","append"].forEach((function(e,n){var r=n%2;t.fn[e]=function(){var e,i,a=t.map(arguments,(function(n){var r=[];return"array"==(e=L(n))?(n.forEach((function(e){return void 0!==e.nodeType?r.push(e):t.zepto.isZ(e)?r=r.concat(e.get()):void(r=r.concat(k.fragment(e)))})),r):"object"==e||null==n?n:k.fragment(n)})),o=this.length>1;return a.length<1?this:this.each((function(e,s){i=r?s:s.parentNode,s=0==n?s.nextSibling:1==n?s.firstChild:2==n?s:null;var l=t.contains(u.documentElement,i);a.forEach((function(e){if(o)e=e.cloneNode(!0);else if(!i)return t(e).remove();i.insertBefore(e,s),l&&$(e,(function(e){if(!(null==e.nodeName||"SCRIPT"!==e.nodeName.toUpperCase()||e.type&&"text/javascript"!==e.type||e.src)){var t=e.ownerDocument?e.ownerDocument.defaultView:window;t.eval.call(t,e.innerHTML)}}))}))}))},t.fn[r?e+"To":"insert"+(n?"Before":"After")]=function(n){return t(n)[e](this),this}})),k.Z.prototype=K.prototype=t.fn,k.uniq=i,k.deserializeValue=W,t.zepto=k,t}();window.Zepto=r,void 0===window.$&&(window.$=r),function(e){var t,n,r=+new Date,i=window.document,a=/)<[^<]*)*<\/script>/gi,o=/^(?:text|application)\/javascript/i,s=/^(?:text|application)\/xml/i,l=/^\s*$/,u=i.createElement("a");function c(t,n,r,a){if(t.global)return function(t,n,r){var i=e.Event(n);return e(t).trigger(i,r),!i.isDefaultPrevented()}(n||i,r,a)}function d(e,t){var n=t.context;if(!1===t.beforeSend.call(n,e,t)||!1===c(t,n,"ajaxBeforeSend",[e,t]))return!1;c(t,n,"ajaxSend",[e,t])}function f(e,t,n,r){var i=n.context;n.success.call(i,e,"success",t),r&&r.resolveWith(i,[e,"success",t]),c(n,i,"ajaxSuccess",[t,n,e]),p("success",t,n)}function h(e,t,n,r,i){var a=r.context;r.error.call(a,n,t,e),i&&i.rejectWith(a,[n,t,e]),c(r,a,"ajaxError",[n,r,e||t]),p(t,n,r)}function p(t,n,r){var i=r.context;r.complete.call(i,n,t),c(r,i,"ajaxComplete",[n,r]),function(t){t.global&&!--e.active&&c(t,null,"ajaxStop")}(r)}function m(){}function g(e,t){return""==t?e:(e+"&"+t).replace(/[&?]{1,2}/,"?")}function y(t,n,r,i){return e.isFunction(n)&&(i=r,r=n,n=void 0),e.isFunction(r)||(i=r,r=void 0),{url:t,data:n,success:r,dataType:i}}u.href=window.location.href,e.active=0,e.ajaxJSONP=function(t,n){if(!("type"in t))return e.ajax(t);var a,o,s=t.jsonpCallback,l=(e.isFunction(s)?s():s)||"Zepto"+r++,u=i.createElement("script"),c=window[l],p=function(t){e(u).triggerHandler("error",t||"abort")},m={abort:p};return n&&n.promise(m),e(u).on("load error",(function(r,i){clearTimeout(o),e(u).off().remove(),"error"!=r.type&&a?f(a[0],m,t,n):h(null,i||"error",m,t,n),window[l]=c,a&&e.isFunction(c)&&c(a[0]),c=a=void 0})),!1===d(m,t)?(p("abort"),m):(window[l]=function(){a=arguments},u.src=t.url.replace(/\?(.+)=\?/,"?$1="+l),i.head.appendChild(u),t.timeout>0&&(o=setTimeout((function(){p("timeout")}),t.timeout)),m)},e.ajaxSettings={type:"GET",beforeSend:m,success:m,error:m,complete:m,context:null,global:!0,xhr:function(){return new window.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:"application/json",xml:"application/xml, text/xml",html:"text/html",text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0,dataFilter:m},e.ajax=function(r){var a,p,y=e.extend({},r||{}),v=e.Deferred&&e.Deferred();for(t in e.ajaxSettings)void 0===y[t]&&(y[t]=e.ajaxSettings[t]);!function(t){t.global&&0==e.active++&&c(t,null,"ajaxStart")}(y),y.crossDomain||((a=i.createElement("a")).href=y.url,a.href=a.href,y.crossDomain=u.protocol+"//"+u.host!=a.protocol+"//"+a.host),y.url||(y.url=window.location.toString()),(p=y.url.indexOf("#"))>-1&&(y.url=y.url.slice(0,p)),function(t){t.processData&&t.data&&"string"!=e.type(t.data)&&(t.data=e.param(t.data,t.traditional)),!t.data||t.type&&"GET"!=t.type.toUpperCase()&&"jsonp"!=t.dataType||(t.url=g(t.url,t.data),t.data=void 0)}(y);var b=y.dataType,_=/\?.+=\?/.test(y.url);if(_&&(b="jsonp"),!1!==y.cache&&(r&&!0===r.cache||"script"!=b&&"jsonp"!=b)||(y.url=g(y.url,"_="+Date.now())),"jsonp"==b)return _||(y.url=g(y.url,y.jsonp?y.jsonp+"=?":!1===y.jsonp?"":"callback=?")),e.ajaxJSONP(y,v);var A,E=y.accepts[b],T={},w=function(e,t){T[e.toLowerCase()]=[e,t]},S=/^([\w-]+:)\/\//.test(y.url)?RegExp.$1:window.location.protocol,k=y.xhr(),C=k.setRequestHeader;if(v&&v.promise(k),y.crossDomain||w("X-Requested-With","XMLHttpRequest"),w("Accept",E||"*/*"),(E=y.mimeType||E)&&(E.indexOf(",")>-1&&(E=E.split(",",2)[0]),k.overrideMimeType&&k.overrideMimeType(E)),(y.contentType||!1!==y.contentType&&y.data&&"GET"!=y.type.toUpperCase())&&w("Content-Type",y.contentType||"application/x-www-form-urlencoded"),y.headers)for(n in y.headers)w(n,y.headers[n]);if(k.setRequestHeader=w,k.onreadystatechange=function(){if(4==k.readyState){k.onreadystatechange=m,clearTimeout(A);var t,n=!1;if(k.status>=200&&k.status<300||304==k.status||0==k.status&&"file:"==S){if(b=b||function(e){return e&&(e=e.split(";",2)[0]),e&&("text/html"==e?"html":"application/json"==e?"json":o.test(e)?"script":s.test(e)&&"xml")||"text"}(y.mimeType||k.getResponseHeader("content-type")),"arraybuffer"==k.responseType||"blob"==k.responseType)t=k.response;else{t=k.responseText;try{t=function(e,t,n){if(n.dataFilter==m)return e;var r=n.context;return n.dataFilter.call(r,e,t)}(t,b,y),"script"==b?(0,eval)(t):"xml"==b?t=k.responseXML:"json"==b&&(t=l.test(t)?null:e.parseJSON(t))}catch(e){n=e}if(n)return h(n,"parsererror",k,y,v)}f(t,k,y,v)}else h(k.statusText||null,k.status?"error":"abort",k,y,v)}},!1===d(k,y))return k.abort(),h(null,"abort",k,y,v),k;var x=!("async"in y)||y.async;if(k.open(y.type,y.url,x,y.username,y.password),y.xhrFields)for(n in y.xhrFields)k[n]=y.xhrFields[n];for(n in T)C.apply(k,T[n]);return y.timeout>0&&(A=setTimeout((function(){k.onreadystatechange=m,k.abort(),h(null,"timeout",k,y,v)}),y.timeout)),k.send(y.data?y.data:null),k},e.get=function(){return e.ajax(y.apply(null,arguments))},e.post=function(){var t=y.apply(null,arguments);return t.type="POST",e.ajax(t)},e.getJSON=function(){var t=y.apply(null,arguments);return t.dataType="json",e.ajax(t)},e.fn.load=function(t,n,r){if(!this.length)return this;var i,o=this,s=t.split(/\s/),l=y(t,n,r),u=l.success;return s.length>1&&(l.url=s[0],i=s[1]),l.success=function(t){o.html(i?e("
").html(t.replace(a,"")).find(i):t),u&&u.apply(o,arguments)},e.ajax(l),this};var v=encodeURIComponent;e.param=function(t,n){var r=[];return r.add=function(t,n){e.isFunction(n)&&(n=n()),null==n&&(n=""),this.push(v(t)+"="+v(n))},function t(n,r,i,a){var o,s=e.isArray(r),l=e.isPlainObject(r);e.each(r,(function(r,u){o=e.type(u),a&&(r=i?a:a+"["+(l||"object"==o||"array"==o?r:"")+"]"),!a&&s?n.add(u.name,u.value):"array"==o||!i&&"object"==o?t(n,u,i,r):n.add(r,u)}))}(r,t,n),r.join("&").replace(/%20/g,"+")}}(r),(n=r).Callbacks=function(e){e=n.extend({},e);var t,r,i,a,o,s,l=[],u=!e.once&&[],c=function(n){for(t=e.memory&&n,r=!0,s=a||0,a=0,o=l.length,i=!0;l&&s-1;)l.splice(r,1),i&&(r<=o&&--o,r<=s&&--s)})),this},has:function(e){return!(!l||!(e?n.inArray(e,l)>-1:l.length))},empty:function(){return o=l.length=0,this},disable:function(){return l=u=t=void 0,this},disabled:function(){return!l},lock:function(){return u=void 0,t||d.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||r&&!u||(t=[e,(t=t||[]).slice?t.slice():t],i?u.push(t):c(t)),this},fire:function(){return d.fireWith(this,arguments)},fired:function(){return!!r}};return d},function(e){var t=Array.prototype.slice;function n(t){var r=[["resolve","done",e.Callbacks({once:1,memory:1}),"resolved"],["reject","fail",e.Callbacks({once:1,memory:1}),"rejected"],["notify","progress",e.Callbacks({memory:1})]],i="pending",a={state:function(){return i},always:function(){return o.done(arguments).fail(arguments),this},then:function(){var t=arguments;return n((function(n){e.each(r,(function(r,i){var s=e.isFunction(t[r])&&t[r];o[i[1]]((function(){var t=s&&s.apply(this,arguments);if(t&&e.isFunction(t.promise))t.promise().done(n.resolve).fail(n.reject).progress(n.notify);else{var r=this===a?n.promise():this,o=s?[t]:arguments;n[i[0]+"With"](r,o)}}))})),t=null})).promise()},promise:function(t){return null!=t?e.extend(t,a):a}},o={};return e.each(r,(function(e,t){var n=t[2],s=t[3];a[t[1]]=n.add,s&&n.add((function(){i=s}),r[1^e][2].disable,r[2][2].lock),o[t[0]]=function(){return o[t[0]+"With"](this===o?a:this,arguments),this},o[t[0]+"With"]=n.fireWith})),a.promise(o),t&&t.call(o,o),o}e.when=function(r){var i,a,o,s=t.call(arguments),l=s.length,u=0,c=1!==l||r&&e.isFunction(r.promise)?l:0,d=1===c?r:n(),f=function(e,n,r){return function(a){n[e]=this,r[e]=arguments.length>1?t.call(arguments):a,r===i?d.notifyWith(n,r):--c||d.resolveWith(n,r)}};if(l>1)for(i=new Array(l),a=new Array(l),o=new Array(l);u-1)return this},has:function(e,n,r){if(t.qsa(this,r).length)return this}},o=new RegExp("(.*):(\\w+)(?:\\(([^)]+)\\))?$\\s*"),s=/^\s*>/,l="Zepto"+ +new Date;function u(e,t){e=e.replace(/=#\]/g,'="#"]');var n,r,i=o.exec(e);if(i&&i[2]in a&&(n=a[i[2]],r=i[3],e=i[1],r)){var s=Number(r);r=isNaN(s)?r.replace(/^["']|["']$/g,""):s}return t(e,n,r)}t.qsa=function(r,i){return u(i,(function(a,o,u){try{var c;!a&&o?a="*":s.test(a)&&(c=e(r).addClass(l),a="."+l+" "+a);var d=n(r,a)}catch(e){throw console.error("error performing selector: %o",i),e}finally{c&&c.removeClass(l)}return o?t.uniq(e.map(d,(function(e,t){return o.call(e,t,d,u)}))):d}))},t.matches=function(e,t){return u(t,(function(t,n,i){return(!t||r(e,t))&&(!n||n.call(e,null,i)===e)}))}}(r),e.exports=r},"./node_modules/core-js/library/fn/array/from.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js/library/fn/array/from.js ***! - \*******************************************************/ -/*! no static exports found */function(e,t,n){n(/*! ../../modules/es6.string.iterator */"./node_modules/core-js/library/modules/es6.string.iterator.js"),n(/*! ../../modules/es6.array.from */"./node_modules/core-js/library/modules/es6.array.from.js"),e.exports=n(/*! ../../modules/_core */"./node_modules/core-js/library/modules/_core.js").Array.from},"./node_modules/core-js/library/fn/get-iterator.js": -/*!*********************************************************!*\ - !*** ./node_modules/core-js/library/fn/get-iterator.js ***! - \*********************************************************/ -/*! no static exports found */function(e,t,n){n(/*! ../modules/web.dom.iterable */"./node_modules/core-js/library/modules/web.dom.iterable.js"),n(/*! ../modules/es6.string.iterator */"./node_modules/core-js/library/modules/es6.string.iterator.js"),e.exports=n(/*! ../modules/core.get-iterator */"./node_modules/core-js/library/modules/core.get-iterator.js")},"./node_modules/core-js/library/fn/json/stringify.js": -/*!***********************************************************!*\ - !*** ./node_modules/core-js/library/fn/json/stringify.js ***! - \***********************************************************/ -/*! no static exports found */function(e,t,n){var r=n(/*! ../../modules/_core */"./node_modules/core-js/library/modules/_core.js"),i=r.JSON||(r.JSON={stringify:JSON.stringify});e.exports=function(e){return i.stringify.apply(i,arguments)}},"./node_modules/core-js/library/fn/object/assign.js": -/*!**********************************************************!*\ - !*** ./node_modules/core-js/library/fn/object/assign.js ***! - \**********************************************************/ -/*! no static exports found */function(e,t,n){n(/*! ../../modules/es6.object.assign */"./node_modules/core-js/library/modules/es6.object.assign.js"),e.exports=n(/*! ../../modules/_core */"./node_modules/core-js/library/modules/_core.js").Object.assign},"./node_modules/core-js/library/fn/object/create.js": -/*!**********************************************************!*\ - !*** ./node_modules/core-js/library/fn/object/create.js ***! - \**********************************************************/ -/*! no static exports found */function(e,t,n){n(/*! ../../modules/es6.object.create */"./node_modules/core-js/library/modules/es6.object.create.js");var r=n(/*! ../../modules/_core */"./node_modules/core-js/library/modules/_core.js").Object;e.exports=function(e,t){return r.create(e,t)}},"./node_modules/core-js/library/fn/object/define-property.js": -/*!*******************************************************************!*\ - !*** ./node_modules/core-js/library/fn/object/define-property.js ***! - \*******************************************************************/ -/*! no static exports found */function(e,t,n){n(/*! ../../modules/es6.object.define-property */"./node_modules/core-js/library/modules/es6.object.define-property.js");var r=n(/*! ../../modules/_core */"./node_modules/core-js/library/modules/_core.js").Object;e.exports=function(e,t,n){return r.defineProperty(e,t,n)}},"./node_modules/core-js/library/fn/object/get-own-property-descriptor.js": -/*!*******************************************************************************!*\ - !*** ./node_modules/core-js/library/fn/object/get-own-property-descriptor.js ***! - \*******************************************************************************/ -/*! no static exports found */function(e,t,n){n(/*! ../../modules/es6.object.get-own-property-descriptor */"./node_modules/core-js/library/modules/es6.object.get-own-property-descriptor.js");var r=n(/*! ../../modules/_core */"./node_modules/core-js/library/modules/_core.js").Object;e.exports=function(e,t){return r.getOwnPropertyDescriptor(e,t)}},"./node_modules/core-js/library/fn/object/keys.js": -/*!********************************************************!*\ - !*** ./node_modules/core-js/library/fn/object/keys.js ***! - \********************************************************/ -/*! no static exports found */function(e,t,n){n(/*! ../../modules/es6.object.keys */"./node_modules/core-js/library/modules/es6.object.keys.js"),e.exports=n(/*! ../../modules/_core */"./node_modules/core-js/library/modules/_core.js").Object.keys},"./node_modules/core-js/library/fn/object/set-prototype-of.js": -/*!********************************************************************!*\ - !*** ./node_modules/core-js/library/fn/object/set-prototype-of.js ***! - \********************************************************************/ -/*! no static exports found */function(e,t,n){n(/*! ../../modules/es6.object.set-prototype-of */"./node_modules/core-js/library/modules/es6.object.set-prototype-of.js"),e.exports=n(/*! ../../modules/_core */"./node_modules/core-js/library/modules/_core.js").Object.setPrototypeOf},"./node_modules/core-js/library/fn/symbol/index.js": -/*!*********************************************************!*\ - !*** ./node_modules/core-js/library/fn/symbol/index.js ***! - \*********************************************************/ -/*! no static exports found */function(e,t,n){n(/*! ../../modules/es6.symbol */"./node_modules/core-js/library/modules/es6.symbol.js"),n(/*! ../../modules/es6.object.to-string */"./node_modules/core-js/library/modules/es6.object.to-string.js"),n(/*! ../../modules/es7.symbol.async-iterator */"./node_modules/core-js/library/modules/es7.symbol.async-iterator.js"),n(/*! ../../modules/es7.symbol.observable */"./node_modules/core-js/library/modules/es7.symbol.observable.js"),e.exports=n(/*! ../../modules/_core */"./node_modules/core-js/library/modules/_core.js").Symbol},"./node_modules/core-js/library/fn/symbol/iterator.js": -/*!************************************************************!*\ - !*** ./node_modules/core-js/library/fn/symbol/iterator.js ***! - \************************************************************/ -/*! no static exports found */function(e,t,n){n(/*! ../../modules/es6.string.iterator */"./node_modules/core-js/library/modules/es6.string.iterator.js"),n(/*! ../../modules/web.dom.iterable */"./node_modules/core-js/library/modules/web.dom.iterable.js"),e.exports=n(/*! ../../modules/_wks-ext */"./node_modules/core-js/library/modules/_wks-ext.js").f("iterator")},"./node_modules/core-js/library/modules/_a-function.js": -/*!*************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_a-function.js ***! - \*************************************************************/ -/*! no static exports found */function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},"./node_modules/core-js/library/modules/_add-to-unscopables.js": -/*!*********************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_add-to-unscopables.js ***! - \*********************************************************************/ -/*! no static exports found */function(e,t){e.exports=function(){}},"./node_modules/core-js/library/modules/_an-object.js": -/*!************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_an-object.js ***! - \************************************************************/ -/*! no static exports found */function(e,t,n){var r=n(/*! ./_is-object */"./node_modules/core-js/library/modules/_is-object.js");e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},"./node_modules/core-js/library/modules/_array-includes.js": -/*!*****************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_array-includes.js ***! - \*****************************************************************/ -/*! no static exports found */function(e,t,n){var r=n(/*! ./_to-iobject */"./node_modules/core-js/library/modules/_to-iobject.js"),i=n(/*! ./_to-length */"./node_modules/core-js/library/modules/_to-length.js"),a=n(/*! ./_to-index */"./node_modules/core-js/library/modules/_to-index.js");e.exports=function(e){return function(t,n,o){var s,l=r(t),u=i(l.length),c=a(o,u);if(e&&n!=n){for(;u>c;)if((s=l[c++])!=s)return!0}else for(;u>c;c++)if((e||c in l)&&l[c]===n)return e||c||0;return!e&&-1}}},"./node_modules/core-js/library/modules/_classof.js": -/*!**********************************************************!*\ - !*** ./node_modules/core-js/library/modules/_classof.js ***! - \**********************************************************/ -/*! no static exports found */function(e,t,n){var r=n(/*! ./_cof */"./node_modules/core-js/library/modules/_cof.js"),i=n(/*! ./_wks */"./node_modules/core-js/library/modules/_wks.js")("toStringTag"),a="Arguments"==r(function(){return arguments}());e.exports=function(e){var t,n,o;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),i))?n:a?r(t):"Object"==(o=r(t))&&"function"==typeof t.callee?"Arguments":o}},"./node_modules/core-js/library/modules/_cof.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/library/modules/_cof.js ***! - \******************************************************/ -/*! no static exports found */function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},"./node_modules/core-js/library/modules/_core.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js/library/modules/_core.js ***! - \*******************************************************/ -/*! no static exports found */function(e,t){var n=e.exports={version:"2.4.0"};"number"==typeof __e&&(__e=n)},"./node_modules/core-js/library/modules/_create-property.js": -/*!******************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_create-property.js ***! - \******************************************************************/ -/*! no static exports found */function(e,t,n){"use strict";var r=n(/*! ./_object-dp */"./node_modules/core-js/library/modules/_object-dp.js"),i=n(/*! ./_property-desc */"./node_modules/core-js/library/modules/_property-desc.js");e.exports=function(e,t,n){t in e?r.f(e,t,i(0,n)):e[t]=n}},"./node_modules/core-js/library/modules/_ctx.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/library/modules/_ctx.js ***! - \******************************************************/ -/*! no static exports found */function(e,t,n){var r=n(/*! ./_a-function */"./node_modules/core-js/library/modules/_a-function.js");e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},"./node_modules/core-js/library/modules/_defined.js": -/*!**********************************************************!*\ - !*** ./node_modules/core-js/library/modules/_defined.js ***! - \**********************************************************/ -/*! no static exports found */function(e,t){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},"./node_modules/core-js/library/modules/_descriptors.js": -/*!**************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_descriptors.js ***! - \**************************************************************/ -/*! no static exports found */function(e,t,n){e.exports=!n(/*! ./_fails */"./node_modules/core-js/library/modules/_fails.js")((function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}))},"./node_modules/core-js/library/modules/_dom-create.js": -/*!*************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_dom-create.js ***! - \*************************************************************/ -/*! no static exports found */function(e,t,n){var r=n(/*! ./_is-object */"./node_modules/core-js/library/modules/_is-object.js"),i=n(/*! ./_global */"./node_modules/core-js/library/modules/_global.js").document,a=r(i)&&r(i.createElement);e.exports=function(e){return a?i.createElement(e):{}}},"./node_modules/core-js/library/modules/_enum-bug-keys.js": -/*!****************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_enum-bug-keys.js ***! - \****************************************************************/ -/*! no static exports found */function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},"./node_modules/core-js/library/modules/_enum-keys.js": -/*!************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_enum-keys.js ***! - \************************************************************/ -/*! no static exports found */function(e,t,n){var r=n(/*! ./_object-keys */"./node_modules/core-js/library/modules/_object-keys.js"),i=n(/*! ./_object-gops */"./node_modules/core-js/library/modules/_object-gops.js"),a=n(/*! ./_object-pie */"./node_modules/core-js/library/modules/_object-pie.js");e.exports=function(e){var t=r(e),n=i.f;if(n)for(var o,s=n(e),l=a.f,u=0;s.length>u;)l.call(e,o=s[u++])&&t.push(o);return t}},"./node_modules/core-js/library/modules/_export.js": -/*!*********************************************************!*\ - !*** ./node_modules/core-js/library/modules/_export.js ***! - \*********************************************************/ -/*! no static exports found */function(e,t,n){var r=n(/*! ./_global */"./node_modules/core-js/library/modules/_global.js"),i=n(/*! ./_core */"./node_modules/core-js/library/modules/_core.js"),a=n(/*! ./_ctx */"./node_modules/core-js/library/modules/_ctx.js"),o=n(/*! ./_hide */"./node_modules/core-js/library/modules/_hide.js"),s=function(e,t,n){var l,u,c,d=e&s.F,f=e&s.G,h=e&s.S,p=e&s.P,m=e&s.B,g=e&s.W,y=f?i:i[t]||(i[t]={}),v=y.prototype,b=f?r:h?r[t]:(r[t]||{}).prototype;for(l in f&&(n=t),n)(u=!d&&b&&void 0!==b[l])&&l in y||(c=u?b[l]:n[l],y[l]=f&&"function"!=typeof b[l]?n[l]:m&&u?a(c,r):g&&b[l]==c?function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t.prototype=e.prototype,t}(c):p&&"function"==typeof c?a(Function.call,c):c,p&&((y.virtual||(y.virtual={}))[l]=c,e&s.R&&v&&!v[l]&&o(v,l,c)))};s.F=1,s.G=2,s.S=4,s.P=8,s.B=16,s.W=32,s.U=64,s.R=128,e.exports=s},"./node_modules/core-js/library/modules/_fails.js": -/*!********************************************************!*\ - !*** ./node_modules/core-js/library/modules/_fails.js ***! - \********************************************************/ -/*! no static exports found */function(e,t){e.exports=function(e){try{return!!e()}catch(e){return!0}}},"./node_modules/core-js/library/modules/_global.js": -/*!*********************************************************!*\ - !*** ./node_modules/core-js/library/modules/_global.js ***! - \*********************************************************/ -/*! no static exports found */function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},"./node_modules/core-js/library/modules/_has.js": -/*!******************************************************!*\ - !*** ./node_modules/core-js/library/modules/_has.js ***! - \******************************************************/ -/*! no static exports found */function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},"./node_modules/core-js/library/modules/_hide.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js/library/modules/_hide.js ***! - \*******************************************************/ -/*! no static exports found */function(e,t,n){var r=n(/*! ./_object-dp */"./node_modules/core-js/library/modules/_object-dp.js"),i=n(/*! ./_property-desc */"./node_modules/core-js/library/modules/_property-desc.js");e.exports=n(/*! ./_descriptors */"./node_modules/core-js/library/modules/_descriptors.js")?function(e,t,n){return r.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},"./node_modules/core-js/library/modules/_html.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js/library/modules/_html.js ***! - \*******************************************************/ -/*! no static exports found */function(e,t,n){e.exports=n(/*! ./_global */"./node_modules/core-js/library/modules/_global.js").document&&document.documentElement},"./node_modules/core-js/library/modules/_ie8-dom-define.js": -/*!*****************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_ie8-dom-define.js ***! - \*****************************************************************/ -/*! no static exports found */function(e,t,n){e.exports=!n(/*! ./_descriptors */"./node_modules/core-js/library/modules/_descriptors.js")&&!n(/*! ./_fails */"./node_modules/core-js/library/modules/_fails.js")((function(){return 7!=Object.defineProperty(n(/*! ./_dom-create */"./node_modules/core-js/library/modules/_dom-create.js")("div"),"a",{get:function(){return 7}}).a}))},"./node_modules/core-js/library/modules/_iobject.js": -/*!**********************************************************!*\ - !*** ./node_modules/core-js/library/modules/_iobject.js ***! - \**********************************************************/ -/*! no static exports found */function(e,t,n){var r=n(/*! ./_cof */"./node_modules/core-js/library/modules/_cof.js");e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},"./node_modules/core-js/library/modules/_is-array-iter.js": -/*!****************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_is-array-iter.js ***! - \****************************************************************/ -/*! no static exports found */function(e,t,n){var r=n(/*! ./_iterators */"./node_modules/core-js/library/modules/_iterators.js"),i=n(/*! ./_wks */"./node_modules/core-js/library/modules/_wks.js")("iterator"),a=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||a[i]===e)}},"./node_modules/core-js/library/modules/_is-array.js": -/*!***********************************************************!*\ - !*** ./node_modules/core-js/library/modules/_is-array.js ***! - \***********************************************************/ -/*! no static exports found */function(e,t,n){var r=n(/*! ./_cof */"./node_modules/core-js/library/modules/_cof.js");e.exports=Array.isArray||function(e){return"Array"==r(e)}},"./node_modules/core-js/library/modules/_is-object.js": -/*!************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_is-object.js ***! - \************************************************************/ -/*! no static exports found */function(e,t){e.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},"./node_modules/core-js/library/modules/_iter-call.js": -/*!************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_iter-call.js ***! - \************************************************************/ -/*! no static exports found */function(e,t,n){var r=n(/*! ./_an-object */"./node_modules/core-js/library/modules/_an-object.js");e.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(t){var a=e.return;throw void 0!==a&&r(a.call(e)),t}}},"./node_modules/core-js/library/modules/_iter-create.js": -/*!**************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_iter-create.js ***! - \**************************************************************/ -/*! no static exports found */function(e,t,n){"use strict";var r=n(/*! ./_object-create */"./node_modules/core-js/library/modules/_object-create.js"),i=n(/*! ./_property-desc */"./node_modules/core-js/library/modules/_property-desc.js"),a=n(/*! ./_set-to-string-tag */"./node_modules/core-js/library/modules/_set-to-string-tag.js"),o={};n(/*! ./_hide */"./node_modules/core-js/library/modules/_hide.js")(o,n(/*! ./_wks */"./node_modules/core-js/library/modules/_wks.js")("iterator"),(function(){return this})),e.exports=function(e,t,n){e.prototype=r(o,{next:i(1,n)}),a(e,t+" Iterator")}},"./node_modules/core-js/library/modules/_iter-define.js": -/*!**************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_iter-define.js ***! - \**************************************************************/ -/*! no static exports found */function(e,t,n){"use strict";var r=n(/*! ./_library */"./node_modules/core-js/library/modules/_library.js"),i=n(/*! ./_export */"./node_modules/core-js/library/modules/_export.js"),a=n(/*! ./_redefine */"./node_modules/core-js/library/modules/_redefine.js"),o=n(/*! ./_hide */"./node_modules/core-js/library/modules/_hide.js"),s=n(/*! ./_has */"./node_modules/core-js/library/modules/_has.js"),l=n(/*! ./_iterators */"./node_modules/core-js/library/modules/_iterators.js"),u=n(/*! ./_iter-create */"./node_modules/core-js/library/modules/_iter-create.js"),c=n(/*! ./_set-to-string-tag */"./node_modules/core-js/library/modules/_set-to-string-tag.js"),d=n(/*! ./_object-gpo */"./node_modules/core-js/library/modules/_object-gpo.js"),f=n(/*! ./_wks */"./node_modules/core-js/library/modules/_wks.js")("iterator"),h=!([].keys&&"next"in[].keys()),p=function(){return this};e.exports=function(e,t,n,m,g,y,v){u(n,t,m);var b,_,A,E=function(e){if(!h&&e in k)return k[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},T=t+" Iterator",w="values"==g,S=!1,k=e.prototype,C=k[f]||k["@@iterator"]||g&&k[g],x=C||E(g),R=g?w?E("entries"):x:void 0,L="Array"==t&&k.entries||C;if(L&&(A=d(L.call(new e)))!==Object.prototype&&(c(A,T,!0),r||s(A,f)||o(A,f,p)),w&&C&&"values"!==C.name&&(S=!0,x=function(){return C.call(this)}),r&&!v||!h&&!S&&k[f]||o(k,f,x),l[t]=x,l[T]=p,g)if(b={values:w?x:E("values"),keys:y?x:E("keys"),entries:R},v)for(_ in b)_ in k||a(k,_,b[_]);else i(i.P+i.F*(h||S),t,b);return b}},"./node_modules/core-js/library/modules/_iter-detect.js": -/*!**************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_iter-detect.js ***! - \**************************************************************/ -/*! no static exports found */function(e,t,n){var r=n(/*! ./_wks */"./node_modules/core-js/library/modules/_wks.js")("iterator"),i=!1;try{var a=[7][r]();a.return=function(){i=!0},Array.from(a,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var a=[7],o=a[r]();o.next=function(){return{done:n=!0}},a[r]=function(){return o},e(a)}catch(e){}return n}},"./node_modules/core-js/library/modules/_iter-step.js": -/*!************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_iter-step.js ***! - \************************************************************/ -/*! no static exports found */function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},"./node_modules/core-js/library/modules/_iterators.js": -/*!************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_iterators.js ***! - \************************************************************/ -/*! no static exports found */function(e,t){e.exports={}},"./node_modules/core-js/library/modules/_keyof.js": -/*!********************************************************!*\ - !*** ./node_modules/core-js/library/modules/_keyof.js ***! - \********************************************************/ -/*! no static exports found */function(e,t,n){var r=n(/*! ./_object-keys */"./node_modules/core-js/library/modules/_object-keys.js"),i=n(/*! ./_to-iobject */"./node_modules/core-js/library/modules/_to-iobject.js");e.exports=function(e,t){for(var n,a=i(e),o=r(a),s=o.length,l=0;s>l;)if(a[n=o[l++]]===t)return n}},"./node_modules/core-js/library/modules/_library.js": -/*!**********************************************************!*\ - !*** ./node_modules/core-js/library/modules/_library.js ***! - \**********************************************************/ -/*! no static exports found */function(e,t){e.exports=!0},"./node_modules/core-js/library/modules/_meta.js": -/*!*******************************************************!*\ - !*** ./node_modules/core-js/library/modules/_meta.js ***! - \*******************************************************/ -/*! no static exports found */function(e,t,n){var r=n(/*! ./_uid */"./node_modules/core-js/library/modules/_uid.js")("meta"),i=n(/*! ./_is-object */"./node_modules/core-js/library/modules/_is-object.js"),a=n(/*! ./_has */"./node_modules/core-js/library/modules/_has.js"),o=n(/*! ./_object-dp */"./node_modules/core-js/library/modules/_object-dp.js").f,s=0,l=Object.isExtensible||function(){return!0},u=!n(/*! ./_fails */"./node_modules/core-js/library/modules/_fails.js")((function(){return l(Object.preventExtensions({}))})),c=function(e){o(e,r,{value:{i:"O"+ ++s,w:{}}})},d=e.exports={KEY:r,NEED:!1,fastKey:function(e,t){if(!i(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!a(e,r)){if(!l(e))return"F";if(!t)return"E";c(e)}return e[r].i},getWeak:function(e,t){if(!a(e,r)){if(!l(e))return!0;if(!t)return!1;c(e)}return e[r].w},onFreeze:function(e){return u&&d.NEED&&l(e)&&!a(e,r)&&c(e),e}}},"./node_modules/core-js/library/modules/_object-assign.js": -/*!****************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_object-assign.js ***! - \****************************************************************/ -/*! no static exports found */function(e,t,n){"use strict";var r=n(/*! ./_object-keys */"./node_modules/core-js/library/modules/_object-keys.js"),i=n(/*! ./_object-gops */"./node_modules/core-js/library/modules/_object-gops.js"),a=n(/*! ./_object-pie */"./node_modules/core-js/library/modules/_object-pie.js"),o=n(/*! ./_to-object */"./node_modules/core-js/library/modules/_to-object.js"),s=n(/*! ./_iobject */"./node_modules/core-js/library/modules/_iobject.js"),l=Object.assign;e.exports=!l||n(/*! ./_fails */"./node_modules/core-js/library/modules/_fails.js")((function(){var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach((function(e){t[e]=e})),7!=l({},e)[n]||Object.keys(l({},t)).join("")!=r}))?function(e,t){for(var n=o(e),l=arguments.length,u=1,c=i.f,d=a.f;l>u;)for(var f,h=s(arguments[u++]),p=c?r(h).concat(c(h)):r(h),m=p.length,g=0;m>g;)d.call(h,f=p[g++])&&(n[f]=h[f]);return n}:l},"./node_modules/core-js/library/modules/_object-create.js": -/*!****************************************************************!*\ - !*** ./node_modules/core-js/library/modules/_object-create.js ***! - \****************************************************************/ -/*! no static exports found */function(e,t,n){var r=n(/*! ./_an-object */"./node_modules/core-js/library/modules/_an-object.js"),i=n(/*! ./_object-dps */"./node_modules/core-js/library/modules/_object-dps.js"),a=n(/*! ./_enum-bug-keys */"./node_modules/core-js/library/modules/_enum-bug-keys.js"),o=n(/*! ./_shared-key */"./node_modules/core-js/library/modules/_shared-key.js")("IE_PROTO"),s=function(){},l=function(){var e,t=n(/*! ./_dom-create */"./node_modules/core-js/library/modules/_dom-create.js")("iframe"),r=a.length;for(t.style.display="none",n(/*! ./_html */"./node_modules/core-js/library/modules/_html.js").appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write(" + + + +
@@ -14,23 +19,34 @@
- - \ No newline at end of file From ac2c98bcdc14bad40026133583f6c7cfe4ba650c Mon Sep 17 00:00:00 2001 From: Oliver Traber Date: Tue, 15 Feb 2022 22:35:36 +0100 Subject: [PATCH 4/5] Update base image to Debian Bullseye --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 2f94d17..e4773b7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,8 @@ # Base Image used to create this Image -FROM debian:buster-slim +FROM debian:bullseye-slim # Maintainer -LABEL maintainer="oliver@traber-info.de" +LABEL maintainer="hi@bluemedia.dev" ENV DEBIAN_FRONTEND noninteractive ENV RTMP_PORT 1935 From da915d702d6cf7efd21662a42f17af5563f4e240 Mon Sep 17 00:00:00 2001 From: Oliver Traber Date: Sun, 7 Aug 2022 00:58:46 +0200 Subject: [PATCH 5/5] Update docker image name in README.md --- README.md | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6dfd3f3..cfe9c0f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,23 @@ # nginx-live + + + + + + + + + + + + +
+ :warning: Notice +
+ The docker image is now hosted as git.bluemedia.dev/bluemedia/nginx-live. The old registry name will continue to point to the current image for now, but may stop working at some point in the future. +
+ nginx-live is a simple, lightweight, self-hosted video streaming service in a Docker container. It allows you to securely stream video and audio from encoders such as OBS via RTMP or RTMPS. The stream is then converted to the HLS format so that it can be viewed by a larger number of viewers in their favorite browser. @@ -10,7 +28,7 @@ It allows you to securely stream video and audio from encoders such as OBS via R If you want to try nginx-live, or test a configuration change, you can start the container without any environment variables. In this case the ingest is done unencrypted via RTMP. The necessary stream key is generated randomly and printed in the Docker log during the first start. ```shell -docker run -d --name streaming -p 8080:8080 -p 1935:1935 repo.bluemedia.dev/bluemedia/nginx-live +docker run -d --name streaming -p 8080:8080 -p 1935:1935 git.bluemedia.dev/bluemedia/nginx-live ``` After launch, the web player should be available at `http://:8080/`. @@ -25,7 +43,7 @@ docker run -d --name streaming -p 8080:8080 -p 1935:1935 \ -v /path/to/certs:/cert:ro \ -e TLS_CERT=fullchain.cer \ -e TLS_KEY=private.key \ -repo.bluemedia.dev/bluemedia/nginx-live +git.bluemedia.dev/bluemedia/nginx-live ``` You will now need to set the server url in your streaming software in the following format: `rtmps://:/live`. It is important that you specify the RTMP port. @@ -51,7 +69,7 @@ If you want to make the web player and the HLS files available via HTTPS, you ca - `frontend/` All frontend related files. These will be copied to the web root of nginx. ## Automated image builds -The Docker image `repo.bluemedia.dev/bluemedia/nginx-live` is built an pushed every two days by a Jenkins instance. Builds are based on the current main branch of this repository. +The Docker image `git.bluemedia.dev/bluemedia/nginx-live` is built an pushed every two days by a Jenkins instance. Builds are based on the current main branch of this repository. ## Contribution Guidelines