diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml deleted file mode 100644 index 37d7e9e..0000000 --- a/.github/workflows/build-and-publish.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Build and Publish - -on: - push: - branches: - - 'main' - tags: - - 'v*' - pull_request: - -jobs: - docker: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - - name: Docker meta - id: meta - uses: docker/metadata-action@v3 - with: - images: ghcr.io/${{ github.repository }} - - - name: Login to Github Packages - uses: docker/login-action@v1 - if: github.event_name != 'pull_request' - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build and push - id: docker_build - uses: docker/build-push-action@v2 - with: - context: . - push: ${{ github.event_name != 'pull_request'}} - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 010e963..dbd813f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,13 @@ .env -static/css/font-awesome.min.css -static/js/bootstrap.bundle.min.js -static/js/jquery.min.js -static/js/vue.min.js -static/js/axios.min.js -static/fonts +.venv +source/static/css/font-awesome.min.css +source/static/js/bootstrap.bundle.min.js +source/static/js/jquery.min.js +source/static/js/vue.min.js +source/static/js/axios.min.js +source/static/fonts -staticfiles +source/staticfiles # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 94bb1c6..0000000 --- a/.travis.yml +++ /dev/null @@ -1,10 +0,0 @@ -language: python -python: - - "3.7" - - "3.8" -install: - - pip install -r requirements.txt - - pip install flake8 -script: - - flake8 - - ./manage.py test diff --git a/Dockerfile b/Dockerfile index fc5806d..056cdf2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ ENV PYTHONUNBUFFERED 1 RUN apk add --no-cache postgresql-dev gcc python3-dev musl-dev gettext postgresql-client nginx supervisor # install dependencies -ADD ./requirements.txt . +ADD ./source/requirements.txt . RUN pip install -r requirements.txt # add supervisor and nginx configs @@ -20,7 +20,7 @@ ADD ./docker/supervisord.conf /etc/supervisord.conf RUN addgroup -S portier && adduser -S portier -G portier # add code -ADD --chown=portier:portier . /app +ADD --chown=portier:portier ./source/ /app/ # add static external libraries for frontend RUN ./fetch_frontend_libs.sh \ diff --git a/docker-compose.dev.yaml b/docker-compose.yaml similarity index 93% rename from docker-compose.dev.yaml rename to docker-compose.yaml index 1dcb37b..0f31744 100644 --- a/docker-compose.dev.yaml +++ b/docker-compose.yaml @@ -37,4 +37,4 @@ services: - 1935:1935 - 8888:8888 volumes: - - ./srs.dev.conf:/usr/local/srs/conf/docker.conf:ro \ No newline at end of file + - ./srs.conf:/usr/local/srs/conf/docker.conf:ro diff --git a/bootstrap_variables.scss b/source/bootstrap_variables.scss similarity index 100% rename from bootstrap_variables.scss rename to source/bootstrap_variables.scss diff --git a/concierge/__init__.py b/source/concierge/__init__.py similarity index 100% rename from concierge/__init__.py rename to source/concierge/__init__.py diff --git a/concierge/admin.py b/source/concierge/admin.py similarity index 100% rename from concierge/admin.py rename to source/concierge/admin.py diff --git a/concierge/apps.py b/source/concierge/apps.py similarity index 100% rename from concierge/apps.py rename to source/concierge/apps.py diff --git a/concierge/migrations/0001_initial.py b/source/concierge/migrations/0001_initial.py similarity index 100% rename from concierge/migrations/0001_initial.py rename to source/concierge/migrations/0001_initial.py diff --git a/concierge/migrations/0002_auto_20200426_1834.py b/source/concierge/migrations/0002_auto_20200426_1834.py similarity index 100% rename from concierge/migrations/0002_auto_20200426_1834.py rename to source/concierge/migrations/0002_auto_20200426_1834.py diff --git a/concierge/migrations/0003_auto_20200426_1835.py b/source/concierge/migrations/0003_auto_20200426_1835.py similarity index 100% rename from concierge/migrations/0003_auto_20200426_1835.py rename to source/concierge/migrations/0003_auto_20200426_1835.py diff --git a/concierge/migrations/0004_auto_20200426_1912.py b/source/concierge/migrations/0004_auto_20200426_1912.py similarity index 100% rename from concierge/migrations/0004_auto_20200426_1912.py rename to source/concierge/migrations/0004_auto_20200426_1912.py diff --git a/concierge/migrations/0005_auto_20200426_2007.py b/source/concierge/migrations/0005_auto_20200426_2007.py similarity index 100% rename from concierge/migrations/0005_auto_20200426_2007.py rename to source/concierge/migrations/0005_auto_20200426_2007.py diff --git a/concierge/migrations/0006_task_config_id.py b/source/concierge/migrations/0006_task_config_id.py similarity index 100% rename from concierge/migrations/0006_task_config_id.py rename to source/concierge/migrations/0006_task_config_id.py diff --git a/concierge/migrations/__init__.py b/source/concierge/migrations/__init__.py similarity index 100% rename from concierge/migrations/__init__.py rename to source/concierge/migrations/__init__.py diff --git a/concierge/models.py b/source/concierge/models.py similarity index 100% rename from concierge/models.py rename to source/concierge/models.py diff --git a/concierge/signals.py b/source/concierge/signals.py similarity index 100% rename from concierge/signals.py rename to source/concierge/signals.py diff --git a/concierge/tests.py b/source/concierge/tests.py similarity index 100% rename from concierge/tests.py rename to source/concierge/tests.py diff --git a/concierge/urls.py b/source/concierge/urls.py similarity index 100% rename from concierge/urls.py rename to source/concierge/urls.py diff --git a/concierge/views.py b/source/concierge/views.py similarity index 100% rename from concierge/views.py rename to source/concierge/views.py diff --git a/core/__init__.py b/source/core/__init__.py similarity index 100% rename from core/__init__.py rename to source/core/__init__.py diff --git a/core/apps.py b/source/core/apps.py similarity index 100% rename from core/apps.py rename to source/core/apps.py diff --git a/core/management/commands/createdefaultgroup.py b/source/core/management/commands/createdefaultgroup.py similarity index 100% rename from core/management/commands/createdefaultgroup.py rename to source/core/management/commands/createdefaultgroup.py diff --git a/fetch_frontend_libs.sh b/source/fetch_frontend_libs.sh similarity index 100% rename from fetch_frontend_libs.sh rename to source/fetch_frontend_libs.sh diff --git a/locale/de/LC_MESSAGES/django.po b/source/locale/de/LC_MESSAGES/django.po similarity index 100% rename from locale/de/LC_MESSAGES/django.po rename to source/locale/de/LC_MESSAGES/django.po diff --git a/locale/en/LC_MESSAGES/django.po b/source/locale/en/LC_MESSAGES/django.po similarity index 100% rename from locale/en/LC_MESSAGES/django.po rename to source/locale/en/LC_MESSAGES/django.po diff --git a/manage.py b/source/manage.py similarity index 100% rename from manage.py rename to source/manage.py diff --git a/portal/__init__.py b/source/portal/__init__.py similarity index 100% rename from portal/__init__.py rename to source/portal/__init__.py diff --git a/portal/admin.py b/source/portal/admin.py similarity index 100% rename from portal/admin.py rename to source/portal/admin.py diff --git a/portal/apps.py b/source/portal/apps.py similarity index 100% rename from portal/apps.py rename to source/portal/apps.py diff --git a/portal/migrations/__init__.py b/source/portal/migrations/__init__.py similarity index 100% rename from portal/migrations/__init__.py rename to source/portal/migrations/__init__.py diff --git a/portal/models.py b/source/portal/models.py similarity index 100% rename from portal/models.py rename to source/portal/models.py diff --git a/portal/templates/portal/index.html b/source/portal/templates/portal/index.html similarity index 100% rename from portal/templates/portal/index.html rename to source/portal/templates/portal/index.html diff --git a/portal/tests.py b/source/portal/tests.py similarity index 100% rename from portal/tests.py rename to source/portal/tests.py diff --git a/portal/urls.py b/source/portal/urls.py similarity index 100% rename from portal/urls.py rename to source/portal/urls.py diff --git a/portal/views.py b/source/portal/views.py similarity index 100% rename from portal/views.py rename to source/portal/views.py diff --git a/portier/__init__.py b/source/portier/__init__.py similarity index 100% rename from portier/__init__.py rename to source/portier/__init__.py diff --git a/portier/asgi.py b/source/portier/asgi.py similarity index 100% rename from portier/asgi.py rename to source/portier/asgi.py diff --git a/portier/celery.py b/source/portier/celery.py similarity index 100% rename from portier/celery.py rename to source/portier/celery.py diff --git a/portier/common/handlers.py b/source/portier/common/handlers.py similarity index 100% rename from portier/common/handlers.py rename to source/portier/common/handlers.py diff --git a/portier/settings.py b/source/portier/settings.py similarity index 100% rename from portier/settings.py rename to source/portier/settings.py diff --git a/portier/urls.py b/source/portier/urls.py similarity index 100% rename from portier/urls.py rename to source/portier/urls.py diff --git a/portier/wsgi.py b/source/portier/wsgi.py similarity index 100% rename from portier/wsgi.py rename to source/portier/wsgi.py diff --git a/requirements.txt b/source/requirements.txt similarity index 100% rename from requirements.txt rename to source/requirements.txt diff --git a/restapi/__init__.py b/source/restapi/__init__.py similarity index 100% rename from restapi/__init__.py rename to source/restapi/__init__.py diff --git a/restapi/apps.py b/source/restapi/apps.py similarity index 100% rename from restapi/apps.py rename to source/restapi/apps.py diff --git a/restapi/migrations/__init__.py b/source/restapi/migrations/__init__.py similarity index 100% rename from restapi/migrations/__init__.py rename to source/restapi/migrations/__init__.py diff --git a/restapi/urls.py b/source/restapi/urls.py similarity index 100% rename from restapi/urls.py rename to source/restapi/urls.py diff --git a/restapi/views.py b/source/restapi/views.py similarity index 100% rename from restapi/views.py rename to source/restapi/views.py diff --git a/restream/__init__.py b/source/restream/__init__.py similarity index 100% rename from restream/__init__.py rename to source/restream/__init__.py diff --git a/restream/admin.py b/source/restream/admin.py similarity index 100% rename from restream/admin.py rename to source/restream/admin.py diff --git a/restream/apps.py b/source/restream/apps.py similarity index 100% rename from restream/apps.py rename to source/restream/apps.py diff --git a/restream/forms.py b/source/restream/forms.py similarity index 100% rename from restream/forms.py rename to source/restream/forms.py diff --git a/restream/migrations/0001_initial.py b/source/restream/migrations/0001_initial.py similarity index 100% rename from restream/migrations/0001_initial.py rename to source/restream/migrations/0001_initial.py diff --git a/restream/migrations/0002_auto_20200501_1302.py b/source/restream/migrations/0002_auto_20200501_1302.py similarity index 100% rename from restream/migrations/0002_auto_20200501_1302.py rename to source/restream/migrations/0002_auto_20200501_1302.py diff --git a/restream/migrations/0003_restreamconfig_format.py b/source/restream/migrations/0003_restreamconfig_format.py similarity index 100% rename from restream/migrations/0003_restreamconfig_format.py rename to source/restream/migrations/0003_restreamconfig_format.py diff --git a/restream/migrations/__init__.py b/source/restream/migrations/__init__.py similarity index 100% rename from restream/migrations/__init__.py rename to source/restream/migrations/__init__.py diff --git a/restream/models.py b/source/restream/models.py similarity index 100% rename from restream/models.py rename to source/restream/models.py diff --git a/restream/signals.py b/source/restream/signals.py similarity index 100% rename from restream/signals.py rename to source/restream/signals.py diff --git a/restream/templates/restream/restreamconfig_confirm_delete.html b/source/restream/templates/restream/restreamconfig_confirm_delete.html similarity index 100% rename from restream/templates/restream/restreamconfig_confirm_delete.html rename to source/restream/templates/restream/restreamconfig_confirm_delete.html diff --git a/restream/templates/restream/restreamconfig_detail.html b/source/restream/templates/restream/restreamconfig_detail.html similarity index 100% rename from restream/templates/restream/restreamconfig_detail.html rename to source/restream/templates/restream/restreamconfig_detail.html diff --git a/restream/templates/restream/restreamconfig_form.html b/source/restream/templates/restream/restreamconfig_form.html similarity index 100% rename from restream/templates/restream/restreamconfig_form.html rename to source/restream/templates/restream/restreamconfig_form.html diff --git a/restream/templates/restream/restreamconfig_list.html b/source/restream/templates/restream/restreamconfig_list.html similarity index 100% rename from restream/templates/restream/restreamconfig_list.html rename to source/restream/templates/restream/restreamconfig_list.html diff --git a/restream/templates/restream/restreamconfig_update_form.html b/source/restream/templates/restream/restreamconfig_update_form.html similarity index 100% rename from restream/templates/restream/restreamconfig_update_form.html rename to source/restream/templates/restream/restreamconfig_update_form.html diff --git a/restream/tests.py b/source/restream/tests.py similarity index 100% rename from restream/tests.py rename to source/restream/tests.py diff --git a/restream/urls.py b/source/restream/urls.py similarity index 100% rename from restream/urls.py rename to source/restream/urls.py diff --git a/restream/views.py b/source/restream/views.py similarity index 100% rename from restream/views.py rename to source/restream/views.py diff --git a/rtmp/__init__.py b/source/rtmp/__init__.py similarity index 100% rename from rtmp/__init__.py rename to source/rtmp/__init__.py diff --git a/rtmp/admin.py b/source/rtmp/admin.py similarity index 100% rename from rtmp/admin.py rename to source/rtmp/admin.py diff --git a/rtmp/apps.py b/source/rtmp/apps.py similarity index 100% rename from rtmp/apps.py rename to source/rtmp/apps.py diff --git a/rtmp/forms.py b/source/rtmp/forms.py similarity index 100% rename from rtmp/forms.py rename to source/rtmp/forms.py diff --git a/rtmp/management/commands/createdefaultapplication.py b/source/rtmp/management/commands/createdefaultapplication.py similarity index 100% rename from rtmp/management/commands/createdefaultapplication.py rename to source/rtmp/management/commands/createdefaultapplication.py diff --git a/rtmp/migrations/0001_initial.py b/source/rtmp/migrations/0001_initial.py similarity index 100% rename from rtmp/migrations/0001_initial.py rename to source/rtmp/migrations/0001_initial.py diff --git a/rtmp/migrations/0002_stream_publish_counter.py b/source/rtmp/migrations/0002_stream_publish_counter.py similarity index 100% rename from rtmp/migrations/0002_stream_publish_counter.py rename to source/rtmp/migrations/0002_stream_publish_counter.py diff --git a/rtmp/migrations/0003_auto_20200426_1834.py b/source/rtmp/migrations/0003_auto_20200426_1834.py similarity index 100% rename from rtmp/migrations/0003_auto_20200426_1834.py rename to source/rtmp/migrations/0003_auto_20200426_1834.py diff --git a/rtmp/migrations/0004_auto_20200501_1302.py b/source/rtmp/migrations/0004_auto_20200501_1302.py similarity index 100% rename from rtmp/migrations/0004_auto_20200501_1302.py rename to source/rtmp/migrations/0004_auto_20200501_1302.py diff --git a/rtmp/migrations/0005_auto_20200531_0951.py b/source/rtmp/migrations/0005_auto_20200531_0951.py similarity index 100% rename from rtmp/migrations/0005_auto_20200531_0951.py rename to source/rtmp/migrations/0005_auto_20200531_0951.py diff --git a/rtmp/migrations/__init__.py b/source/rtmp/migrations/__init__.py similarity index 100% rename from rtmp/migrations/__init__.py rename to source/rtmp/migrations/__init__.py diff --git a/rtmp/models.py b/source/rtmp/models.py similarity index 100% rename from rtmp/models.py rename to source/rtmp/models.py diff --git a/rtmp/signals.py b/source/rtmp/signals.py similarity index 100% rename from rtmp/signals.py rename to source/rtmp/signals.py diff --git a/rtmp/templates/rtmp/stream_confirm_delete.html b/source/rtmp/templates/rtmp/stream_confirm_delete.html similarity index 100% rename from rtmp/templates/rtmp/stream_confirm_delete.html rename to source/rtmp/templates/rtmp/stream_confirm_delete.html diff --git a/rtmp/templates/rtmp/stream_detail.html b/source/rtmp/templates/rtmp/stream_detail.html similarity index 100% rename from rtmp/templates/rtmp/stream_detail.html rename to source/rtmp/templates/rtmp/stream_detail.html diff --git a/rtmp/templates/rtmp/stream_form.html b/source/rtmp/templates/rtmp/stream_form.html similarity index 100% rename from rtmp/templates/rtmp/stream_form.html rename to source/rtmp/templates/rtmp/stream_form.html diff --git a/rtmp/templates/rtmp/stream_list.html b/source/rtmp/templates/rtmp/stream_list.html similarity index 100% rename from rtmp/templates/rtmp/stream_list.html rename to source/rtmp/templates/rtmp/stream_list.html diff --git a/rtmp/templates/rtmp/stream_update_form.html b/source/rtmp/templates/rtmp/stream_update_form.html similarity index 100% rename from rtmp/templates/rtmp/stream_update_form.html rename to source/rtmp/templates/rtmp/stream_update_form.html diff --git a/rtmp/tests.py b/source/rtmp/tests.py similarity index 100% rename from rtmp/tests.py rename to source/rtmp/tests.py diff --git a/rtmp/urls.py b/source/rtmp/urls.py similarity index 100% rename from rtmp/urls.py rename to source/rtmp/urls.py diff --git a/rtmp/views.py b/source/rtmp/views.py similarity index 100% rename from rtmp/views.py rename to source/rtmp/views.py diff --git a/setup.cfg b/source/setup.cfg similarity index 100% rename from setup.cfg rename to source/setup.cfg diff --git a/start.sh b/source/start.sh similarity index 100% rename from start.sh rename to source/start.sh diff --git a/static/.gitkeep b/source/static/.gitkeep similarity index 100% rename from static/.gitkeep rename to source/static/.gitkeep diff --git a/static/css/bootstrap.min.css b/source/static/css/bootstrap.min.css similarity index 100% rename from static/css/bootstrap.min.css rename to source/static/css/bootstrap.min.css diff --git a/static/js/restreamconfig-list.js b/source/static/js/restreamconfig-list.js similarity index 100% rename from static/js/restreamconfig-list.js rename to source/static/js/restreamconfig-list.js diff --git a/static/js/stream-list.js b/source/static/js/stream-list.js similarity index 100% rename from static/js/stream-list.js rename to source/static/js/stream-list.js diff --git a/templates/base.html b/source/templates/base.html similarity index 100% rename from templates/base.html rename to source/templates/base.html diff --git a/templates/registration/login.html b/source/templates/registration/login.html similarity index 100% rename from templates/registration/login.html rename to source/templates/registration/login.html diff --git a/templates/registration/password_change_done.html b/source/templates/registration/password_change_done.html similarity index 100% rename from templates/registration/password_change_done.html rename to source/templates/registration/password_change_done.html diff --git a/templates/registration/password_change_form.html b/source/templates/registration/password_change_form.html similarity index 100% rename from templates/registration/password_change_form.html rename to source/templates/registration/password_change_form.html diff --git a/templates/registration/password_reset_form.html b/source/templates/registration/password_reset_form.html similarity index 100% rename from templates/registration/password_reset_form.html rename to source/templates/registration/password_reset_form.html diff --git a/srs.dev.conf b/srs.conf similarity index 100% rename from srs.dev.conf rename to srs.conf diff --git a/static/js/bootstrap.bundle.min.js b/static/js/bootstrap.bundle.min.js deleted file mode 100644 index 78c533b..0000000 --- a/static/js/bootstrap.bundle.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.4.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("jquery")):"function"==typeof define&&define.amd?define(["exports","jquery"],t):t((e=e||self).bootstrap={},e.jQuery)}(this,function(e,p){"use strict";function i(e,t){for(var n=0;nthis._items.length-1||e<0))if(this._isSliding)p(this._element).one(V.SLID,function(){return t.to(e)});else{if(n===e)return this.pause(),void this.cycle();var i=n=i.clientWidth&&n>=i.clientHeight}),u=0l[e]&&!i.escapeWithReference&&(n=Math.min(h[t],l[e]-("right"===e?h.width:h.height))),Ye({},t,n)}};return c.forEach(function(e){var t=-1!==["left","top"].indexOf(e)?"primary":"secondary";h=ze({},h,u[t](e))}),e.offsets.popper=h,e},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,n=t.popper,i=t.reference,o=e.placement.split("-")[0],r=Math.floor,s=-1!==["top","bottom"].indexOf(o),a=s?"right":"bottom",l=s?"left":"top",c=s?"width":"height";return n[a]r(i[a])&&(e.offsets.popper[l]=r(i[a])),e}},arrow:{order:500,enabled:!0,fn:function(e,t){var n;if(!gt(e.instance.modifiers,"arrow","keepTogether"))return e;var i=t.element;if("string"==typeof i){if(!(i=e.instance.popper.querySelector(i)))return e}else if(!e.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),e;var o=e.placement.split("-")[0],r=e.offsets,s=r.popper,a=r.reference,l=-1!==["left","right"].indexOf(o),c=l?"height":"width",h=l?"Top":"Left",u=h.toLowerCase(),f=l?"left":"top",d=l?"bottom":"right",p=nt(i)[c];a[d]-ps[d]&&(e.offsets.popper[u]+=a[u]+p-s[d]),e.offsets.popper=Xe(e.offsets.popper);var m=a[u]+a[c]/2-p/2,g=ke(e.instance.popper),_=parseFloat(g["margin"+h],10),v=parseFloat(g["border"+h+"Width"],10),y=m-e.offsets.popper[u]-_-v;return y=Math.max(Math.min(s[c]-p,y),0),e.arrowElement=i,e.offsets.arrow=(Ye(n={},u,Math.round(y)),Ye(n,f,""),n),e},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(m,g){if(at(m.instance.modifiers,"inner"))return m;if(m.flipped&&m.placement===m.originalPlacement)return m;var _=Ze(m.instance.popper,m.instance.reference,g.padding,g.boundariesElement,m.positionFixed),v=m.placement.split("-")[0],y=it(v),E=m.placement.split("-")[1]||"",b=[];switch(g.behavior){case Et:b=[v,y];break;case bt:b=yt(v);break;case wt:b=yt(v,!0);break;default:b=g.behavior}return b.forEach(function(e,t){if(v!==e||b.length===t+1)return m;v=m.placement.split("-")[0],y=it(v);var n=m.offsets.popper,i=m.offsets.reference,o=Math.floor,r="left"===v&&o(n.right)>o(i.left)||"right"===v&&o(n.left)o(i.top)||"bottom"===v&&o(n.top)o(_.right),l=o(n.top)o(_.bottom),h="left"===v&&s||"right"===v&&a||"top"===v&&l||"bottom"===v&&c,u=-1!==["top","bottom"].indexOf(v),f=!!g.flipVariations&&(u&&"start"===E&&s||u&&"end"===E&&a||!u&&"start"===E&&l||!u&&"end"===E&&c),d=!!g.flipVariationsByContent&&(u&&"start"===E&&a||u&&"end"===E&&s||!u&&"start"===E&&c||!u&&"end"===E&&l),p=f||d;(r||h||p)&&(m.flipped=!0,(r||h)&&(v=b[t+1]),p&&(E=function(e){return"end"===e?"start":"start"===e?"end":e}(E)),m.placement=v+(E?"-"+E:""),m.offsets.popper=ze({},m.offsets.popper,ot(m.instance.popper,m.offsets.reference,m.placement)),m=st(m.instance.modifiers,m,"flip"))}),m},behavior:"flip",padding:5,boundariesElement:"viewport",flipVariations:!1,flipVariationsByContent:!1},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,n=t.split("-")[0],i=e.offsets,o=i.popper,r=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return o[s?"left":"top"]=r[n]-(a?o[s?"width":"height"]:0),e.placement=it(t),e.offsets.popper=Xe(o),e}},hide:{order:800,enabled:!0,fn:function(e){if(!gt(e.instance.modifiers,"hide","preventOverflow"))return e;var t=e.offsets.reference,n=rt(e.instance.modifiers,function(e){return"preventOverflow"===e.name}).boundaries;if(t.bottomn.right||t.top>n.bottom||t.rightdocument.documentElement.clientHeight;!this._isBodyOverflowing&&e&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!e&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var e=document.body.getBoundingClientRect();this._isBodyOverflowing=e.left+e.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:Cn,popperConfig:null},Fn="show",Mn="out",Wn={HIDE:"hide"+Nn,HIDDEN:"hidden"+Nn,SHOW:"show"+Nn,SHOWN:"shown"+Nn,INSERTED:"inserted"+Nn,CLICK:"click"+Nn,FOCUSIN:"focusin"+Nn,FOCUSOUT:"focusout"+Nn,MOUSEENTER:"mouseenter"+Nn,MOUSELEAVE:"mouseleave"+Nn},Un="fade",Bn="show",qn=".tooltip-inner",Kn=".arrow",Qn="hover",Vn="focus",Yn="click",zn="manual",Xn=function(){function i(e,t){if("undefined"==typeof St)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=e,this.config=this._getConfig(t),this.tip=null,this._setListeners()}var e=i.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(e){if(this._isEnabled)if(e){var t=this.constructor.DATA_KEY,n=p(e.currentTarget).data(t);n||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(t,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p(this.getTipElement()).hasClass(Bn))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),p.removeData(this.element,this.constructor.DATA_KEY),p(this.element).off(this.constructor.EVENT_KEY),p(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&p(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===p(this.element).css("display"))throw new Error("Please use show on visible elements");var e=p.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p(this.element).trigger(e);var n=m.findShadowRoot(this.element),i=p.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=m.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&p(o).addClass(Un);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();p(o).data(this.constructor.DATA_KEY,this),p.contains(this.element.ownerDocument.documentElement,this.tip)||p(o).appendTo(l),p(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new St(this.element,o,this._getPopperConfig(a)),p(o).addClass(Bn),"ontouchstart"in document.documentElement&&p(document.body).children().on("mouseover",null,p.noop);var c=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,p(t.element).trigger(t.constructor.Event.SHOWN),e===Mn&&t._leave(null,t)};if(p(this.tip).hasClass(Un)){var h=m.getTransitionDurationFromElement(this.tip);p(this.tip).one(m.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},e.hide=function(e){function t(){n._hoverState!==Fn&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),p(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()}var n=this,i=this.getTipElement(),o=p.Event(this.constructor.Event.HIDE);if(p(this.element).trigger(o),!o.isDefaultPrevented()){if(p(i).removeClass(Bn),"ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),this._activeTrigger[Yn]=!1,this._activeTrigger[Vn]=!1,this._activeTrigger[Qn]=!1,p(this.tip).hasClass(Un)){var r=m.getTransitionDurationFromElement(i);p(i).one(m.TRANSITION_END,t).emulateTransitionEnd(r)}else t();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(e){p(this.getTipElement()).addClass(Ln+"-"+e)},e.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},e.setContent=function(){var e=this.getTipElement();this.setElementContent(p(e.querySelectorAll(qn)),this.getTitle()),p(e).removeClass(Un+" "+Bn)},e.setElementContent=function(e,t){"object"!=typeof t||!t.nodeType&&!t.jquery?this.config.html?(this.config.sanitize&&(t=In(t,this.config.whiteList,this.config.sanitizeFn)),e.html(t)):e.text(t):this.config.html?p(t).parent().is(e)||e.empty().append(t):e.text(p(t).text())},e.getTitle=function(){var e=this.element.getAttribute("data-original-title");return e=e||("function"==typeof this.config.title?this.config.title.call(this.element):this.config.title)},e._getPopperConfig=function(e){var t=this;return l({},{placement:e,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:Kn},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(e){e.originalPlacement!==e.placement&&t._handlePopperPlacementChange(e)},onUpdate:function(e){return t._handlePopperPlacementChange(e)}},{},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=l({},e.offsets,{},t.config.offset(e.offsets,t.element)||{}),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:m.isElement(this.config.container)?p(this.config.container):p(document).find(this.config.container)},e._getAttachment=function(e){return Hn[e.toUpperCase()]},e._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(e){if("click"===e)p(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(e){return i.toggle(e)});else if(e!==zn){var t=e===Qn?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=e===Qn?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;p(i.element).on(t,i.config.selector,function(e){return i._enter(e)}).on(n,i.config.selector,function(e){return i._leave(e)})}}),this._hideModalHandler=function(){i.element&&i.hide()},p(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var e=typeof this.element.getAttribute("data-original-title");!this.element.getAttribute("title")&&"string"==e||(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(e,t){var n=this.constructor.DATA_KEY;(t=t||p(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusin"===e.type?Vn:Qn]=!0),p(t.getTipElement()).hasClass(Bn)||t._hoverState===Fn?t._hoverState=Fn:(clearTimeout(t._timeout),t._hoverState=Fn,t.config.delay&&t.config.delay.show?t._timeout=setTimeout(function(){t._hoverState===Fn&&t.show()},t.config.delay.show):t.show())},e._leave=function(e,t){var n=this.constructor.DATA_KEY;(t=t||p(e.currentTarget).data(n))||(t=new this.constructor(e.currentTarget,this._getDelegateConfig()),p(e.currentTarget).data(n,t)),e&&(t._activeTrigger["focusout"===e.type?Vn:Qn]=!1),t._isWithActiveTrigger()||(clearTimeout(t._timeout),t._hoverState=Mn,t.config.delay&&t.config.delay.hide?t._timeout=setTimeout(function(){t._hoverState===Mn&&t.hide()},t.config.delay.hide):t.hide())},e._isWithActiveTrigger=function(){for(var e in this._activeTrigger)if(this._activeTrigger[e])return!0;return!1},e._getConfig=function(e){var t=p(this.element).data();return Object.keys(t).forEach(function(e){-1!==xn.indexOf(e)&&delete t[e]}),"number"==typeof(e=l({},this.constructor.Default,{},t,{},"object"==typeof e&&e?e:{})).delay&&(e.delay={show:e.delay,hide:e.delay}),"number"==typeof e.title&&(e.title=e.title.toString()),"number"==typeof e.content&&(e.content=e.content.toString()),m.typeCheckConfig(An,e,this.constructor.DefaultType),e.sanitize&&(e.template=In(e.template,e.whiteList,e.sanitizeFn)),e},e._getDelegateConfig=function(){var e={};if(this.config)for(var t in this.config)this.constructor.Default[t]!==this.config[t]&&(e[t]=this.config[t]);return e},e._cleanTipClass=function(){var e=p(this.getTipElement()),t=e.attr("class").match(Pn);null!==t&&t.length&&e.removeClass(t.join(""))},e._handlePopperPlacementChange=function(e){var t=e.instance;this.tip=t.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(e.placement))},e._fixTransition=function(){var e=this.getTipElement(),t=this.config.animation;null===e.getAttribute("x-placement")&&(p(e).removeClass(Un),this.config.animation=!1,this.hide(),this.show(),this.config.animation=t)},i._jQueryInterface=function(n){return this.each(function(){var e=p(this).data(On),t="object"==typeof n&&n;if((e||!/dispose|hide/.test(n))&&(e||(e=new i(this,t),p(this).data(On,e)),"string"==typeof n)){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.4.1"}},{key:"Default",get:function(){return Rn}},{key:"NAME",get:function(){return An}},{key:"DATA_KEY",get:function(){return On}},{key:"Event",get:function(){return Wn}},{key:"EVENT_KEY",get:function(){return Nn}},{key:"DefaultType",get:function(){return jn}}]),i}();p.fn[An]=Xn._jQueryInterface,p.fn[An].Constructor=Xn,p.fn[An].noConflict=function(){return p.fn[An]=kn,Xn._jQueryInterface};var Gn="popover",$n="bs.popover",Jn="."+$n,Zn=p.fn[Gn],ei="bs-popover",ti=new RegExp("(^|\\s)"+ei+"\\S+","g"),ni=l({},Xn.Default,{placement:"right",trigger:"click",content:"",template:''}),ii=l({},Xn.DefaultType,{content:"(string|element|function)"}),oi="fade",ri="show",si=".popover-header",ai=".popover-body",li={HIDE:"hide"+Jn,HIDDEN:"hidden"+Jn,SHOW:"show"+Jn,SHOWN:"shown"+Jn,INSERTED:"inserted"+Jn,CLICK:"click"+Jn,FOCUSIN:"focusin"+Jn,FOCUSOUT:"focusout"+Jn,MOUSEENTER:"mouseenter"+Jn,MOUSELEAVE:"mouseleave"+Jn},ci=function(e){function i(){return e.apply(this,arguments)||this}!function(e,t){e.prototype=Object.create(t.prototype),(e.prototype.constructor=e).__proto__=t}(i,e);var t=i.prototype;return t.isWithContent=function(){return this.getTitle()||this._getContent()},t.addAttachmentClass=function(e){p(this.getTipElement()).addClass(ei+"-"+e)},t.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},t.setContent=function(){var e=p(this.getTipElement());this.setElementContent(e.find(si),this.getTitle());var t=this._getContent();"function"==typeof t&&(t=t.call(this.element)),this.setElementContent(e.find(ai),t),e.removeClass(oi+" "+ri)},t._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},t._cleanTipClass=function(){var e=p(this.getTipElement()),t=e.attr("class").match(ti);null!==t&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||e