From c1df3f0ca326465bf89e6af601da59fb8158408e Mon Sep 17 00:00:00 2001 From: Peter Bolha <xbolha@fi.muni.cz> Date: Sat, 29 Apr 2023 12:48:21 +0200 Subject: [PATCH 01/39] feat: custom api call upon first token enrollment --- privacyidea/api/token.py | 69 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/privacyidea/api/token.py b/privacyidea/api/token.py index 59b1dd8bc..ecd25263a 100644 --- a/privacyidea/api/token.py +++ b/privacyidea/api/token.py @@ -55,10 +55,17 @@ # You should have received a copy of the GNU Affero General Public # License along with this program. If not, see <http://www.gnu.org/licenses/>. # +import json +import jwt +from datetime import datetime +from http import HTTPStatus +import requests from flask import (Blueprint, request, g, current_app) from ..lib.log import log_with from .lib.utils import optional, send_result, send_csv_result, required, getParam + +from ..lib.tokenclass import ROLLOUTSTATE from ..lib.user import get_user_from_param from ..lib.token import (init_token, get_tokens_paginate, assign_token, unassign_token, remove_token, enable_token, @@ -125,6 +132,60 @@ To see how to authenticate read :ref:`rest_auth`. """ +def get_usable_tokens_count(user, all_user_tokens=None): + if not all_user_tokens: + all_user_tokens = get_tokens(user=user) + + token_dicts = [tokenobject.get_as_dict() for tokenobject in + all_user_tokens] + usable_tokens_count = 0 + + for token in token_dicts: + if ( + token["active"] + and not token["revoked"] + and not token["locked"] + and not token["rollout_state"] == ROLLOUTSTATE.CLIENTWAIT + and not token["rollout_state"] == ROLLOUTSTATE.VERIFYPENDING + ): + usable_tokens_count += 1 + + return usable_tokens_count + + +def perform_backchannel_logout(user): + cfg = current_app.config + logout_endpoint_url = cfg.get("logout_endpoint_url") + headers = { + "Content-type": "application/x-www-form-urlencoded" + } + token = { + "iss": cfg.get("issuer"), + "sub": f"{user.login}@{user.realm}", + "aud": cfg.get("audience"), + "iat": int(datetime.now().timestamp()), + "events": { + "http://schemas.openid.net/event/backchannel-logout": {} + } + } + encoded_token = jwt.encode(payload=token, + key=cfg.get("jwt_signkey"), + algorithm=cfg.get("signing_alg")) + + response = requests.post(logout_endpoint_url, + headers=headers, + data={"logout_token": encoded_token}, + ) + + if response.status_code == HTTPStatus.NO_CONTENT: + g.audit_object.log({'logout_result_msg': f"First token was registered and backchannel " + f"logout was successfully performed for user: '{user.login}'"}) + else: + g.audit_object.log({'logout_result_msg': f"Attempted backchannel logout for user: '" + f"{user.login}' failed with the result '{response.status_code}' - " + f"'{response.text}'"}) + + @token_blueprint.route('/init', methods=['POST']) @prepolicy(check_max_token_realm, request) @prepolicy(check_max_token_user, request) @@ -306,6 +367,7 @@ def init(): # tokenrealm = res['realms'] user = request.User + user_usable_tokens_before = get_usable_tokens_count(user) tokenobject = init_token(param, user, tokenrealms=tokenrealms) @@ -317,6 +379,11 @@ def init(): init_details = tokenobject.get_init_detail(param, user) response_details.update(init_details) + user_usable_tokens_after = get_usable_tokens_count(user) + has_first_usable_token = user_usable_tokens_before == 0 and user_usable_tokens_after > 0 + if has_first_usable_token: + perform_backchannel_logout(user) + g.audit_object.log({'user': user.login, 'realm': user.realm, 'serial': tokenobject.token.serial, @@ -331,7 +398,7 @@ def init(): # log.debug("setting random pin for token with serial " # "%s and user: %s" % (serial, user)) # setPin(newpin, None, serial) - + # finally we render the info as qr immage, if the qr parameter # is provided and if the token supports this # if 'qr' in param and tokenobject is not None: -- GitLab From be95d9139aba5b80a635a1fbe367f03d824b25f5 Mon Sep 17 00:00:00 2001 From: Peter Bolha <xbolha@fi.muni.cz> Date: Sun, 30 Apr 2023 09:04:21 +0200 Subject: [PATCH 02/39] feat: custom auditing to log file --- .../lib/auditmodules/customloggeraudit.py | 268 ++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 privacyidea/lib/auditmodules/customloggeraudit.py diff --git a/privacyidea/lib/auditmodules/customloggeraudit.py b/privacyidea/lib/auditmodules/customloggeraudit.py new file mode 100644 index 000000000..c22c82a5c --- /dev/null +++ b/privacyidea/lib/auditmodules/customloggeraudit.py @@ -0,0 +1,268 @@ +# -*- coding: utf-8 -*- +# +# 2019-11-06 Cornelius Kölbel <cornelius.koelbel@netknights.it> +# initial code for writing audit information to a file +# 2023-14-04 Peter Bolha <485456@mail.muni.cz> +# addition of custom logging properties +# +# This code is free software; you can redistribute it and/or +# modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +# License as published by the Free Software Foundation; either +# version 3 of the License, or any later version. +# +# This code is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE for more details. +# +# You should have received a copy of the GNU Affero General Public +# License along with this program. If not, see <http://www.gnu.org/licenses/>. +# +# +__doc__ = """The Logger Audit Module is used to write audit entries to the +Python logging module. + +The Custom Logger Audit Module is configured like this: + + PI_AUDIT_MODULE = "privacyidea.lib.auditmodules.customloggeraudit" + PI_AUDIT_SERVERNAME = "your choice" + + PI_LOGCONFIG = "/etc/privacyidea/logging.cfg" + +The LoggerAudit Class uses the same PI logging config as you could use anyways. +To explicitly write audit logs, you need to add something like the following to +the logging.cfg + +Example: + +[handlers] +keys=file,audit + +[loggers] +keys=root,privacyidea,audit + +... + +[logger_audit] +handlers=audit +qualname=privacyidea.lib.auditmodules.customloggeraudit +level=INFO + +[handler_audit] +class=logging.handlers.RotatingFileHandler +backupCount=14 +maxBytes=10000000 +formatter=detail +level=INFO +args=('/var/log/privacyidea/audit.log',) + +""" + +import json +import logging +import logging.config +from datetime import datetime + +from privacyidea.api.token import get_usable_tokens_count +from privacyidea.lib.auditmodules.base import Audit as AuditBase +from privacyidea.lib.token import get_tokens +from privacyidea.lib.user import User + + +class Audit(AuditBase): + """ + This is a custom LoggerAudit module, which writes the audit entries + to the Python logging. It builds upon LoggerAudit module and adds custom + information regarding operations with tokes via API. + + .. note:: This audit module does not provide a *Read* capability. + """ + + # TODO adjust docs + # TODO mark that custom loggerfile must exist and have proper + # permissions in order to work + def __init__(self, config=None, startdate=None): + super(Audit, self).__init__(config, startdate) + self.name = "customloggeraudit" + + self.qualname = self.config.get("PI_AUDIT_LOGGER_QUALNAME", __name__) + self.logger = logging.getLogger(self.qualname) + + self.custom_logger_qualname = self.config.get("CUSTOM_LOGGER_QUALNAME", + "custom_logger") + self.custom_logger = logging.getLogger(self.custom_logger_qualname) + + def get_user_object(self): + login = self.audit_data["user"] + realm = self.audit_data["realm"] + resolver = self.audit_data["resolver"] + + return User(login=login, realm=realm, resolver=resolver) + + def has_usable_token(self, user, all_user_tokens=None): + return get_usable_tokens_count(user, all_user_tokens) > 0 + + def handle_token_creation(self): + user = self.get_user_object() + all_user_tokens = get_tokens(user=user) + + if len(all_user_tokens) == 1: + token_type = self.audit_data["token_type"] + serial = self.audit_data["serial"] + + if self.has_usable_token(user, all_user_tokens): + # self.custom_logger.info(self.audit_data["logout_result_msg"]) + self.custom_logger.info( + f"user '{user.login}' has successfully registered their " + f"first " + f"token. It is of type '{token_type}' with serial '" + f"{serial}'" + ) + else: + self.custom_logger.info( + f"user '{user.login}' has attempted registration of " + f"their first token. It was of type '{token_type}' with " + f"serial '{serial}' but something went wrong and the " + f"registered token is not usable." + ) + + def handle_token_deletion(self): + user = self.get_user_object() + serial = self.audit_data["serial"] + all_user_tokens = get_tokens(user=user) + + if not self.has_usable_token(user, all_user_tokens): + self.custom_logger.info( + f"user '{user.login}' has deleted a token with serial '" + f"{serial}' leaving them with no usable tokens left." + ) + + def handle_single_token_disabling(self): + user = self.get_user_object() + serial = self.audit_data["serial"] + + if not self.has_usable_token(user): + self.custom_logger.info( + f"user '{user.login}' has disabled a token with serial '" + f"{serial}'. All the remaining user's tokens are not " + f"currently " + f"usable." + ) + + def handle_all_tokens_disabling(self): + user = self.get_user_object() + all_user_tokens = get_tokens(user=user) + affected_serials = [ + tokenobject.get_as_dict()["serial"] for tokenobject in + all_user_tokens + ] + self.custom_logger.info( + f"user '{user.login}' has disabled all of their tokens. Affected " + f"token serial numbers: {affected_serials}" + ) + + def handle_all_tokens_enabling(self): + user = self.get_user_object() + all_user_tokens = get_tokens(user=user) + affected_serials = [ + tokenobject.get_as_dict()["serial"] for tokenobject in + all_user_tokens + ] + all_tokens_enabled_message = ( + f"user '{user.login}' has enabled all " + f"of their tokens. Affected token " + f"serial numbers: " + f"{affected_serials}." + ) + + if not self.has_usable_token(user, all_user_tokens): + all_tokens_enabled_message += ( + " Despite this action, user still does not have any usable " + "tokens." + ) + + self.custom_logger.info(all_tokens_enabled_message) + + def handle_single_token_enabling(self): + user = self.get_user_object() + serial = self.audit_data["serial"] + + # enabling this token caused the user to have usable tokens again + if get_usable_tokens_count(user) == 1: + self.custom_logger.info( + f"user '{user.login}' has enabled a token with serial '" + f"{serial}'. User has a usable token again." + ) + + def handle_single_token_revoking(self): + user = self.get_user_object() + serial = self.audit_data["serial"] + all_user_tokens = get_tokens(user=user) + + if not self.has_usable_token(user, all_user_tokens): + self.custom_logger.info( + f"user '{user.login}' has revoked a token with serial '" + f"{serial}' leaving them with no usable tokens left." + ) + + def handle_all_tokens_revoking(self): + user = self.get_user_object() + all_user_tokens = get_tokens(user=user) + affected_serials = [ + tokenobject.get_as_dict()["serial"] for tokenobject in + all_user_tokens + ] + self.custom_logger.info( + f"user '{user.login}' has revoked all of their tokens. Affected " + f"token serial numbers: {affected_serials}" + ) + + def add_custom_log_info(self): + api_call = self.audit_data["action"] + + # creation of a new token + if api_call == "POST /token/init": + self.handle_token_creation() + # deletion of an existing token + elif api_call == "DELETE /token/<serial>": + self.handle_token_deletion() + elif api_call == "POST /token/disable": + # disabling of a single user's token + if self.audit_data["serial"]: + self.handle_single_token_disabling() + # disabling of all user's tokens + else: + self.handle_all_tokens_disabling() + # enabling of all user's tokens + elif api_call == "POST /token/enable": + # enabling of a single user's token + if self.audit_data["serial"]: + self.handle_single_token_enabling() + # enabling of all user's tokens + else: + self.handle_all_tokens_enabling() + elif api_call == "POST /token/revoke": + # revoking of a single user's token + if self.audit_data["serial"]: + self.handle_single_token_revoking() + # revoking of all user's tokens + else: + self.handle_all_tokens_revoking() + + def finalize_log(self): + """ + This method is used to log the data + e.g. write the data to a file. + """ + self.audit_data["policies"] = ",".join( + self.audit_data.get("policies", [])) + self.audit_data["timestamp"] = datetime.utcnow().isoformat() + if self.audit_data.get("startdate"): + duration = datetime.utcnow() - self.audit_data.get("startdate") + self.audit_data["duration"] = "{0!s}".format(duration) + self.audit_data["startdate"] = self.audit_data.get( + "startdate").isoformat() + self.logger.info( + "{0!s}".format(json.dumps(self.audit_data, sort_keys=True))) + self.add_custom_log_info() + self.audit_data = {} -- GitLab From f24783f246c746ff9e43b6bcccf73e01b8bbee37 Mon Sep 17 00:00:00 2001 From: Peter Bolha <xbolha@fi.muni.cz> Date: Sun, 30 Apr 2023 09:04:31 +0200 Subject: [PATCH 03/39] feat: new way of saving enrolled BUC --- .../token/controllers/tokenControllers.js | 41 +++++++++++++++++++ .../views/token.enrolled.backupcode.html | 11 +++-- privacyidea/static/templates/footer.html | 4 ++ 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/privacyidea/static/components/token/controllers/tokenControllers.js b/privacyidea/static/components/token/controllers/tokenControllers.js index c7bdaac46..75c3bf58a 100644 --- a/privacyidea/static/components/token/controllers/tokenControllers.js +++ b/privacyidea/static/components/token/controllers/tokenControllers.js @@ -435,6 +435,7 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", var otps_count = Object.keys($scope.enrolledToken.otps).length; $scope.otp_row_count = parseInt(otps_count/5 + 0.5); $scope.otp_rows = Object.keys($scope.enrolledToken.otps).slice(0, $scope.otp_row_count); + $scope.enrolledOtps = Object.values($scope.enrolledToken.otps); } if ($scope.enrolledToken.certificate) { var blob = new Blob([ $scope.enrolledToken.certificate ], @@ -647,6 +648,46 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", return true; }; + $scope.downloadBackupcodePDF = function () { + const { jsPDF } = window.jspdf; + const now = new Date().toLocaleString('cs-CZ'); + const serial = $scope.enrolledToken.serial; + const rows = $scope.enrolledOtps.map((element, index) => ({id: `${index + 1}`, otp: element})); + const privacyIDEAColor = $('.progress-bar').css('background-color'); + const rgbArray = privacyIDEAColor.match(/\d+/g).map(num => parseInt(num)); + + var doc = new jsPDF(); + const fontSizeBig = 18; + const fontSizeSmall = 12; + const xOffset = 14; + const yOffset = 10; + const colorGray = 100; + + // Print description texts + doc.setFontSize(fontSizeBig) + doc.text(`Token: ${serial}`, xOffset, yOffset); + doc.setFontSize(fontSizeSmall) + doc.setTextColor(colorGray) + doc.text(now, xOffset, yOffset * 2) + + // Prepare table with OTP keys + doc.autoTable({ + head: [{id: '#', otp: 'OTP'}], + headStyles: { + halign: 'center', + textColor: 255, + fillColor: rgbArray + }, + body: rows, + startY: yOffset * 2.5, + columnStyles: { + id: { fontStyle: 'bold', halign: 'center' }, + }, + }); + + doc.save(`${serial}.pdf`) + } + // =========================================================== // =============== Date stuff =============================== // =========================================================== diff --git a/privacyidea/static/components/token/views/token.enrolled.backupcode.html b/privacyidea/static/components/token/views/token.enrolled.backupcode.html index 795ec7930..1684e67f4 100644 --- a/privacyidea/static/components/token/views/token.enrolled.backupcode.html +++ b/privacyidea/static/components/token/views/token.enrolled.backupcode.html @@ -4,9 +4,7 @@ <div uib-accordion-group class="panel-default" heading="{{ 'The OTP values'|translate }}"> - <div id="paperOtpTable"> - <div ng-include="instanceUrl+'/'+piCustomization+ - '/views/includes/token.enrolled.tan.top.html'"></div> + <div id="paperOtpTable" style="width: 594pt"> <div class="table-responsive"> <table class="table table-bordered table-striped tantoken"> @@ -44,15 +42,16 @@ </tbody> </table> </div> - <div ng-include="instanceUrl+'/'+piCustomization+ - '/views/includes/token.enrolled.tan.bottom.html'"></div> </div> </div> </uib-accordion> </div> </div> + +<div class="progress-bar" id="colorSampleElement"></div> + <button class="btn-default btn" - ng-click="printOtp()"> + ng-click="downloadBucTable()"> <span class="glyphicon glyphicon-print"></span> <span ng-show="browserLanguage === 'en'">print or download as PDF</span> <span ng-show="browserLanguage === 'cs'">vytisknout nebo uloĹľit jako PDF</span> diff --git a/privacyidea/static/templates/footer.html b/privacyidea/static/templates/footer.html index ca297f876..34f1594a3 100644 --- a/privacyidea/static/templates/footer.html +++ b/privacyidea/static/templates/footer.html @@ -82,5 +82,9 @@ <script src="{{ instance }}/{{ "static/contrib/js/angular-inform.js" | versioned }}"></script> <script src="{{ instance }}/{{ "static/contrib/js/webauthn-client/pi-webauthn.js" | versioned }}"></script> <script src="{{ instance }}/{{ "static/contrib/js/u2f-api.js" | versioned }}"></script> +<!-- jsPDF - Script for generating PDF files --> +<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js" integrity="sha512-qZvrmS2ekKPF2mSznTQsxqPgnpkI4DNTlrdUmTzrDgektczlKNRRhy5X5AAOnx5S09ydFYWWNSfcEqDTTHgtNA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> +<!-- autotable - Script for creating formatted tables compatible with jsPDF --> +<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.5.28/jspdf.plugin.autotable.min.js" integrity="sha512-03CCNkeosDFN2zCCu4vLpu3pJfZcrL48F3yB8k87ejT+OVMwco7IH3FW02vtbGhdncS6gyYZ/duYaC/K62xQPQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> </body> </html> -- GitLab From 0197369c356f583637c1e4e06ab3e6a679390304 Mon Sep 17 00:00:00 2001 From: Peter Bolha <xbolha@fi.muni.cz> Date: Fri, 19 May 2023 15:41:47 +0200 Subject: [PATCH 04/39] feat: new registration flow --- privacyidea/api/token.py | 57 +++- privacyidea/lib/policy.py | 11 + .../dialogs/views/dialog.mfa.activated.html | 29 ++ .../token/controllers/tokenControllers.js | 99 +++++- .../components/token/factories/token.js | 19 +- .../static/components/token/states/states.js | 2 +- .../progress_bars/progress.bar.1of2.html | 11 + .../progress_bars/progress.bar.1of4.html | 23 ++ .../progress_bars/progress.bar.2of2.html | 11 + .../progress_bars/progress.bar.2of4.html | 23 ++ .../progress_bars/progress.bar.3of4.html | 23 ++ .../progress_bars/progress.bar.4of4.html | 23 ++ .../views/token.enrolled.backupcode.html | 95 +++--- .../token/views/token.enrolled.totp.html | 138 ++++++--- .../static/components/token/views/token.html | 4 +- .../token/views/token.info.backupcode.html | 7 + .../token/views/token.info.totp.html | 7 + .../token/views/token.info.webauthn.html | 5 + .../token/views/token.modified.enroll.html | 282 ++++++++++++++++++ privacyidea/static/css/token-enroll-flow.css | 158 ++++++++++ privacyidea/static/templates/footer.html | 3 + setup.py | 1 + 22 files changed, 917 insertions(+), 114 deletions(-) create mode 100644 privacyidea/static/components/dialogs/views/dialog.mfa.activated.html create mode 100644 privacyidea/static/components/token/views/progress_bars/progress.bar.1of2.html create mode 100644 privacyidea/static/components/token/views/progress_bars/progress.bar.1of4.html create mode 100644 privacyidea/static/components/token/views/progress_bars/progress.bar.2of2.html create mode 100644 privacyidea/static/components/token/views/progress_bars/progress.bar.2of4.html create mode 100644 privacyidea/static/components/token/views/progress_bars/progress.bar.3of4.html create mode 100644 privacyidea/static/components/token/views/progress_bars/progress.bar.4of4.html create mode 100644 privacyidea/static/components/token/views/token.info.backupcode.html create mode 100644 privacyidea/static/components/token/views/token.info.totp.html create mode 100644 privacyidea/static/components/token/views/token.info.webauthn.html create mode 100644 privacyidea/static/components/token/views/token.modified.enroll.html create mode 100644 privacyidea/static/css/token-enroll-flow.css diff --git a/privacyidea/api/token.py b/privacyidea/api/token.py index ecd25263a..607f89431 100644 --- a/privacyidea/api/token.py +++ b/privacyidea/api/token.py @@ -56,11 +56,15 @@ # License along with this program. If not, see <http://www.gnu.org/licenses/>. # import json +import os +import re + import jwt from datetime import datetime from http import HTTPStatus import requests +import yaml from flask import (Blueprint, request, g, current_app) from ..lib.log import log_with from .lib.utils import optional, send_result, send_csv_result, required, getParam @@ -81,6 +85,7 @@ from ..lib.token import (init_token, get_tokens_paginate, assign_token, assign_tokengroup, unassign_tokengroup, set_tokengroups) from werkzeug.datastructures import FileStorage from cgi import FieldStorage +from perun.connector import AdaptersManager from privacyidea.lib.error import (ParameterError, TokenAdminError) from privacyidea.lib.importotp import (parseOATHcsv, parseSafeNetXML, parseYubicoCSV, parsePSKCdata, GPGImport) @@ -153,6 +158,25 @@ def get_usable_tokens_count(user, all_user_tokens=None): return usable_tokens_count +@token_blueprint.route('/count_usable', methods=['GET']) +@prepolicy(check_base_action, request, action=ACTION.COUNT_USABLE) +@event("count_usable_tokens", request, g) +@log_with(log) +def count_usable_api(): + """ + Get the number of usable tokens of given user. + + :jsonparam serial: The serial number of a single token. + + :return: Number of usable tokens of given user + :rtype: int + """ + # If the API is called by a user, we pass the User Object to the function + user = request.User + res = get_usable_tokens_count(user=user) + return send_result(res) + + def perform_backchannel_logout(user): cfg = current_app.config logout_endpoint_url = cfg.get("logout_endpoint_url") @@ -186,6 +210,35 @@ def perform_backchannel_logout(user): f"'{response.text}'"}) +def load_attrs_manager_config(config_filepath): + if os.path.exists(config_filepath): + with open(config_filepath, 'r') as f: + config = yaml.safe_load(f) + return config + else: + log.info(f"Attempted to load attributes manager config from " + f"'{config_filepath}' but the file was not found.'") + return None + + +def enable_mfa_everywhere(user): + cfg = load_attrs_manager_config('/etc/perun-connector.yaml') + + if not cfg: + log.debug("Wasn't able to load the attributes manager config, " + "so the MFA activation will not be performed.") + return + + # TODO load attr from cfg(?) + mfa_enforce_attr = "urn:perun:user:attribute-def:def:mfaEnforceSettings:mu" + adapters_manager = AdaptersManager(cfg['attributes_manager_config'], + cfg['attributes_map']) + + perun_user_id_candidates = re.findall(r'\d+', user.uid) + perun_user_id = int(perun_user_id_candidates[0]) + adapters_manager.set_user_attributes(perun_user_id, {mfa_enforce_attr: "all"}) + + @token_blueprint.route('/init', methods=['POST']) @prepolicy(check_max_token_realm, request) @prepolicy(check_max_token_user, request) @@ -382,7 +435,9 @@ def init(): user_usable_tokens_after = get_usable_tokens_count(user) has_first_usable_token = user_usable_tokens_before == 0 and user_usable_tokens_after > 0 if has_first_usable_token: - perform_backchannel_logout(user) + # TODO enable logout after the endpoint has been configured and deployed + # perform_backchannel_logout(user) + enable_mfa_everywhere(user) g.audit_object.log({'user': user.login, 'realm': user.realm, diff --git a/privacyidea/lib/policy.py b/privacyidea/lib/policy.py index 12a26ca26..e89898eb8 100644 --- a/privacyidea/lib/policy.py +++ b/privacyidea/lib/policy.py @@ -245,6 +245,7 @@ class ACTION(object): GETCHALLENGES = "getchallenges" COPYTOKENPIN = "copytokenpin" COPYTOKENUSER = "copytokenuser" + COUNT_USABLE = "count_usable" DEFAULT_TOKENTYPE = "default_tokentype" DELETE = "delete" DISABLE = "disable" @@ -1626,6 +1627,12 @@ def get_static_policy_definitions(scope=None): 'Admin is allowed to import token files.'), 'mainmenu': [MAIN_MENU.TOKENS], 'group': GROUP.SYSTEM}, + ACTION.COUNT_USABLE: {'type': 'bool', + "desc": _( + "Admin is allowed to get the number " + "of user's usable tokens."), + 'mainmenu': [MAIN_MENU.TOKENS], + 'group': GROUP.TOKEN}, ACTION.DELETE: {'type': 'bool', 'desc': _( 'Admin is allowed to remove tokens from the ' @@ -1997,6 +2004,10 @@ def get_static_policy_definitions(scope=None): "tokens."), 'mainmenu': [MAIN_MENU.TOKENS], 'group': GROUP.TOKEN}, + ACTION.COUNT_USABLE: {'type': 'bool', + "desc": _("The user is allowed to get the number of their usable tokens."), + 'mainmenu': [MAIN_MENU.TOKENS], + 'group': GROUP.TOKEN}, ACTION.DELETE: {'type': 'bool', "desc": _( "The user is allowed to delete his own " diff --git a/privacyidea/static/components/dialogs/views/dialog.mfa.activated.html b/privacyidea/static/components/dialogs/views/dialog.mfa.activated.html new file mode 100644 index 000000000..0cc1b3f09 --- /dev/null +++ b/privacyidea/static/components/dialogs/views/dialog.mfa.activated.html @@ -0,0 +1,29 @@ +<!-- Modal --> +<div class="modal fade" id="dialogMFAActivated" tabindex="-1" + role="dialog" + aria-labelledby="myModalDialog" + aria-hidden="true"> + <div class="modal-dialog"> + <div class="modal-content"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" + aria-label="Close"> + <span aria-hidden="true">×</span></button> + <h4 class="modal-title" id="myModalDialog" translate> + Multi-factor authentication has been activated</h4> + </div> + <div class="modal-body"> + <p translate> + All the services of Masaryk University will require multi-factor authentication from this point + onwards. If you want to change this, you can manage the list of services for which you will have MFA + activated later in this setup. + </p> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-primary" + data-dismiss="modal">OK + </button> + </div> + </div> + </div> +</div> diff --git a/privacyidea/static/components/token/controllers/tokenControllers.js b/privacyidea/static/components/token/controllers/tokenControllers.js index 75c3bf58a..1d2251b30 100644 --- a/privacyidea/static/components/token/controllers/tokenControllers.js +++ b/privacyidea/static/components/token/controllers/tokenControllers.js @@ -90,7 +90,7 @@ myApp.controller("tokenController", ['TokenFactory', 'ConfigFactory', '$scope', if ($scope.pin_change) { $location.path("/pinchange"); } - + // listen to the reload broadcast $scope.$on("piReload", function() { /* Due to the parameter "live_search" in the get function @@ -190,6 +190,13 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", useIt: false }; $scope.enrolling = false; + $scope.awaitingBackupcodeEnroll = false; + $scope.awaitingSetupCompletion = false; + $scope.hasUsableTokens = false; + $scope.hasSeenMFADialog = false; + $scope.hasDownloadedBackupcodes = false; + $scope.isVisibleTOTPAppCode = false; + $scope.initiallyAllowedTokenTypes = ['totp']; $scope.formInit = { tokenTypes: {"hotp": gettextCatalog.getString("HOTP: event based One Time Passwords"), @@ -485,6 +492,54 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", ); }; + $scope.calculateHasUsableTokens = function () { + // Having usable tokens is a prerequisite for enrolling some token types. + // Admin, however can enroll any token at any time for any user. + if ($scope.loggedInUser.role === 'admin') { + $scope.hasUsableTokens = true; + return $scope.hasUsableTokens; + } + + $scope.newUser.user = fixUser($scope.newUser.user); + TokenFactory.getUsableTokensCount($scope.newUser, + function (data) { + if (data) { + $scope.hasUsableTokens = data.result.value > 0; + console.log(`"${$scope.newUser.user} has usable token: ${$scope.hasUsableTokens}"`); + return $scope.hasUsableTokens; + } + console.log(`"${$scope.newUser.user} has no usable token"`); + }, function () {console.log("An Error occurred while fetching the number of available tokens.")} + ); + return false; + }; + + $scope.showMFAActivationDialog = function () { + const dialogMFAActivated = $('#dialogMFAActivated'); + + dialogMFAActivated.modal(); + + // Continue to next stage after the modal has been closed + dialogMFAActivated.on('hidden.bs.modal', function () { + $scope.enrollToken(); + $scope.enrolledToken = null; + $scope.enrolling = false; + $scope.awaitingBackupcodeEnroll = true; + $scope.form.type='backupcode'; + console.log('Modal closed'); + }); + }; + + $scope.isAllowedInitially = function (tokentype) { + return $scope.initiallyAllowedTokenTypes.includes(tokentype); + }; + + + + $scope.toggleTOTPAppCodeVisibility = function () { + $scope.isVisibleTOTPAppCode = !$scope.isVisibleTOTPAppCode; + }; + $scope.pollTokenInfo = function () { TokenFactory.getTokenForSerial($scope.enrolledToken.serial, function(data) { $scope.enrolledToken.rollout_state = data.result.value.tokens[0].rollout_state; @@ -648,7 +703,7 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", return true; }; - $scope.downloadBackupcodePDF = function () { + $scope.getBackupcodePDF = function () { const { jsPDF } = window.jspdf; const now = new Date().toLocaleString('cs-CZ'); const serial = $scope.enrolledToken.serial; @@ -659,16 +714,29 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", var doc = new jsPDF(); const fontSizeBig = 18; const fontSizeSmall = 12; - const xOffset = 14; + const xOffset = 30; const yOffset = 10; const colorGray = 100; + const colorBlack = 0; + + // Assuming content is a centered block with left and right margins + const contentWidth = doc.internal.pageSize.getWidth() - xOffset * 2; // Print description texts - doc.setFontSize(fontSizeBig) + doc.setFontSize(fontSizeBig); doc.text(`Token: ${serial}`, xOffset, yOffset); - doc.setFontSize(fontSizeSmall) - doc.setTextColor(colorGray) - doc.text(now, xOffset, yOffset * 2) + + doc.setFontSize(fontSizeSmall); + doc.text(`User: ${$scope.newUser.user}`, xOffset, yOffset * 2); + + doc.setTextColor(colorGray); + doc.text(now, xOffset, yOffset * 3); + + doc.setTextColor(colorBlack); + doc.text(xOffset, yOffset * 5, "In case you lose access to your token (e.g. lost smartphone) you can still authenticate to the " + + "services of the Masaryk University using one of the following backup codes. Please mind that the backup " + + "codes are single use, meaning each code gets invalidated after being used to authenticate.", + { maxWidth: contentWidth }); // Prepare table with OTP keys doc.autoTable({ @@ -679,13 +747,26 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", fillColor: rgbArray }, body: rows, - startY: yOffset * 2.5, + startY: yOffset * 7, + margin: {left: xOffset, right: xOffset}, + tableWidth: contentWidth, columnStyles: { id: { fontStyle: 'bold', halign: 'center' }, }, }); + $scope.hasDownloadedBackupcodes = true; + + return {doc: doc, serial: serial}; + } + + $scope.printBackupcodePDF = function () { + const result = $scope.getBackupcodePDF() + window.open(result.doc.output('bloburl'), '_blank').print(); + } - doc.save(`${serial}.pdf`) + $scope.downloadBackupcodePDF = function () { + const result = $scope.getBackupcodePDF() + result.doc.save(`${result.serial}.pdf`) } // =========================================================== diff --git a/privacyidea/static/components/token/factories/token.js b/privacyidea/static/components/token/factories/token.js index a6501a041..c4afeebee 100644 --- a/privacyidea/static/components/token/factories/token.js +++ b/privacyidea/static/components/token/factories/token.js @@ -256,6 +256,23 @@ angular.module("TokenModule", ["privacyideaAuth"]) params: params, headers: {'PI-Authorization': AuthFactory.getAuthToken()} }).then(function (response) { callback(response.data) }, function(error) { AuthFactory.authError(error.data) }); - } + }, + getUsableTokensCount: function (userObject, callback, callback_error) { + const username = fixUser(userObject.user); + let params = {}; + if (username) { + params.user = username; + params.realm = userObject.realm; + } + $http.get(tokenUrl + "/count_usable", { + // params: params, + headers: {'PI-Authorization': AuthFactory.getAuthToken()} + }).then(function (response) { callback(response.data) }, + function(error) { AuthFactory.authError(error.data); + if (callback_error) { + callback_error(error.data); + } + }); + }, }; }]); diff --git a/privacyidea/static/components/token/states/states.js b/privacyidea/static/components/token/states/states.js index 2d1c904c6..6ccbafd11 100644 --- a/privacyidea/static/components/token/states/states.js +++ b/privacyidea/static/components/token/states/states.js @@ -64,7 +64,7 @@ angular.module('privacyideaApp.tokenStates', ['ui.router', 'privacyideaApp.versi }) .state('token.enroll', { url: "/enroll/:realmname/:username", - templateUrl: tokenpath + "token.enroll.html" + versioningSuffixProviderProvider.$get().$get(), + templateUrl: tokenpath + "token.modified.enroll.html" + versioningSuffixProviderProvider.$get().$get(), controller: "tokenEnrollController", params: { realmname: null, username: null }, }) diff --git a/privacyidea/static/components/token/views/progress_bars/progress.bar.1of2.html b/privacyidea/static/components/token/views/progress_bars/progress.bar.1of2.html new file mode 100644 index 000000000..05e247af4 --- /dev/null +++ b/privacyidea/static/components/token/views/progress_bars/progress.bar.1of2.html @@ -0,0 +1,11 @@ +<div class="progresses"> + <div class="steps filled"> + <span><b>1</b></span> + </div> + + <span class="line empty"></span> + + <div class="steps empty"> + <span><i class="glyphicon glyphicon-ok"></i></span> + </div> +</div> \ No newline at end of file diff --git a/privacyidea/static/components/token/views/progress_bars/progress.bar.1of4.html b/privacyidea/static/components/token/views/progress_bars/progress.bar.1of4.html new file mode 100644 index 000000000..ee6fdf146 --- /dev/null +++ b/privacyidea/static/components/token/views/progress_bars/progress.bar.1of4.html @@ -0,0 +1,23 @@ +<div class="progresses"> + <div class="steps filled"> + <span><b>1</b></span> + </div> + + <span class="line empty"></span> + + <div class="steps empty"> + <span><b>2</b></span> + </div> + + <span class="line empty"></span> + + <div class="steps empty"> + <span><b>3</b></span> + </div> + + <span class="line empty"></span> + + <div class="steps empty"> + <span><i class="glyphicon glyphicon-ok"></i></span> + </div> +</div> \ No newline at end of file diff --git a/privacyidea/static/components/token/views/progress_bars/progress.bar.2of2.html b/privacyidea/static/components/token/views/progress_bars/progress.bar.2of2.html new file mode 100644 index 000000000..a2e563259 --- /dev/null +++ b/privacyidea/static/components/token/views/progress_bars/progress.bar.2of2.html @@ -0,0 +1,11 @@ +<div class="progresses"> + <div class="steps filled"> + <span><b>1</b></span> + </div> + + <span class="line filled"></span> + + <div class="steps filled"> + <span><i class="glyphicon glyphicon-ok"></i></span> + </div> +</div> \ No newline at end of file diff --git a/privacyidea/static/components/token/views/progress_bars/progress.bar.2of4.html b/privacyidea/static/components/token/views/progress_bars/progress.bar.2of4.html new file mode 100644 index 000000000..ac5e00db0 --- /dev/null +++ b/privacyidea/static/components/token/views/progress_bars/progress.bar.2of4.html @@ -0,0 +1,23 @@ +<div class="progresses"> + <div class="steps filled"> + <span><b>1</b></span> + </div> + + <span class="line filled"></span> + + <div class="steps filled"> + <span><b>2</b></span> + </div> + + <span class="line empty"></span> + + <div class="steps empty"> + <span><b>3</b></span> + </div> + + <span class="line empty"></span> + + <div class="steps empty"> + <span><i class="glyphicon glyphicon-ok"></i></span> + </div> +</div> \ No newline at end of file diff --git a/privacyidea/static/components/token/views/progress_bars/progress.bar.3of4.html b/privacyidea/static/components/token/views/progress_bars/progress.bar.3of4.html new file mode 100644 index 000000000..2cb3211fe --- /dev/null +++ b/privacyidea/static/components/token/views/progress_bars/progress.bar.3of4.html @@ -0,0 +1,23 @@ +<div class="progresses"> + <div class="steps filled"> + <span><b>1</b></span> + </div> + + <span class="line filled"></span> + + <div class="steps filled"> + <span><b>2</b></span> + </div> + + <span class="line filled"></span> + + <div class="steps filled"> + <span><b>3</b></span> + </div> + + <span class="line empty"></span> + + <div class="steps empty"> + <span><i class="glyphicon glyphicon-ok"></i></span> + </div> +</div> \ No newline at end of file diff --git a/privacyidea/static/components/token/views/progress_bars/progress.bar.4of4.html b/privacyidea/static/components/token/views/progress_bars/progress.bar.4of4.html new file mode 100644 index 000000000..35e5f9013 --- /dev/null +++ b/privacyidea/static/components/token/views/progress_bars/progress.bar.4of4.html @@ -0,0 +1,23 @@ +<div class="progresses"> + <div class="steps filled"> + <span><b>1</b></span> + </div> + + <span class="line filled"></span> + + <div class="steps filled"> + <span><b>2</b></span> + </div> + + <span class="line filled"></span> + + <div class="steps filled"> + <span><b>3</b></span> + </div> + + <span class="line filled"></span> + + <div class="steps filled"> + <span><i class="glyphicon glyphicon-ok"></i></span> + </div> +</div> \ No newline at end of file diff --git a/privacyidea/static/components/token/views/token.enrolled.backupcode.html b/privacyidea/static/components/token/views/token.enrolled.backupcode.html index 1684e67f4..52b03d74e 100644 --- a/privacyidea/static/components/token/views/token.enrolled.backupcode.html +++ b/privacyidea/static/components/token/views/token.enrolled.backupcode.html @@ -1,58 +1,45 @@ -<div class="row"> - <div class="col-sm-12"> - <uib-accordion close-others="oneAtATime"> - <div uib-accordion-group - class="panel-default" - heading="{{ 'The OTP values'|translate }}"> - <div id="paperOtpTable" style="width: 594pt"> - <div class="table-responsive"> - <table class="table table-bordered table-striped - tantoken"> - <thead> - <tr> - <th translate>#</th> - <th>OTP</th> - <th translate>#</th> - <th>OTP</th> - <th translate>#</th> - <th>OTP</th> - <th translate>#</th> - <th>OTP</th> - <th translate>#</th> - <th>OTP</th> - </tr> - </thead> - <tbody> - <tr ng-repeat="key in otp_rows"> - <td>{{ $index }}</td> - <td>{{ enrolledToken.otps[$index] }}</td> - <td>{{ $index+(1*otp_row_count) }}</td> - <td>{{ enrolledToken.otps[$index+ - (1*otp_row_count)] }}</td> - <td>{{ $index+(2*otp_row_count) }}</td> - <td>{{ enrolledToken.otps[$index+ - (2*otp_row_count)] }}</td> - <td>{{ $index+(3*otp_row_count) }}</td> - <td>{{ enrolledToken.otps[$index+ - (3*otp_row_count)] }}</td> - <td>{{ $index+(4*otp_row_count) }}</td> - <td>{{ enrolledToken.otps[$index+ - (4*otp_row_count)] }}</td> - </tr> - </tbody> - </table> - </div> +<div> + <div class="progress-bar" id="colorSampleElement"></div> + <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b>Save backup codes for + restoring access to your account</b></h3> + <button class="btn-default btn margin-vertical margin-right" + ng-click="downloadBackupcodePDF()"> + <span class="glyphicon glyphicon-download-alt"></span> + <span ng-show="browserLanguage === 'en'"><b>Download</b></span> + <span ng-show="browserLanguage === 'cs'"><b>UloĹľit</b></span> + </button> + <button class="btn-default btn margin-vertical" + ng-click="printBackupcodePDF()"> + <span class="glyphicon glyphicon-print"></span> + <span ng-show="browserLanguage === 'en'"><b>Print</b></span> + <span ng-show="browserLanguage === 'cs'"><b>Vytisknout</b></span> + </button> + <div class="row margin-bottom"> + <div class="col-sm-12"> + <uib-accordion close-others="oneAtATime"> + <div uib-accordion-group + heading="{{ 'Show backup codes'|translate }}"> + <ul class="list-group no-margin-bottom"> + <li class="list-group-item alternate-row" ng-repeat="otp in enrolledOtps"><b>{{$index + 1}}.</b> + {{otp}} + </li> + </ul> </div> - </div> - </uib-accordion> + </uib-accordion> + </div> + </div> + <div> + <h5><b>Why are the backup codes important?</b></h5> + <p> + In case you lose access to your token (e.g. lost smartphone) you can still authenticate to the services of + the + Masaryk University using backup codes. You can simply enter a backup code instead of the code generated by + the + authenticator application on your smartphone. Please mind that the backup codes are <b>single use</b>, + meaning + each code gets <b>invalidated after being used</b> to authenticate. If you have used up most or all of your + codes, it is recommended to generate new ones. + </p> </div> </div> -<div class="progress-bar" id="colorSampleElement"></div> - -<button class="btn-default btn" - ng-click="downloadBucTable()"> - <span class="glyphicon glyphicon-print"></span> - <span ng-show="browserLanguage === 'en'">print or download as PDF</span> - <span ng-show="browserLanguage === 'cs'">vytisknout nebo uloĹľit jako PDF</span> -</button> diff --git a/privacyidea/static/components/token/views/token.enrolled.totp.html b/privacyidea/static/components/token/views/token.enrolled.totp.html index 8e55f73f5..7aa2121cc 100644 --- a/privacyidea/static/components/token/views/token.enrolled.totp.html +++ b/privacyidea/static/components/token/views/token.enrolled.totp.html @@ -1,53 +1,99 @@ -<div class="row"> - <div ng-hide="form['2stepinit'] && enrolledToken.rollout_state !== 'clientwait'" - ng-class="$state.includes('token.wizard') == true && form['2stepinit'] == false ? 'col-sm-12' : 'col-sm-6'"> - <img width="{{ qrCodeWidth }}" - ng-class="$state.includes('token.wizard') == true && form['2stepinit'] == false ? 'centered' : 'not-centered'" - ng-src="{{ enrolledToken.googleurl.img }}"/> +<div class="totp-verify-mobile limit-max-width"> + <div ng-show="enrolledToken.rollout_state === 'enrolled'" class="limit-max-width'"> + <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b>Token enrolled + successfully</b></h3> + <div class="margin-bottom"> + Your TOTP token has been successfully enrolled and verified. + </div> </div> - <div ng-hide="form['2stepinit']" - ng-class="$state.includes('token.wizard') == true && form['2stepinit'] == false ? 'col-sm-12' : 'col-sm-6'"> - <uib-accordion close-others="oneAtATime" ng-show="show_seed"> - <div uib-accordion-group - class="panel-default" - heading="{{ 'The OTP key'|translate }}"> - Hex: {{ enrolledToken.otpkey.value }}<br/> - Base32: {{ enrolledToken.otpkey.value_b32 }} + <div ng-show="enrolledToken.rollout_state === 'verify'" class="limit-max-width"> + <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b>Authentication setup</b> + </h3> + <div class="margin-bottom-large max-available-width"> + <div class="margin-bottom"> + Scan the QR code with your TOTP application, e.g. <a + href="https://play.google.com/store/apps/details?id=com.beemdevelopment.aegis" , target="_blank"><b>Aegis + Authenticator</b></a> + (Android) or <a href="https://apps.apple.com/us/app/raivo-otp/id1459042137" , target="_blank"><b>Raivo + OTP</b></a> + (iOS). If you're + unable to scan the QR code and you have the TOTP application on this device, <a href="" + ng-click="toggleTOTPAppCodeVisibility()"><b>click + here</b></a> to + reveal the text code. + </div> + <div class="totp-app-init-panel" ng-show="isVisibleTOTPAppCode"> + <div class="card-body"> + <h4 class="card-title"><b>TOTP initiation code</b></h4> + <div ng-show="enrolledToken.googleurl.value"> + <h6 class="card-subtitle mb-2 text-muted">On mobile, you can try clicking the link below instead + of + scanning the QR code. If nothing happens, you can still manually enter the codes below the + link + into your TOTP app.</h6> + <p translate class="card-text totp-app-init-code"> + <b>Link:</b> <a href="{{ enrolledToken.googleurl.value }}">click here</a> + </p> + </div> + <h6 class="card-subtitle mb-2 text-muted">If the link above didn't seem to do anything, try copying + one + of these codes into your TOTP app manually.</h6> + <p class="card-text totp-app-init-code"><b>Hex:</b> {{ enrolledToken.otpkey.value }}</p> + <p class="card-text totp-app-init-code"><b>Base32:</b> {{ enrolledToken.otpkey.value_b32}}</p> + </div> </div> - </uib-accordion> + </div> + <div ng-hide="form['2stepinit'] && enrolledToken.rollout_state !== 'clientwait'" + ng-class="$state.includes('token.wizard') == true && form['2stepinit'] == false ? 'col-sm-12' : 'col-sm-6'"> + <img width="{{ qrCodeWidth }}" + ng-class="$state.includes('token.wizard') == true && form['2stepinit'] == false ? 'centered limit-max-width' : 'not-centered limit-max-width'" + ng-src="{{ enrolledToken.googleurl.img }}"/> + </div> + <div ng-hide="form['2stepinit']" + ng-class="$state.includes('token.wizard') == true && form['2stepinit'] == false ? 'col-sm-12' : 'col-sm-6'"> + <uib-accordion close-others="oneAtATime" ng-show="show_seed"> + <div uib-accordion-group + class="panel-default" + heading="{{ 'The OTP key'|translate }}"> + Hex: {{ enrolledToken.otpkey.value }}<br/> + Base32: {{ enrolledToken.otpkey.value_b32 }} + </div> + </uib-accordion> - <div class="col-sm-12" ng-hide="$state.includes('token.wizard')"> - <p translate ng-show="enrolledToken.googleurl.value"> - Click <a href="{{ enrolledToken.googleurl.value }}">here</a> or scan - the QR Code, if you - want to add the Token to your Google Authenticator. - </p> - <p translate> - The QR Code contains the secret key of your token. You need to - protect it. <b>If you are in doubt, that someone else saw it, please - regenerate the QR Code, when no one else is watching.</b> - </p> - <button ng-click="regenerateToken()" class="btn btn-warning" translate> - Regenerate QR Code - </button> + <div class="col-sm-12 margin-bottom-large" ng-hide="$state.includes('token.wizard')"> + <p translate> + The QR Code contains the secret key of your token. You need to + protect it. If you are in doubt, that someone else saw it, please + regenerate the QR Code, when no one else is watching. <a href ng-click="regenerateToken()"><b>Regenerate + QR code</b></a> + </p> + </div> </div> - </div> - <div class="col-sm-6" ng-show="form['2stepinit'] && enrolledToken.rollout_state === 'clientwait'"> - <p translate> - Your token {{ enrolledToken.serial }} is not completely enrolled, yet. - </p> - <p translate> - Please scan the QR code with the privacyIDEA authenticator app and enter - the generated code below. - </p> - <div class="form-group"> - <label for="clientpart" translate>Client Part</label> - <input type="text" ng-model="$parent.clientpart" - autofocus - class="form-control" - name="clientpart"> - <button type="button" ng-click="sendClientPart()" - class="btn btn-primary" translate>Enroll Token</button> + <div class="col-sm-6" ng-show="form['2stepinit'] && enrolledToken.rollout_state === 'clientwait'"> + <p translate> + Your token {{ enrolledToken.serial }} is not completely enrolled, yet. + </p> + <p translate> + Please scan the QR code with the privacyIDEA authenticator app and enter + the generated code below. + </p> + <div class="form-group"> + <label for="clientpart" translate>Client Part</label> + <input type="text" ng-model="$parent.clientpart" + autofocus + class="form-control" + name="clientpart"> + <button type="button" ng-click="sendClientPart()" + class="btn btn-primary" translate>Enroll Token + </button> + </div> + </div> + <div class="padding-top inline-block"> + <p translate=""><b>Insert the TOTP code from your application</b></p> + <p translate="">Your application will display a six-digit code after scanning the QR code. Please enter the + code + into the field below.</p> </div> </div> </div> + diff --git a/privacyidea/static/components/token/views/token.html b/privacyidea/static/components/token/views/token.html index 347aebc28..d8b6c186d 100644 --- a/privacyidea/static/components/token/views/token.html +++ b/privacyidea/static/components/token/views/token.html @@ -1,7 +1,7 @@ <div class="well" ng-controller="tokenController"> <div class="row"> - <div class="col-lg-3 sticky" ng-hide="token_wizard"> + <div class="col-lg-3 desktop-sticky" ng-hide="token_wizard"> <div class="pa-sidebar panel"> <ul class="nav nav-pills nav-stacked"> <li role="presentation" @@ -112,7 +112,7 @@ </div> <div ng-class="{'col-lg-9': !token_wizard, 'col-lg-12': token_wizard}" - ui-view class="slide panel"> + ui-view class="slide panel panel-margins"> </div> </div> </div> diff --git a/privacyidea/static/components/token/views/token.info.backupcode.html b/privacyidea/static/components/token/views/token.info.backupcode.html new file mode 100644 index 000000000..a96464bf1 --- /dev/null +++ b/privacyidea/static/components/token/views/token.info.backupcode.html @@ -0,0 +1,7 @@ +<div> + This method can be turned on after the primary verification method has been set up (TOTP). Backup codes are + <b>single-use</b> codes used for gaining access to your account in case you lose access to your primary verification + device. You can store them on your electronic device or print them. It's highly recommended to keep them on a <b>separate + device</b> from the one that holds your primary token. You should also generate new backup codes in case you have + used most or all of the current ones. +</div> \ No newline at end of file diff --git a/privacyidea/static/components/token/views/token.info.totp.html b/privacyidea/static/components/token/views/token.info.totp.html new file mode 100644 index 000000000..f61966ac4 --- /dev/null +++ b/privacyidea/static/components/token/views/token.info.totp.html @@ -0,0 +1,7 @@ +<div> + TOTP codes are generated by an application installed on your smartphone or computer, e.g. <a + href="https://play.google.com/store/apps/details?id=com.beemdevelopment.aegis" , target="_blank"><b>Aegis + Authenticator</b></a> (Android) or <a href="https://apps.apple.com/us/app/raivo-otp/id1459042137" , target="_blank"><b>Raivo + OTP</b></a> (iOS). It will display a new verification code every 30 seconds. You can copy this code and insert it + while logging in. +</div> \ No newline at end of file diff --git a/privacyidea/static/components/token/views/token.info.webauthn.html b/privacyidea/static/components/token/views/token.info.webauthn.html new file mode 100644 index 000000000..5a6439f63 --- /dev/null +++ b/privacyidea/static/components/token/views/token.info.webauthn.html @@ -0,0 +1,5 @@ +<div> + This method can be turned on after the primary verification method has been set up (TOTP). Security key uses a + standard defined by the W3C and Fido Alliance organizations. You can use your smartphone, computer or a physical + security keychain (e.g. YubiKey) depending on your device's capabilities. +</div> \ No newline at end of file diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html new file mode 100644 index 000000000..634abb26e --- /dev/null +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -0,0 +1,282 @@ +<div ng-init="calculateHasUsableTokens()" class="panel padded-panel"> + <!-- Hide the form, after the token was enrolled --> + <!-- 1/4 Show this only before the initial TOTP token is registered --> + <div ng-hide="enrolledToken || awaitingBackupcodeEnroll || awaitingSetupCompletion"> + <div ng-if="!hasUsableTokens"> + <ng-include + src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.1of4.html'"></ng-include> + </div> + <div ng-if="hasUsableTokens"> + <ng-include + src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.1of2.html'"></ng-include> + </div> + + <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b>Multi-factor + authentication</b></h3> + <!-- Configurable prolog --> + <div ng-if="$state.includes('token.wizard')" + ng-include="instanceUrl+'/'+piCustomization+ + '/views/includes/token.enroll.pre.top.html'"></div> + + <form name="formEnrollToken" role="form" validate ng-init="form.type = 'totp'"> + <div class="form-group" ng-repeat="(type, desc) in formInit.tokenTypes"> + <input class="form-check-input" type="radio" name="{type}" id="radio{{type}}" value="{{type}}" + ng-model="form.type" + ng-change="changeTokenType()" + ng-disabled="!(hasUsableTokens || isAllowedInitially(type))" + > + <label class="form-check-label custom-form-check-label" for="radio{{type}}" + ng-style="!(hasUsableTokens || isAllowedInitially(type)) ? { color: 'darkgray' } : {}"> + {{desc}} + </label> + <ng-include + src="instanceUrl + '/static/components/token/views/token.info.' + type + '.html'"></ng-include> + </div> + + <!-- The description input field for all token types --> + <div class="form-group" ng-hide="loggedInUser.role == 'user' && !checkRight('setdescription')"> + <label for="description" translate>Description</label> + <p>Optionally, you can provide a description for your token. This will help you tell them apart if you + enroll multiple tokens. For example, you can use your device or TOTP application name as a hint.</p> + <input type="text" class="form-control" id="description" + autocomplete="new-password" + placeholder="{{ 'Samsung phone - Aegis authenticator'|translate }}" + ng-model="form.description"/> + </div> + + <!-- User Assignment --> + <div ng-if="loggedInUser.role == 'admin' && $state.includes('token.rollover') == false"> + <h4 translate><b>Assign token to user</b></h4> + + <div assign-user new-user-object="newUser" realms="realms" + default-realm="defaultRealm"></div> + + <div class="msg-block" + ng-show="formEnrollToken.otppin2.$error.passwordVerify"> + <span class="msg-error" translate>OTP PINs do not match!</span> + </div> + </div> + <!-- Token PIN --> + <div class="form-group" + ng-if="loggedInUser.role == 'user' && !hidePin && + (!$state.includes('token.wizard') || getRightsValue('otp_pin_minlength'))&& + checkRight('enrollpin')"> + <label for="otppin" translate>PIN</label> + <input name="otppin" ng-model="newUser.pin" + type=password class="form-control" + equals="{{ pin2 }}" + placeholder="{{ 'Type a password'|translate }}"> + <input name="otppin2" ng-model="pin2" + type=password class="form-control" + equals="{{ newUser.pin }}" + placeholder="{{ 'Repeat password'|translate }}"> + </div> + + <!-- Extended attributes --> + <uib-accordion ng-hide="$state.includes('token.wizard') || + loggedInUser.role=='user'"> + <div uib-accordion-group + class="panel-default" + heading="{{ 'Extended Attributes'|translate }}"> + <div class="form-group col-sm-6"> + <label for="validity_start" + translate>Validity Start + </label> + <p class="input-group col-sm-12"> + <input type="text" class="form-control" + name="validity_start" + uib-datepicker-popup="yyyy-MM-ddTHH:mmZ" + ng-model="form.validity_period_start" + is-open="startOpened" + min-date="today" + show-button-bar="false" + close-text="Close"/> + <span class="input-group-btn"> + <button type="button" class="btn btn-default" + ng-click="startOpened = openDate($event)"> + <i class="glyphicon glyphicon-calendar"></i> + </button> + </span> + </p> + </div> + <div class="form-group col-sm-6"> + <label for="validity_end" + translate>Validity End + </label> + <p class="input-group col-sm-12"> + <input type="text" class="form-control" + name="validity_end" + uib-datepicker-popup="yyyy-MM-ddTHH:mmZ" + ng-model="form.validity_period_end" + is-open="endOpened" + show-button-bar="false" + min-date="today" + close-text="Close"/> + <span class="input-group-btn"> + <button type="button" class="btn btn-default" + ng-click="endOpened = openDate($event)"><i + class="glyphicon glyphicon-calendar"></i> + </button> + </span> + </p> + </div> + <p class="help" translate> + The start time and the end time of the validity period + should be entered in the format + <em>YYYY-MM-DDThh:mm+oooo</em>. + </p> + </div> + </uib-accordion> + + <!-- pass the rollover info in the form --> + <input type="checkbox" ng-show="false" name="rollover" + ng-init="form.rollover = $state.includes('token.rollover')" + ng-model="form.rollover"/> + <div class="text-center"> + <button type="button" ng-click="enrollToken()" + ng-disabled="!checkEnroll() || formEnrollToken.$invalid || enrolling" + class="btn btn-primary margin-bottom"> + <span ng-if="$state.includes('token.rollover') == false" translate>Continue</span> + <span ng-if="$state.includes('token.rollover')" translate>Rollover Token</span> + </button> + </div> + </form> + + <!-- Configurable epilog --> + <div ng-if="$state.includes('token.wizard')" + ng-include="instanceUrl+'/'+piCustomization+ + '/views/includes/token.enroll.pre.bottom.html'"></div> + + </div> + + <!-- Show this information after the token was enrolled completely --> + <!-- 2/4 Show this after the initial TOTP token was registered --> + <div ng-show="enrolledToken && !awaitingBackupcodeEnroll"> + <div ng-if="!hasUsableTokens"> + <ng-include + src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.2of4.html'"></ng-include> + </div> + <div ng-if="hasUsableTokens"> + <ng-include + src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.2of2.html'"></ng-include> + </div> + + <div ng-if="$state.includes('token.wizard')" + ng-include="instanceUrl+'/'+piCustomization+ + '/views/includes/token.enroll.post.top.html'"></div> + + <!-- This is the token data section. It differs for every token type--> + <ng-include src="instanceUrl + + '/static/components/token/views/token.enrolled.' + form.type + '.html' + fileVersionSuffix"> + </ng-include> + + <!-- Verify Token enrollment --> + <div ng-show="enrolledToken.rollout_state === 'verify'"> + <div class="form-group verify-totp"> + <input type="text" ng-model="verifyResponse" + autofocus + class="form-control" + placeholder="123456" + name="verifyResponse"> + </div> + <div class="text-center"> + <button type="button" ng-click="sendVerifyResponse()" + class="btn btn-primary margin-bottom" translate>Verify Token + </button> + </div> + </div> + + <!-- Token Wizard --> + <div ng-if="$state.includes('token.wizard')" + ng-include="instanceUrl+'/'+piCustomization+ + '/views/includes/token.enroll.post.bottom.html'"></div> + + <div class="text-center" ng-hide="click_wait || enrolledToken.rollout_state === 'clientwait' + || enrolledToken.rollout_state === 'verify'"> + <!-- Confirm MFA activation dialog after registering initial token --> + <button ng-click="hasSeenMFADialog = true; showMFAActivationDialog()" + ng-hide="hasUsableTokens || hasSeenMFADialog" + class="btn btn-primary margin-bottom" translate>Continue + </button> + <!-- Proceed to next page after confirming the MFA activation dialog --> + <!-- <button ng-click="enrollToken(); enrolledToken = null; enrolling = false; awaitingBackupcodeEnroll = true; form.type='backupcode';"--> + <!-- ng-hide="hasUsableTokens || !hasSeenMFADialog"--> + <!-- class="btn btn-primary margin-bottom" translate>Continue--> + <!-- </button>--> + <!-- Finish the enrollment process if this wasn't the user's initial token --> + <button ng-click="enrolledToken = null; enrolling = false;" + ng-hide="!hasUsableTokens" + ui-sref="token.list" + class="btn btn-primary margin-bottom" translate>Finish + </button> + </div> + </div> + + <!-- 3/4 Show this after the initial TOTP token was registered --> + <div ng-show="awaitingBackupcodeEnroll"> + <div ng-if="!hasUsableTokens"> + <ng-include + src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.3of4.html'"></ng-include> + </div> + + <div ng-if="$state.includes('token.wizard')" + ng-include="instanceUrl+'/'+piCustomization+ + '/views/includes/token.enroll.post.top.html'"></div> + + <!-- This is the token data section. It differs for every token type--> + <ng-include src="instanceUrl + + '/static/components/token/views/token.enrolled.' + form.type + '.html' + fileVersionSuffix"> + </ng-include> + <div class="text-center"> + <button ng-click="awaitingBackupcodeEnroll = false; awaitingSetupCompletion = true; enrolledToken = null;" + ng-disabled="!hasDownloadedBackupcodes" + class="btn btn-primary margin-bottom" translate>I have my backup codes + </button> + </div> + </div> + + <!-- 4/4 Show this after the initial TOTP token and the initial backupcodes have been registered --> + <div ng-show="awaitingSetupCompletion"> + <div ng-if="!hasUsableTokens"> + <ng-include + src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.4of4.html'"></ng-include> + </div> + + <div class="totp-verify-mobile"> + <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b>Multi-factor + authentication has been successfully set up!</b></h3> + + <p><b>Which services will now require multi-factor authentication?</b></p> + <p>Multi-factor authentication is currently activated for all the services. To manage your settings click + the Service settings button below</p> + + <!-- Open Perun settings in a new tab --> + <a class="btn-default btn margin-bottom-large" href="https://account.muni.cz/profile/settings/auth" + target="_blank"> + Service + settings + </a> + </div> + + <div class="totp-verify-mobile"> + <h3><b>Add another method of multi-factor authentication? (optional)</b></h3> + <p><b>Now you can set up an additional method of authentication using security key(s) for easier log in and + account + recovery + in future.</b></p> + <p>Security keys use a standard defined by organizations W3C and Fido Alliance. You can use your + smartphone, + computer or a physical security key (e.g. YubiKey).</p> + <button class="btn-default btn margin-bottom-large" + ng-click="calculateHasUsableTokens(); awaitingSetupCompletion = false; form.type='webauthn'; form.description=''"> + Set up a security key + </button> + </div> + <div class="text-center"> + <button ng-click="awaitingSetupCompletion=false;" + ui-sref="token.list" + class="btn btn-primary margin-bottom" translate>Finish + </button> + </div> + </div> +</div> diff --git a/privacyidea/static/css/token-enroll-flow.css b/privacyidea/static/css/token-enroll-flow.css new file mode 100644 index 000000000..d43ba55b3 --- /dev/null +++ b/privacyidea/static/css/token-enroll-flow.css @@ -0,0 +1,158 @@ +:root { + --primary-bg-color: #337ab7; + --primary-border-color: #2e6da4; + --secondary-bg-color: #f9f9f9; + --secondary-border-color: #c0c0c0; +} + +.margin-bottom { + margin-bottom: 15px; +} + +.margin-bottom-large { + margin-bottom: 45px; +} + +.margin-top { + margin-top: 15px; +} + +.margin-right { + margin-right: 15px; +} + +.margin-vertical { + margin-top: 15px; + margin-bottom: 15px; +} + +.no-margin-bottom { + margin-bottom: 0; +} + +.padding-top { + padding-top: 15px; +} + +.max-available-width { + max-width: -webkit-fill-available; +} + +.main-heading-element { + margin-top: 20px; + margin-bottom: 20px; +} + +.padded-panel { + padding-left: 10%; + padding-right: 10%; + margin-bottom: 0; +} + + +.form-control-top { + margin-top: 10px; +} + +input[type="radio"] { + margin-bottom: 0; +} + +.custom-form-check-label { + display: contents; +} + +.inline-block { + display: inline-block; +} + +.limit-max-width { + max-width: 100%; +} + +.totp-app-init-panel { + margin-bottom: 15px; + border: 1px solid var(--secondary-border-color); + border-radius: 5px; + background-color: var(--secondary-bg-color); + padding: 10px +} + +.totp-app-init-code { + word-wrap: break-word; +} + +@media (max-width: 1200px) { + .panel-margins { + margin-top: 15px; + margin-left: 15px; + margin-right: 15px; + } +} + +.verify-totp { + width: 30%; +} + +@media (max-width: 600px) { + .verify-totp { + width: 100%; + } + + .totp-verify-mobile { + display: flex; + flex-direction: column; + align-items: center; + } +} + +@media (min-width: 1200px) { + .desktop-sticky { + position: sticky; + top: 0; + } +} + +.alternate-row:nth-child(even) { + background-color: var(--secondary-bg-color); +} + +/* Progress bar */ +body { + background-color: #eee; + font-family: "Poppins", sans-serif; + font-weight: 300; +} + +.progresses { + display: flex; + align-items: center; + justify-content: space-between; + margin-top: 15px; + margin-bottom: 45px; +} + +.line { + width: 100%; + height: 6px; +} + +.empty { + background: lightgray +} + +.filled { + background: var(--primary-bg-color); +} + +.steps { + display: flex; + color: #fff; + font-size: 14px; + width: 40px; + height: 40px; + align-items: center; + justify-content: center; + border-radius: 50%; + padding: 20px; +} diff --git a/privacyidea/static/templates/footer.html b/privacyidea/static/templates/footer.html index 34f1594a3..9b36fb13f 100644 --- a/privacyidea/static/templates/footer.html +++ b/privacyidea/static/templates/footer.html @@ -16,6 +16,9 @@ <ng-include src="'{{ instance }}/{{ "static/components/dialogs/views/dialog.no.token.html" | versioned }}'"> </ng-include> +<ng-include src="'{{ instance }}/{{ "static/components/dialogs/views/dialog.mfa.activated.html" | versioned }}'"> +</ng-include> + <!--load all javascripts after the HTML part--> <script src="{{ instance }}/{{ "static/contrib/js/angular.js" | versioned }}"></script> <script src="{{ instance }}/{{ "static/contrib/js/ui-bootstrap-tpls.js" | versioned }}"></script> diff --git a/setup.py b/setup.py index afc615aa7..5964fb430 100644 --- a/setup.py +++ b/setup.py @@ -49,6 +49,7 @@ install_requires = ["beautifulsoup4[lxml]>=4.3.2", "ldap3>=2.6", "netaddr>=0.7.12", "passlib[bcrypt]>=1.7.0", + "perun.connector~=3.3", "argon2_cffi>=20.1.0", "pydash>=4.7.4", "PyJWT>=1.3.0", -- GitLab From 1201431c457d9a55fecce63cb4a99e25e57f095f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ou=C5=A1ek?= <brousek@ics.muni.cz> Date: Fri, 19 May 2023 16:41:45 +0200 Subject: [PATCH 05/39] fix: correct value for mfaEnforceSettings --- privacyidea/api/token.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/privacyidea/api/token.py b/privacyidea/api/token.py index 607f89431..0e1623237 100644 --- a/privacyidea/api/token.py +++ b/privacyidea/api/token.py @@ -236,7 +236,7 @@ def enable_mfa_everywhere(user): perun_user_id_candidates = re.findall(r'\d+', user.uid) perun_user_id = int(perun_user_id_candidates[0]) - adapters_manager.set_user_attributes(perun_user_id, {mfa_enforce_attr: "all"}) + adapters_manager.set_user_attributes(perun_user_id, {mfa_enforce_attr: "{\"all\":true}"}) @token_blueprint.route('/init', methods=['POST']) -- GitLab From 49aca0eba82d55b13a827bff28386d45ab20c51b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ou=C5=A1ek?= <brousek@ics.muni.cz> Date: Fri, 19 May 2023 23:07:31 +0200 Subject: [PATCH 06/39] feat: translations, minor text modifications (temporary, MUNI-specific) --- .../dialogs/views/dialog.mfa.activated.html | 6 +- .../views/token.enrolled.backupcode.html | 18 ++-- .../token/views/token.enrolled.totp.html | 83 +++++++++++-------- .../token/views/token.info.backupcode.html | 17 ++-- .../token/views/token.info.totp.html | 13 ++- .../token/views/token.info.webauthn.html | 12 +-- .../token/views/token.modified.enroll.html | 70 +++++++++------- 7 files changed, 122 insertions(+), 97 deletions(-) diff --git a/privacyidea/static/components/dialogs/views/dialog.mfa.activated.html b/privacyidea/static/components/dialogs/views/dialog.mfa.activated.html index 0cc1b3f09..8a8877014 100644 --- a/privacyidea/static/components/dialogs/views/dialog.mfa.activated.html +++ b/privacyidea/static/components/dialogs/views/dialog.mfa.activated.html @@ -10,13 +10,11 @@ aria-label="Close"> <span aria-hidden="true">×</span></button> <h4 class="modal-title" id="myModalDialog" translate> - Multi-factor authentication has been activated</h4> + {{ browserLanguage === 'cs' ? 'VĂcefázovĂ© ověřenĂ bylo aktivováno' : 'Multi-factor authentication has been activated' }}</h4> </div> <div class="modal-body"> <p translate> - All the services of Masaryk University will require multi-factor authentication from this point - onwards. If you want to change this, you can manage the list of services for which you will have MFA - activated later in this setup. + {{ browserLanguage === 'cs' ? 'Všechny sluĹľby, kterĂ© pouĹľĂvajĂ JednotnĂ© pĹ™ihlášenĂ MUNI, budou od tohoto okamĹľiku vyĹľadovat vĂcefázovĂ© ověřenĂ. NastavenĂ mĹŻĹľete pozdÄ›ji zmÄ›nit a vybrat si sluĹľby, pro kterĂ© budete mĂt vĂcefázovĂ© ověřenĂ aktivováno.' : 'All services which use MUNI Unified Login will require multi-factor authentication from this point onwards. If you want to change this, you can manage the list of services for which you will have MFA activated later in this setup.' }} </p> </div> <div class="modal-footer"> diff --git a/privacyidea/static/components/token/views/token.enrolled.backupcode.html b/privacyidea/static/components/token/views/token.enrolled.backupcode.html index 52b03d74e..98db02125 100644 --- a/privacyidea/static/components/token/views/token.enrolled.backupcode.html +++ b/privacyidea/static/components/token/views/token.enrolled.backupcode.html @@ -1,7 +1,6 @@ <div> <div class="progress-bar" id="colorSampleElement"></div> - <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b>Save backup codes for - restoring access to your account</b></h3> + <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b>{{ browserLanguage === 'cs' ? 'UloĹľte si záloĹľnĂ kĂłdy pro obnovenĂ pĹ™Ăstupu' : 'Save backup codes for restoring access to your account' }}</b></h3> <button class="btn-default btn margin-vertical margin-right" ng-click="downloadBackupcodePDF()"> <span class="glyphicon glyphicon-download-alt"></span> @@ -29,17 +28,14 @@ </div> </div> <div> - <h5><b>Why are the backup codes important?</b></h5> - <p> - In case you lose access to your token (e.g. lost smartphone) you can still authenticate to the services of - the - Masaryk University using backup codes. You can simply enter a backup code instead of the code generated by - the - authenticator application on your smartphone. Please mind that the backup codes are <b>single use</b>, - meaning - each code gets <b>invalidated after being used</b> to authenticate. If you have used up most or all of your + <h5><b>{{ browserLanguage === 'cs' ? 'ProÄŤ jsou záloĹľnĂ kĂłdy dĹŻleĹľitĂ©?' : 'Why are backup codes important?' }}</b></h5> + <p ng-show="browserLanguage === 'en'"> + In case you lose access to your token (e.g. lost smartphone) you can still authenticate to the services behind MUNI Unified Login using backup codes. You can simply enter a backup code instead of the code generated by the authenticator application or a password manager. Keep in mind that the backup codes are <b>single use</b>, meaning each code gets <b>invalidated after being used</b> to authenticate. If you have used up most or all of your codes, it is recommended to generate new ones. </p> + <p ng-show="browserLanguage === 'cs'"> + V pĹ™ĂpadÄ›, Ĺľe ztratĂte pĹ™Ăstup ke svĂ©mu tokenu (napĹ™. pĹ™i ztrátÄ› smartphonu), mĹŻĹľete se stále autentizovat ke sluĹľbám za JednotnĂ˝m pĹ™ihlášenĂm MUNI pomocĂ záloĹľnĂch kĂłdĹŻ. MĹŻĹľete jednoduše zadat záloĹľnĂ kĂłd mĂsto kĂłdu vygenerovanĂ©ho autentizaÄŤnĂ aplikacĂ nebo správcem hesel. ZáloĹľnĂ kĂłdy jsou <b>jednorázovĂ©</b>, coĹľ znamená, Ĺľe kaĹľdĂ˝ kĂłd je <b>po jednom pouĹľitĂ zneplatnÄ›n</b>. Pokud jste spotĹ™ebovali vÄ›tšinu nebo všechny svĂ© kĂłdy, doporuÄŤujeme vygenerovat si novĂ©. + </p> </div> </div> diff --git a/privacyidea/static/components/token/views/token.enrolled.totp.html b/privacyidea/static/components/token/views/token.enrolled.totp.html index 7aa2121cc..76cc22d86 100644 --- a/privacyidea/static/components/token/views/token.enrolled.totp.html +++ b/privacyidea/static/components/token/views/token.enrolled.totp.html @@ -1,45 +1,52 @@ <div class="totp-verify-mobile limit-max-width"> <div ng-show="enrolledToken.rollout_state === 'enrolled'" class="limit-max-width'"> - <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b>Token enrolled - successfully</b></h3> + <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b>Token enrolled</b></h3> <div class="margin-bottom"> - Your TOTP token has been successfully enrolled and verified. + {{ browserLanguage === 'cs' ? 'Vaše aplikace pro ověřovacĂ kĂłdy byla ĂşspěšnÄ› zaregistrována a ověřena.' : 'Your verification code app has been successfully enrolled and verified.' }} </div> </div> <div ng-show="enrolledToken.rollout_state === 'verify'" class="limit-max-width"> - <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b>Authentication setup</b> + <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element"><b>{{ browserLanguage === 'cs' ? 'NastavenĂ autentizace' : 'Authentication setup' }}</b> </h3> <div class="margin-bottom-large max-available-width"> - <div class="margin-bottom"> - Scan the QR code with your TOTP application, e.g. <a - href="https://play.google.com/store/apps/details?id=com.beemdevelopment.aegis" , target="_blank"><b>Aegis - Authenticator</b></a> - (Android) or <a href="https://apps.apple.com/us/app/raivo-otp/id1459042137" , target="_blank"><b>Raivo - OTP</b></a> - (iOS). If you're - unable to scan the QR code and you have the TOTP application on this device, <a href="" - ng-click="toggleTOTPAppCodeVisibility()"><b>click - here</b></a> to - reveal the text code. + <div class="margin-bottom" ng-show="browserLanguage === 'en'"> + Scan the QR code with your authenticator app, e.g. + <a href="https://getaegis.app/" target="_blank" rel="noopener nofollow"><b>Aegis Authenticator</b></a> (Android) + or <a href="https://raivo-otp.com/" target="_blank" rel="noopener nofollow"><b>Raivo OTP</b></a> (iOS). + + If you cannot scan a QR code and you have the app in this device, + <a href="" ng-click="toggleTOTPAppCodeVisibility()"><b>click here</b></a> to reveal the text code. + </div> + <div class="margin-bottom" ng-show="browserLanguage === 'cs'"> + Naskenujte QR kĂłd svou aplikacĂ pro ověřovacĂ kĂłdy, napĹ™. + <a href="https://getaegis.app/" target="_blank" rel="noopener nofollow"><b>Aegis Authenticator</b></a> (Android) + nebo <a href="https://raivo-otp.com/" target="_blank" rel="noopener nofollow"><b>Raivo OTP</b></a> (iOS). + + Pokud nemĹŻĹľete QR kĂłd naskenovat a aplikaci máte v tomto zaĹ™ĂzenĂ, + <a href="" ng-click="toggleTOTPAppCodeVisibility()"><b>kliknÄ›te zde</b></a> pro zobrazenĂ kĂłdu v textovĂ© podobÄ›. </div> <div class="totp-app-init-panel" ng-show="isVisibleTOTPAppCode"> <div class="card-body"> - <h4 class="card-title"><b>TOTP initiation code</b></h4> + <h4 class="card-title"><b>{{ browserLanguage == 'cs' ? 'tajnĂ˝ klĂÄŤ pro ruÄŤnĂ vloĹľenĂ' : 'secret key for manual input' }}</b></h4> <div ng-show="enrolledToken.googleurl.value"> - <h6 class="card-subtitle mb-2 text-muted">On mobile, you can try clicking the link below instead - of - scanning the QR code. If nothing happens, you can still manually enter the codes below the - link - into your TOTP app.</h6> - <p translate class="card-text totp-app-init-code"> - <b>Link:</b> <a href="{{ enrolledToken.googleurl.value }}">click here</a> + <h6 class="card-subtitle mb-2 text-muted" ng-show="browserLanguage === 'en'"> + You can try clicking the link below instead of scanning the QR code. + </h6> + <h6 class="card-subtitle mb-2 text-muted" ng-show="browserLanguage === 'cs'"> + MĂsto skenovánĂ QR kĂłdu mĹŻĹľete zkusit kliknout na odkaz nĂĹľe. + </h6> + <p class="card-text totp-app-init-code"> + <b>{{ browserLanguage == 'cs' ? 'Odkaz' : 'Link' }}:</b> <a href="{{ enrolledToken.googleurl.value }}">{{ browserLanguage == 'cs' ? 'kliknÄ›te zde' : 'click here' }}</a> </p> </div> - <h6 class="card-subtitle mb-2 text-muted">If the link above didn't seem to do anything, try copying - one - of these codes into your TOTP app manually.</h6> - <p class="card-text totp-app-init-code"><b>Hex:</b> {{ enrolledToken.otpkey.value }}</p> - <p class="card-text totp-app-init-code"><b>Base32:</b> {{ enrolledToken.otpkey.value_b32}}</p> + <h6 class="card-subtitle mb-2 text-muted" ng-show="browserLanguage === 'en'"> + If nothing happened after clicking the link above, try copying one of these codes into your TOTP app manually. + </h6> + <h6 class="card-subtitle mb-2 text-muted" ng-show="browserLanguage === 'cs'"> + Pokud se po kliknutĂ na výše uvedenĂ˝ odkaz nic nestalo, zkuste jeden z tÄ›chto kĂłdĹŻ zkopĂrovat do aplikace TOTP ruÄŤnÄ›. + </h6> + <p class="card-text totp-app-init-code"><b>{{ browserLanguage == 'cs' ? 'Base32 (nejÄŤastÄ›jšĂ)' : 'Base32 (most common)' }}:</b> {{ enrolledToken.otpkey.value_b32}}</p> + <p class="card-text totp-app-init-code"><b>{{ browserLanguage == 'cs' ? 'HexadecimálnÄ›' : 'Hexadecimal' }}:</b> {{ enrolledToken.otpkey.value }}</p> </div> </div> </div> @@ -63,10 +70,12 @@ <div class="col-sm-12 margin-bottom-large" ng-hide="$state.includes('token.wizard')"> <p translate> The QR Code contains the secret key of your token. You need to - protect it. If you are in doubt, that someone else saw it, please - regenerate the QR Code, when no one else is watching. <a href ng-click="regenerateToken()"><b>Regenerate - QR code</b></a> + protect it. <b>If you are in doubt, that someone else saw it, please + regenerate the QR Code, when no one else is watching.</b> </p> + <button ng-click="regenerateToken()" class="btn btn-warning" translate> + Regenerate QR Code + </button> </div> </div> <div class="col-sm-6" ng-show="form['2stepinit'] && enrolledToken.rollout_state === 'clientwait'"> @@ -89,10 +98,14 @@ </div> </div> <div class="padding-top inline-block"> - <p translate=""><b>Insert the TOTP code from your application</b></p> - <p translate="">Your application will display a six-digit code after scanning the QR code. Please enter the - code - into the field below.</p> + <p ng-show="browserLanguage === 'en'"><b>Insert a verification code from your application</b></p> + <p ng-show="browserLanguage === 'cs'"><b>VloĹľte ověřovacĂ kĂłd z aplikace</b></p> + <p ng-show="browserLanguage === 'en'"> + Your application will display a six-digit code after scanning the QR code. Please enter the code into the field below. + </p> + <p ng-show="browserLanguage === 'cs'"> + Vaše aplikace po naskenovánĂ QR kĂłdu zobrazà šestimĂstnĂ˝ kĂłd. Zadejte prosĂm kĂłd do pole nĂĹľe. + </p> </div> </div> </div> diff --git a/privacyidea/static/components/token/views/token.info.backupcode.html b/privacyidea/static/components/token/views/token.info.backupcode.html index a96464bf1..eb1345a2c 100644 --- a/privacyidea/static/components/token/views/token.info.backupcode.html +++ b/privacyidea/static/components/token/views/token.info.backupcode.html @@ -1,7 +1,12 @@ -<div> - This method can be turned on after the primary verification method has been set up (TOTP). Backup codes are +<div ng-show="browserLanguage === 'en'"> + This method can be enabled after verification codes have been set up. Backup codes are <b>single-use</b> codes used for gaining access to your account in case you lose access to your primary verification - device. You can store them on your electronic device or print them. It's highly recommended to keep them on a <b>separate - device</b> from the one that holds your primary token. You should also generate new backup codes in case you have - used most or all of the current ones. -</div> \ No newline at end of file + device. You can store them in PDF or print them. It is highly recommended to keep them <b>separately</b> from the device that you use to sign in regularly. + If you have used up most or all of your codes, it is recommended to generate new ones. +</div> +<div ng-show="browserLanguage === 'cs'"> + Tuto metodu lze aktivovat po nastavenĂ ověřovacĂch kĂłdĹŻ. ZáloĹľnĂ kĂłdy jsou + <b>jednorázovĂ©</b> kĂłdy pouĹľitelnĂ© k zĂskánĂ pĹ™Ăstupu k Vašemu účtu v pĹ™ĂpadÄ›, Ĺľe ztratĂte pĹ™Ăstup ke svĂ©mu primárnĂmu zaĹ™ĂzenĂ. + MĹŻĹľete si je uloĹľit do souboru PDF nebo vytisknout. DoporuÄŤujeme uchovávat je <b>oddÄ›lenÄ›</b> od zaĹ™ĂzenĂ, kterĂ˝m se běžnÄ› ověřujete. + Pokud jste spotĹ™ebovali vÄ›tšinu nebo všechny svĂ© kĂłdy, doporuÄŤujeme vygenerovat si novĂ©. +</div> diff --git a/privacyidea/static/components/token/views/token.info.totp.html b/privacyidea/static/components/token/views/token.info.totp.html index f61966ac4..ca1b6ceeb 100644 --- a/privacyidea/static/components/token/views/token.info.totp.html +++ b/privacyidea/static/components/token/views/token.info.totp.html @@ -1,7 +1,6 @@ -<div> - TOTP codes are generated by an application installed on your smartphone or computer, e.g. <a - href="https://play.google.com/store/apps/details?id=com.beemdevelopment.aegis" , target="_blank"><b>Aegis - Authenticator</b></a> (Android) or <a href="https://apps.apple.com/us/app/raivo-otp/id1459042137" , target="_blank"><b>Raivo - OTP</b></a> (iOS). It will display a new verification code every 30 seconds. You can copy this code and insert it - while logging in. -</div> \ No newline at end of file +<div ng-show="browserLanguage === 'en'"> + Verification codes are generated by an authenticator application or by a password manager installed in your device, e.g. <a href="https://getaegis.app/" target="_blank" rel="noopener nofollow"><b>Aegis Authenticator</b></a> (Android) or <a href="https://raivo-otp.com/" target="_blank" rel="noopener nofollow"><b>Raivo OTP</b></a> (iOS). It will display a new verification code every 30 seconds. You can copy this code and insert it or type it while logging in. +</div> +<div ng-show="browserLanguage === 'cs'"> + OvěřovacĂ kĂłdy jsou generovány ověřovacĂ aplikacĂ nebo správcem hesel nainstalovanĂ˝m ve vašem zaĹ™ĂzenĂ, napĹ™. <a href="https://getaegis.app/" target="_blank" rel="noopener nofollow"><b>Aegis Authenticator</b></a> (pro Android) nebo <a href="https: //raivo-otp.com/" target="_blank" rel="noopener nofollow"><b>Raivo OTP</b></a> (pro iOS). KaĹľdĂ˝ch 30 sekund se zobrazĂ novĂ˝ ověřovacĂ kĂłd. Tento kĂłd mĹŻĹľete zkopĂrovat a vloĹľit nebo opsat pĹ™i pĹ™ihlašovánĂ. +</div> diff --git a/privacyidea/static/components/token/views/token.info.webauthn.html b/privacyidea/static/components/token/views/token.info.webauthn.html index 5a6439f63..2b26a936e 100644 --- a/privacyidea/static/components/token/views/token.info.webauthn.html +++ b/privacyidea/static/components/token/views/token.info.webauthn.html @@ -1,5 +1,7 @@ -<div> - This method can be turned on after the primary verification method has been set up (TOTP). Security key uses a - standard defined by the W3C and Fido Alliance organizations. You can use your smartphone, computer or a physical - security keychain (e.g. YubiKey) depending on your device's capabilities. -</div> \ No newline at end of file +<div ng-show="browserLanguage === 'en'"> + This method can be enabled after verification codes have been set up. + Security keys (and passkeys) are a more secure and easier to use alternative to verification codes, but they are more complex to set up for the first time and they are not available for all devices and web browsers. Security keys are based on an open standard defined by the W3C and FIDO Alliance. You can use your smartphone, computer or a physical security token (e.g. a YubiKey) for verification. +</div> +<div ng-show="browserLanguage === 'cs'"> + Tuto metodu lze aktivovat po nastavenĂ ověřovacĂch kĂłdĹŻ. BezpeÄŤnostnĂ klĂÄŤe (a tzv. passkeys) jsou bezpeÄŤnÄ›jšà a snáze pouĹľitelnou alternativou k ověřovacĂm kĂłdĹŻm, ale jejich prvotnĂ nastavenĂ je sloĹľitÄ›jšà a nejsou dostupnĂ© pro všechna zaĹ™ĂzenĂ a webovĂ© prohlĂĹľeÄŤe. BezpeÄŤnostnĂ klĂÄŤe jsou zaloĹľeny na otevĹ™enĂ©m standardu definovanĂ©m organizacemi W3C a FIDO Alliance. K ověřenĂ mĹŻĹľete pouĹľĂt svĹŻj chytrĂ˝ telefon, poÄŤĂtaÄŤ nebo fyzickĂ˝ bezpeÄŤnostnĂ token (napĹ™. YubiKey). +</div> diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index 634abb26e..6931aaf7d 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -11,8 +11,7 @@ src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.1of2.html'"></ng-include> </div> - <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b>Multi-factor - authentication</b></h3> + <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b>{{ browserLanguage == 'cs' ? 'VĂcefázovĂ© ověřenĂ' : 'Multi-factor authentication' }}</b></h3> <!-- Configurable prolog --> <div ng-if="$state.includes('token.wizard')" ng-include="instanceUrl+'/'+piCustomization+ @@ -36,11 +35,17 @@ <!-- The description input field for all token types --> <div class="form-group" ng-hide="loggedInUser.role == 'user' && !checkRight('setdescription')"> <label for="description" translate>Description</label> - <p>Optionally, you can provide a description for your token. This will help you tell them apart if you - enroll multiple tokens. For example, you can use your device or TOTP application name as a hint.</p> + <p ng-show="browserLanguage === 'en'"> + Optionally, you can provide a description for your token. This will help you tell them apart if you + enroll multiple tokens. For example, you can use your device name or the authenticator app name as a hint. + </p> + <p ng-show="browserLanguage === 'en'"> + MĹŻĹľete zadat popis svĂ©ho tokenu (nepovinnĂ©). Popis sloužà k rozlišenĂ tokenĹŻ, pokud si jich zaregistrujete vĂce. + MĹŻĹľete napĹ™Ăklad pouĹľĂt název svĂ©ho zaĹ™ĂzenĂ nebo název ověřovacĂ aplikace. + </p> <input type="text" class="form-control" id="description" autocomplete="new-password" - placeholder="{{ 'Samsung phone - Aegis authenticator'|translate }}" + placeholder="Samsung - Aegis" ng-model="form.description"/> </div> @@ -181,8 +186,7 @@ </div> <div class="text-center"> <button type="button" ng-click="sendVerifyResponse()" - class="btn btn-primary margin-bottom" translate>Verify Token - </button> + class="btn btn-primary margin-bottom" translate>Verify Token</button> </div> </div> @@ -196,7 +200,7 @@ <!-- Confirm MFA activation dialog after registering initial token --> <button ng-click="hasSeenMFADialog = true; showMFAActivationDialog()" ng-hide="hasUsableTokens || hasSeenMFADialog" - class="btn btn-primary margin-bottom" translate>Continue + class="btn btn-primary margin-bottom">{{ browserLanguage == 'cs' ? 'PokraÄŤovat' : 'Continue' }} </button> <!-- Proceed to next page after confirming the MFA activation dialog --> <!-- <button ng-click="enrollToken(); enrolledToken = null; enrolling = false; awaitingBackupcodeEnroll = true; form.type='backupcode';"--> @@ -207,7 +211,7 @@ <button ng-click="enrolledToken = null; enrolling = false;" ng-hide="!hasUsableTokens" ui-sref="token.list" - class="btn btn-primary margin-bottom" translate>Finish + class="btn btn-primary margin-bottom" translate>{{ browserLanguage == 'cs' ? 'DokonÄŤit' : 'Finish' }} </button> </div> </div> @@ -230,7 +234,7 @@ <div class="text-center"> <button ng-click="awaitingBackupcodeEnroll = false; awaitingSetupCompletion = true; enrolledToken = null;" ng-disabled="!hasDownloadedBackupcodes" - class="btn btn-primary margin-bottom" translate>I have my backup codes + class="btn btn-primary margin-bottom">{{ browserLanguage == 'cs' ? 'ZáloĹľnĂ kĂłdy mám' : 'I have my backup codes' }} </button> </div> </div> @@ -243,39 +247,47 @@ </div> <div class="totp-verify-mobile"> - <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b>Multi-factor - authentication has been successfully set up!</b></h3> + <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element"><b> + {{ browserLanguage == 'cs' ? 'VĂcefázovĂ© ověřenĂ bylo ĂşspěšnÄ› nastaveno.' : 'Multi-factor authentication has been successfully set up!' }} + </b></h3> - <p><b>Which services will now require multi-factor authentication?</b></p> - <p>Multi-factor authentication is currently activated for all the services. To manage your settings click - the Service settings button below</p> + <p ng-show="browserLanguage === 'en'"><b>Which services will now require multi-factor authentication?</b></p> + <p ng-show="browserLanguage === 'cs'"><b>KterĂ© sluĹľby budou nynĂ vyĹľadovat vĂcefázovĂ© ověřenĂ?</b></p> + <p ng-show="browserLanguage === 'en'"> + Multi-factor authentication is currently activated for all services behind MUNI Unified Login. + To manage your settings, click the Service settings button below. + </p> + <p ng-show="browserLanguage === 'cs'"> + VĂcefázovĂ© ověřenĂ je nynĂ aktivnĂ pro všechny sluĹľby za JednotnĂ˝m pĹ™ihlášenĂm MUNI. + Chcete-li upravit toto nastavenĂ, pouĹľijte tlaÄŤĂtko NastavenĂ sluĹľeb nĂĹľe. + </p> <!-- Open Perun settings in a new tab --> - <a class="btn-default btn margin-bottom-large" href="https://account.muni.cz/profile/settings/auth" - target="_blank"> - Service - settings + <a class="btn-default btn margin-bottom-large" href="https://account.muni.cz/profile/settings/auth" target="_blank"> + {{ browserLanguage == 'cs' ? 'NastavenĂ sluĹľeb' : 'Service settings' }} </a> </div> <div class="totp-verify-mobile"> - <h3><b>Add another method of multi-factor authentication? (optional)</b></h3> - <p><b>Now you can set up an additional method of authentication using security key(s) for easier log in and - account - recovery - in future.</b></p> - <p>Security keys use a standard defined by organizations W3C and Fido Alliance. You can use your - smartphone, - computer or a physical security key (e.g. YubiKey).</p> + <h3 ng-show="browserLanguage === 'en'"><b>Add another method of multi-factor authentication (optional)</b></h3> + <h3 ng-show="browserLanguage === 'cs'"><b>PĹ™idat dalšà metodu vĂcefázovĂ©ho ověřenĂ (nepovinnĂ©)</b></h3> + <p ng-show="browserLanguage === 'en'"><b> + We highly recommend setting up an additional method of authentication using security keys, for easier and more secure log in from your devices. + You can set up multiple security keys and sign in with the one you have most handy. + </b></p> + <p ng-show="browserLanguage === 'cs'"><b> + DoporuÄŤujeme nastavit dalšà metodu ověřovánĂ pomocĂ bezpeÄŤnostnĂch klĂÄŤĹŻ, pro snadnÄ›jšà a bezpeÄŤnÄ›jšà pĹ™ihlašovánĂ ze svĂ˝ch zaĹ™ĂzenĂ. + MĹŻĹľete si nastavit vĂce bezpeÄŤnostnĂch klĂÄŤĹŻ a pĹ™ihlásit se pomocĂ toho, kterĂ˝ máte zrovna po ruce. + </b></p> <button class="btn-default btn margin-bottom-large" ng-click="calculateHasUsableTokens(); awaitingSetupCompletion = false; form.type='webauthn'; form.description=''"> - Set up a security key + {{ browserLanguage == 'cs' ? 'PĹ™idat bezpeÄŤnostnĂ klĂÄŤ' : 'Set up a security key' }} </button> </div> <div class="text-center"> <button ng-click="awaitingSetupCompletion=false;" ui-sref="token.list" - class="btn btn-primary margin-bottom" translate>Finish + class="btn btn-primary margin-bottom" translate>{{ browserLanguage == 'cs' ? 'DokonÄŤit' : 'Finish' }} </button> </div> </div> -- GitLab From 95dd5dd199a8bd3403b8b7fb429635b44fa7da0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ou=C5=A1ek?= <brousek@ics.muni.cz> Date: Fri, 19 May 2023 23:15:00 +0200 Subject: [PATCH 07/39] fix: local copy of jspdf --- .../static/jspdf.plugin.autotable.min.js | 10 + privacyidea/static/jspdf.umd.min.js | 398 ++++++++++++++++++ privacyidea/static/templates/footer.html | 4 +- 3 files changed, 410 insertions(+), 2 deletions(-) create mode 100644 privacyidea/static/jspdf.plugin.autotable.min.js create mode 100644 privacyidea/static/jspdf.umd.min.js diff --git a/privacyidea/static/jspdf.plugin.autotable.min.js b/privacyidea/static/jspdf.plugin.autotable.min.js new file mode 100644 index 000000000..3de19629e --- /dev/null +++ b/privacyidea/static/jspdf.plugin.autotable.min.js @@ -0,0 +1,10 @@ +/*! + * + * jsPDF AutoTable plugin v3.5.28 + * + * Copyright (c) 2022 Simon Bengtsson, https://github.com/simonbengtsson/jsPDF-AutoTable + * Licensed under the MIT License. + * http://opensource.org/licenses/mit-license + * + */ +!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e(function(){try{return require("jspdf")}catch(t){}}());else if("function"==typeof define&&define.amd)define(["jspdf"],e);else{var n="object"==typeof exports?e(function(){try{return require("jspdf")}catch(t){}}()):e(t.jspdf);for(var o in n)("object"==typeof exports?exports:t)[o]=n[o]}}("undefined"!=typeof globalThis?globalThis:void 0!==this?this:"undefined"!=typeof window?window:"undefined"!=typeof self?self:global,(function(t){return function(){"use strict";var e={662:function(t,e){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.CellHookData=e.HookData=void 0;var r=function(t,e,n){this.table=e,this.pageNumber=e.pageNumber,this.pageCount=this.pageNumber,this.settings=e.settings,this.cursor=n,this.doc=t.getDocument()};e.HookData=r;var i=function(t){function e(e,n,o,r,i,l){var a=t.call(this,e,n,l)||this;return a.cell=o,a.row=r,a.column=i,a.section=r.section,a}return o(e,t),e}(r);e.CellHookData=i},790:function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var o=n(148),r=n(938),i=n(323),l=n(587),a=n(49),s=n(858);e.default=function(t){t.API.autoTable=function(){for(var t,e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];1===e.length?t=e[0]:(console.error("Use of deprecated autoTable initiation"),(t=e[2]||{}).columns=e[0],t.body=e[1]);var o=(0,l.parseInput)(this,t),r=(0,s.createTable)(this,o);return(0,a.drawTable)(this,r),this},t.API.lastAutoTable=!1,t.API.previousAutoTable=!1,t.API.autoTable.previous=!1,t.API.autoTableText=function(t,e,n,o){(0,r.default)(t,e,n,o,this)},t.API.autoTableSetDefaults=function(t){return i.DocHandler.setDefaults(t,this),this},t.autoTableSetDefaults=function(t,e){i.DocHandler.setDefaults(t,e)},t.API.autoTableHtmlToJson=function(t,e){if(void 0===e&&(e=!1),"undefined"==typeof window)return console.error("Cannot run autoTableHtmlToJson in non browser environment"),null;var n=new i.DocHandler(this),r=(0,o.parseHtml)(n,t,window,e,!1),l=r.head,a=r.body;return{columns:l[0].map((function(t){return t.content})),rows:a,data:a}},t.API.autoTableEndPosY=function(){console.error("Use of deprecated function: autoTableEndPosY. Use doc.lastAutoTable.finalY instead.");var t=this.lastAutoTable;return t&&t.finalY?t.finalY:0},t.API.autoTableAddPageContent=function(e){return console.error("Use of deprecated function: autoTableAddPageContent. Use jsPDF.autoTableSetDefaults({didDrawPage: () => {}}) instead."),t.API.autoTable.globalDefaults||(t.API.autoTable.globalDefaults={}),t.API.autoTable.globalDefaults.addPageContent=e,this},t.API.autoTableAddPage=function(){return console.error("Use of deprecated function: autoTableAddPage. Use doc.addPage()"),this.addPage(),this}}},938:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t,e,n,o,r){o=o||{};var i=1.15,l=r.internal.scaleFactor,a=r.internal.getFontSize()/l,s="",u=1;if("middle"!==o.valign&&"bottom"!==o.valign&&"center"!==o.halign&&"right"!==o.halign||(u=(s="string"==typeof t?t.split(/\r\n|\r|\n/g):t).length||1),n+=a*(2-i),"middle"===o.valign?n-=u/2*a*i:"bottom"===o.valign&&(n-=u*a*i),"center"===o.halign||"right"===o.halign){var d=a;if("center"===o.halign&&(d*=.5),s&&u>=1){for(var h=0;h<s.length;h++)r.text(s[h],e-r.getStringUnitWidth(s[h])*d,n),n+=a*i;return r}e-=r.getStringUnitWidth(t)*d}return"justify"===o.halign?r.text(t,e,n,{maxWidth:o.maxWidth||100,align:"justify"}):r.text(t,e,n),r}},200:function(t,e){function n(t,e){var n=t>0,o=e||0===e;return n&&o?"DF":n?"S":o?"F":null}Object.defineProperty(e,"__esModule",{value:!0}),e.parseSpacing=e.getFillStyle=e.addTableBorder=e.getStringWidth=void 0,e.getStringWidth=function(t,e,n){return n.applyStyles(e,!0),(Array.isArray(t)?t:[t]).map((function(t){return n.getTextWidth(t)})).reduce((function(t,e){return Math.max(t,e)}),0)},e.addTableBorder=function(t,e,o,r){var i=e.settings.tableLineWidth,l=e.settings.tableLineColor;t.applyStyles({lineWidth:i,lineColor:l});var a=n(i,!1);a&&t.rect(o.x,o.y,e.getWidth(t.pageSize().width),r.y-o.y,a)},e.getFillStyle=n,e.parseSpacing=function(t,e){var n,o,r,i;if(t=t||e,Array.isArray(t)){if(t.length>=4)return{top:t[0],right:t[1],bottom:t[2],left:t[3]};if(3===t.length)return{top:t[0],right:t[1],bottom:t[2],left:t[1]};if(2===t.length)return{top:t[0],right:t[1],bottom:t[0],left:t[1]};t=1===t.length?t[0]:e}return"object"==typeof t?("number"==typeof t.vertical&&(t.top=t.vertical,t.bottom=t.vertical),"number"==typeof t.horizontal&&(t.right=t.horizontal,t.left=t.horizontal),{left:null!==(n=t.left)&&void 0!==n?n:e,top:null!==(o=t.top)&&void 0!==o?o:e,right:null!==(r=t.right)&&void 0!==r?r:e,bottom:null!==(i=t.bottom)&&void 0!==i?i:e}):("number"!=typeof t&&(t=e),{top:t,right:t,bottom:t,left:t})}},913:function(t,e){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function o(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(o.prototype=e.prototype,new o)});Object.defineProperty(e,"__esModule",{value:!0}),e.getTheme=e.defaultStyles=e.HtmlRowInput=e.FONT_ROW_RATIO=void 0,e.FONT_ROW_RATIO=1.15;var r=function(t){function e(e){var n=t.call(this)||this;return n._element=e,n}return o(e,t),e}(Array);e.HtmlRowInput=r,e.defaultStyles=function(t){return{font:"helvetica",fontStyle:"normal",overflow:"linebreak",fillColor:!1,textColor:20,halign:"left",valign:"top",fontSize:10,cellPadding:5/t,lineColor:200,lineWidth:0,cellWidth:"auto",minCellHeight:0,minCellWidth:0}},e.getTheme=function(t){return{striped:{table:{fillColor:255,textColor:80,fontStyle:"normal"},head:{textColor:255,fillColor:[41,128,185],fontStyle:"bold"},body:{},foot:{textColor:255,fillColor:[41,128,185],fontStyle:"bold"},alternateRow:{fillColor:245}},grid:{table:{fillColor:255,textColor:80,fontStyle:"normal",lineWidth:.1},head:{textColor:255,fillColor:[26,188,156],fontStyle:"bold",lineWidth:0},body:{},foot:{textColor:255,fillColor:[26,188,156],fontStyle:"bold",lineWidth:0},alternateRow:{}},plain:{head:{fontStyle:"bold"},foot:{fontStyle:"bold"}}}[t]}},259:function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0}),e.parseCss=void 0;var o=n(200);function r(t,e){var n=i(t,e);if(!n)return null;var o=n.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d*\.?\d*))?\)$/);if(!o||!Array.isArray(o))return null;var r=[parseInt(o[1]),parseInt(o[2]),parseInt(o[3])];return 0===parseInt(o[4])||isNaN(r[0])||isNaN(r[1])||isNaN(r[2])?null:r}function i(t,e){var n=e(t);return"rgba(0, 0, 0, 0)"===n||"transparent"===n||"initial"===n||"inherit"===n?null==t.parentElement?null:i(t.parentElement,e):n}e.parseCss=function(t,e,n,i,l){var a={},s=96/72,u=r(e,(function(t){return l.getComputedStyle(t).backgroundColor}));null!=u&&(a.fillColor=u);var d=r(e,(function(t){return l.getComputedStyle(t).color}));null!=d&&(a.textColor=d);var h=r(e,(function(t){return l.getComputedStyle(t).borderTopColor}));null!=h&&(a.lineColor=h);var c=function(t,e){var n=[t.paddingTop,t.paddingRight,t.paddingBottom,t.paddingLeft],r=96/(72/e),i=(parseInt(t.lineHeight)-parseInt(t.fontSize))/e/2,l=n.map((function(t){return parseInt(t||"0")/r})),a=(0,o.parseSpacing)(l,0);i>a.top&&(a.top=i);i>a.bottom&&(a.bottom=i);return a}(i,n);c&&(a.cellPadding=c);var f=parseInt(i.borderTopWidth||"");(f=f/s/n)&&(a.lineWidth=f);var g=["left","right","center","justify"];-1!==g.indexOf(i.textAlign)&&(a.halign=i.textAlign),-1!==(g=["middle","bottom","top"]).indexOf(i.verticalAlign)&&(a.valign=i.verticalAlign);var p=parseInt(i.fontSize||"");isNaN(p)||(a.fontSize=p/s);var y=function(t){var e="";("bold"===t.fontWeight||"bolder"===t.fontWeight||parseInt(t.fontWeight)>=700)&&(e="bold");"italic"!==t.fontStyle&&"oblique"!==t.fontStyle||(e+="italic");return e}(i);y&&(a.fontStyle=y);var v=(i.fontFamily||"").toLowerCase();return-1!==t.indexOf(v)&&(a.font=v),a}},323:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.DocHandler=void 0;var n={},o=function(){function t(t){this.jsPDFDocument=t,this.userStyles={textColor:t.getTextColor?this.jsPDFDocument.getTextColor():0,fontSize:t.internal.getFontSize(),fontStyle:t.internal.getFont().fontStyle,font:t.internal.getFont().fontName,lineWidth:t.getLineWidth?this.jsPDFDocument.getLineWidth():0,lineColor:t.getDrawColor?this.jsPDFDocument.getDrawColor():0}}return t.setDefaults=function(t,e){void 0===e&&(e=null),e?e.__autoTableDocumentDefaults=t:n=t},t.unifyColor=function(t){return Array.isArray(t)?t:"number"==typeof t?[t,t,t]:"string"==typeof t?[t]:null},t.prototype.applyStyles=function(e,n){var o,r,i;void 0===n&&(n=!1),e.fontStyle&&this.jsPDFDocument.setFontStyle&&this.jsPDFDocument.setFontStyle(e.fontStyle);var l=this.jsPDFDocument.internal.getFont(),a=l.fontStyle,s=l.fontName;if(e.font&&(s=e.font),e.fontStyle){a=e.fontStyle;var u=this.getFontList()[s];u&&-1===u.indexOf(a)&&(this.jsPDFDocument.setFontStyle&&this.jsPDFDocument.setFontStyle(u[0]),a=u[0])}if(this.jsPDFDocument.setFont(s,a),e.fontSize&&this.jsPDFDocument.setFontSize(e.fontSize),!n){var d=t.unifyColor(e.fillColor);d&&(o=this.jsPDFDocument).setFillColor.apply(o,d),(d=t.unifyColor(e.textColor))&&(r=this.jsPDFDocument).setTextColor.apply(r,d),(d=t.unifyColor(e.lineColor))&&(i=this.jsPDFDocument).setDrawColor.apply(i,d),"number"==typeof e.lineWidth&&this.jsPDFDocument.setLineWidth(e.lineWidth)}},t.prototype.splitTextToSize=function(t,e,n){return this.jsPDFDocument.splitTextToSize(t,e,n)},t.prototype.rect=function(t,e,n,o,r){return this.jsPDFDocument.rect(t,e,n,o,r)},t.prototype.getLastAutoTable=function(){return this.jsPDFDocument.lastAutoTable||null},t.prototype.getTextWidth=function(t){return this.jsPDFDocument.getTextWidth(t)},t.prototype.getDocument=function(){return this.jsPDFDocument},t.prototype.setPage=function(t){this.jsPDFDocument.setPage(t)},t.prototype.addPage=function(){return this.jsPDFDocument.addPage()},t.prototype.getFontList=function(){return this.jsPDFDocument.getFontList()},t.prototype.getGlobalOptions=function(){return n||{}},t.prototype.getDocumentOptions=function(){return this.jsPDFDocument.__autoTableDocumentDefaults||{}},t.prototype.pageSize=function(){var t=this.jsPDFDocument.internal.pageSize;return null==t.width&&(t={width:t.getWidth(),height:t.getHeight()}),t},t.prototype.scaleFactor=function(){return this.jsPDFDocument.internal.scaleFactor},t.prototype.pageNumber=function(){var t=this.jsPDFDocument.internal.getCurrentPageInfo();return t?t.pageNumber:this.jsPDFDocument.internal.getNumberOfPages()},t}();e.DocHandler=o},148:function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0}),e.parseHtml=void 0;var o=n(259),r=n(913);function i(t,e,n,i,a,s){for(var u=new r.HtmlRowInput(i),d=0;d<i.cells.length;d++){var h=i.cells[d],c=n.getComputedStyle(h);if(a||"none"!==c.display){var f=void 0;s&&(f=(0,o.parseCss)(t,h,e,c,n)),u.push({rowSpan:h.rowSpan,colSpan:h.colSpan,styles:f,_element:h,content:l(h)})}}var g=n.getComputedStyle(i);if(u.length>0&&(a||"none"!==g.display))return u}function l(t){var e=t.cloneNode(!0);return e.innerHTML=e.innerHTML.replace(/\n/g,"").replace(/ +/g," "),e.innerHTML=e.innerHTML.split(/\<br.*?\>/).map((function(t){return t.trim()})).join("\n"),e.innerText||e.textContent||""}e.parseHtml=function(t,e,n,o,r){var l,a,s;void 0===o&&(o=!1),void 0===r&&(r=!1),s="string"==typeof e?n.document.querySelector(e):e;var u=Object.keys(t.getFontList()),d=t.scaleFactor(),h=[],c=[],f=[];if(!s)return console.error("Html table could not be found with input: ",e),{head:h,body:c,foot:f};for(var g=0;g<s.rows.length;g++){var p=s.rows[g],y=null===(a=null===(l=null==p?void 0:p.parentElement)||void 0===l?void 0:l.tagName)||void 0===a?void 0:a.toLowerCase(),v=i(u,d,n,p,o,r);v&&("thead"===y?h.push(v):"tfoot"===y?f.push(v):c.push(v))}return{head:h,body:c,foot:f}}},587:function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0}),e.parseInput=void 0;var o=n(148),r=n(360),i=n(200),l=n(323),a=n(291);function s(t,e,n){var o=t[0]||e[0]||n[0]||[],r=[];return Object.keys(o).filter((function(t){return"_element"!==t})).forEach((function(t){var e,n=1;"object"!=typeof(e=Array.isArray(o)?o[parseInt(t)]:o[t])||Array.isArray(e)||(n=(null==e?void 0:e.colSpan)||1);for(var i=0;i<n;i++){var l={dataKey:Array.isArray(o)?r.length:t+(i>0?"_".concat(i):"")};r.push(l)}})),r}e.parseInput=function(t,e){var n=new l.DocHandler(t),u=n.getDocumentOptions(),d=n.getGlobalOptions();(0,a.default)(n,d,u,e);var h,c=(0,r.assign)({},d,u,e);"undefined"!=typeof window&&(h=window);var f=function(t,e,n){for(var o={styles:{},headStyles:{},bodyStyles:{},footStyles:{},alternateRowStyles:{},columnStyles:{}},i=function(i){if("columnStyles"===i){var l=t[i],a=e[i],s=n[i];o.columnStyles=(0,r.assign)({},l,a,s)}else{var u=[t,e,n].map((function(t){return t[i]||{}}));o[i]=(0,r.assign)({},u[0],u[1],u[2])}},l=0,a=Object.keys(o);l<a.length;l++){i(a[l])}return o}(d,u,e),g=function(t,e,n){for(var o={didParseCell:[],willDrawCell:[],didDrawCell:[],didDrawPage:[]},r=0,i=[t,e,n];r<i.length;r++){var l=i[r];l.didParseCell&&o.didParseCell.push(l.didParseCell),l.willDrawCell&&o.willDrawCell.push(l.willDrawCell),l.didDrawCell&&o.didDrawCell.push(l.didDrawCell),l.didDrawPage&&o.didDrawPage.push(l.didDrawPage)}return o}(d,u,e),p=function(t,e){var n,o,r,l,a,s,u,d,h,c,f,g,p,y=(0,i.parseSpacing)(e.margin,40/t.scaleFactor()),v=null!==(n=function(t,e){var n=t.getLastAutoTable(),o=t.scaleFactor(),r=t.pageNumber(),i=!1;if(n&&n.startPageNumber){i=n.startPageNumber+n.pageNumber-1===r}if("number"==typeof e)return e;if((null==e||!1===e)&&i&&null!=(null==n?void 0:n.finalY))return n.finalY+20/o;return null}(t,e.startY))&&void 0!==n?n:y.top;g=!0===e.showFoot?"everyPage":!1===e.showFoot?"never":null!==(o=e.showFoot)&&void 0!==o?o:"everyPage";p=!0===e.showHead?"everyPage":!1===e.showHead?"never":null!==(r=e.showHead)&&void 0!==r?r:"everyPage";var m=null!==(l=e.useCss)&&void 0!==l&&l,b=e.theme||(m?"plain":"striped"),w=!!e.horizontalPageBreak,S=null!==(a=e.horizontalPageBreakRepeat)&&void 0!==a?a:null;return{includeHiddenHtml:null!==(s=e.includeHiddenHtml)&&void 0!==s&&s,useCss:m,theme:b,startY:v,margin:y,pageBreak:null!==(u=e.pageBreak)&&void 0!==u?u:"auto",rowPageBreak:null!==(d=e.rowPageBreak)&&void 0!==d?d:"auto",tableWidth:null!==(h=e.tableWidth)&&void 0!==h?h:"auto",showHead:p,showFoot:g,tableLineWidth:null!==(c=e.tableLineWidth)&&void 0!==c?c:0,tableLineColor:null!==(f=e.tableLineColor)&&void 0!==f?f:200,horizontalPageBreak:w,horizontalPageBreakRepeat:S}}(n,c),y=function(t,e,n){var r=e.head||[],i=e.body||[],l=e.foot||[];if(e.html){var a=e.includeHiddenHtml;if(n){var u=(0,o.parseHtml)(t,e.html,n,a,e.useCss)||{};r=u.head||r,i=u.body||r,l=u.foot||r}else console.error("Cannot parse html in non browser environment")}return{columns:e.columns||s(r,i,l),head:r,body:i,foot:l}}(n,c,h);return{id:e.tableId,content:y,hooks:g,styles:f,settings:p}}},291:function(t,e){function n(t){t.rowHeight?(console.error("Use of deprecated style rowHeight. It is renamed to minCellHeight."),t.minCellHeight||(t.minCellHeight=t.rowHeight)):t.columnWidth&&(console.error("Use of deprecated style columnWidth. It is renamed to cellWidth."),t.cellWidth||(t.cellWidth=t.columnWidth))}Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t,e,o,r){for(var i=function(e){e&&"object"!=typeof e&&console.error("The options parameter should be of type object, is: "+typeof e),void 0!==e.extendWidth&&(e.tableWidth=e.extendWidth?"auto":"wrap",console.error("Use of deprecated option: extendWidth, use tableWidth instead.")),void 0!==e.margins&&(void 0===e.margin&&(e.margin=e.margins),console.error("Use of deprecated option: margins, use margin instead.")),e.startY&&"number"!=typeof e.startY&&(console.error("Invalid value for startY option",e.startY),delete e.startY),!e.didDrawPage&&(e.afterPageContent||e.beforePageContent||e.afterPageAdd)&&(console.error("The afterPageContent, beforePageContent and afterPageAdd hooks are deprecated. Use didDrawPage instead"),e.didDrawPage=function(n){t.applyStyles(t.userStyles),e.beforePageContent&&e.beforePageContent(n),t.applyStyles(t.userStyles),e.afterPageContent&&e.afterPageContent(n),t.applyStyles(t.userStyles),e.afterPageAdd&&n.pageNumber>1&&n.afterPageAdd(n),t.applyStyles(t.userStyles)}),["createdHeaderCell","drawHeaderRow","drawRow","drawHeaderCell"].forEach((function(t){e[t]&&console.error('The "'.concat(t,'" hook has changed in version 3.0, check the changelog for how to migrate.'))})),[["showFoot","showFooter"],["showHead","showHeader"],["didDrawPage","addPageContent"],["didParseCell","createdCell"],["headStyles","headerStyles"]].forEach((function(t){var n=t[0],o=t[1];e[o]&&(console.error("Use of deprecated option ".concat(o,". Use ").concat(n," instead")),e[n]=e[o])})),[["padding","cellPadding"],["lineHeight","rowHeight"],"fontSize","overflow"].forEach((function(t){var n="string"==typeof t?t:t[0],o="string"==typeof t?t:t[1];void 0!==e[n]&&(void 0===e.styles[o]&&(e.styles[o]=e[n]),console.error("Use of deprecated option: "+n+", use the style "+o+" instead."))}));for(var o=0,r=["styles","bodyStyles","headStyles","footStyles"];o<r.length;o++){n(e[r[o]]||{})}for(var i=e.columnStyles||{},l=0,a=Object.keys(i);l<a.length;l++){n(i[a[l]]||{})}},l=0,a=[e,o,r];l<a.length;l++){i(a[l])}}},287:function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0}),e.Column=e.Cell=e.Row=e.Table=void 0;var o=n(913),r=n(662),i=n(200),l=function(){function t(t,e){this.pageNumber=1,this.pageCount=1,this.id=t.id,this.settings=t.settings,this.styles=t.styles,this.hooks=t.hooks,this.columns=e.columns,this.head=e.head,this.body=e.body,this.foot=e.foot}return t.prototype.getHeadHeight=function(t){return this.head.reduce((function(e,n){return e+n.getMaxCellHeight(t)}),0)},t.prototype.getFootHeight=function(t){return this.foot.reduce((function(e,n){return e+n.getMaxCellHeight(t)}),0)},t.prototype.allRows=function(){return this.head.concat(this.body).concat(this.foot)},t.prototype.callCellHooks=function(t,e,n,o,i,l){for(var a=0,s=e;a<s.length;a++){var u=!1===(0,s[a])(new r.CellHookData(t,this,n,o,i,l));if(n.text=Array.isArray(n.text)?n.text:[n.text],u)return!1}return!0},t.prototype.callEndPageHooks=function(t,e){t.applyStyles(t.userStyles);for(var n=0,o=this.hooks.didDrawPage;n<o.length;n++){(0,o[n])(new r.HookData(t,this,e))}},t.prototype.getWidth=function(t){if("number"==typeof this.settings.tableWidth)return this.settings.tableWidth;if("wrap"===this.settings.tableWidth)return this.columns.reduce((function(t,e){return t+e.wrappedWidth}),0);var e=this.settings.margin;return t-e.left-e.right},t}();e.Table=l;var a=function(){function t(t,e,n,r,i){void 0===i&&(i=!1),this.height=0,this.raw=t,t instanceof o.HtmlRowInput&&(this.raw=t._element,this.element=t._element),this.index=e,this.section=n,this.cells=r,this.spansMultiplePages=i}return t.prototype.getMaxCellHeight=function(t){var e=this;return t.reduce((function(t,n){var o;return Math.max(t,(null===(o=e.cells[n.index])||void 0===o?void 0:o.height)||0)}),0)},t.prototype.hasRowSpan=function(t){var e=this;return t.filter((function(t){var n=e.cells[t.index];return!!n&&n.rowSpan>1})).length>0},t.prototype.canEntireRowFit=function(t,e){return this.getMaxCellHeight(e)<=t},t.prototype.getMinimumRowHeight=function(t,e){var n=this;return t.reduce((function(t,r){var i=n.cells[r.index];if(!i)return 0;var l=i.styles.fontSize/e.scaleFactor()*o.FONT_ROW_RATIO,a=i.padding("vertical")+l;return a>t?a:t}),0)},t}();e.Row=a;var s=function(){function t(t,e,n){var o,r;this.contentHeight=0,this.contentWidth=0,this.wrappedWidth=0,this.minReadableWidth=0,this.minWidth=0,this.width=0,this.height=0,this.x=0,this.y=0,this.styles=e,this.section=n,this.raw=t;var i=t;null==t||"object"!=typeof t||Array.isArray(t)?(this.rowSpan=1,this.colSpan=1):(this.rowSpan=t.rowSpan||1,this.colSpan=t.colSpan||1,i=null!==(r=null!==(o=t.content)&&void 0!==o?o:t.title)&&void 0!==r?r:t,t._element&&(this.raw=t._element));var l=null!=i?""+i:"";this.text=l.split(/\r\n|\r|\n/g)}return t.prototype.getTextPos=function(){var t,e;if("top"===this.styles.valign)t=this.y+this.padding("top");else if("bottom"===this.styles.valign)t=this.y+this.height-this.padding("bottom");else{var n=this.height-this.padding("vertical");t=this.y+n/2+this.padding("top")}if("right"===this.styles.halign)e=this.x+this.width-this.padding("right");else if("center"===this.styles.halign){var o=this.width-this.padding("horizontal");e=this.x+o/2+this.padding("left")}else e=this.x+this.padding("left");return{x:e,y:t}},t.prototype.getContentHeight=function(t){var e=(Array.isArray(this.text)?this.text.length:1)*(this.styles.fontSize/t*o.FONT_ROW_RATIO)+this.padding("vertical");return Math.max(e,this.styles.minCellHeight)},t.prototype.padding=function(t){var e=(0,i.parseSpacing)(this.styles.cellPadding,0);return"vertical"===t?e.top+e.bottom:"horizontal"===t?e.left+e.right:e[t]},t}();e.Cell=s;var u=function(){function t(t,e,n){this.wrappedWidth=0,this.minReadableWidth=0,this.minWidth=0,this.width=0,this.dataKey=t,this.raw=e,this.index=n}return t.prototype.getMaxCustomCellWidth=function(t){for(var e=0,n=0,o=t.allRows();n<o.length;n++){var r=o[n].cells[this.index];r&&"number"==typeof r.styles.cellWidth&&(e=Math.max(e,r.styles.cellWidth))}return e},t}();e.Column=u},360:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.assign=void 0,e.assign=function(t,e,n,o,r){if(null==t)throw new TypeError("Cannot convert undefined or null to object");for(var i=Object(t),l=1;l<arguments.length;l++){var a=arguments[l];if(null!=a)for(var s in a)Object.prototype.hasOwnProperty.call(a,s)&&(i[s]=a[s])}return i}},858:function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0}),e.createTable=void 0;var o=n(323),r=n(287),i=n(189),l=n(913),a=n(360);function s(t,e,n,o,i,l){var a={};return e.map((function(e,s){for(var u=0,h={},c=0,f=0,g=0,p=n;g<p.length;g++){var y=p[g];if(null==a[y.index]||0===a[y.index].left)if(0===f){var v=void 0,m={};"object"!=typeof(v=Array.isArray(e)?e[y.index-c-u]:e[y.dataKey])||Array.isArray(v)||(m=(null==v?void 0:v.styles)||{});var b=d(t,y,s,i,o,l,m),w=new r.Cell(v,b,t);h[y.dataKey]=w,h[y.index]=w,f=w.colSpan-1,a[y.index]={left:w.rowSpan-1,times:f}}else f--,c++;else a[y.index].left--,f=a[y.index].times,u++}return new r.Row(e,s,t,h)}))}function u(t,e){var n={};return t.forEach((function(t){if(null!=t.raw){var o=function(t,e){if("head"===t){if("object"==typeof e)return e.header||e.title||null;if("string"==typeof e||"number"==typeof e)return e}else if("foot"===t&&"object"==typeof e)return e.footer;return null}(e,t.raw);null!=o&&(n[t.dataKey]=o)}})),Object.keys(n).length>0?n:null}function d(t,e,n,o,r,i,s){var u,d=(0,l.getTheme)(o);"head"===t?u=r.headStyles:"body"===t?u=r.bodyStyles:"foot"===t&&(u=r.footStyles);var h=(0,a.assign)({},d.table,d[t],r.styles,u),c=r.columnStyles[e.dataKey]||r.columnStyles[e.index]||{},f="body"===t?c:{},g="body"===t&&n%2==0?(0,a.assign)({},d.alternateRow,r.alternateRowStyles):{},p=(0,l.defaultStyles)(i),y=(0,a.assign)({},p,h,g,f);return(0,a.assign)(y,s)}e.createTable=function(t,e){var n=new o.DocHandler(t),l=function(t,e){var n=t.content,o=function(t){return t.map((function(t,e){var n,o,i;return i="object"==typeof t&&null!==(o=null!==(n=t.dataKey)&&void 0!==n?n:t.key)&&void 0!==o?o:e,new r.Column(i,t,e)}))}(n.columns);if(0===n.head.length){(i=u(o,"head"))&&n.head.push(i)}if(0===n.foot.length){var i;(i=u(o,"foot"))&&n.foot.push(i)}var l=t.settings.theme,a=t.styles;return{columns:o,head:s("head",n.head,o,a,l,e),body:s("body",n.body,o,a,l,e),foot:s("foot",n.foot,o,a,l,e)}}(e,n.scaleFactor()),a=new r.Table(e,l);return(0,i.calculateWidths)(n,a),n.applyStyles(n.userStyles),a}},49:function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0}),e.addPage=e.drawTable=void 0;var o=n(913),r=n(200),i=n(287),l=n(323),a=n(360),s=n(938),u=n(435);function d(t,e,n){var r=t.styles.fontSize/n.scaleFactor()*o.FONT_ROW_RATIO,i=t.padding("vertical"),l=Math.floor((e-i)/r);return Math.max(0,l)}function h(t,e,n,o,r,l,s){var u=function(t,e,n,o){var r=e.settings.margin.bottom,i=e.settings.showFoot;("everyPage"===i||"lastPage"===i&&n)&&(r+=e.getFootHeight(e.columns));return t.pageSize().height-o.y-r}(t,e,o,l);if(n.canEntireRowFit(u,s))c(t,e,n,l,s);else if(function(t,e,n,o){var r=t.pageSize().height,i=o.settings.margin,l=r-(i.top+i.bottom);"body"===e.section&&(l-=o.getHeadHeight(o.columns)+o.getFootHeight(o.columns));var a=e.getMinimumRowHeight(o.columns,t),s=a<n;if(a>l)return console.error("Will not be able to print row ".concat(e.index," correctly since it's minimum height is larger than page height")),!0;if(!s)return!1;var u=e.hasRowSpan(o.columns);return e.getMaxCellHeight(o.columns)>l?(u&&console.error("The content of row ".concat(e.index," will not be drawn correctly since drawing rows with a height larger than the page height and has cells with rowspans is not supported.")),!0):!u&&"avoid"!==o.settings.rowPageBreak}(t,n,u,e)){var f=function(t,e,n,o){var r={};t.spansMultiplePages=!0,t.height=0;for(var l=0,s=0,u=n.columns;s<u.length;s++){var h=u[s];if(m=t.cells[h.index]){Array.isArray(m.text)||(m.text=[m.text]);var c=new i.Cell(m.raw,m.styles,m.section);(c=(0,a.assign)(c,m)).text=[];var f=d(m,e,o);m.text.length>f&&(c.text=m.text.splice(f,m.text.length));var g=o.scaleFactor();m.contentHeight=m.getContentHeight(g),m.contentHeight>=e&&(m.contentHeight=e,c.styles.minCellHeight-=e),m.contentHeight>t.height&&(t.height=m.contentHeight),c.contentHeight=c.getContentHeight(g),c.contentHeight>l&&(l=c.contentHeight),r[h.index]=c}}var p=new i.Row(t.raw,-1,t.section,r,!0);p.height=l;for(var y=0,v=n.columns;y<v.length;y++){var m;h=v[y],(c=p.cells[h.index])&&(c.height=p.height),(m=t.cells[h.index])&&(m.height=t.height)}return p}(n,u,e,t);c(t,e,n,l,s),g(t,e,r,l,s),h(t,e,f,o,r,l,s)}else g(t,e,r,l,s),h(t,e,n,o,r,l,s)}function c(t,e,n,o,r){o.x=e.settings.margin.left;for(var i=0,l=r;i<l.length;i++){var a=l[i],u=n.cells[a.index];if(u)if(t.applyStyles(u.styles),u.x=o.x,u.y=o.y,!1!==e.callCellHooks(t,e.hooks.willDrawCell,u,n,a,o)){f(t,u,o);var d=u.getTextPos();(0,s.default)(u.text,d.x,d.y,{halign:u.styles.halign,valign:u.styles.valign,maxWidth:Math.ceil(u.width-u.padding("left")-u.padding("right"))},t.getDocument()),e.callCellHooks(t,e.hooks.didDrawCell,u,n,a,o),o.x+=a.width}else o.x+=a.width;else o.x+=a.width}o.y+=n.height}function f(t,e,n){var o=e.styles;if(t.getDocument().setFillColor(t.getDocument().getFillColor()),"number"==typeof o.lineWidth){var i=(0,r.getFillStyle)(o.lineWidth,o.fillColor);i&&t.rect(e.x,n.y,e.width,e.height,i)}else if("object"==typeof o.lineWidth){t.rect(e.x,n.y,e.width,e.height,"F");var l=Object.keys(o.lineWidth),a=o.lineWidth;l.map((function(i){var l=(0,r.getFillStyle)(a[i],o.fillColor);!function(t,e,n,o,r,i){var l,a,s,u;switch(o){case"top":l=n.x,a=n.y,s=n.x+e.width,u=n.y;break;case"left":l=n.x,a=n.y,s=n.x,u=n.y+e.height;break;case"right":l=n.x+e.width,a=n.y,s=n.x+e.width,u=n.y+e.height;break;default:l=n.x,a=n.y+e.height-i,s=n.x+e.width,u=n.y+e.height-i}t.getDocument().setLineWidth(i),t.getDocument().line(l,a,s,u,r)}(t,e,n,i,l||"S",a[i])}))}}function g(t,e,n,o,i){void 0===i&&(i=[]),t.applyStyles(t.userStyles),"everyPage"===e.settings.showFoot&&e.foot.forEach((function(n){return c(t,e,n,o,i)})),e.callEndPageHooks(t,o);var l=e.settings.margin;(0,r.addTableBorder)(t,e,n,o),p(t),e.pageNumber++,e.pageCount++,o.x=l.left,o.y=l.top,n.y=l.top,"everyPage"===e.settings.showHead&&e.head.forEach((function(n){return c(t,e,n,o,i)}))}function p(t){var e=t.pageNumber();t.setPage(e+1),t.pageNumber()===e&&t.addPage()}e.drawTable=function(t,e){var n=e.settings,o=n.startY,i=n.margin,s={x:i.left,y:o},d=e.getHeadHeight(e.columns)+e.getFootHeight(e.columns),f=o+i.bottom+d;"avoid"===n.pageBreak&&(f+=e.allRows().reduce((function(t,e){return t+e.height}),0));var y=new l.DocHandler(t);("always"===n.pageBreak||null!=n.startY&&f>y.pageSize().height)&&(p(y),s.y=i.top);var v=(0,a.assign)({},s);e.startPageNumber=y.pageNumber(),!0===n.horizontalPageBreak?function(t,e,n,o){u.default.calculateAllColumnsCanFitInPage(t,e).map((function(r,i){t.applyStyles(t.userStyles),i>0?g(t,e,n,o,r.columns):function(t,e,n,o){var r=e.settings;t.applyStyles(t.userStyles),("firstPage"===r.showHead||"everyPage"===r.showHead)&&e.head.forEach((function(r){return c(t,e,r,n,o)}))}(t,e,o,r.columns),function(t,e,n,o,r){t.applyStyles(t.userStyles),e.body.forEach((function(i,l){var a=l===e.body.length-1;h(t,e,i,a,n,o,r)}))}(t,e,n,o,r.columns),function(t,e,n,o){var r=e.settings;t.applyStyles(t.userStyles),("lastPage"===r.showFoot||"everyPage"===r.showFoot)&&e.foot.forEach((function(r){return c(t,e,r,n,o)}))}(t,e,o,r.columns)}))}(y,e,v,s):(y.applyStyles(y.userStyles),"firstPage"!==n.showHead&&"everyPage"!==n.showHead||e.head.forEach((function(t){return c(y,e,t,s,e.columns)})),y.applyStyles(y.userStyles),e.body.forEach((function(t,n){var o=n===e.body.length-1;h(y,e,t,o,v,s,e.columns)})),y.applyStyles(y.userStyles),"lastPage"!==n.showFoot&&"everyPage"!==n.showFoot||e.foot.forEach((function(t){return c(y,e,t,s,e.columns)}))),(0,r.addTableBorder)(y,e,v,s),e.callEndPageHooks(y,s),e.finalY=s.y,t.lastAutoTable=e,t.previousAutoTable=e,t.autoTable&&(t.autoTable.previous=e),y.applyStyles(y.userStyles)},e.addPage=g},435:function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var o=n(200),r=function(t,e){var n=(0,o.parseSpacing)(e.settings.margin,0);return t.pageSize().width-(n.left+n.right)},i=function(t,e,n){void 0===n&&(n={});var o=r(t,e),i=e.settings.horizontalPageBreakRepeat,l=null,a=[],s=[],u=e.columns.length,d=n&&n.start?n.start:0;for(null!=i&&(l=e.columns.find((function(t){return t.dataKey===i||t.index===i})))&&(a.push(l.index),s.push(e.columns[l.index]),o-=l.wrappedWidth);d<u;)if((null==l?void 0:l.index)!==d){var h=e.columns[d].wrappedWidth;if(o<h){0!==d&&d!==n.start||(a.push(d),s.push(e.columns[d]));break}a.push(d),s.push(e.columns[d]),o-=h,d++}else d++;return{colIndexes:a,columns:s,lastIndex:d}};e.default={getColumnsCanFitInPage:i,calculateAllColumnsCanFitInPage:function(t,e){for(var n=[],o=0,r=e.columns.length;o<r;){var l=i(t,e,{start:0===o?0:o});l&&l.columns&&l.columns.length?(o=l.lastIndex,n.push(l)):o++}return n},getPageAvailableWidth:r}},189:function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0}),e.ellipsize=e.resizeColumns=e.calculateWidths=void 0;var o=n(200),r=n(435);function i(t,e,n){for(var o=e,r=t.reduce((function(t,e){return t+e.wrappedWidth}),0),l=0;l<t.length;l++){var a=t[l],s=o*(a.wrappedWidth/r),u=a.width+s,d=n(a),h=u<d?d:u;e-=h-a.width,a.width=h}if(e=Math.round(1e10*e)/1e10){var c=t.filter((function(t){return!(e<0)||t.width>n(t)}));c.length&&(e=i(c,e,n))}return e}function l(t,e,n,r,i){return t.map((function(t){return function(t,e,n,r,i){var l=1e4*r.scaleFactor();if((e=Math.ceil(e*l)/l)>=(0,o.getStringWidth)(t,n,r))return t;for(;e<(0,o.getStringWidth)(t+i,n,r)&&!(t.length<=1);)t=t.substring(0,t.length-1);return t.trim()+i}(t,e,n,r,i)}))}e.calculateWidths=function(t,e){!function(t,e){var n=t.scaleFactor(),i=e.settings.horizontalPageBreak,l=r.default.getPageAvailableWidth(t,e);e.allRows().forEach((function(r){for(var a=0,s=e.columns;a<s.length;a++){var u=s[a],d=r.cells[u.index];if(d){var h=e.hooks.didParseCell;e.callCellHooks(t,h,d,r,u,null);var c=d.padding("horizontal");d.contentWidth=(0,o.getStringWidth)(d.text,d.styles,t)+c;var f=(0,o.getStringWidth)(d.text.join(" ").split(/\s+/),d.styles,t);if(d.minReadableWidth=f+d.padding("horizontal"),"number"==typeof d.styles.cellWidth)d.minWidth=d.styles.cellWidth,d.wrappedWidth=d.styles.cellWidth;else if("wrap"===d.styles.cellWidth||!0===i)d.contentWidth>l?(d.minWidth=l,d.wrappedWidth=l):(d.minWidth=d.contentWidth,d.wrappedWidth=d.contentWidth);else{var g=10/n;d.minWidth=d.styles.minCellWidth||g,d.wrappedWidth=d.contentWidth,d.minWidth>d.wrappedWidth&&(d.wrappedWidth=d.minWidth)}}}})),e.allRows().forEach((function(t){for(var n=0,o=e.columns;n<o.length;n++){var r=o[n],i=t.cells[r.index];if(i&&1===i.colSpan)r.wrappedWidth=Math.max(r.wrappedWidth,i.wrappedWidth),r.minWidth=Math.max(r.minWidth,i.minWidth),r.minReadableWidth=Math.max(r.minReadableWidth,i.minReadableWidth);else{var l=e.styles.columnStyles[r.dataKey]||e.styles.columnStyles[r.index]||{},a=l.cellWidth||l.minCellWidth;a&&"number"==typeof a&&(r.minWidth=a,r.wrappedWidth=a)}i&&(i.colSpan>1&&!r.minWidth&&(r.minWidth=i.minWidth),i.colSpan>1&&!r.wrappedWidth&&(r.wrappedWidth=i.minWidth))}}))}(t,e);var n=[],a=0;e.columns.forEach((function(t){var o=t.getMaxCustomCellWidth(e);o?t.width=o:(t.width=t.wrappedWidth,n.push(t)),a+=t.width}));var s=e.getWidth(t.pageSize().width)-a;s&&(s=i(n,s,(function(t){return Math.max(t.minReadableWidth,t.minWidth)}))),s&&(s=i(n,s,(function(t){return t.minWidth}))),s=Math.abs(s),!e.settings.horizontalPageBreak&&s>.1/t.scaleFactor()&&(s=s<1?s:Math.round(s),console.error("Of the table content, ".concat(s," units width could not fit page"))),function(t){for(var e=t.allRows(),n=0;n<e.length;n++)for(var o=e[n],r=null,i=0,l=0,a=0;a<t.columns.length;a++){var s=t.columns[a];if((l-=1)>1&&t.columns[a+1])i+=s.width,delete o.cells[s.index];else if(r){var u=r;delete o.cells[s.index],r=null,u.width=s.width+i}else{if(!(u=o.cells[s.index]))continue;if(l=u.colSpan,i=0,u.colSpan>1){r=u,i+=s.width;continue}u.width=s.width+i}}}(e),function(t,e){for(var n={count:0,height:0},o=0,r=t.allRows();o<r.length;o++){for(var i=r[o],a=0,s=t.columns;a<s.length;a++){var u=s[a],d=i.cells[u.index];if(d){e.applyStyles(d.styles,!0);var h=d.width-d.padding("horizontal");if("linebreak"===d.styles.overflow)d.text=e.splitTextToSize(d.text,h+1/e.scaleFactor(),{fontSize:d.styles.fontSize});else if("ellipsize"===d.styles.overflow)d.text=l(d.text,h,d.styles,e,"...");else if("hidden"===d.styles.overflow)d.text=l(d.text,h,d.styles,e,"");else if("function"==typeof d.styles.overflow){var c=d.styles.overflow(d.text,h);d.text="string"==typeof c?[c]:c}d.contentHeight=d.getContentHeight(e.scaleFactor());var f=d.contentHeight/d.rowSpan;d.rowSpan>1&&n.count*n.height<f*d.rowSpan?n={height:f,count:d.rowSpan}:n&&n.count>0&&n.height>f&&(f=n.height),f>i.height&&(i.height=f)}}n.count--}}(e,t),function(t){for(var e={},n=1,o=t.allRows(),r=0;r<o.length;r++)for(var i=o[r],l=0,a=t.columns;l<a.length;l++){var s=a[l],u=e[s.index];if(n>1)n--,delete i.cells[s.index];else if(u)u.cell.height+=i.height,n=u.cell.colSpan,delete i.cells[s.index],u.left--,u.left<=1&&delete e[s.index];else{var d=i.cells[s.index];if(!d)continue;if(d.height=i.height,d.rowSpan>1){var h=o.length-r,c=d.rowSpan>h?h:d.rowSpan;e[s.index]={cell:d,left:c,row:i}}}}}(e)},e.resizeColumns=i,e.ellipsize=l},84:function(e){if(void 0===t){var n=new Error("Cannot find module 'undefined'");throw n.code="MODULE_NOT_FOUND",n}e.exports=t}},n={};function o(t){var r=n[t];if(void 0!==r)return r.exports;var i=n[t]={exports:{}};return e[t].call(i.exports,i,i.exports,o),i.exports}var r={};return function(){var t=r;Object.defineProperty(t,"__esModule",{value:!0}),t.Cell=t.Column=t.Row=t.Table=t.CellHookData=t.__drawTable=t.__createTable=t.applyPlugin=void 0;var e=o(790),n=o(587),i=o(49),l=o(858),a=o(287);Object.defineProperty(t,"Table",{enumerable:!0,get:function(){return a.Table}});var s=o(662);Object.defineProperty(t,"CellHookData",{enumerable:!0,get:function(){return s.CellHookData}});var u=o(287);function d(t){(0,e.default)(t)}Object.defineProperty(t,"Cell",{enumerable:!0,get:function(){return u.Cell}}),Object.defineProperty(t,"Column",{enumerable:!0,get:function(){return u.Column}}),Object.defineProperty(t,"Row",{enumerable:!0,get:function(){return u.Row}}),t.applyPlugin=d,t.__createTable=function(t,e){var o=(0,n.parseInput)(t,e);return(0,l.createTable)(t,o)},t.__drawTable=function(t,e){(0,i.drawTable)(t,e)};try{var h=o(84);h.jsPDF&&(h=h.jsPDF),d(h)}catch(t){}t.default=function(t,e){var o=(0,n.parseInput)(t,e),r=(0,l.createTable)(t,o);(0,i.drawTable)(t,r)}}(),r}()})); \ No newline at end of file diff --git a/privacyidea/static/jspdf.umd.min.js b/privacyidea/static/jspdf.umd.min.js new file mode 100644 index 000000000..a9781f1dc --- /dev/null +++ b/privacyidea/static/jspdf.umd.min.js @@ -0,0 +1,398 @@ +/** @license + * + * jsPDF - PDF Document creation from JavaScript + * Version 2.5.1 Built on 2022-01-28T15:37:57.789Z + * CommitID 00000000 + * + * Copyright (c) 2010-2021 James Hall <james@parall.ax>, https://github.com/MrRio/jsPDF + * 2015-2021 yWorks GmbH, http://www.yworks.com + * 2015-2021 Lukas Holländer <lukas.hollaender@yworks.com>, https://github.com/HackbrettXXX + * 2016-2018 Aras Abbasi <aras.abbasi@gmail.com> + * 2010 Aaron Spike, https://github.com/acspike + * 2012 Willow Systems Corporation, https://github.com/willowsystems + * 2012 Pablo Hess, https://github.com/pablohess + * 2012 Florian Jenett, https://github.com/fjenett + * 2013 Warren Weckesser, https://github.com/warrenweckesser + * 2013 Youssef Beddad, https://github.com/lifof + * 2013 Lee Driscoll, https://github.com/lsdriscoll + * 2013 Stefan Slonevskiy, https://github.com/stefslon + * 2013 Jeremy Morel, https://github.com/jmorel + * 2013 Christoph Hartmann, https://github.com/chris-rock + * 2014 Juan Pablo Gaviria, https://github.com/juanpgaviria + * 2014 James Makes, https://github.com/dollaruw + * 2014 Diego Casorran, https://github.com/diegocr + * 2014 Steven Spungin, https://github.com/Flamenco + * 2014 Kenneth Glassey, https://github.com/Gavvers + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Contributor(s): + * siefkenj, ahwolf, rickygu, Midnith, saintclair, eaparango, + * kim3er, mfo, alnorth, Flamenco + */ + +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).jspdf={})}(this,(function(t){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var r=function(){return"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this}();function n(){r.console&&"function"==typeof r.console.log&&r.console.log.apply(r.console,arguments)}var i={log:n,warn:function(t){r.console&&("function"==typeof r.console.warn?r.console.warn.apply(r.console,arguments):n.call(null,arguments))},error:function(t){r.console&&("function"==typeof r.console.error?r.console.error.apply(r.console,arguments):n(t))}};function a(t,e,r){var n=new XMLHttpRequest;n.open("GET",t),n.responseType="blob",n.onload=function(){l(n.response,e,r)},n.onerror=function(){i.error("could not download file")},n.send()}function o(t){var e=new XMLHttpRequest;e.open("HEAD",t,!1);try{e.send()}catch(t){}return e.status>=200&&e.status<=299}function s(t){try{t.dispatchEvent(new MouseEvent("click"))}catch(r){var e=document.createEvent("MouseEvents");e.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),t.dispatchEvent(e)}}var c,u,l=r.saveAs||("object"!==("undefined"==typeof window?"undefined":e(window))||window!==r?function(){}:"undefined"!=typeof HTMLAnchorElement&&"download"in HTMLAnchorElement.prototype?function(t,e,n){var i=r.URL||r.webkitURL,c=document.createElement("a");e=e||t.name||"download",c.download=e,c.rel="noopener","string"==typeof t?(c.href=t,c.origin!==location.origin?o(c.href)?a(t,e,n):s(c,c.target="_blank"):s(c)):(c.href=i.createObjectURL(t),setTimeout((function(){i.revokeObjectURL(c.href)}),4e4),setTimeout((function(){s(c)}),0))}:"msSaveOrOpenBlob"in navigator?function(t,r,n){if(r=r||t.name||"download","string"==typeof t)if(o(t))a(t,r,n);else{var c=document.createElement("a");c.href=t,c.target="_blank",setTimeout((function(){s(c)}))}else navigator.msSaveOrOpenBlob(function(t,r){return void 0===r?r={autoBom:!1}:"object"!==e(r)&&(i.warn("Deprecated: Expected third argument to be a object"),r={autoBom:!r}),r.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(t.type)?new Blob([String.fromCharCode(65279),t],{type:t.type}):t}(t,n),r)}:function(t,n,i,o){if((o=o||open("","_blank"))&&(o.document.title=o.document.body.innerText="downloading..."),"string"==typeof t)return a(t,n,i);var s="application/octet-stream"===t.type,c=/constructor/i.test(r.HTMLElement)||r.safari,u=/CriOS\/[\d]+/.test(navigator.userAgent);if((u||s&&c)&&"object"===("undefined"==typeof FileReader?"undefined":e(FileReader))){var l=new FileReader;l.onloadend=function(){var t=l.result;t=u?t:t.replace(/^data:[^;]*;/,"data:attachment/file;"),o?o.location.href=t:location=t,o=null},l.readAsDataURL(t)}else{var h=r.URL||r.webkitURL,f=h.createObjectURL(t);o?o.location=f:location.href=f,o=null,setTimeout((function(){h.revokeObjectURL(f)}),4e4)}}); +/** + * A class to parse color values + * @author Stoyan Stefanov <sstoo@gmail.com> + * {@link http://www.phpied.com/rgb-color-parser-in-javascript/} + * @license Use it if you like it + */function h(t){var e;t=t||"",this.ok=!1,"#"==t.charAt(0)&&(t=t.substr(1,6));t={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",feldspar:"d19275",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslateblue:"8470ff",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",violetred:"d02090",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"}[t=(t=t.replace(/ /g,"")).toLowerCase()]||t;for(var r=[{re:/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,example:["rgb(123, 234, 45)","rgb(255,234,245)"],process:function(t){return[parseInt(t[1]),parseInt(t[2]),parseInt(t[3])]}},{re:/^(\w{2})(\w{2})(\w{2})$/,example:["#00ff00","336699"],process:function(t){return[parseInt(t[1],16),parseInt(t[2],16),parseInt(t[3],16)]}},{re:/^(\w{1})(\w{1})(\w{1})$/,example:["#fb0","f0f"],process:function(t){return[parseInt(t[1]+t[1],16),parseInt(t[2]+t[2],16),parseInt(t[3]+t[3],16)]}}],n=0;n<r.length;n++){var i=r[n].re,a=r[n].process,o=i.exec(t);o&&(e=a(o),this.r=e[0],this.g=e[1],this.b=e[2],this.ok=!0)}this.r=this.r<0||isNaN(this.r)?0:this.r>255?255:this.r,this.g=this.g<0||isNaN(this.g)?0:this.g>255?255:this.g,this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b,this.toRGB=function(){return"rgb("+this.r+", "+this.g+", "+this.b+")"},this.toHex=function(){var t=this.r.toString(16),e=this.g.toString(16),r=this.b.toString(16);return 1==t.length&&(t="0"+t),1==e.length&&(e="0"+e),1==r.length&&(r="0"+r),"#"+t+e+r}} +/** + * @license + * Joseph Myers does not specify a particular license for his work. + * + * Author: Joseph Myers + * Accessed from: http://www.myersdaily.org/joseph/javascript/md5.js + * + * Modified by: Owen Leong + */ +function f(t,e){var r=t[0],n=t[1],i=t[2],a=t[3];r=p(r,n,i,a,e[0],7,-680876936),a=p(a,r,n,i,e[1],12,-389564586),i=p(i,a,r,n,e[2],17,606105819),n=p(n,i,a,r,e[3],22,-1044525330),r=p(r,n,i,a,e[4],7,-176418897),a=p(a,r,n,i,e[5],12,1200080426),i=p(i,a,r,n,e[6],17,-1473231341),n=p(n,i,a,r,e[7],22,-45705983),r=p(r,n,i,a,e[8],7,1770035416),a=p(a,r,n,i,e[9],12,-1958414417),i=p(i,a,r,n,e[10],17,-42063),n=p(n,i,a,r,e[11],22,-1990404162),r=p(r,n,i,a,e[12],7,1804603682),a=p(a,r,n,i,e[13],12,-40341101),i=p(i,a,r,n,e[14],17,-1502002290),r=g(r,n=p(n,i,a,r,e[15],22,1236535329),i,a,e[1],5,-165796510),a=g(a,r,n,i,e[6],9,-1069501632),i=g(i,a,r,n,e[11],14,643717713),n=g(n,i,a,r,e[0],20,-373897302),r=g(r,n,i,a,e[5],5,-701558691),a=g(a,r,n,i,e[10],9,38016083),i=g(i,a,r,n,e[15],14,-660478335),n=g(n,i,a,r,e[4],20,-405537848),r=g(r,n,i,a,e[9],5,568446438),a=g(a,r,n,i,e[14],9,-1019803690),i=g(i,a,r,n,e[3],14,-187363961),n=g(n,i,a,r,e[8],20,1163531501),r=g(r,n,i,a,e[13],5,-1444681467),a=g(a,r,n,i,e[2],9,-51403784),i=g(i,a,r,n,e[7],14,1735328473),r=m(r,n=g(n,i,a,r,e[12],20,-1926607734),i,a,e[5],4,-378558),a=m(a,r,n,i,e[8],11,-2022574463),i=m(i,a,r,n,e[11],16,1839030562),n=m(n,i,a,r,e[14],23,-35309556),r=m(r,n,i,a,e[1],4,-1530992060),a=m(a,r,n,i,e[4],11,1272893353),i=m(i,a,r,n,e[7],16,-155497632),n=m(n,i,a,r,e[10],23,-1094730640),r=m(r,n,i,a,e[13],4,681279174),a=m(a,r,n,i,e[0],11,-358537222),i=m(i,a,r,n,e[3],16,-722521979),n=m(n,i,a,r,e[6],23,76029189),r=m(r,n,i,a,e[9],4,-640364487),a=m(a,r,n,i,e[12],11,-421815835),i=m(i,a,r,n,e[15],16,530742520),r=v(r,n=m(n,i,a,r,e[2],23,-995338651),i,a,e[0],6,-198630844),a=v(a,r,n,i,e[7],10,1126891415),i=v(i,a,r,n,e[14],15,-1416354905),n=v(n,i,a,r,e[5],21,-57434055),r=v(r,n,i,a,e[12],6,1700485571),a=v(a,r,n,i,e[3],10,-1894986606),i=v(i,a,r,n,e[10],15,-1051523),n=v(n,i,a,r,e[1],21,-2054922799),r=v(r,n,i,a,e[8],6,1873313359),a=v(a,r,n,i,e[15],10,-30611744),i=v(i,a,r,n,e[6],15,-1560198380),n=v(n,i,a,r,e[13],21,1309151649),r=v(r,n,i,a,e[4],6,-145523070),a=v(a,r,n,i,e[11],10,-1120210379),i=v(i,a,r,n,e[2],15,718787259),n=v(n,i,a,r,e[9],21,-343485551),t[0]=S(r,t[0]),t[1]=S(n,t[1]),t[2]=S(i,t[2]),t[3]=S(a,t[3])}function d(t,e,r,n,i,a){return e=S(S(e,t),S(n,a)),S(e<<i|e>>>32-i,r)}function p(t,e,r,n,i,a,o){return d(e&r|~e&n,t,e,i,a,o)}function g(t,e,r,n,i,a,o){return d(e&n|r&~n,t,e,i,a,o)}function m(t,e,r,n,i,a,o){return d(e^r^n,t,e,i,a,o)}function v(t,e,r,n,i,a,o){return d(r^(e|~n),t,e,i,a,o)}function b(t){var e,r=t.length,n=[1732584193,-271733879,-1732584194,271733878];for(e=64;e<=t.length;e+=64)f(n,y(t.substring(e-64,e)));t=t.substring(e-64);var i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(e=0;e<t.length;e++)i[e>>2]|=t.charCodeAt(e)<<(e%4<<3);if(i[e>>2]|=128<<(e%4<<3),e>55)for(f(n,i),e=0;e<16;e++)i[e]=0;return i[14]=8*r,f(n,i),n}function y(t){var e,r=[];for(e=0;e<64;e+=4)r[e>>2]=t.charCodeAt(e)+(t.charCodeAt(e+1)<<8)+(t.charCodeAt(e+2)<<16)+(t.charCodeAt(e+3)<<24);return r}c=r.atob.bind(r),u=r.btoa.bind(r);var w="0123456789abcdef".split("");function N(t){for(var e="",r=0;r<4;r++)e+=w[t>>8*r+4&15]+w[t>>8*r&15];return e}function L(t){return String.fromCharCode((255&t)>>0,(65280&t)>>8,(16711680&t)>>16,(4278190080&t)>>24)}function A(t){return function(t){return t.map(L).join("")}(b(t))}var x="5d41402abc4b2a76b9719d911017c592"!=function(t){for(var e=0;e<t.length;e++)t[e]=N(t[e]);return t.join("")}(b("hello"));function S(t,e){if(x){var r=(65535&t)+(65535&e);return(t>>16)+(e>>16)+(r>>16)<<16|65535&r}return t+e&4294967295} +/** + * @license + * FPDF is released under a permissive license: there is no usage restriction. + * You may embed it freely in your application (commercial or not), with or + * without modifications. + * + * Reference: http://www.fpdf.org/en/script/script37.php + */function _(t,e){var r,n,i,a;if(t!==r){for(var o=(i=t,a=1+(256/t.length>>0),new Array(a+1).join(i)),s=[],c=0;c<256;c++)s[c]=c;var u=0;for(c=0;c<256;c++){var l=s[c];u=(u+l+o.charCodeAt(c))%256,s[c]=s[u],s[u]=l}r=t,n=s}else s=n;var h=e.length,f=0,d=0,p="";for(c=0;c<h;c++)d=(d+(l=s[f=(f+1)%256]))%256,s[f]=s[d],s[d]=l,o=s[(s[f]+s[d])%256],p+=String.fromCharCode(e.charCodeAt(c)^o);return p} +/** + * @license + * Licensed under the MIT License. + * http://opensource.org/licenses/mit-license + * Author: Owen Leong (@owenl131) + * Date: 15 Oct 2020 + * References: + * https://www.cs.cmu.edu/~dst/Adobe/Gallery/anon21jul01-pdf-encryption.txt + * https://github.com/foliojs/pdfkit/blob/master/lib/security.js + * http://www.fpdf.org/en/script/script37.php + */var P={print:4,modify:8,copy:16,"annot-forms":32};function k(t,e,r,n){this.v=1,this.r=2;var i=192;t.forEach((function(t){if(void 0!==P.perm)throw new Error("Invalid permission: "+t);i+=P[t]})),this.padding="(ÂżN^NuŠAd\0NVÿú\b..\0¶Ăh>€/\f©þdSiz";var a=(e+this.padding).substr(0,32),o=(r+this.padding).substr(0,32);this.O=this.processOwnerPassword(a,o),this.P=-(1+(255^i)),this.encryptionKey=A(a+this.O+this.lsbFirstWord(this.P)+this.hexToBytes(n)).substr(0,5),this.U=_(this.encryptionKey,this.padding)}function F(t){if(/[^\u0000-\u00ff]/.test(t))throw new Error("Invalid PDF Name Object: "+t+", Only accept ASCII characters.");for(var e="",r=t.length,n=0;n<r;n++){var i=t.charCodeAt(n);if(i<33||35===i||37===i||40===i||41===i||47===i||60===i||62===i||91===i||93===i||123===i||125===i||i>126)e+="#"+("0"+i.toString(16)).slice(-2);else e+=t[n]}return e}function I(t){if("object"!==e(t))throw new Error("Invalid Context passed to initialize PubSub (jsPDF-module)");var n={};this.subscribe=function(t,e,r){if(r=r||!1,"string"!=typeof t||"function"!=typeof e||"boolean"!=typeof r)throw new Error("Invalid arguments passed to PubSub.subscribe (jsPDF-module)");n.hasOwnProperty(t)||(n[t]={});var i=Math.random().toString(35);return n[t][i]=[e,!!r],i},this.unsubscribe=function(t){for(var e in n)if(n[e][t])return delete n[e][t],0===Object.keys(n[e]).length&&delete n[e],!0;return!1},this.publish=function(e){if(n.hasOwnProperty(e)){var a=Array.prototype.slice.call(arguments,1),o=[];for(var s in n[e]){var c=n[e][s];try{c[0].apply(t,a)}catch(t){r.console&&i.error("jsPDF PubSub Error",t.message,t)}c[1]&&o.push(s)}o.length&&o.forEach(this.unsubscribe)}},this.getTopics=function(){return n}}function C(t){if(!(this instanceof C))return new C(t);var e="opacity,stroke-opacity".split(",");for(var r in t)t.hasOwnProperty(r)&&e.indexOf(r)>=0&&(this[r]=t[r]);this.id="",this.objectNumber=-1}function j(t,e){this.gState=t,this.matrix=e,this.id="",this.objectNumber=-1}function O(t,e,r,n,i){if(!(this instanceof O))return new O(t,e,r,n,i);this.type="axial"===t?2:3,this.coords=e,this.colors=r,j.call(this,n,i)}function B(t,e,r,n,i){if(!(this instanceof B))return new B(t,e,r,n,i);this.boundingBox=t,this.xStep=e,this.yStep=r,this.stream="",this.cloneIndex=0,j.call(this,n,i)}function M(t){var n,a="string"==typeof arguments[0]?arguments[0]:"p",o=arguments[1],s=arguments[2],c=arguments[3],f=[],d=1,p=16,g="S",m=null;"object"===e(t=t||{})&&(a=t.orientation,o=t.unit||o,s=t.format||s,c=t.compress||t.compressPdf||c,null!==(m=t.encryption||null)&&(m.userPassword=m.userPassword||"",m.ownerPassword=m.ownerPassword||"",m.userPermissions=m.userPermissions||[]),d="number"==typeof t.userUnit?Math.abs(t.userUnit):1,void 0!==t.precision&&(n=t.precision),void 0!==t.floatPrecision&&(p=t.floatPrecision),g=t.defaultPathOperation||"S"),f=t.filters||(!0===c?["FlateEncode"]:f),o=o||"mm",a=(""+(a||"P")).toLowerCase();var v=t.putOnlyUsedFonts||!1,b={},y={internal:{},__private__:{}};y.__private__.PubSub=I;var w="1.3",N=y.__private__.getPdfVersion=function(){return w};y.__private__.setPdfVersion=function(t){w=t};var L={a0:[2383.94,3370.39],a1:[1683.78,2383.94],a2:[1190.55,1683.78],a3:[841.89,1190.55],a4:[595.28,841.89],a5:[419.53,595.28],a6:[297.64,419.53],a7:[209.76,297.64],a8:[147.4,209.76],a9:[104.88,147.4],a10:[73.7,104.88],b0:[2834.65,4008.19],b1:[2004.09,2834.65],b2:[1417.32,2004.09],b3:[1000.63,1417.32],b4:[708.66,1000.63],b5:[498.9,708.66],b6:[354.33,498.9],b7:[249.45,354.33],b8:[175.75,249.45],b9:[124.72,175.75],b10:[87.87,124.72],c0:[2599.37,3676.54],c1:[1836.85,2599.37],c2:[1298.27,1836.85],c3:[918.43,1298.27],c4:[649.13,918.43],c5:[459.21,649.13],c6:[323.15,459.21],c7:[229.61,323.15],c8:[161.57,229.61],c9:[113.39,161.57],c10:[79.37,113.39],dl:[311.81,623.62],letter:[612,792],"government-letter":[576,756],legal:[612,1008],"junior-legal":[576,360],ledger:[1224,792],tabloid:[792,1224],"credit-card":[153,243]};y.__private__.getPageFormats=function(){return L};var A=y.__private__.getPageFormat=function(t){return L[t]};s=s||"a4";var x={COMPAT:"compat",ADVANCED:"advanced"},S=x.COMPAT;function _(){this.saveGraphicsState(),ht(new Vt(_t,0,0,-_t,0,Rr()*_t).toString()+" cm"),this.setFontSize(this.getFontSize()/_t),g="n",S=x.ADVANCED}function P(){this.restoreGraphicsState(),g="S",S=x.COMPAT}var j=y.__private__.combineFontStyleAndFontWeight=function(t,e){if("bold"==t&&"normal"==e||"bold"==t&&400==e||"normal"==t&&"italic"==e||"bold"==t&&"italic"==e)throw new Error("Invalid Combination of fontweight and fontstyle");return e&&(t=400==e||"normal"===e?"italic"===t?"italic":"normal":700!=e&&"bold"!==e||"normal"!==t?(700==e?"bold":e)+""+t:"bold"),t};y.advancedAPI=function(t){var e=S===x.COMPAT;return e&&_.call(this),"function"!=typeof t||(t(this),e&&P.call(this)),this},y.compatAPI=function(t){var e=S===x.ADVANCED;return e&&P.call(this),"function"!=typeof t||(t(this),e&&_.call(this)),this},y.isAdvancedAPI=function(){return S===x.ADVANCED};var E,q=function(t){if(S!==x.ADVANCED)throw new Error(t+" is only available in 'advanced' API mode. You need to call advancedAPI() first.")},D=y.roundToPrecision=y.__private__.roundToPrecision=function(t,e){var r=n||e;if(isNaN(t)||isNaN(r))throw new Error("Invalid argument passed to jsPDF.roundToPrecision");return t.toFixed(r).replace(/0+$/,"")};E=y.hpf=y.__private__.hpf="number"==typeof p?function(t){if(isNaN(t))throw new Error("Invalid argument passed to jsPDF.hpf");return D(t,p)}:"smart"===p?function(t){if(isNaN(t))throw new Error("Invalid argument passed to jsPDF.hpf");return D(t,t>-1&&t<1?16:5)}:function(t){if(isNaN(t))throw new Error("Invalid argument passed to jsPDF.hpf");return D(t,16)};var R=y.f2=y.__private__.f2=function(t){if(isNaN(t))throw new Error("Invalid argument passed to jsPDF.f2");return D(t,2)},T=y.__private__.f3=function(t){if(isNaN(t))throw new Error("Invalid argument passed to jsPDF.f3");return D(t,3)},U=y.scale=y.__private__.scale=function(t){if(isNaN(t))throw new Error("Invalid argument passed to jsPDF.scale");return S===x.COMPAT?t*_t:S===x.ADVANCED?t:void 0},z=function(t){return S===x.COMPAT?Rr()-t:S===x.ADVANCED?t:void 0},H=function(t){return U(z(t))};y.__private__.setPrecision=y.setPrecision=function(t){"number"==typeof parseInt(t,10)&&(n=parseInt(t,10))};var W,V="00000000000000000000000000000000",G=y.__private__.getFileId=function(){return V},Y=y.__private__.setFileId=function(t){return V=void 0!==t&&/^[a-fA-F0-9]{32}$/.test(t)?t.toUpperCase():V.split("").map((function(){return"ABCDEF0123456789".charAt(Math.floor(16*Math.random()))})).join(""),null!==m&&(Ye=new k(m.userPermissions,m.userPassword,m.ownerPassword,V)),V};y.setFileId=function(t){return Y(t),this},y.getFileId=function(){return G()};var J=y.__private__.convertDateToPDFDate=function(t){var e=t.getTimezoneOffset(),r=e<0?"+":"-",n=Math.floor(Math.abs(e/60)),i=Math.abs(e%60),a=[r,Q(n),"'",Q(i),"'"].join("");return["D:",t.getFullYear(),Q(t.getMonth()+1),Q(t.getDate()),Q(t.getHours()),Q(t.getMinutes()),Q(t.getSeconds()),a].join("")},X=y.__private__.convertPDFDateToDate=function(t){var e=parseInt(t.substr(2,4),10),r=parseInt(t.substr(6,2),10)-1,n=parseInt(t.substr(8,2),10),i=parseInt(t.substr(10,2),10),a=parseInt(t.substr(12,2),10),o=parseInt(t.substr(14,2),10);return new Date(e,r,n,i,a,o,0)},K=y.__private__.setCreationDate=function(t){var e;if(void 0===t&&(t=new Date),t instanceof Date)e=J(t);else{if(!/^D:(20[0-2][0-9]|203[0-7]|19[7-9][0-9])(0[0-9]|1[0-2])([0-2][0-9]|3[0-1])(0[0-9]|1[0-9]|2[0-3])(0[0-9]|[1-5][0-9])(0[0-9]|[1-5][0-9])(\+0[0-9]|\+1[0-4]|-0[0-9]|-1[0-1])'(0[0-9]|[1-5][0-9])'?$/.test(t))throw new Error("Invalid argument passed to jsPDF.setCreationDate");e=t}return W=e},Z=y.__private__.getCreationDate=function(t){var e=W;return"jsDate"===t&&(e=X(W)),e};y.setCreationDate=function(t){return K(t),this},y.getCreationDate=function(t){return Z(t)};var $,Q=y.__private__.padd2=function(t){return("0"+parseInt(t)).slice(-2)},tt=y.__private__.padd2Hex=function(t){return("00"+(t=t.toString())).substr(t.length)},et=0,rt=[],nt=[],it=0,at=[],ot=[],st=!1,ct=nt,ut=function(){et=0,it=0,nt=[],rt=[],at=[],Qt=Kt(),te=Kt()};y.__private__.setCustomOutputDestination=function(t){st=!0,ct=t};var lt=function(t){st||(ct=t)};y.__private__.resetCustomOutputDestination=function(){st=!1,ct=nt};var ht=y.__private__.out=function(t){return t=t.toString(),it+=t.length+1,ct.push(t),ct},ft=y.__private__.write=function(t){return ht(1===arguments.length?t.toString():Array.prototype.join.call(arguments," "))},dt=y.__private__.getArrayBuffer=function(t){for(var e=t.length,r=new ArrayBuffer(e),n=new Uint8Array(r);e--;)n[e]=t.charCodeAt(e);return r},pt=[["Helvetica","helvetica","normal","WinAnsiEncoding"],["Helvetica-Bold","helvetica","bold","WinAnsiEncoding"],["Helvetica-Oblique","helvetica","italic","WinAnsiEncoding"],["Helvetica-BoldOblique","helvetica","bolditalic","WinAnsiEncoding"],["Courier","courier","normal","WinAnsiEncoding"],["Courier-Bold","courier","bold","WinAnsiEncoding"],["Courier-Oblique","courier","italic","WinAnsiEncoding"],["Courier-BoldOblique","courier","bolditalic","WinAnsiEncoding"],["Times-Roman","times","normal","WinAnsiEncoding"],["Times-Bold","times","bold","WinAnsiEncoding"],["Times-Italic","times","italic","WinAnsiEncoding"],["Times-BoldItalic","times","bolditalic","WinAnsiEncoding"],["ZapfDingbats","zapfdingbats","normal",null],["Symbol","symbol","normal",null]];y.__private__.getStandardFonts=function(){return pt};var gt=t.fontSize||16;y.__private__.setFontSize=y.setFontSize=function(t){return gt=S===x.ADVANCED?t/_t:t,this};var mt,vt=y.__private__.getFontSize=y.getFontSize=function(){return S===x.COMPAT?gt:gt*_t},bt=t.R2L||!1;y.__private__.setR2L=y.setR2L=function(t){return bt=t,this},y.__private__.getR2L=y.getR2L=function(){return bt};var yt,wt=y.__private__.setZoomMode=function(t){var e=[void 0,null,"fullwidth","fullheight","fullpage","original"];if(/^(?:\d+\.\d*|\d*\.\d+|\d+)%$/.test(t))mt=t;else if(isNaN(t)){if(-1===e.indexOf(t))throw new Error('zoom must be Integer (e.g. 2), a percentage Value (e.g. 300%) or fullwidth, fullheight, fullpage, original. "'+t+'" is not recognized.');mt=t}else mt=parseInt(t,10)};y.__private__.getZoomMode=function(){return mt};var Nt,Lt=y.__private__.setPageMode=function(t){if(-1==[void 0,null,"UseNone","UseOutlines","UseThumbs","FullScreen"].indexOf(t))throw new Error('Page mode must be one of UseNone, UseOutlines, UseThumbs, or FullScreen. "'+t+'" is not recognized.');yt=t};y.__private__.getPageMode=function(){return yt};var At=y.__private__.setLayoutMode=function(t){if(-1==[void 0,null,"continuous","single","twoleft","tworight","two"].indexOf(t))throw new Error('Layout mode must be one of continuous, single, twoleft, tworight. "'+t+'" is not recognized.');Nt=t};y.__private__.getLayoutMode=function(){return Nt},y.__private__.setDisplayMode=y.setDisplayMode=function(t,e,r){return wt(t),At(e),Lt(r),this};var xt={title:"",subject:"",author:"",keywords:"",creator:""};y.__private__.getDocumentProperty=function(t){if(-1===Object.keys(xt).indexOf(t))throw new Error("Invalid argument passed to jsPDF.getDocumentProperty");return xt[t]},y.__private__.getDocumentProperties=function(){return xt},y.__private__.setDocumentProperties=y.setProperties=y.setDocumentProperties=function(t){for(var e in xt)xt.hasOwnProperty(e)&&t[e]&&(xt[e]=t[e]);return this},y.__private__.setDocumentProperty=function(t,e){if(-1===Object.keys(xt).indexOf(t))throw new Error("Invalid arguments passed to jsPDF.setDocumentProperty");return xt[t]=e};var St,_t,Pt,kt,Ft,It={},Ct={},jt=[],Ot={},Bt={},Mt={},Et={},qt=null,Dt=0,Rt=[],Tt=new I(y),Ut=t.hotfixes||[],zt={},Ht={},Wt=[],Vt=function t(e,r,n,i,a,o){if(!(this instanceof t))return new t(e,r,n,i,a,o);isNaN(e)&&(e=1),isNaN(r)&&(r=0),isNaN(n)&&(n=0),isNaN(i)&&(i=1),isNaN(a)&&(a=0),isNaN(o)&&(o=0),this._matrix=[e,r,n,i,a,o]};Object.defineProperty(Vt.prototype,"sx",{get:function(){return this._matrix[0]},set:function(t){this._matrix[0]=t}}),Object.defineProperty(Vt.prototype,"shy",{get:function(){return this._matrix[1]},set:function(t){this._matrix[1]=t}}),Object.defineProperty(Vt.prototype,"shx",{get:function(){return this._matrix[2]},set:function(t){this._matrix[2]=t}}),Object.defineProperty(Vt.prototype,"sy",{get:function(){return this._matrix[3]},set:function(t){this._matrix[3]=t}}),Object.defineProperty(Vt.prototype,"tx",{get:function(){return this._matrix[4]},set:function(t){this._matrix[4]=t}}),Object.defineProperty(Vt.prototype,"ty",{get:function(){return this._matrix[5]},set:function(t){this._matrix[5]=t}}),Object.defineProperty(Vt.prototype,"a",{get:function(){return this._matrix[0]},set:function(t){this._matrix[0]=t}}),Object.defineProperty(Vt.prototype,"b",{get:function(){return this._matrix[1]},set:function(t){this._matrix[1]=t}}),Object.defineProperty(Vt.prototype,"c",{get:function(){return this._matrix[2]},set:function(t){this._matrix[2]=t}}),Object.defineProperty(Vt.prototype,"d",{get:function(){return this._matrix[3]},set:function(t){this._matrix[3]=t}}),Object.defineProperty(Vt.prototype,"e",{get:function(){return this._matrix[4]},set:function(t){this._matrix[4]=t}}),Object.defineProperty(Vt.prototype,"f",{get:function(){return this._matrix[5]},set:function(t){this._matrix[5]=t}}),Object.defineProperty(Vt.prototype,"rotation",{get:function(){return Math.atan2(this.shx,this.sx)}}),Object.defineProperty(Vt.prototype,"scaleX",{get:function(){return this.decompose().scale.sx}}),Object.defineProperty(Vt.prototype,"scaleY",{get:function(){return this.decompose().scale.sy}}),Object.defineProperty(Vt.prototype,"isIdentity",{get:function(){return 1===this.sx&&(0===this.shy&&(0===this.shx&&(1===this.sy&&(0===this.tx&&0===this.ty))))}}),Vt.prototype.join=function(t){return[this.sx,this.shy,this.shx,this.sy,this.tx,this.ty].map(E).join(t)},Vt.prototype.multiply=function(t){var e=t.sx*this.sx+t.shy*this.shx,r=t.sx*this.shy+t.shy*this.sy,n=t.shx*this.sx+t.sy*this.shx,i=t.shx*this.shy+t.sy*this.sy,a=t.tx*this.sx+t.ty*this.shx+this.tx,o=t.tx*this.shy+t.ty*this.sy+this.ty;return new Vt(e,r,n,i,a,o)},Vt.prototype.decompose=function(){var t=this.sx,e=this.shy,r=this.shx,n=this.sy,i=this.tx,a=this.ty,o=Math.sqrt(t*t+e*e),s=(t/=o)*r+(e/=o)*n;r-=t*s,n-=e*s;var c=Math.sqrt(r*r+n*n);return s/=c,t*(n/=c)<e*(r/=c)&&(t=-t,e=-e,s=-s,o=-o),{scale:new Vt(o,0,0,c,0,0),translate:new Vt(1,0,0,1,i,a),rotate:new Vt(t,e,-e,t,0,0),skew:new Vt(1,0,s,1,0,0)}},Vt.prototype.toString=function(t){return this.join(" ")},Vt.prototype.inversed=function(){var t=this.sx,e=this.shy,r=this.shx,n=this.sy,i=this.tx,a=this.ty,o=1/(t*n-e*r),s=n*o,c=-e*o,u=-r*o,l=t*o;return new Vt(s,c,u,l,-s*i-u*a,-c*i-l*a)},Vt.prototype.applyToPoint=function(t){var e=t.x*this.sx+t.y*this.shx+this.tx,r=t.x*this.shy+t.y*this.sy+this.ty;return new Cr(e,r)},Vt.prototype.applyToRectangle=function(t){var e=this.applyToPoint(t),r=this.applyToPoint(new Cr(t.x+t.w,t.y+t.h));return new jr(e.x,e.y,r.x-e.x,r.y-e.y)},Vt.prototype.clone=function(){var t=this.sx,e=this.shy,r=this.shx,n=this.sy,i=this.tx,a=this.ty;return new Vt(t,e,r,n,i,a)},y.Matrix=Vt;var Gt=y.matrixMult=function(t,e){return e.multiply(t)},Yt=new Vt(1,0,0,1,0,0);y.unitMatrix=y.identityMatrix=Yt;var Jt=function(t,e){if(!Bt[t]){var r=(e instanceof O?"Sh":"P")+(Object.keys(Ot).length+1).toString(10);e.id=r,Bt[t]=r,Ot[r]=e,Tt.publish("addPattern",e)}};y.ShadingPattern=O,y.TilingPattern=B,y.addShadingPattern=function(t,e){return q("addShadingPattern()"),Jt(t,e),this},y.beginTilingPattern=function(t){q("beginTilingPattern()"),Br(t.boundingBox[0],t.boundingBox[1],t.boundingBox[2]-t.boundingBox[0],t.boundingBox[3]-t.boundingBox[1],t.matrix)},y.endTilingPattern=function(t,e){q("endTilingPattern()"),e.stream=ot[$].join("\n"),Jt(t,e),Tt.publish("endTilingPattern",e),Wt.pop().restore()};var Xt=y.__private__.newObject=function(){var t=Kt();return Zt(t,!0),t},Kt=y.__private__.newObjectDeferred=function(){return et++,rt[et]=function(){return it},et},Zt=function(t,e){return e="boolean"==typeof e&&e,rt[t]=it,e&&ht(t+" 0 obj"),t},$t=y.__private__.newAdditionalObject=function(){var t={objId:Kt(),content:""};return at.push(t),t},Qt=Kt(),te=Kt(),ee=y.__private__.decodeColorString=function(t){var e=t.split(" ");if(2!==e.length||"g"!==e[1]&&"G"!==e[1]){if(5===e.length&&("k"===e[4]||"K"===e[4])){e=[(1-e[0])*(1-e[3]),(1-e[1])*(1-e[3]),(1-e[2])*(1-e[3]),"r"]}}else{var r=parseFloat(e[0]);e=[r,r,r,"r"]}for(var n="#",i=0;i<3;i++)n+=("0"+Math.floor(255*parseFloat(e[i])).toString(16)).slice(-2);return n},re=y.__private__.encodeColorString=function(t){var r;"string"==typeof t&&(t={ch1:t});var n=t.ch1,i=t.ch2,a=t.ch3,o=t.ch4,s="draw"===t.pdfColorType?["G","RG","K"]:["g","rg","k"];if("string"==typeof n&&"#"!==n.charAt(0)){var c=new h(n);if(c.ok)n=c.toHex();else if(!/^\d*\.?\d*$/.test(n))throw new Error('Invalid color "'+n+'" passed to jsPDF.encodeColorString.')}if("string"==typeof n&&/^#[0-9A-Fa-f]{3}$/.test(n)&&(n="#"+n[1]+n[1]+n[2]+n[2]+n[3]+n[3]),"string"==typeof n&&/^#[0-9A-Fa-f]{6}$/.test(n)){var u=parseInt(n.substr(1),16);n=u>>16&255,i=u>>8&255,a=255&u}if(void 0===i||void 0===o&&n===i&&i===a)if("string"==typeof n)r=n+" "+s[0];else switch(t.precision){case 2:r=R(n/255)+" "+s[0];break;case 3:default:r=T(n/255)+" "+s[0]}else if(void 0===o||"object"===e(o)){if(o&&!isNaN(o.a)&&0===o.a)return r=["1.","1.","1.",s[1]].join(" ");if("string"==typeof n)r=[n,i,a,s[1]].join(" ");else switch(t.precision){case 2:r=[R(n/255),R(i/255),R(a/255),s[1]].join(" ");break;default:case 3:r=[T(n/255),T(i/255),T(a/255),s[1]].join(" ")}}else if("string"==typeof n)r=[n,i,a,o,s[2]].join(" ");else switch(t.precision){case 2:r=[R(n),R(i),R(a),R(o),s[2]].join(" ");break;case 3:default:r=[T(n),T(i),T(a),T(o),s[2]].join(" ")}return r},ne=y.__private__.getFilters=function(){return f},ie=y.__private__.putStream=function(t){var e=(t=t||{}).data||"",r=t.filters||ne(),n=t.alreadyAppliedFilters||[],i=t.addLength1||!1,a=e.length,o=t.objectId,s=function(t){return t};if(null!==m&&void 0===o)throw new Error("ObjectId must be passed to putStream for file encryption");null!==m&&(s=Ye.encryptor(o,0));var c={};!0===r&&(r=["FlateEncode"]);var u=t.additionalKeyValues||[],l=(c=void 0!==M.API.processDataByFilters?M.API.processDataByFilters(e,r):{data:e,reverseChain:[]}).reverseChain+(Array.isArray(n)?n.join(" "):n.toString());if(0!==c.data.length&&(u.push({key:"Length",value:c.data.length}),!0===i&&u.push({key:"Length1",value:a})),0!=l.length)if(l.split("/").length-1==1)u.push({key:"Filter",value:l});else{u.push({key:"Filter",value:"["+l+"]"});for(var h=0;h<u.length;h+=1)if("DecodeParms"===u[h].key){for(var f=[],d=0;d<c.reverseChain.split("/").length-1;d+=1)f.push("null");f.push(u[h].value),u[h].value="["+f.join(" ")+"]"}}ht("<<");for(var p=0;p<u.length;p++)ht("/"+u[p].key+" "+u[p].value);ht(">>"),0!==c.data.length&&(ht("stream"),ht(s(c.data)),ht("endstream"))},ae=y.__private__.putPage=function(t){var e=t.number,r=t.data,n=t.objId,i=t.contentsObjId;Zt(n,!0),ht("<</Type /Page"),ht("/Parent "+t.rootDictionaryObjId+" 0 R"),ht("/Resources "+t.resourceDictionaryObjId+" 0 R"),ht("/MediaBox ["+parseFloat(E(t.mediaBox.bottomLeftX))+" "+parseFloat(E(t.mediaBox.bottomLeftY))+" "+E(t.mediaBox.topRightX)+" "+E(t.mediaBox.topRightY)+"]"),null!==t.cropBox&&ht("/CropBox ["+E(t.cropBox.bottomLeftX)+" "+E(t.cropBox.bottomLeftY)+" "+E(t.cropBox.topRightX)+" "+E(t.cropBox.topRightY)+"]"),null!==t.bleedBox&&ht("/BleedBox ["+E(t.bleedBox.bottomLeftX)+" "+E(t.bleedBox.bottomLeftY)+" "+E(t.bleedBox.topRightX)+" "+E(t.bleedBox.topRightY)+"]"),null!==t.trimBox&&ht("/TrimBox ["+E(t.trimBox.bottomLeftX)+" "+E(t.trimBox.bottomLeftY)+" "+E(t.trimBox.topRightX)+" "+E(t.trimBox.topRightY)+"]"),null!==t.artBox&&ht("/ArtBox ["+E(t.artBox.bottomLeftX)+" "+E(t.artBox.bottomLeftY)+" "+E(t.artBox.topRightX)+" "+E(t.artBox.topRightY)+"]"),"number"==typeof t.userUnit&&1!==t.userUnit&&ht("/UserUnit "+t.userUnit),Tt.publish("putPage",{objId:n,pageContext:Rt[e],pageNumber:e,page:r}),ht("/Contents "+i+" 0 R"),ht(">>"),ht("endobj");var a=r.join("\n");return S===x.ADVANCED&&(a+="\nQ"),Zt(i,!0),ie({data:a,filters:ne(),objectId:i}),ht("endobj"),n},oe=y.__private__.putPages=function(){var t,e,r=[];for(t=1;t<=Dt;t++)Rt[t].objId=Kt(),Rt[t].contentsObjId=Kt();for(t=1;t<=Dt;t++)r.push(ae({number:t,data:ot[t],objId:Rt[t].objId,contentsObjId:Rt[t].contentsObjId,mediaBox:Rt[t].mediaBox,cropBox:Rt[t].cropBox,bleedBox:Rt[t].bleedBox,trimBox:Rt[t].trimBox,artBox:Rt[t].artBox,userUnit:Rt[t].userUnit,rootDictionaryObjId:Qt,resourceDictionaryObjId:te}));Zt(Qt,!0),ht("<</Type /Pages");var n="/Kids [";for(e=0;e<Dt;e++)n+=r[e]+" 0 R ";ht(n+"]"),ht("/Count "+Dt),ht(">>"),ht("endobj"),Tt.publish("postPutPages")},se=function(t){Tt.publish("putFont",{font:t,out:ht,newObject:Xt,putStream:ie}),!0!==t.isAlreadyPutted&&(t.objectNumber=Xt(),ht("<<"),ht("/Type /Font"),ht("/BaseFont /"+F(t.postScriptName)),ht("/Subtype /Type1"),"string"==typeof t.encoding&&ht("/Encoding /"+t.encoding),ht("/FirstChar 32"),ht("/LastChar 255"),ht(">>"),ht("endobj"))},ce=function(){for(var t in It)It.hasOwnProperty(t)&&(!1===v||!0===v&&b.hasOwnProperty(t))&&se(It[t])},ue=function(t){t.objectNumber=Xt();var e=[];e.push({key:"Type",value:"/XObject"}),e.push({key:"Subtype",value:"/Form"}),e.push({key:"BBox",value:"["+[E(t.x),E(t.y),E(t.x+t.width),E(t.y+t.height)].join(" ")+"]"}),e.push({key:"Matrix",value:"["+t.matrix.toString()+"]"});var r=t.pages[1].join("\n");ie({data:r,additionalKeyValues:e,objectId:t.objectNumber}),ht("endobj")},le=function(){for(var t in zt)zt.hasOwnProperty(t)&&ue(zt[t])},he=function(t,e){var r,n=[],i=1/(e-1);for(r=0;r<1;r+=i)n.push(r);if(n.push(1),0!=t[0].offset){var a={offset:0,color:t[0].color};t.unshift(a)}if(1!=t[t.length-1].offset){var o={offset:1,color:t[t.length-1].color};t.push(o)}for(var s="",c=0,u=0;u<n.length;u++){for(r=n[u];r>t[c+1].offset;)c++;var l=t[c].offset,h=(r-l)/(t[c+1].offset-l),f=t[c].color,d=t[c+1].color;s+=tt(Math.round((1-h)*f[0]+h*d[0]).toString(16))+tt(Math.round((1-h)*f[1]+h*d[1]).toString(16))+tt(Math.round((1-h)*f[2]+h*d[2]).toString(16))}return s.trim()},fe=function(t,e){e||(e=21);var r=Xt(),n=he(t.colors,e),i=[];i.push({key:"FunctionType",value:"0"}),i.push({key:"Domain",value:"[0.0 1.0]"}),i.push({key:"Size",value:"["+e+"]"}),i.push({key:"BitsPerSample",value:"8"}),i.push({key:"Range",value:"[0.0 1.0 0.0 1.0 0.0 1.0]"}),i.push({key:"Decode",value:"[0.0 1.0 0.0 1.0 0.0 1.0]"}),ie({data:n,additionalKeyValues:i,alreadyAppliedFilters:["/ASCIIHexDecode"],objectId:r}),ht("endobj"),t.objectNumber=Xt(),ht("<< /ShadingType "+t.type),ht("/ColorSpace /DeviceRGB");var a="/Coords ["+E(parseFloat(t.coords[0]))+" "+E(parseFloat(t.coords[1]))+" ";2===t.type?a+=E(parseFloat(t.coords[2]))+" "+E(parseFloat(t.coords[3])):a+=E(parseFloat(t.coords[2]))+" "+E(parseFloat(t.coords[3]))+" "+E(parseFloat(t.coords[4]))+" "+E(parseFloat(t.coords[5])),ht(a+="]"),t.matrix&&ht("/Matrix ["+t.matrix.toString()+"]"),ht("/Function "+r+" 0 R"),ht("/Extend [true true]"),ht(">>"),ht("endobj")},de=function(t,e){var r=Kt(),n=Xt();e.push({resourcesOid:r,objectOid:n}),t.objectNumber=n;var i=[];i.push({key:"Type",value:"/Pattern"}),i.push({key:"PatternType",value:"1"}),i.push({key:"PaintType",value:"1"}),i.push({key:"TilingType",value:"1"}),i.push({key:"BBox",value:"["+t.boundingBox.map(E).join(" ")+"]"}),i.push({key:"XStep",value:E(t.xStep)}),i.push({key:"YStep",value:E(t.yStep)}),i.push({key:"Resources",value:r+" 0 R"}),t.matrix&&i.push({key:"Matrix",value:"["+t.matrix.toString()+"]"}),ie({data:t.stream,additionalKeyValues:i,objectId:t.objectNumber}),ht("endobj")},pe=function(t){var e;for(e in Ot)Ot.hasOwnProperty(e)&&(Ot[e]instanceof O?fe(Ot[e]):Ot[e]instanceof B&&de(Ot[e],t))},ge=function(t){for(var e in t.objectNumber=Xt(),ht("<<"),t)switch(e){case"opacity":ht("/ca "+R(t[e]));break;case"stroke-opacity":ht("/CA "+R(t[e]))}ht(">>"),ht("endobj")},me=function(){var t;for(t in Mt)Mt.hasOwnProperty(t)&&ge(Mt[t])},ve=function(){for(var t in ht("/XObject <<"),zt)zt.hasOwnProperty(t)&&zt[t].objectNumber>=0&&ht("/"+t+" "+zt[t].objectNumber+" 0 R");Tt.publish("putXobjectDict"),ht(">>")},be=function(){Ye.oid=Xt(),ht("<<"),ht("/Filter /Standard"),ht("/V "+Ye.v),ht("/R "+Ye.r),ht("/U <"+Ye.toHexString(Ye.U)+">"),ht("/O <"+Ye.toHexString(Ye.O)+">"),ht("/P "+Ye.P),ht(">>"),ht("endobj")},ye=function(){for(var t in ht("/Font <<"),It)It.hasOwnProperty(t)&&(!1===v||!0===v&&b.hasOwnProperty(t))&&ht("/"+t+" "+It[t].objectNumber+" 0 R");ht(">>")},we=function(){if(Object.keys(Ot).length>0){for(var t in ht("/Shading <<"),Ot)Ot.hasOwnProperty(t)&&Ot[t]instanceof O&&Ot[t].objectNumber>=0&&ht("/"+t+" "+Ot[t].objectNumber+" 0 R");Tt.publish("putShadingPatternDict"),ht(">>")}},Ne=function(t){if(Object.keys(Ot).length>0){for(var e in ht("/Pattern <<"),Ot)Ot.hasOwnProperty(e)&&Ot[e]instanceof y.TilingPattern&&Ot[e].objectNumber>=0&&Ot[e].objectNumber<t&&ht("/"+e+" "+Ot[e].objectNumber+" 0 R");Tt.publish("putTilingPatternDict"),ht(">>")}},Le=function(){if(Object.keys(Mt).length>0){var t;for(t in ht("/ExtGState <<"),Mt)Mt.hasOwnProperty(t)&&Mt[t].objectNumber>=0&&ht("/"+t+" "+Mt[t].objectNumber+" 0 R");Tt.publish("putGStateDict"),ht(">>")}},Ae=function(t){Zt(t.resourcesOid,!0),ht("<<"),ht("/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]"),ye(),we(),Ne(t.objectOid),Le(),ve(),ht(">>"),ht("endobj")},xe=function(){var t=[];ce(),me(),le(),pe(t),Tt.publish("putResources"),t.forEach(Ae),Ae({resourcesOid:te,objectOid:Number.MAX_SAFE_INTEGER}),Tt.publish("postPutResources")},Se=function(){Tt.publish("putAdditionalObjects");for(var t=0;t<at.length;t++){var e=at[t];Zt(e.objId,!0),ht(e.content),ht("endobj")}Tt.publish("postPutAdditionalObjects")},_e=function(t){Ct[t.fontName]=Ct[t.fontName]||{},Ct[t.fontName][t.fontStyle]=t.id},Pe=function(t,e,r,n,i){var a={id:"F"+(Object.keys(It).length+1).toString(10),postScriptName:t,fontName:e,fontStyle:r,encoding:n,isStandardFont:i||!1,metadata:{}};return Tt.publish("addFont",{font:a,instance:this}),It[a.id]=a,_e(a),a.id},ke=function(t){for(var e=0,r=pt.length;e<r;e++){var n=Pe.call(this,t[e][0],t[e][1],t[e][2],pt[e][3],!0);!1===v&&(b[n]=!0);var i=t[e][0].split("-");_e({id:n,fontName:i[0],fontStyle:i[1]||""})}Tt.publish("addFonts",{fonts:It,dictionary:Ct})},Fe=function(t){return t.foo=function(){try{return t.apply(this,arguments)}catch(t){var e=t.stack||"";~e.indexOf(" at ")&&(e=e.split(" at ")[1]);var n="Error in function "+e.split("\n")[0].split("<")[0]+": "+t.message;if(!r.console)throw new Error(n);r.console.error(n,t),r.alert&&alert(n)}},t.foo.bar=t,t.foo},Ie=function(t,e){var r,n,i,a,o,s,c,u,l;if(i=(e=e||{}).sourceEncoding||"Unicode",o=e.outputEncoding,(e.autoencode||o)&&It[St].metadata&&It[St].metadata[i]&&It[St].metadata[i].encoding&&(a=It[St].metadata[i].encoding,!o&&It[St].encoding&&(o=It[St].encoding),!o&&a.codePages&&(o=a.codePages[0]),"string"==typeof o&&(o=a[o]),o)){for(c=!1,s=[],r=0,n=t.length;r<n;r++)(u=o[t.charCodeAt(r)])?s.push(String.fromCharCode(u)):s.push(t[r]),s[r].charCodeAt(0)>>8&&(c=!0);t=s.join("")}for(r=t.length;void 0===c&&0!==r;)t.charCodeAt(r-1)>>8&&(c=!0),r--;if(!c)return t;for(s=e.noBOM?[]:[254,255],r=0,n=t.length;r<n;r++){if((l=(u=t.charCodeAt(r))>>8)>>8)throw new Error("Character at position "+r+" of string '"+t+"' exceeds 16bits. Cannot be encoded into UCS-2 BE");s.push(l),s.push(u-(l<<8))}return String.fromCharCode.apply(void 0,s)},Ce=y.__private__.pdfEscape=y.pdfEscape=function(t,e){return Ie(t,e).replace(/\\/g,"\\\\").replace(/\(/g,"\\(").replace(/\)/g,"\\)")},je=y.__private__.beginPage=function(t){ot[++Dt]=[],Rt[Dt]={objId:0,contentsObjId:0,userUnit:Number(d),artBox:null,bleedBox:null,cropBox:null,trimBox:null,mediaBox:{bottomLeftX:0,bottomLeftY:0,topRightX:Number(t[0]),topRightY:Number(t[1])}},Me(Dt),lt(ot[$])},Oe=function(t,e){var r,n,o;switch(a=e||a,"string"==typeof t&&(r=A(t.toLowerCase()),Array.isArray(r)&&(n=r[0],o=r[1])),Array.isArray(t)&&(n=t[0]*_t,o=t[1]*_t),isNaN(n)&&(n=s[0],o=s[1]),(n>14400||o>14400)&&(i.warn("A page in a PDF can not be wider or taller than 14400 userUnit. jsPDF limits the width/height to 14400"),n=Math.min(14400,n),o=Math.min(14400,o)),s=[n,o],a.substr(0,1)){case"l":o>n&&(s=[o,n]);break;case"p":n>o&&(s=[o,n])}je(s),pr(fr),ht(Lr),0!==kr&&ht(kr+" J"),0!==Fr&&ht(Fr+" j"),Tt.publish("addPage",{pageNumber:Dt})},Be=function(t){t>0&&t<=Dt&&(ot.splice(t,1),Rt.splice(t,1),Dt--,$>Dt&&($=Dt),this.setPage($))},Me=function(t){t>0&&t<=Dt&&($=t)},Ee=y.__private__.getNumberOfPages=y.getNumberOfPages=function(){return ot.length-1},qe=function(t,e,r){var n,a=void 0;return r=r||{},t=void 0!==t?t:It[St].fontName,e=void 0!==e?e:It[St].fontStyle,n=t.toLowerCase(),void 0!==Ct[n]&&void 0!==Ct[n][e]?a=Ct[n][e]:void 0!==Ct[t]&&void 0!==Ct[t][e]?a=Ct[t][e]:!1===r.disableWarning&&i.warn("Unable to look up font label for font '"+t+"', '"+e+"'. Refer to getFontList() for available fonts."),a||r.noFallback||null==(a=Ct.times[e])&&(a=Ct.times.normal),a},De=y.__private__.putInfo=function(){var t=Xt(),e=function(t){return t};for(var r in null!==m&&(e=Ye.encryptor(t,0)),ht("<<"),ht("/Producer ("+Ce(e("jsPDF "+M.version))+")"),xt)xt.hasOwnProperty(r)&&xt[r]&&ht("/"+r.substr(0,1).toUpperCase()+r.substr(1)+" ("+Ce(e(xt[r]))+")");ht("/CreationDate ("+Ce(e(W))+")"),ht(">>"),ht("endobj")},Re=y.__private__.putCatalog=function(t){var e=(t=t||{}).rootDictionaryObjId||Qt;switch(Xt(),ht("<<"),ht("/Type /Catalog"),ht("/Pages "+e+" 0 R"),mt||(mt="fullwidth"),mt){case"fullwidth":ht("/OpenAction [3 0 R /FitH null]");break;case"fullheight":ht("/OpenAction [3 0 R /FitV null]");break;case"fullpage":ht("/OpenAction [3 0 R /Fit]");break;case"original":ht("/OpenAction [3 0 R /XYZ null null 1]");break;default:var r=""+mt;"%"===r.substr(r.length-1)&&(mt=parseInt(mt)/100),"number"==typeof mt&&ht("/OpenAction [3 0 R /XYZ null null "+R(mt)+"]")}switch(Nt||(Nt="continuous"),Nt){case"continuous":ht("/PageLayout /OneColumn");break;case"single":ht("/PageLayout /SinglePage");break;case"two":case"twoleft":ht("/PageLayout /TwoColumnLeft");break;case"tworight":ht("/PageLayout /TwoColumnRight")}yt&&ht("/PageMode /"+yt),Tt.publish("putCatalog"),ht(">>"),ht("endobj")},Te=y.__private__.putTrailer=function(){ht("trailer"),ht("<<"),ht("/Size "+(et+1)),ht("/Root "+et+" 0 R"),ht("/Info "+(et-1)+" 0 R"),null!==m&&ht("/Encrypt "+Ye.oid+" 0 R"),ht("/ID [ <"+V+"> <"+V+"> ]"),ht(">>")},Ue=y.__private__.putHeader=function(){ht("%PDF-"+w),ht("%ºß¬à ")},ze=y.__private__.putXRef=function(){var t="0000000000";ht("xref"),ht("0 "+(et+1)),ht("0000000000 65535 f ");for(var e=1;e<=et;e++){"function"==typeof rt[e]?ht((t+rt[e]()).slice(-10)+" 00000 n "):void 0!==rt[e]?ht((t+rt[e]).slice(-10)+" 00000 n "):ht("0000000000 00000 n ")}},He=y.__private__.buildDocument=function(){ut(),lt(nt),Tt.publish("buildDocument"),Ue(),oe(),Se(),xe(),null!==m&&be(),De(),Re();var t=it;return ze(),Te(),ht("startxref"),ht(""+t),ht("%%EOF"),lt(ot[$]),nt.join("\n")},We=y.__private__.getBlob=function(t){return new Blob([dt(t)],{type:"application/pdf"})},Ve=y.output=y.__private__.output=Fe((function(t,e){switch("string"==typeof(e=e||{})?e={filename:e}:e.filename=e.filename||"generated.pdf",t){case void 0:return He();case"save":y.save(e.filename);break;case"arraybuffer":return dt(He());case"blob":return We(He());case"bloburi":case"bloburl":if(void 0!==r.URL&&"function"==typeof r.URL.createObjectURL)return r.URL&&r.URL.createObjectURL(We(He()))||void 0;i.warn("bloburl is not supported by your system, because URL.createObjectURL is not supported by your browser.");break;case"datauristring":case"dataurlstring":var n="",a=He();try{n=u(a)}catch(t){n=u(unescape(encodeURIComponent(a)))}return"data:application/pdf;filename="+e.filename+";base64,"+n;case"pdfobjectnewwindow":if("[object Window]"===Object.prototype.toString.call(r)){var o="https://cdnjs.cloudflare.com/ajax/libs/pdfobject/2.1.1/pdfobject.min.js",s=' integrity="sha512-4ze/a9/4jqu+tX9dfOqJYSvyYd5M6qum/3HpCLr+/Jqf0whc37VUbkpNGHR7/8pSnCFw47T1fmIpwBV7UySh3g==" crossorigin="anonymous"';e.pdfObjectUrl&&(o=e.pdfObjectUrl,s="");var c='<html><style>html, body { padding: 0; margin: 0; } iframe { width: 100%; height: 100%; border: 0;} </style><body><script src="'+o+'"'+s+'><\/script><script >PDFObject.embed("'+this.output("dataurlstring")+'", '+JSON.stringify(e)+");<\/script></body></html>",l=r.open();return null!==l&&l.document.write(c),l}throw new Error("The option pdfobjectnewwindow just works in a browser-environment.");case"pdfjsnewwindow":if("[object Window]"===Object.prototype.toString.call(r)){var h='<html><style>html, body { padding: 0; margin: 0; } iframe { width: 100%; height: 100%; border: 0;} </style><body><iframe id="pdfViewer" src="'+(e.pdfJsUrl||"examples/PDF.js/web/viewer.html")+"?file=&downloadName="+e.filename+'" width="500px" height="400px" /></body></html>',f=r.open();if(null!==f){f.document.write(h);var d=this;f.document.documentElement.querySelector("#pdfViewer").onload=function(){f.document.title=e.filename,f.document.documentElement.querySelector("#pdfViewer").contentWindow.PDFViewerApplication.open(d.output("bloburl"))}}return f}throw new Error("The option pdfjsnewwindow just works in a browser-environment.");case"dataurlnewwindow":if("[object Window]"!==Object.prototype.toString.call(r))throw new Error("The option dataurlnewwindow just works in a browser-environment.");var p='<html><style>html, body { padding: 0; margin: 0; } iframe { width: 100%; height: 100%; border: 0;} </style><body><iframe src="'+this.output("datauristring",e)+'"></iframe></body></html>',g=r.open();if(null!==g&&(g.document.write(p),g.document.title=e.filename),g||"undefined"==typeof safari)return g;break;case"datauri":case"dataurl":return r.document.location.href=this.output("datauristring",e);default:return null}})),Ge=function(t){return!0===Array.isArray(Ut)&&Ut.indexOf(t)>-1};switch(o){case"pt":_t=1;break;case"mm":_t=72/25.4;break;case"cm":_t=72/2.54;break;case"in":_t=72;break;case"px":_t=1==Ge("px_scaling")?.75:96/72;break;case"pc":case"em":_t=12;break;case"ex":_t=6;break;default:if("number"!=typeof o)throw new Error("Invalid unit: "+o);_t=o}var Ye=null;K(),Y();var Je=function(t){return null!==m?Ye.encryptor(t,0):function(t){return t}},Xe=y.__private__.getPageInfo=y.getPageInfo=function(t){if(isNaN(t)||t%1!=0)throw new Error("Invalid argument passed to jsPDF.getPageInfo");return{objId:Rt[t].objId,pageNumber:t,pageContext:Rt[t]}},Ke=y.__private__.getPageInfoByObjId=function(t){if(isNaN(t)||t%1!=0)throw new Error("Invalid argument passed to jsPDF.getPageInfoByObjId");for(var e in Rt)if(Rt[e].objId===t)break;return Xe(e)},Ze=y.__private__.getCurrentPageInfo=y.getCurrentPageInfo=function(){return{objId:Rt[$].objId,pageNumber:$,pageContext:Rt[$]}};y.addPage=function(){return Oe.apply(this,arguments),this},y.setPage=function(){return Me.apply(this,arguments),lt.call(this,ot[$]),this},y.insertPage=function(t){return this.addPage(),this.movePage($,t),this},y.movePage=function(t,e){var r,n;if(t>e){r=ot[t],n=Rt[t];for(var i=t;i>e;i--)ot[i]=ot[i-1],Rt[i]=Rt[i-1];ot[e]=r,Rt[e]=n,this.setPage(e)}else if(t<e){r=ot[t],n=Rt[t];for(var a=t;a<e;a++)ot[a]=ot[a+1],Rt[a]=Rt[a+1];ot[e]=r,Rt[e]=n,this.setPage(e)}return this},y.deletePage=function(){return Be.apply(this,arguments),this},y.__private__.text=y.text=function(t,r,n,i,a){var o,s,c,u,l,h,f,d,p,g=(i=i||{}).scope||this;if("number"==typeof t&&"number"==typeof r&&("string"==typeof n||Array.isArray(n))){var m=n;n=r,r=t,t=m}if(arguments[3]instanceof Vt==!1?(c=arguments[4],u=arguments[5],"object"===e(f=arguments[3])&&null!==f||("string"==typeof c&&(u=c,c=null),"string"==typeof f&&(u=f,f=null),"number"==typeof f&&(c=f,f=null),i={flags:f,angle:c,align:u})):(q("The transform parameter of text() with a Matrix value"),p=a),isNaN(r)||isNaN(n)||null==t)throw new Error("Invalid arguments passed to jsPDF.text");if(0===t.length)return g;var v="",y=!1,w="number"==typeof i.lineHeightFactor?i.lineHeightFactor:hr,N=g.internal.scaleFactor;function L(t){return t=t.split("\t").join(Array(i.TabLen||9).join(" ")),Ce(t,f)}function A(t){for(var e,r=t.concat(),n=[],i=r.length;i--;)"string"==typeof(e=r.shift())?n.push(e):Array.isArray(t)&&(1===e.length||void 0===e[1]&&void 0===e[2])?n.push(e[0]):n.push([e[0],e[1],e[2]]);return n}function _(t,e){var r;if("string"==typeof t)r=e(t)[0];else if(Array.isArray(t)){for(var n,i,a=t.concat(),o=[],s=a.length;s--;)"string"==typeof(n=a.shift())?o.push(e(n)[0]):Array.isArray(n)&&"string"==typeof n[0]&&(i=e(n[0],n[1],n[2]),o.push([i[0],i[1],i[2]]));r=o}return r}var P=!1,k=!0;if("string"==typeof t)P=!0;else if(Array.isArray(t)){var F=t.concat();s=[];for(var I,C=F.length;C--;)("string"!=typeof(I=F.shift())||Array.isArray(I)&&"string"!=typeof I[0])&&(k=!1);P=k}if(!1===P)throw new Error('Type of text must be string or Array. "'+t+'" is not recognized.');"string"==typeof t&&(t=t.match(/[\r?\n]/)?t.split(/\r\n|\r|\n/g):[t]);var j=gt/g.internal.scaleFactor,O=j*(w-1);switch(i.baseline){case"bottom":n-=O;break;case"top":n+=j-O;break;case"hanging":n+=j-2*O;break;case"middle":n+=j/2-O}if((h=i.maxWidth||0)>0&&("string"==typeof t?t=g.splitTextToSize(t,h):"[object Array]"===Object.prototype.toString.call(t)&&(t=t.reduce((function(t,e){return t.concat(g.splitTextToSize(e,h))}),[]))),o={text:t,x:r,y:n,options:i,mutex:{pdfEscape:Ce,activeFontKey:St,fonts:It,activeFontSize:gt}},Tt.publish("preProcessText",o),t=o.text,c=(i=o.options).angle,p instanceof Vt==!1&&c&&"number"==typeof c){c*=Math.PI/180,0===i.rotationDirection&&(c=-c),S===x.ADVANCED&&(c=-c);var B=Math.cos(c),M=Math.sin(c);p=new Vt(B,M,-M,B,0,0)}else c&&c instanceof Vt&&(p=c);S!==x.ADVANCED||p||(p=Yt),void 0!==(l=i.charSpace||_r)&&(v+=E(U(l))+" Tc\n",this.setCharSpace(this.getCharSpace()||0)),void 0!==(d=i.horizontalScale)&&(v+=E(100*d)+" Tz\n");i.lang;var D=-1,R=void 0!==i.renderingMode?i.renderingMode:i.stroke,T=g.internal.getCurrentPageInfo().pageContext;switch(R){case 0:case!1:case"fill":D=0;break;case 1:case!0:case"stroke":D=1;break;case 2:case"fillThenStroke":D=2;break;case 3:case"invisible":D=3;break;case 4:case"fillAndAddForClipping":D=4;break;case 5:case"strokeAndAddPathForClipping":D=5;break;case 6:case"fillThenStrokeAndAddToPathForClipping":D=6;break;case 7:case"addToPathForClipping":D=7}var z=void 0!==T.usedRenderingMode?T.usedRenderingMode:-1;-1!==D?v+=D+" Tr\n":-1!==z&&(v+="0 Tr\n"),-1!==D&&(T.usedRenderingMode=D),u=i.align||"left";var H,W=gt*w,V=g.internal.pageSize.getWidth(),G=It[St];l=i.charSpace||_r,h=i.maxWidth||0,f=Object.assign({autoencode:!0,noBOM:!0},i.flags);var Y=[];if("[object Array]"===Object.prototype.toString.call(t)){var J;s=A(t),"left"!==u&&(H=s.map((function(t){return g.getStringUnitWidth(t,{font:G,charSpace:l,fontSize:gt,doKerning:!1})*gt/N})));var X,K=0;if("right"===u){r-=H[0],t=[],C=s.length;for(var Z=0;Z<C;Z++)0===Z?(X=br(r),J=yr(n)):(X=U(K-H[Z]),J=-W),t.push([s[Z],X,J]),K=H[Z]}else if("center"===u){r-=H[0]/2,t=[],C=s.length;for(var $=0;$<C;$++)0===$?(X=br(r),J=yr(n)):(X=U((K-H[$])/2),J=-W),t.push([s[$],X,J]),K=H[$]}else if("left"===u){t=[],C=s.length;for(var Q=0;Q<C;Q++)t.push(s[Q])}else{if("justify"!==u)throw new Error('Unrecognized alignment option, use "left", "center", "right" or "justify".');t=[],C=s.length,h=0!==h?h:V;for(var tt=0;tt<C;tt++)J=0===tt?yr(n):-W,X=0===tt?br(r):0,tt<C-1?Y.push(E(U((h-H[tt])/(s[tt].split(" ").length-1)))):Y.push(0),t.push([s[tt],X,J])}}var et="boolean"==typeof i.R2L?i.R2L:bt;!0===et&&(t=_(t,(function(t,e,r){return[t.split("").reverse().join(""),e,r]}))),o={text:t,x:r,y:n,options:i,mutex:{pdfEscape:Ce,activeFontKey:St,fonts:It,activeFontSize:gt}},Tt.publish("postProcessText",o),t=o.text,y=o.mutex.isHex||!1;var rt=It[St].encoding;"WinAnsiEncoding"!==rt&&"StandardEncoding"!==rt||(t=_(t,(function(t,e,r){return[L(t),e,r]}))),s=A(t),t=[];for(var nt,it,at,ot=0,st=1,ct=Array.isArray(s[0])?st:ot,ut="",lt=function(t,e,r){var n="";return r instanceof Vt?(r="number"==typeof i.angle?Gt(r,new Vt(1,0,0,1,t,e)):Gt(new Vt(1,0,0,1,t,e),r),S===x.ADVANCED&&(r=Gt(new Vt(1,0,0,-1,0,0),r)),n=r.join(" ")+" Tm\n"):n=E(t)+" "+E(e)+" Td\n",n},ft=0;ft<s.length;ft++){switch(ut="",ct){case st:at=(y?"<":"(")+s[ft][0]+(y?">":")"),nt=parseFloat(s[ft][1]),it=parseFloat(s[ft][2]);break;case ot:at=(y?"<":"(")+s[ft]+(y?">":")"),nt=br(r),it=yr(n)}void 0!==Y&&void 0!==Y[ft]&&(ut=Y[ft]+" Tw\n"),0===ft?t.push(ut+lt(nt,it,p)+at):ct===ot?t.push(ut+at):ct===st&&t.push(ut+lt(nt,it,p)+at)}t=ct===ot?t.join(" Tj\nT* "):t.join(" Tj\n"),t+=" Tj\n";var dt="BT\n/";return dt+=St+" "+gt+" Tf\n",dt+=E(gt*w)+" TL\n",dt+=xr+"\n",dt+=v,dt+=t,ht(dt+="ET"),b[St]=!0,g};var $e=y.__private__.clip=y.clip=function(t){return ht("evenodd"===t?"W*":"W"),this};y.clipEvenOdd=function(){return $e("evenodd")},y.__private__.discardPath=y.discardPath=function(){return ht("n"),this};var Qe=y.__private__.isValidStyle=function(t){var e=!1;return-1!==[void 0,null,"S","D","F","DF","FD","f","f*","B","B*","n"].indexOf(t)&&(e=!0),e};y.__private__.setDefaultPathOperation=y.setDefaultPathOperation=function(t){return Qe(t)&&(g=t),this};var tr=y.__private__.getStyle=y.getStyle=function(t){var e=g;switch(t){case"D":case"S":e="S";break;case"F":e="f";break;case"FD":case"DF":e="B";break;case"f":case"f*":case"B":case"B*":e=t}return e},er=y.close=function(){return ht("h"),this};y.stroke=function(){return ht("S"),this},y.fill=function(t){return rr("f",t),this},y.fillEvenOdd=function(t){return rr("f*",t),this},y.fillStroke=function(t){return rr("B",t),this},y.fillStrokeEvenOdd=function(t){return rr("B*",t),this};var rr=function(t,r){"object"===e(r)?ar(r,t):ht(t)},nr=function(t){null===t||S===x.ADVANCED&&void 0===t||(t=tr(t),ht(t))};function ir(t,e,r,n,i){var a=new B(e||this.boundingBox,r||this.xStep,n||this.yStep,this.gState,i||this.matrix);a.stream=this.stream;var o=t+"$$"+this.cloneIndex+++"$$";return Jt(o,a),a}var ar=function(t,e){var r=Bt[t.key],n=Ot[r];if(n instanceof O)ht("q"),ht(or(e)),n.gState&&y.setGState(n.gState),ht(t.matrix.toString()+" cm"),ht("/"+r+" sh"),ht("Q");else if(n instanceof B){var i=new Vt(1,0,0,-1,0,Rr());t.matrix&&(i=i.multiply(t.matrix||Yt),r=ir.call(n,t.key,t.boundingBox,t.xStep,t.yStep,i).id),ht("q"),ht("/Pattern cs"),ht("/"+r+" scn"),n.gState&&y.setGState(n.gState),ht(e),ht("Q")}},or=function(t){switch(t){case"f":case"F":return"W n";case"f*":return"W* n";case"B":return"W S";case"B*":return"W* S";case"S":return"W S";case"n":return"W n"}},sr=y.moveTo=function(t,e){return ht(E(U(t))+" "+E(H(e))+" m"),this},cr=y.lineTo=function(t,e){return ht(E(U(t))+" "+E(H(e))+" l"),this},ur=y.curveTo=function(t,e,r,n,i,a){return ht([E(U(t)),E(H(e)),E(U(r)),E(H(n)),E(U(i)),E(H(a)),"c"].join(" ")),this};y.__private__.line=y.line=function(t,e,r,n,i){if(isNaN(t)||isNaN(e)||isNaN(r)||isNaN(n)||!Qe(i))throw new Error("Invalid arguments passed to jsPDF.line");return S===x.COMPAT?this.lines([[r-t,n-e]],t,e,[1,1],i||"S"):this.lines([[r-t,n-e]],t,e,[1,1]).stroke()},y.__private__.lines=y.lines=function(t,e,r,n,i,a){var o,s,c,u,l,h,f,d,p,g,m,v;if("number"==typeof t&&(v=r,r=e,e=t,t=v),n=n||[1,1],a=a||!1,isNaN(e)||isNaN(r)||!Array.isArray(t)||!Array.isArray(n)||!Qe(i)||"boolean"!=typeof a)throw new Error("Invalid arguments passed to jsPDF.lines");for(sr(e,r),o=n[0],s=n[1],u=t.length,g=e,m=r,c=0;c<u;c++)2===(l=t[c]).length?(g=l[0]*o+g,m=l[1]*s+m,cr(g,m)):(h=l[0]*o+g,f=l[1]*s+m,d=l[2]*o+g,p=l[3]*s+m,g=l[4]*o+g,m=l[5]*s+m,ur(h,f,d,p,g,m));return a&&er(),nr(i),this},y.path=function(t){for(var e=0;e<t.length;e++){var r=t[e],n=r.c;switch(r.op){case"m":sr(n[0],n[1]);break;case"l":cr(n[0],n[1]);break;case"c":ur.apply(this,n);break;case"h":er()}}return this},y.__private__.rect=y.rect=function(t,e,r,n,i){if(isNaN(t)||isNaN(e)||isNaN(r)||isNaN(n)||!Qe(i))throw new Error("Invalid arguments passed to jsPDF.rect");return S===x.COMPAT&&(n=-n),ht([E(U(t)),E(H(e)),E(U(r)),E(U(n)),"re"].join(" ")),nr(i),this},y.__private__.triangle=y.triangle=function(t,e,r,n,i,a,o){if(isNaN(t)||isNaN(e)||isNaN(r)||isNaN(n)||isNaN(i)||isNaN(a)||!Qe(o))throw new Error("Invalid arguments passed to jsPDF.triangle");return this.lines([[r-t,n-e],[i-r,a-n],[t-i,e-a]],t,e,[1,1],o,!0),this},y.__private__.roundedRect=y.roundedRect=function(t,e,r,n,i,a,o){if(isNaN(t)||isNaN(e)||isNaN(r)||isNaN(n)||isNaN(i)||isNaN(a)||!Qe(o))throw new Error("Invalid arguments passed to jsPDF.roundedRect");var s=4/3*(Math.SQRT2-1);return i=Math.min(i,.5*r),a=Math.min(a,.5*n),this.lines([[r-2*i,0],[i*s,0,i,a-a*s,i,a],[0,n-2*a],[0,a*s,-i*s,a,-i,a],[2*i-r,0],[-i*s,0,-i,-a*s,-i,-a],[0,2*a-n],[0,-a*s,i*s,-a,i,-a]],t+i,e,[1,1],o,!0),this},y.__private__.ellipse=y.ellipse=function(t,e,r,n,i){if(isNaN(t)||isNaN(e)||isNaN(r)||isNaN(n)||!Qe(i))throw new Error("Invalid arguments passed to jsPDF.ellipse");var a=4/3*(Math.SQRT2-1)*r,o=4/3*(Math.SQRT2-1)*n;return sr(t+r,e),ur(t+r,e-o,t+a,e-n,t,e-n),ur(t-a,e-n,t-r,e-o,t-r,e),ur(t-r,e+o,t-a,e+n,t,e+n),ur(t+a,e+n,t+r,e+o,t+r,e),nr(i),this},y.__private__.circle=y.circle=function(t,e,r,n){if(isNaN(t)||isNaN(e)||isNaN(r)||!Qe(n))throw new Error("Invalid arguments passed to jsPDF.circle");return this.ellipse(t,e,r,r,n)},y.setFont=function(t,e,r){return r&&(e=j(e,r)),St=qe(t,e,{disableWarning:!1}),this};var lr=y.__private__.getFont=y.getFont=function(){return It[qe.apply(y,arguments)]};y.__private__.getFontList=y.getFontList=function(){var t,e,r={};for(t in Ct)if(Ct.hasOwnProperty(t))for(e in r[t]=[],Ct[t])Ct[t].hasOwnProperty(e)&&r[t].push(e);return r},y.addFont=function(t,e,r,n,i){var a=["StandardEncoding","MacRomanEncoding","Identity-H","WinAnsiEncoding"];return arguments[3]&&-1!==a.indexOf(arguments[3])?i=arguments[3]:arguments[3]&&-1==a.indexOf(arguments[3])&&(r=j(r,n)),i=i||"Identity-H",Pe.call(this,t,e,r,i)};var hr,fr=t.lineWidth||.200025,dr=y.__private__.getLineWidth=y.getLineWidth=function(){return fr},pr=y.__private__.setLineWidth=y.setLineWidth=function(t){return fr=t,ht(E(U(t))+" w"),this};y.__private__.setLineDash=M.API.setLineDash=M.API.setLineDashPattern=function(t,e){if(t=t||[],e=e||0,isNaN(e)||!Array.isArray(t))throw new Error("Invalid arguments passed to jsPDF.setLineDash");return t=t.map((function(t){return E(U(t))})).join(" "),e=E(U(e)),ht("["+t+"] "+e+" d"),this};var gr=y.__private__.getLineHeight=y.getLineHeight=function(){return gt*hr};y.__private__.getLineHeight=y.getLineHeight=function(){return gt*hr};var mr=y.__private__.setLineHeightFactor=y.setLineHeightFactor=function(t){return"number"==typeof(t=t||1.15)&&(hr=t),this},vr=y.__private__.getLineHeightFactor=y.getLineHeightFactor=function(){return hr};mr(t.lineHeight);var br=y.__private__.getHorizontalCoordinate=function(t){return U(t)},yr=y.__private__.getVerticalCoordinate=function(t){return S===x.ADVANCED?t:Rt[$].mediaBox.topRightY-Rt[$].mediaBox.bottomLeftY-U(t)},wr=y.__private__.getHorizontalCoordinateString=y.getHorizontalCoordinateString=function(t){return E(br(t))},Nr=y.__private__.getVerticalCoordinateString=y.getVerticalCoordinateString=function(t){return E(yr(t))},Lr=t.strokeColor||"0 G";y.__private__.getStrokeColor=y.getDrawColor=function(){return ee(Lr)},y.__private__.setStrokeColor=y.setDrawColor=function(t,e,r,n){return Lr=re({ch1:t,ch2:e,ch3:r,ch4:n,pdfColorType:"draw",precision:2}),ht(Lr),this};var Ar=t.fillColor||"0 g";y.__private__.getFillColor=y.getFillColor=function(){return ee(Ar)},y.__private__.setFillColor=y.setFillColor=function(t,e,r,n){return Ar=re({ch1:t,ch2:e,ch3:r,ch4:n,pdfColorType:"fill",precision:2}),ht(Ar),this};var xr=t.textColor||"0 g",Sr=y.__private__.getTextColor=y.getTextColor=function(){return ee(xr)};y.__private__.setTextColor=y.setTextColor=function(t,e,r,n){return xr=re({ch1:t,ch2:e,ch3:r,ch4:n,pdfColorType:"text",precision:3}),this};var _r=t.charSpace,Pr=y.__private__.getCharSpace=y.getCharSpace=function(){return parseFloat(_r||0)};y.__private__.setCharSpace=y.setCharSpace=function(t){if(isNaN(t))throw new Error("Invalid argument passed to jsPDF.setCharSpace");return _r=t,this};var kr=0;y.CapJoinStyles={0:0,butt:0,but:0,miter:0,1:1,round:1,rounded:1,circle:1,2:2,projecting:2,project:2,square:2,bevel:2},y.__private__.setLineCap=y.setLineCap=function(t){var e=y.CapJoinStyles[t];if(void 0===e)throw new Error("Line cap style of '"+t+"' is not recognized. See or extend .CapJoinStyles property for valid styles");return kr=e,ht(e+" J"),this};var Fr=0;y.__private__.setLineJoin=y.setLineJoin=function(t){var e=y.CapJoinStyles[t];if(void 0===e)throw new Error("Line join style of '"+t+"' is not recognized. See or extend .CapJoinStyles property for valid styles");return Fr=e,ht(e+" j"),this},y.__private__.setLineMiterLimit=y.__private__.setMiterLimit=y.setLineMiterLimit=y.setMiterLimit=function(t){if(t=t||0,isNaN(t))throw new Error("Invalid argument passed to jsPDF.setLineMiterLimit");return ht(E(U(t))+" M"),this},y.GState=C,y.setGState=function(t){(t="string"==typeof t?Mt[Et[t]]:Ir(null,t)).equals(qt)||(ht("/"+t.id+" gs"),qt=t)};var Ir=function(t,e){if(!t||!Et[t]){var r=!1;for(var n in Mt)if(Mt.hasOwnProperty(n)&&Mt[n].equals(e)){r=!0;break}if(r)e=Mt[n];else{var i="GS"+(Object.keys(Mt).length+1).toString(10);Mt[i]=e,e.id=i}return t&&(Et[t]=e.id),Tt.publish("addGState",e),e}};y.addGState=function(t,e){return Ir(t,e),this},y.saveGraphicsState=function(){return ht("q"),jt.push({key:St,size:gt,color:xr}),this},y.restoreGraphicsState=function(){ht("Q");var t=jt.pop();return St=t.key,gt=t.size,xr=t.color,qt=null,this},y.setCurrentTransformationMatrix=function(t){return ht(t.toString()+" cm"),this},y.comment=function(t){return ht("#"+t),this};var Cr=function(t,e){var r=t||0;Object.defineProperty(this,"x",{enumerable:!0,get:function(){return r},set:function(t){isNaN(t)||(r=parseFloat(t))}});var n=e||0;Object.defineProperty(this,"y",{enumerable:!0,get:function(){return n},set:function(t){isNaN(t)||(n=parseFloat(t))}});var i="pt";return Object.defineProperty(this,"type",{enumerable:!0,get:function(){return i},set:function(t){i=t.toString()}}),this},jr=function(t,e,r,n){Cr.call(this,t,e),this.type="rect";var i=r||0;Object.defineProperty(this,"w",{enumerable:!0,get:function(){return i},set:function(t){isNaN(t)||(i=parseFloat(t))}});var a=n||0;return Object.defineProperty(this,"h",{enumerable:!0,get:function(){return a},set:function(t){isNaN(t)||(a=parseFloat(t))}}),this},Or=function(){this.page=Dt,this.currentPage=$,this.pages=ot.slice(0),this.pagesContext=Rt.slice(0),this.x=Pt,this.y=kt,this.matrix=Ft,this.width=qr($),this.height=Rr($),this.outputDestination=ct,this.id="",this.objectNumber=-1};Or.prototype.restore=function(){Dt=this.page,$=this.currentPage,Rt=this.pagesContext,ot=this.pages,Pt=this.x,kt=this.y,Ft=this.matrix,Dr($,this.width),Tr($,this.height),ct=this.outputDestination};var Br=function(t,e,r,n,i){Wt.push(new Or),Dt=$=0,ot=[],Pt=t,kt=e,Ft=i,je([r,n])},Mr=function(t){if(Ht[t])Wt.pop().restore();else{var e=new Or,r="Xo"+(Object.keys(zt).length+1).toString(10);e.id=r,Ht[t]=r,zt[r]=e,Tt.publish("addFormObject",e),Wt.pop().restore()}};for(var Er in y.beginFormObject=function(t,e,r,n,i){return Br(t,e,r,n,i),this},y.endFormObject=function(t){return Mr(t),this},y.doFormObject=function(t,e){var r=zt[Ht[t]];return ht("q"),ht(e.toString()+" cm"),ht("/"+r.id+" Do"),ht("Q"),this},y.getFormObject=function(t){var e=zt[Ht[t]];return{x:e.x,y:e.y,width:e.width,height:e.height,matrix:e.matrix}},y.save=function(t,e){return t=t||"generated.pdf",(e=e||{}).returnPromise=e.returnPromise||!1,!1===e.returnPromise?(l(We(He()),t),"function"==typeof l.unload&&r.setTimeout&&setTimeout(l.unload,911),this):new Promise((function(e,n){try{var i=l(We(He()),t);"function"==typeof l.unload&&r.setTimeout&&setTimeout(l.unload,911),e(i)}catch(t){n(t.message)}}))},M.API)M.API.hasOwnProperty(Er)&&("events"===Er&&M.API.events.length?function(t,e){var r,n,i;for(i=e.length-1;-1!==i;i--)r=e[i][0],n=e[i][1],t.subscribe.apply(t,[r].concat("function"==typeof n?[n]:n))}(Tt,M.API.events):y[Er]=M.API[Er]);var qr=y.getPageWidth=function(t){return(Rt[t=t||$].mediaBox.topRightX-Rt[t].mediaBox.bottomLeftX)/_t},Dr=y.setPageWidth=function(t,e){Rt[t].mediaBox.topRightX=e*_t+Rt[t].mediaBox.bottomLeftX},Rr=y.getPageHeight=function(t){return(Rt[t=t||$].mediaBox.topRightY-Rt[t].mediaBox.bottomLeftY)/_t},Tr=y.setPageHeight=function(t,e){Rt[t].mediaBox.topRightY=e*_t+Rt[t].mediaBox.bottomLeftY};return y.internal={pdfEscape:Ce,getStyle:tr,getFont:lr,getFontSize:vt,getCharSpace:Pr,getTextColor:Sr,getLineHeight:gr,getLineHeightFactor:vr,getLineWidth:dr,write:ft,getHorizontalCoordinate:br,getVerticalCoordinate:yr,getCoordinateString:wr,getVerticalCoordinateString:Nr,collections:{},newObject:Xt,newAdditionalObject:$t,newObjectDeferred:Kt,newObjectDeferredBegin:Zt,getFilters:ne,putStream:ie,events:Tt,scaleFactor:_t,pageSize:{getWidth:function(){return qr($)},setWidth:function(t){Dr($,t)},getHeight:function(){return Rr($)},setHeight:function(t){Tr($,t)}},encryptionOptions:m,encryption:Ye,getEncryptor:Je,output:Ve,getNumberOfPages:Ee,pages:ot,out:ht,f2:R,f3:T,getPageInfo:Xe,getPageInfoByObjId:Ke,getCurrentPageInfo:Ze,getPDFVersion:N,Point:Cr,Rectangle:jr,Matrix:Vt,hasHotfix:Ge},Object.defineProperty(y.internal.pageSize,"width",{get:function(){return qr($)},set:function(t){Dr($,t)},enumerable:!0,configurable:!0}),Object.defineProperty(y.internal.pageSize,"height",{get:function(){return Rr($)},set:function(t){Tr($,t)},enumerable:!0,configurable:!0}),ke.call(y,pt),St="F1",Oe(s,a),Tt.publish("initialized"),y}k.prototype.lsbFirstWord=function(t){return String.fromCharCode(t>>0&255,t>>8&255,t>>16&255,t>>24&255)},k.prototype.toHexString=function(t){return t.split("").map((function(t){return("0"+(255&t.charCodeAt(0)).toString(16)).slice(-2)})).join("")},k.prototype.hexToBytes=function(t){for(var e=[],r=0;r<t.length;r+=2)e.push(String.fromCharCode(parseInt(t.substr(r,2),16)));return e.join("")},k.prototype.processOwnerPassword=function(t,e){return _(A(e).substr(0,5),t)},k.prototype.encryptor=function(t,e){var r=A(this.encryptionKey+String.fromCharCode(255&t,t>>8&255,t>>16&255,255&e,e>>8&255)).substr(0,10);return function(t){return _(r,t)}},C.prototype.equals=function(t){var r,n="id,objectNumber,equals";if(!t||e(t)!==e(this))return!1;var i=0;for(r in this)if(!(n.indexOf(r)>=0)){if(this.hasOwnProperty(r)&&!t.hasOwnProperty(r))return!1;if(this[r]!==t[r])return!1;i++}for(r in t)t.hasOwnProperty(r)&&n.indexOf(r)<0&&i--;return 0===i},M.API={events:[]},M.version="2.5.1";var E=M.API,q=1,D=function(t){return t.replace(/\\/g,"\\\\").replace(/\(/g,"\\(").replace(/\)/g,"\\)")},R=function(t){return t.replace(/\\\\/g,"\\").replace(/\\\(/g,"(").replace(/\\\)/g,")")},T=function(t){return t.toFixed(2)},U=function(t){return t.toFixed(5)};E.__acroform__={};var z=function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t},H=function(t){return t*q},W=function(t){var e=new ct,r=Lt.internal.getHeight(t)||0,n=Lt.internal.getWidth(t)||0;return e.BBox=[0,0,Number(T(n)),Number(T(r))],e},V=E.__acroform__.setBit=function(t,e){if(t=t||0,e=e||0,isNaN(t)||isNaN(e))throw new Error("Invalid arguments passed to jsPDF.API.__acroform__.setBit");return t|=1<<e},G=E.__acroform__.clearBit=function(t,e){if(t=t||0,e=e||0,isNaN(t)||isNaN(e))throw new Error("Invalid arguments passed to jsPDF.API.__acroform__.clearBit");return t&=~(1<<e)},Y=E.__acroform__.getBit=function(t,e){if(isNaN(t)||isNaN(e))throw new Error("Invalid arguments passed to jsPDF.API.__acroform__.getBit");return 0==(t&1<<e)?0:1},J=E.__acroform__.getBitForPdf=function(t,e){if(isNaN(t)||isNaN(e))throw new Error("Invalid arguments passed to jsPDF.API.__acroform__.getBitForPdf");return Y(t,e-1)},X=E.__acroform__.setBitForPdf=function(t,e){if(isNaN(t)||isNaN(e))throw new Error("Invalid arguments passed to jsPDF.API.__acroform__.setBitForPdf");return V(t,e-1)},K=E.__acroform__.clearBitForPdf=function(t,e){if(isNaN(t)||isNaN(e))throw new Error("Invalid arguments passed to jsPDF.API.__acroform__.clearBitForPdf");return G(t,e-1)},Z=E.__acroform__.calculateCoordinates=function(t,e){var r=e.internal.getHorizontalCoordinate,n=e.internal.getVerticalCoordinate,i=t[0],a=t[1],o=t[2],s=t[3],c={};return c.lowerLeft_X=r(i)||0,c.lowerLeft_Y=n(a+s)||0,c.upperRight_X=r(i+o)||0,c.upperRight_Y=n(a)||0,[Number(T(c.lowerLeft_X)),Number(T(c.lowerLeft_Y)),Number(T(c.upperRight_X)),Number(T(c.upperRight_Y))]},$=function(t){if(t.appearanceStreamContent)return t.appearanceStreamContent;if(t.V||t.DV){var e=[],r=t._V||t.DV,n=Q(t,r),i=t.scope.internal.getFont(t.fontName,t.fontStyle).id;e.push("/Tx BMC"),e.push("q"),e.push("BT"),e.push(t.scope.__private__.encodeColorString(t.color)),e.push("/"+i+" "+T(n.fontSize)+" Tf"),e.push("1 0 0 1 0 0 Tm"),e.push(n.text),e.push("ET"),e.push("Q"),e.push("EMC");var a=W(t);return a.scope=t.scope,a.stream=e.join("\n"),a}},Q=function(t,e){var r=0===t.fontSize?t.maxFontSize:t.fontSize,n={text:"",fontSize:""},i=(e=")"==(e="("==e.substr(0,1)?e.substr(1):e).substr(e.length-1)?e.substr(0,e.length-1):e).split(" ");i=t.multiline?i.map((function(t){return t.split("\n")})):i.map((function(t){return[t]}));var a=r,o=Lt.internal.getHeight(t)||0;o=o<0?-o:o;var s=Lt.internal.getWidth(t)||0;s=s<0?-s:s;var c=function(e,r,n){if(e+1<i.length){var a=r+" "+i[e+1][0];return tt(a,t,n).width<=s-4}return!1};a++;t:for(;a>0;){e="",a--;var u,l,h=tt("3",t,a).height,f=t.multiline?o-a:(o-h)/2,d=f+=2,p=0,g=0,m=0;if(a<=0){e="(...) Tj\n",e+="% Width of Text: "+tt(e,t,a=12).width+", FieldWidth:"+s+"\n";break}for(var v="",b=0,y=0;y<i.length;y++)if(i.hasOwnProperty(y)){var w=!1;if(1!==i[y].length&&m!==i[y].length-1){if((h+2)*(b+2)+2>o)continue t;v+=i[y][m],w=!0,g=y,y--}else{v=" "==(v+=i[y][m]+" ").substr(v.length-1)?v.substr(0,v.length-1):v;var N=parseInt(y),L=c(N,v,a),A=y>=i.length-1;if(L&&!A){v+=" ",m=0;continue}if(L||A){if(A)g=N;else if(t.multiline&&(h+2)*(b+2)+2>o)continue t}else{if(!t.multiline)continue t;if((h+2)*(b+2)+2>o)continue t;g=N}}for(var x="",S=p;S<=g;S++){var _=i[S];if(t.multiline){if(S===g){x+=_[m]+" ",m=(m+1)%_.length;continue}if(S===p){x+=_[_.length-1]+" ";continue}}x+=_[0]+" "}switch(x=" "==x.substr(x.length-1)?x.substr(0,x.length-1):x,l=tt(x,t,a).width,t.textAlign){case"right":u=s-l-2;break;case"center":u=(s-l)/2;break;case"left":default:u=2}e+=T(u)+" "+T(d)+" Td\n",e+="("+D(x)+") Tj\n",e+=-T(u)+" 0 Td\n",d=-(a+2),l=0,p=w?g:g+1,b++,v=""}else;break}return n.text=e,n.fontSize=a,n},tt=function(t,e,r){var n=e.scope.internal.getFont(e.fontName,e.fontStyle),i=e.scope.getStringUnitWidth(t,{font:n,fontSize:parseFloat(r),charSpace:0})*parseFloat(r);return{height:e.scope.getStringUnitWidth("3",{font:n,fontSize:parseFloat(r),charSpace:0})*parseFloat(r)*1.5,width:i}},et={fields:[],xForms:[],acroFormDictionaryRoot:null,printedOut:!1,internal:null,isInitialized:!1},rt=function(t,e){var r={type:"reference",object:t};void 0===e.internal.getPageInfo(t.page).pageContext.annotations.find((function(t){return t.type===r.type&&t.object===r.object}))&&e.internal.getPageInfo(t.page).pageContext.annotations.push(r)},nt=function(t,r){for(var n in t)if(t.hasOwnProperty(n)){var i=n,a=t[n];r.internal.newObjectDeferredBegin(a.objId,!0),"object"===e(a)&&"function"==typeof a.putStream&&a.putStream(),delete t[i]}},it=function(t,r){if(r.scope=t,void 0!==t.internal&&(void 0===t.internal.acroformPlugin||!1===t.internal.acroformPlugin.isInitialized)){if(lt.FieldNum=0,t.internal.acroformPlugin=JSON.parse(JSON.stringify(et)),t.internal.acroformPlugin.acroFormDictionaryRoot)throw new Error("Exception while creating AcroformDictionary");q=t.internal.scaleFactor,t.internal.acroformPlugin.acroFormDictionaryRoot=new ut,t.internal.acroformPlugin.acroFormDictionaryRoot.scope=t,t.internal.acroformPlugin.acroFormDictionaryRoot._eventID=t.internal.events.subscribe("postPutResources",(function(){!function(t){t.internal.events.unsubscribe(t.internal.acroformPlugin.acroFormDictionaryRoot._eventID),delete t.internal.acroformPlugin.acroFormDictionaryRoot._eventID,t.internal.acroformPlugin.printedOut=!0}(t)})),t.internal.events.subscribe("buildDocument",(function(){!function(t){t.internal.acroformPlugin.acroFormDictionaryRoot.objId=void 0;var e=t.internal.acroformPlugin.acroFormDictionaryRoot.Fields;for(var r in e)if(e.hasOwnProperty(r)){var n=e[r];n.objId=void 0,n.hasAnnotation&&rt(n,t)}}(t)})),t.internal.events.subscribe("putCatalog",(function(){!function(t){if(void 0===t.internal.acroformPlugin.acroFormDictionaryRoot)throw new Error("putCatalogCallback: Root missing.");t.internal.write("/AcroForm "+t.internal.acroformPlugin.acroFormDictionaryRoot.objId+" 0 R")}(t)})),t.internal.events.subscribe("postPutPages",(function(r){!function(t,r){var n=!t;for(var i in t||(r.internal.newObjectDeferredBegin(r.internal.acroformPlugin.acroFormDictionaryRoot.objId,!0),r.internal.acroformPlugin.acroFormDictionaryRoot.putStream()),t=t||r.internal.acroformPlugin.acroFormDictionaryRoot.Kids)if(t.hasOwnProperty(i)){var a=t[i],o=[],s=a.Rect;if(a.Rect&&(a.Rect=Z(a.Rect,r)),r.internal.newObjectDeferredBegin(a.objId,!0),a.DA=Lt.createDefaultAppearanceStream(a),"object"===e(a)&&"function"==typeof a.getKeyValueListForStream&&(o=a.getKeyValueListForStream()),a.Rect=s,a.hasAppearanceStream&&!a.appearanceStreamContent){var c=$(a);o.push({key:"AP",value:"<</N "+c+">>"}),r.internal.acroformPlugin.xForms.push(c)}if(a.appearanceStreamContent){var u="";for(var l in a.appearanceStreamContent)if(a.appearanceStreamContent.hasOwnProperty(l)){var h=a.appearanceStreamContent[l];if(u+="/"+l+" ",u+="<<",Object.keys(h).length>=1||Array.isArray(h)){for(var i in h)if(h.hasOwnProperty(i)){var f=h[i];"function"==typeof f&&(f=f.call(r,a)),u+="/"+i+" "+f+" ",r.internal.acroformPlugin.xForms.indexOf(f)>=0||r.internal.acroformPlugin.xForms.push(f)}}else"function"==typeof(f=h)&&(f=f.call(r,a)),u+="/"+i+" "+f,r.internal.acroformPlugin.xForms.indexOf(f)>=0||r.internal.acroformPlugin.xForms.push(f);u+=">>"}o.push({key:"AP",value:"<<\n"+u+">>"})}r.internal.putStream({additionalKeyValues:o,objectId:a.objId}),r.internal.out("endobj")}n&&nt(r.internal.acroformPlugin.xForms,r)}(r,t)})),t.internal.acroformPlugin.isInitialized=!0}},at=E.__acroform__.arrayToPdfArray=function(t,r,n){var i=function(t){return t};if(Array.isArray(t)){for(var a="[",o=0;o<t.length;o++)switch(0!==o&&(a+=" "),e(t[o])){case"boolean":case"number":case"object":a+=t[o].toString();break;case"string":"/"!==t[o].substr(0,1)?(void 0!==r&&n&&(i=n.internal.getEncryptor(r)),a+="("+D(i(t[o].toString()))+")"):a+=t[o].toString()}return a+="]"}throw new Error("Invalid argument passed to jsPDF.__acroform__.arrayToPdfArray")};var ot=function(t,e,r){var n=function(t){return t};return void 0!==e&&r&&(n=r.internal.getEncryptor(e)),(t=t||"").toString(),t="("+D(n(t))+")"},st=function(){this._objId=void 0,this._scope=void 0,Object.defineProperty(this,"objId",{get:function(){if(void 0===this._objId){if(void 0===this.scope)return;this._objId=this.scope.internal.newObjectDeferred()}return this._objId},set:function(t){this._objId=t}}),Object.defineProperty(this,"scope",{value:this._scope,writable:!0})};st.prototype.toString=function(){return this.objId+" 0 R"},st.prototype.putStream=function(){var t=this.getKeyValueListForStream();this.scope.internal.putStream({data:this.stream,additionalKeyValues:t,objectId:this.objId}),this.scope.internal.out("endobj")},st.prototype.getKeyValueListForStream=function(){var t=[],e=Object.getOwnPropertyNames(this).filter((function(t){return"content"!=t&&"appearanceStreamContent"!=t&&"scope"!=t&&"objId"!=t&&"_"!=t.substring(0,1)}));for(var r in e)if(!1===Object.getOwnPropertyDescriptor(this,e[r]).configurable){var n=e[r],i=this[n];i&&(Array.isArray(i)?t.push({key:n,value:at(i,this.objId,this.scope)}):i instanceof st?(i.scope=this.scope,t.push({key:n,value:i.objId+" 0 R"})):"function"!=typeof i&&t.push({key:n,value:i}))}return t};var ct=function(){st.call(this),Object.defineProperty(this,"Type",{value:"/XObject",configurable:!1,writable:!0}),Object.defineProperty(this,"Subtype",{value:"/Form",configurable:!1,writable:!0}),Object.defineProperty(this,"FormType",{value:1,configurable:!1,writable:!0});var t,e=[];Object.defineProperty(this,"BBox",{configurable:!1,get:function(){return e},set:function(t){e=t}}),Object.defineProperty(this,"Resources",{value:"2 0 R",configurable:!1,writable:!0}),Object.defineProperty(this,"stream",{enumerable:!1,configurable:!0,set:function(e){t=e.trim()},get:function(){return t||null}})};z(ct,st);var ut=function(){st.call(this);var t,e=[];Object.defineProperty(this,"Kids",{enumerable:!1,configurable:!0,get:function(){return e.length>0?e:void 0}}),Object.defineProperty(this,"Fields",{enumerable:!1,configurable:!1,get:function(){return e}}),Object.defineProperty(this,"DA",{enumerable:!1,configurable:!1,get:function(){if(t){var e=function(t){return t};return this.scope&&(e=this.scope.internal.getEncryptor(this.objId)),"("+D(e(t))+")"}},set:function(e){t=e}})};z(ut,st);var lt=function t(){st.call(this);var e=4;Object.defineProperty(this,"F",{enumerable:!1,configurable:!1,get:function(){return e},set:function(t){if(isNaN(t))throw new Error('Invalid value "'+t+'" for attribute F supplied.');e=t}}),Object.defineProperty(this,"showWhenPrinted",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(e,3))},set:function(t){!0===Boolean(t)?this.F=X(e,3):this.F=K(e,3)}});var r=0;Object.defineProperty(this,"Ff",{enumerable:!1,configurable:!1,get:function(){return r},set:function(t){if(isNaN(t))throw new Error('Invalid value "'+t+'" for attribute Ff supplied.');r=t}});var n=[];Object.defineProperty(this,"Rect",{enumerable:!1,configurable:!1,get:function(){if(0!==n.length)return n},set:function(t){n=void 0!==t?t:[]}}),Object.defineProperty(this,"x",{enumerable:!0,configurable:!0,get:function(){return!n||isNaN(n[0])?0:n[0]},set:function(t){n[0]=t}}),Object.defineProperty(this,"y",{enumerable:!0,configurable:!0,get:function(){return!n||isNaN(n[1])?0:n[1]},set:function(t){n[1]=t}}),Object.defineProperty(this,"width",{enumerable:!0,configurable:!0,get:function(){return!n||isNaN(n[2])?0:n[2]},set:function(t){n[2]=t}}),Object.defineProperty(this,"height",{enumerable:!0,configurable:!0,get:function(){return!n||isNaN(n[3])?0:n[3]},set:function(t){n[3]=t}});var i="";Object.defineProperty(this,"FT",{enumerable:!0,configurable:!1,get:function(){return i},set:function(t){switch(t){case"/Btn":case"/Tx":case"/Ch":case"/Sig":i=t;break;default:throw new Error('Invalid value "'+t+'" for attribute FT supplied.')}}});var a=null;Object.defineProperty(this,"T",{enumerable:!0,configurable:!1,get:function(){if(!a||a.length<1){if(this instanceof bt)return;a="FieldObject"+t.FieldNum++}var e=function(t){return t};return this.scope&&(e=this.scope.internal.getEncryptor(this.objId)),"("+D(e(a))+")"},set:function(t){a=t.toString()}}),Object.defineProperty(this,"fieldName",{configurable:!0,enumerable:!0,get:function(){return a},set:function(t){a=t}});var o="helvetica";Object.defineProperty(this,"fontName",{enumerable:!0,configurable:!0,get:function(){return o},set:function(t){o=t}});var s="normal";Object.defineProperty(this,"fontStyle",{enumerable:!0,configurable:!0,get:function(){return s},set:function(t){s=t}});var c=0;Object.defineProperty(this,"fontSize",{enumerable:!0,configurable:!0,get:function(){return c},set:function(t){c=t}});var u=void 0;Object.defineProperty(this,"maxFontSize",{enumerable:!0,configurable:!0,get:function(){return void 0===u?50/q:u},set:function(t){u=t}});var l="black";Object.defineProperty(this,"color",{enumerable:!0,configurable:!0,get:function(){return l},set:function(t){l=t}});var h="/F1 0 Tf 0 g";Object.defineProperty(this,"DA",{enumerable:!0,configurable:!1,get:function(){if(!(!h||this instanceof bt||this instanceof wt))return ot(h,this.objId,this.scope)},set:function(t){t=t.toString(),h=t}});var f=null;Object.defineProperty(this,"DV",{enumerable:!1,configurable:!1,get:function(){if(f)return this instanceof gt==!1?ot(f,this.objId,this.scope):f},set:function(t){t=t.toString(),f=this instanceof gt==!1?"("===t.substr(0,1)?R(t.substr(1,t.length-2)):R(t):t}}),Object.defineProperty(this,"defaultValue",{enumerable:!0,configurable:!0,get:function(){return this instanceof gt==!0?R(f.substr(1,f.length-1)):f},set:function(t){t=t.toString(),f=this instanceof gt==!0?"/"+t:t}});var d=null;Object.defineProperty(this,"_V",{enumerable:!1,configurable:!1,get:function(){if(d)return d},set:function(t){this.V=t}}),Object.defineProperty(this,"V",{enumerable:!1,configurable:!1,get:function(){if(d)return this instanceof gt==!1?ot(d,this.objId,this.scope):d},set:function(t){t=t.toString(),d=this instanceof gt==!1?"("===t.substr(0,1)?R(t.substr(1,t.length-2)):R(t):t}}),Object.defineProperty(this,"value",{enumerable:!0,configurable:!0,get:function(){return this instanceof gt==!0?R(d.substr(1,d.length-1)):d},set:function(t){t=t.toString(),d=this instanceof gt==!0?"/"+t:t}}),Object.defineProperty(this,"hasAnnotation",{enumerable:!0,configurable:!0,get:function(){return this.Rect}}),Object.defineProperty(this,"Type",{enumerable:!0,configurable:!1,get:function(){return this.hasAnnotation?"/Annot":null}}),Object.defineProperty(this,"Subtype",{enumerable:!0,configurable:!1,get:function(){return this.hasAnnotation?"/Widget":null}});var p,g=!1;Object.defineProperty(this,"hasAppearanceStream",{enumerable:!0,configurable:!0,get:function(){return g},set:function(t){t=Boolean(t),g=t}}),Object.defineProperty(this,"page",{enumerable:!0,configurable:!0,get:function(){if(p)return p},set:function(t){p=t}}),Object.defineProperty(this,"readOnly",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,1))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,1):this.Ff=K(this.Ff,1)}}),Object.defineProperty(this,"required",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,2))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,2):this.Ff=K(this.Ff,2)}}),Object.defineProperty(this,"noExport",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,3))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,3):this.Ff=K(this.Ff,3)}});var m=null;Object.defineProperty(this,"Q",{enumerable:!0,configurable:!1,get:function(){if(null!==m)return m},set:function(t){if(-1===[0,1,2].indexOf(t))throw new Error('Invalid value "'+t+'" for attribute Q supplied.');m=t}}),Object.defineProperty(this,"textAlign",{get:function(){var t;switch(m){case 0:default:t="left";break;case 1:t="center";break;case 2:t="right"}return t},configurable:!0,enumerable:!0,set:function(t){switch(t){case"right":case 2:m=2;break;case"center":case 1:m=1;break;case"left":case 0:default:m=0}}})};z(lt,st);var ht=function(){lt.call(this),this.FT="/Ch",this.V="()",this.fontName="zapfdingbats";var t=0;Object.defineProperty(this,"TI",{enumerable:!0,configurable:!1,get:function(){return t},set:function(e){t=e}}),Object.defineProperty(this,"topIndex",{enumerable:!0,configurable:!0,get:function(){return t},set:function(e){t=e}});var e=[];Object.defineProperty(this,"Opt",{enumerable:!0,configurable:!1,get:function(){return at(e,this.objId,this.scope)},set:function(t){var r,n;n=[],"string"==typeof(r=t)&&(n=function(t,e,r){r||(r=1);for(var n,i=[];n=e.exec(t);)i.push(n[r]);return i}(r,/\((.*?)\)/g)),e=n}}),this.getOptions=function(){return e},this.setOptions=function(t){e=t,this.sort&&e.sort()},this.addOption=function(t){t=(t=t||"").toString(),e.push(t),this.sort&&e.sort()},this.removeOption=function(t,r){for(r=r||!1,t=(t=t||"").toString();-1!==e.indexOf(t)&&(e.splice(e.indexOf(t),1),!1!==r););},Object.defineProperty(this,"combo",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,18))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,18):this.Ff=K(this.Ff,18)}}),Object.defineProperty(this,"edit",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,19))},set:function(t){!0===this.combo&&(!0===Boolean(t)?this.Ff=X(this.Ff,19):this.Ff=K(this.Ff,19))}}),Object.defineProperty(this,"sort",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,20))},set:function(t){!0===Boolean(t)?(this.Ff=X(this.Ff,20),e.sort()):this.Ff=K(this.Ff,20)}}),Object.defineProperty(this,"multiSelect",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,22))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,22):this.Ff=K(this.Ff,22)}}),Object.defineProperty(this,"doNotSpellCheck",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,23))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,23):this.Ff=K(this.Ff,23)}}),Object.defineProperty(this,"commitOnSelChange",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,27))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,27):this.Ff=K(this.Ff,27)}}),this.hasAppearanceStream=!1};z(ht,lt);var ft=function(){ht.call(this),this.fontName="helvetica",this.combo=!1};z(ft,ht);var dt=function(){ft.call(this),this.combo=!0};z(dt,ft);var pt=function(){dt.call(this),this.edit=!0};z(pt,dt);var gt=function(){lt.call(this),this.FT="/Btn",Object.defineProperty(this,"noToggleToOff",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,15))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,15):this.Ff=K(this.Ff,15)}}),Object.defineProperty(this,"radio",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,16))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,16):this.Ff=K(this.Ff,16)}}),Object.defineProperty(this,"pushButton",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,17))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,17):this.Ff=K(this.Ff,17)}}),Object.defineProperty(this,"radioIsUnison",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,26))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,26):this.Ff=K(this.Ff,26)}});var t,r={};Object.defineProperty(this,"MK",{enumerable:!1,configurable:!1,get:function(){var t=function(t){return t};if(this.scope&&(t=this.scope.internal.getEncryptor(this.objId)),0!==Object.keys(r).length){var e,n=[];for(e in n.push("<<"),r)n.push("/"+e+" ("+D(t(r[e]))+")");return n.push(">>"),n.join("\n")}},set:function(t){"object"===e(t)&&(r=t)}}),Object.defineProperty(this,"caption",{enumerable:!0,configurable:!0,get:function(){return r.CA||""},set:function(t){"string"==typeof t&&(r.CA=t)}}),Object.defineProperty(this,"AS",{enumerable:!1,configurable:!1,get:function(){return t},set:function(e){t=e}}),Object.defineProperty(this,"appearanceState",{enumerable:!0,configurable:!0,get:function(){return t.substr(1,t.length-1)},set:function(e){t="/"+e}})};z(gt,lt);var mt=function(){gt.call(this),this.pushButton=!0};z(mt,gt);var vt=function(){gt.call(this),this.radio=!0,this.pushButton=!1;var t=[];Object.defineProperty(this,"Kids",{enumerable:!0,configurable:!1,get:function(){return t},set:function(e){t=void 0!==e?e:[]}})};z(vt,gt);var bt=function(){var t,r;lt.call(this),Object.defineProperty(this,"Parent",{enumerable:!1,configurable:!1,get:function(){return t},set:function(e){t=e}}),Object.defineProperty(this,"optionName",{enumerable:!1,configurable:!0,get:function(){return r},set:function(t){r=t}});var n,i={};Object.defineProperty(this,"MK",{enumerable:!1,configurable:!1,get:function(){var t=function(t){return t};this.scope&&(t=this.scope.internal.getEncryptor(this.objId));var e,r=[];for(e in r.push("<<"),i)r.push("/"+e+" ("+D(t(i[e]))+")");return r.push(">>"),r.join("\n")},set:function(t){"object"===e(t)&&(i=t)}}),Object.defineProperty(this,"caption",{enumerable:!0,configurable:!0,get:function(){return i.CA||""},set:function(t){"string"==typeof t&&(i.CA=t)}}),Object.defineProperty(this,"AS",{enumerable:!1,configurable:!1,get:function(){return n},set:function(t){n=t}}),Object.defineProperty(this,"appearanceState",{enumerable:!0,configurable:!0,get:function(){return n.substr(1,n.length-1)},set:function(t){n="/"+t}}),this.caption="l",this.appearanceState="Off",this._AppearanceType=Lt.RadioButton.Circle,this.appearanceStreamContent=this._AppearanceType.createAppearanceStream(this.optionName)};z(bt,lt),vt.prototype.setAppearance=function(t){if(!("createAppearanceStream"in t)||!("getCA"in t))throw new Error("Couldn't assign Appearance to RadioButton. Appearance was Invalid!");for(var e in this.Kids)if(this.Kids.hasOwnProperty(e)){var r=this.Kids[e];r.appearanceStreamContent=t.createAppearanceStream(r.optionName),r.caption=t.getCA()}},vt.prototype.createOption=function(t){var e=new bt;return e.Parent=this,e.optionName=t,this.Kids.push(e),At.call(this.scope,e),e};var yt=function(){gt.call(this),this.fontName="zapfdingbats",this.caption="3",this.appearanceState="On",this.value="On",this.textAlign="center",this.appearanceStreamContent=Lt.CheckBox.createAppearanceStream()};z(yt,gt);var wt=function(){lt.call(this),this.FT="/Tx",Object.defineProperty(this,"multiline",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,13))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,13):this.Ff=K(this.Ff,13)}}),Object.defineProperty(this,"fileSelect",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,21))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,21):this.Ff=K(this.Ff,21)}}),Object.defineProperty(this,"doNotSpellCheck",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,23))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,23):this.Ff=K(this.Ff,23)}}),Object.defineProperty(this,"doNotScroll",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,24))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,24):this.Ff=K(this.Ff,24)}}),Object.defineProperty(this,"comb",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,25))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,25):this.Ff=K(this.Ff,25)}}),Object.defineProperty(this,"richText",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,26))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,26):this.Ff=K(this.Ff,26)}});var t=null;Object.defineProperty(this,"MaxLen",{enumerable:!0,configurable:!1,get:function(){return t},set:function(e){t=e}}),Object.defineProperty(this,"maxLength",{enumerable:!0,configurable:!0,get:function(){return t},set:function(e){Number.isInteger(e)&&(t=e)}}),Object.defineProperty(this,"hasAppearanceStream",{enumerable:!0,configurable:!0,get:function(){return this.V||this.DV}})};z(wt,lt);var Nt=function(){wt.call(this),Object.defineProperty(this,"password",{enumerable:!0,configurable:!0,get:function(){return Boolean(J(this.Ff,14))},set:function(t){!0===Boolean(t)?this.Ff=X(this.Ff,14):this.Ff=K(this.Ff,14)}}),this.password=!0};z(Nt,wt);var Lt={CheckBox:{createAppearanceStream:function(){return{N:{On:Lt.CheckBox.YesNormal},D:{On:Lt.CheckBox.YesPushDown,Off:Lt.CheckBox.OffPushDown}}},YesPushDown:function(t){var e=W(t);e.scope=t.scope;var r=[],n=t.scope.internal.getFont(t.fontName,t.fontStyle).id,i=t.scope.__private__.encodeColorString(t.color),a=Q(t,t.caption);return r.push("0.749023 g"),r.push("0 0 "+T(Lt.internal.getWidth(t))+" "+T(Lt.internal.getHeight(t))+" re"),r.push("f"),r.push("BMC"),r.push("q"),r.push("0 0 1 rg"),r.push("/"+n+" "+T(a.fontSize)+" Tf "+i),r.push("BT"),r.push(a.text),r.push("ET"),r.push("Q"),r.push("EMC"),e.stream=r.join("\n"),e},YesNormal:function(t){var e=W(t);e.scope=t.scope;var r=t.scope.internal.getFont(t.fontName,t.fontStyle).id,n=t.scope.__private__.encodeColorString(t.color),i=[],a=Lt.internal.getHeight(t),o=Lt.internal.getWidth(t),s=Q(t,t.caption);return i.push("1 g"),i.push("0 0 "+T(o)+" "+T(a)+" re"),i.push("f"),i.push("q"),i.push("0 0 1 rg"),i.push("0 0 "+T(o-1)+" "+T(a-1)+" re"),i.push("W"),i.push("n"),i.push("0 g"),i.push("BT"),i.push("/"+r+" "+T(s.fontSize)+" Tf "+n),i.push(s.text),i.push("ET"),i.push("Q"),e.stream=i.join("\n"),e},OffPushDown:function(t){var e=W(t);e.scope=t.scope;var r=[];return r.push("0.749023 g"),r.push("0 0 "+T(Lt.internal.getWidth(t))+" "+T(Lt.internal.getHeight(t))+" re"),r.push("f"),e.stream=r.join("\n"),e}},RadioButton:{Circle:{createAppearanceStream:function(t){var e={D:{Off:Lt.RadioButton.Circle.OffPushDown},N:{}};return e.N[t]=Lt.RadioButton.Circle.YesNormal,e.D[t]=Lt.RadioButton.Circle.YesPushDown,e},getCA:function(){return"l"},YesNormal:function(t){var e=W(t);e.scope=t.scope;var r=[],n=Lt.internal.getWidth(t)<=Lt.internal.getHeight(t)?Lt.internal.getWidth(t)/4:Lt.internal.getHeight(t)/4;n=Number((.9*n).toFixed(5));var i=Lt.internal.Bezier_C,a=Number((n*i).toFixed(5));return r.push("q"),r.push("1 0 0 1 "+U(Lt.internal.getWidth(t)/2)+" "+U(Lt.internal.getHeight(t)/2)+" cm"),r.push(n+" 0 m"),r.push(n+" "+a+" "+a+" "+n+" 0 "+n+" c"),r.push("-"+a+" "+n+" -"+n+" "+a+" -"+n+" 0 c"),r.push("-"+n+" -"+a+" -"+a+" -"+n+" 0 -"+n+" c"),r.push(a+" -"+n+" "+n+" -"+a+" "+n+" 0 c"),r.push("f"),r.push("Q"),e.stream=r.join("\n"),e},YesPushDown:function(t){var e=W(t);e.scope=t.scope;var r=[],n=Lt.internal.getWidth(t)<=Lt.internal.getHeight(t)?Lt.internal.getWidth(t)/4:Lt.internal.getHeight(t)/4;n=Number((.9*n).toFixed(5));var i=Number((2*n).toFixed(5)),a=Number((i*Lt.internal.Bezier_C).toFixed(5)),o=Number((n*Lt.internal.Bezier_C).toFixed(5));return r.push("0.749023 g"),r.push("q"),r.push("1 0 0 1 "+U(Lt.internal.getWidth(t)/2)+" "+U(Lt.internal.getHeight(t)/2)+" cm"),r.push(i+" 0 m"),r.push(i+" "+a+" "+a+" "+i+" 0 "+i+" c"),r.push("-"+a+" "+i+" -"+i+" "+a+" -"+i+" 0 c"),r.push("-"+i+" -"+a+" -"+a+" -"+i+" 0 -"+i+" c"),r.push(a+" -"+i+" "+i+" -"+a+" "+i+" 0 c"),r.push("f"),r.push("Q"),r.push("0 g"),r.push("q"),r.push("1 0 0 1 "+U(Lt.internal.getWidth(t)/2)+" "+U(Lt.internal.getHeight(t)/2)+" cm"),r.push(n+" 0 m"),r.push(n+" "+o+" "+o+" "+n+" 0 "+n+" c"),r.push("-"+o+" "+n+" -"+n+" "+o+" -"+n+" 0 c"),r.push("-"+n+" -"+o+" -"+o+" -"+n+" 0 -"+n+" c"),r.push(o+" -"+n+" "+n+" -"+o+" "+n+" 0 c"),r.push("f"),r.push("Q"),e.stream=r.join("\n"),e},OffPushDown:function(t){var e=W(t);e.scope=t.scope;var r=[],n=Lt.internal.getWidth(t)<=Lt.internal.getHeight(t)?Lt.internal.getWidth(t)/4:Lt.internal.getHeight(t)/4;n=Number((.9*n).toFixed(5));var i=Number((2*n).toFixed(5)),a=Number((i*Lt.internal.Bezier_C).toFixed(5));return r.push("0.749023 g"),r.push("q"),r.push("1 0 0 1 "+U(Lt.internal.getWidth(t)/2)+" "+U(Lt.internal.getHeight(t)/2)+" cm"),r.push(i+" 0 m"),r.push(i+" "+a+" "+a+" "+i+" 0 "+i+" c"),r.push("-"+a+" "+i+" -"+i+" "+a+" -"+i+" 0 c"),r.push("-"+i+" -"+a+" -"+a+" -"+i+" 0 -"+i+" c"),r.push(a+" -"+i+" "+i+" -"+a+" "+i+" 0 c"),r.push("f"),r.push("Q"),e.stream=r.join("\n"),e}},Cross:{createAppearanceStream:function(t){var e={D:{Off:Lt.RadioButton.Cross.OffPushDown},N:{}};return e.N[t]=Lt.RadioButton.Cross.YesNormal,e.D[t]=Lt.RadioButton.Cross.YesPushDown,e},getCA:function(){return"8"},YesNormal:function(t){var e=W(t);e.scope=t.scope;var r=[],n=Lt.internal.calculateCross(t);return r.push("q"),r.push("1 1 "+T(Lt.internal.getWidth(t)-2)+" "+T(Lt.internal.getHeight(t)-2)+" re"),r.push("W"),r.push("n"),r.push(T(n.x1.x)+" "+T(n.x1.y)+" m"),r.push(T(n.x2.x)+" "+T(n.x2.y)+" l"),r.push(T(n.x4.x)+" "+T(n.x4.y)+" m"),r.push(T(n.x3.x)+" "+T(n.x3.y)+" l"),r.push("s"),r.push("Q"),e.stream=r.join("\n"),e},YesPushDown:function(t){var e=W(t);e.scope=t.scope;var r=Lt.internal.calculateCross(t),n=[];return n.push("0.749023 g"),n.push("0 0 "+T(Lt.internal.getWidth(t))+" "+T(Lt.internal.getHeight(t))+" re"),n.push("f"),n.push("q"),n.push("1 1 "+T(Lt.internal.getWidth(t)-2)+" "+T(Lt.internal.getHeight(t)-2)+" re"),n.push("W"),n.push("n"),n.push(T(r.x1.x)+" "+T(r.x1.y)+" m"),n.push(T(r.x2.x)+" "+T(r.x2.y)+" l"),n.push(T(r.x4.x)+" "+T(r.x4.y)+" m"),n.push(T(r.x3.x)+" "+T(r.x3.y)+" l"),n.push("s"),n.push("Q"),e.stream=n.join("\n"),e},OffPushDown:function(t){var e=W(t);e.scope=t.scope;var r=[];return r.push("0.749023 g"),r.push("0 0 "+T(Lt.internal.getWidth(t))+" "+T(Lt.internal.getHeight(t))+" re"),r.push("f"),e.stream=r.join("\n"),e}}},createDefaultAppearanceStream:function(t){var e=t.scope.internal.getFont(t.fontName,t.fontStyle).id,r=t.scope.__private__.encodeColorString(t.color);return"/"+e+" "+t.fontSize+" Tf "+r}};Lt.internal={Bezier_C:.551915024494,calculateCross:function(t){var e=Lt.internal.getWidth(t),r=Lt.internal.getHeight(t),n=Math.min(e,r);return{x1:{x:(e-n)/2,y:(r-n)/2+n},x2:{x:(e-n)/2+n,y:(r-n)/2},x3:{x:(e-n)/2,y:(r-n)/2},x4:{x:(e-n)/2+n,y:(r-n)/2+n}}}},Lt.internal.getWidth=function(t){var r=0;return"object"===e(t)&&(r=H(t.Rect[2])),r},Lt.internal.getHeight=function(t){var r=0;return"object"===e(t)&&(r=H(t.Rect[3])),r};var At=E.addField=function(t){if(it(this,t),!(t instanceof lt))throw new Error("Invalid argument passed to jsPDF.addField.");var e;return(e=t).scope.internal.acroformPlugin.printedOut&&(e.scope.internal.acroformPlugin.printedOut=!1,e.scope.internal.acroformPlugin.acroFormDictionaryRoot=null),e.scope.internal.acroformPlugin.acroFormDictionaryRoot.Fields.push(e),t.page=t.scope.internal.getCurrentPageInfo().pageNumber,this};E.AcroFormChoiceField=ht,E.AcroFormListBox=ft,E.AcroFormComboBox=dt,E.AcroFormEditBox=pt,E.AcroFormButton=gt,E.AcroFormPushButton=mt,E.AcroFormRadioButton=vt,E.AcroFormCheckBox=yt,E.AcroFormTextField=wt,E.AcroFormPasswordField=Nt,E.AcroFormAppearance=Lt,E.AcroForm={ChoiceField:ht,ListBox:ft,ComboBox:dt,EditBox:pt,Button:gt,PushButton:mt,RadioButton:vt,CheckBox:yt,TextField:wt,PasswordField:Nt,Appearance:Lt},M.AcroForm={ChoiceField:ht,ListBox:ft,ComboBox:dt,EditBox:pt,Button:gt,PushButton:mt,RadioButton:vt,CheckBox:yt,TextField:wt,PasswordField:Nt,Appearance:Lt};var xt=M.AcroForm;function St(t){return t.reduce((function(t,e,r){return t[e]=r,t}),{})}!function(t){t.__addimage__={};var r="UNKNOWN",n={PNG:[[137,80,78,71]],TIFF:[[77,77,0,42],[73,73,42,0]],JPEG:[[255,216,255,224,void 0,void 0,74,70,73,70,0],[255,216,255,225,void 0,void 0,69,120,105,102,0,0],[255,216,255,219],[255,216,255,238]],JPEG2000:[[0,0,0,12,106,80,32,32]],GIF87a:[[71,73,70,56,55,97]],GIF89a:[[71,73,70,56,57,97]],WEBP:[[82,73,70,70,void 0,void 0,void 0,void 0,87,69,66,80]],BMP:[[66,77],[66,65],[67,73],[67,80],[73,67],[80,84]]},i=t.__addimage__.getImageFileTypeByImageData=function(t,e){var i,a,o,s,c,u=r;if("RGBA"===(e=e||r)||void 0!==t.data&&t.data instanceof Uint8ClampedArray&&"height"in t&&"width"in t)return"RGBA";if(x(t))for(c in n)for(o=n[c],i=0;i<o.length;i+=1){for(s=!0,a=0;a<o[i].length;a+=1)if(void 0!==o[i][a]&&o[i][a]!==t[a]){s=!1;break}if(!0===s){u=c;break}}else for(c in n)for(o=n[c],i=0;i<o.length;i+=1){for(s=!0,a=0;a<o[i].length;a+=1)if(void 0!==o[i][a]&&o[i][a]!==t.charCodeAt(a)){s=!1;break}if(!0===s){u=c;break}}return u===r&&e!==r&&(u=e),u},a=function t(e){for(var r=this.internal.write,n=this.internal.putStream,i=(0,this.internal.getFilters)();-1!==i.indexOf("FlateEncode");)i.splice(i.indexOf("FlateEncode"),1);e.objectId=this.internal.newObject();var a=[];if(a.push({key:"Type",value:"/XObject"}),a.push({key:"Subtype",value:"/Image"}),a.push({key:"Width",value:e.width}),a.push({key:"Height",value:e.height}),e.colorSpace===b.INDEXED?a.push({key:"ColorSpace",value:"[/Indexed /DeviceRGB "+(e.palette.length/3-1)+" "+("sMask"in e&&void 0!==e.sMask?e.objectId+2:e.objectId+1)+" 0 R]"}):(a.push({key:"ColorSpace",value:"/"+e.colorSpace}),e.colorSpace===b.DEVICE_CMYK&&a.push({key:"Decode",value:"[1 0 1 0 1 0 1 0]"})),a.push({key:"BitsPerComponent",value:e.bitsPerComponent}),"decodeParameters"in e&&void 0!==e.decodeParameters&&a.push({key:"DecodeParms",value:"<<"+e.decodeParameters+">>"}),"transparency"in e&&Array.isArray(e.transparency)){for(var o="",s=0,c=e.transparency.length;s<c;s++)o+=e.transparency[s]+" "+e.transparency[s]+" ";a.push({key:"Mask",value:"["+o+"]"})}void 0!==e.sMask&&a.push({key:"SMask",value:e.objectId+1+" 0 R"});var u=void 0!==e.filter?["/"+e.filter]:void 0;if(n({data:e.data,additionalKeyValues:a,alreadyAppliedFilters:u,objectId:e.objectId}),r("endobj"),"sMask"in e&&void 0!==e.sMask){var l="/Predictor "+e.predictor+" /Colors 1 /BitsPerComponent "+e.bitsPerComponent+" /Columns "+e.width,h={width:e.width,height:e.height,colorSpace:"DeviceGray",bitsPerComponent:e.bitsPerComponent,decodeParameters:l,data:e.sMask};"filter"in e&&(h.filter=e.filter),t.call(this,h)}if(e.colorSpace===b.INDEXED){var f=this.internal.newObject();n({data:_(new Uint8Array(e.palette)),objectId:f}),r("endobj")}},o=function(){var t=this.internal.collections.addImage_images;for(var e in t)a.call(this,t[e])},s=function(){var t,e=this.internal.collections.addImage_images,r=this.internal.write;for(var n in e)r("/I"+(t=e[n]).index,t.objectId,"0","R")},u=function(){this.internal.collections.addImage_images||(this.internal.collections.addImage_images={},this.internal.events.subscribe("putResources",o),this.internal.events.subscribe("putXobjectDict",s))},l=function(){var t=this.internal.collections.addImage_images;return u.call(this),t},h=function(){return Object.keys(this.internal.collections.addImage_images).length},f=function(e){return"function"==typeof t["process"+e.toUpperCase()]},d=function(t){return"object"===e(t)&&1===t.nodeType},p=function(e,r){if("IMG"===e.nodeName&&e.hasAttribute("src")){var n=""+e.getAttribute("src");if(0===n.indexOf("data:image/"))return c(unescape(n).split("base64,").pop());var i=t.loadFile(n,!0);if(void 0!==i)return i}if("CANVAS"===e.nodeName){if(0===e.width||0===e.height)throw new Error("Given canvas must have data. Canvas width: "+e.width+", height: "+e.height);var a;switch(r){case"PNG":a="image/png";break;case"WEBP":a="image/webp";break;case"JPEG":case"JPG":default:a="image/jpeg"}return c(e.toDataURL(a,1).split("base64,").pop())}},g=function(t){var e=this.internal.collections.addImage_images;if(e)for(var r in e)if(t===e[r].alias)return e[r]},m=function(t,e,r){return t||e||(t=-96,e=-96),t<0&&(t=-1*r.width*72/t/this.internal.scaleFactor),e<0&&(e=-1*r.height*72/e/this.internal.scaleFactor),0===t&&(t=e*r.width/r.height),0===e&&(e=t*r.height/r.width),[t,e]},v=function(t,e,r,n,i,a){var o=m.call(this,r,n,i),s=this.internal.getCoordinateString,c=this.internal.getVerticalCoordinateString,u=l.call(this);if(r=o[0],n=o[1],u[i.index]=i,a){a*=Math.PI/180;var h=Math.cos(a),f=Math.sin(a),d=function(t){return t.toFixed(4)},p=[d(h),d(f),d(-1*f),d(h),0,0,"cm"]}this.internal.write("q"),a?(this.internal.write([1,"0","0",1,s(t),c(e+n),"cm"].join(" ")),this.internal.write(p.join(" ")),this.internal.write([s(r),"0","0",s(n),"0","0","cm"].join(" "))):this.internal.write([s(r),"0","0",s(n),s(t),c(e+n),"cm"].join(" ")),this.isAdvancedAPI()&&this.internal.write([1,0,0,-1,0,0,"cm"].join(" ")),this.internal.write("/I"+i.index+" Do"),this.internal.write("Q")},b=t.color_spaces={DEVICE_RGB:"DeviceRGB",DEVICE_GRAY:"DeviceGray",DEVICE_CMYK:"DeviceCMYK",CAL_GREY:"CalGray",CAL_RGB:"CalRGB",LAB:"Lab",ICC_BASED:"ICCBased",INDEXED:"Indexed",PATTERN:"Pattern",SEPARATION:"Separation",DEVICE_N:"DeviceN"};t.decode={DCT_DECODE:"DCTDecode",FLATE_DECODE:"FlateDecode",LZW_DECODE:"LZWDecode",JPX_DECODE:"JPXDecode",JBIG2_DECODE:"JBIG2Decode",ASCII85_DECODE:"ASCII85Decode",ASCII_HEX_DECODE:"ASCIIHexDecode",RUN_LENGTH_DECODE:"RunLengthDecode",CCITT_FAX_DECODE:"CCITTFaxDecode"};var y=t.image_compression={NONE:"NONE",FAST:"FAST",MEDIUM:"MEDIUM",SLOW:"SLOW"},w=t.__addimage__.sHashCode=function(t){var e,r,n=0;if("string"==typeof t)for(r=t.length,e=0;e<r;e++)n=(n<<5)-n+t.charCodeAt(e),n|=0;else if(x(t))for(r=t.byteLength/2,e=0;e<r;e++)n=(n<<5)-n+t[e],n|=0;return n},N=t.__addimage__.validateStringAsBase64=function(t){(t=t||"").toString().trim();var e=!0;return 0===t.length&&(e=!1),t.length%4!=0&&(e=!1),!1===/^[A-Za-z0-9+/]+$/.test(t.substr(0,t.length-2))&&(e=!1),!1===/^[A-Za-z0-9/][A-Za-z0-9+/]|[A-Za-z0-9+/]=|==$/.test(t.substr(-2))&&(e=!1),e},L=t.__addimage__.extractImageFromDataUrl=function(t){var e=(t=t||"").split("base64,"),r=null;if(2===e.length){var n=/^data:(\w*\/\w*);*(charset=(?!charset=)[\w=-]*)*;*$/.exec(e[0]);Array.isArray(n)&&(r={mimeType:n[1],charset:n[2],data:e[1]})}return r},A=t.__addimage__.supportsArrayBuffer=function(){return"undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array};t.__addimage__.isArrayBuffer=function(t){return A()&&t instanceof ArrayBuffer};var x=t.__addimage__.isArrayBufferView=function(t){return A()&&"undefined"!=typeof Uint32Array&&(t instanceof Int8Array||t instanceof Uint8Array||"undefined"!=typeof Uint8ClampedArray&&t instanceof Uint8ClampedArray||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Float32Array||t instanceof Float64Array)},S=t.__addimage__.binaryStringToUint8Array=function(t){for(var e=t.length,r=new Uint8Array(e),n=0;n<e;n++)r[n]=t.charCodeAt(n);return r},_=t.__addimage__.arrayBufferToBinaryString=function(t){for(var e="",r=x(t)?t:new Uint8Array(t),n=0;n<r.length;n+=8192)e+=String.fromCharCode.apply(null,r.subarray(n,n+8192));return e};t.addImage=function(){var t,n,i,a,o,s,c,l,h;if("number"==typeof arguments[1]?(n=r,i=arguments[1],a=arguments[2],o=arguments[3],s=arguments[4],c=arguments[5],l=arguments[6],h=arguments[7]):(n=arguments[1],i=arguments[2],a=arguments[3],o=arguments[4],s=arguments[5],c=arguments[6],l=arguments[7],h=arguments[8]),"object"===e(t=arguments[0])&&!d(t)&&"imageData"in t){var f=t;t=f.imageData,n=f.format||n||r,i=f.x||i||0,a=f.y||a||0,o=f.w||f.width||o,s=f.h||f.height||s,c=f.alias||c,l=f.compression||l,h=f.rotation||f.angle||h}var p=this.internal.getFilters();if(void 0===l&&-1!==p.indexOf("FlateEncode")&&(l="SLOW"),isNaN(i)||isNaN(a))throw new Error("Invalid coordinates passed to jsPDF.addImage");u.call(this);var g=P.call(this,t,n,c,l);return v.call(this,i,a,o,s,g,h),this};var P=function(e,n,a,o){var s,c,u;if("string"==typeof e&&i(e)===r){e=unescape(e);var l=k(e,!1);(""!==l||void 0!==(l=t.loadFile(e,!0)))&&(e=l)}if(d(e)&&(e=p(e,n)),n=i(e,n),!f(n))throw new Error("addImage does not support files of type '"+n+"', please ensure that a plugin for '"+n+"' support is added.");if((null==(u=a)||0===u.length)&&(a=function(t){return"string"==typeof t||x(t)?w(t):x(t.data)?w(t.data):null}(e)),(s=g.call(this,a))||(A()&&(e instanceof Uint8Array||"RGBA"===n||(c=e,e=S(e))),s=this["process"+n.toUpperCase()](e,h.call(this),a,function(e){return e&&"string"==typeof e&&(e=e.toUpperCase()),e in t.image_compression?e:y.NONE}(o),c)),!s)throw new Error("An unknown error occurred whilst processing the image.");return s},k=t.__addimage__.convertBase64ToBinaryString=function(t,e){var r;e="boolean"!=typeof e||e;var n,i="";if("string"==typeof t){n=null!==(r=L(t))?r.data:t;try{i=c(n)}catch(t){if(e)throw N(n)?new Error("atob-Error in jsPDF.convertBase64ToBinaryString "+t.message):new Error("Supplied Data is not a valid base64-String jsPDF.convertBase64ToBinaryString ")}}return i};t.getImageProperties=function(e){var n,a,o="";if(d(e)&&(e=p(e)),"string"==typeof e&&i(e)===r&&(""===(o=k(e,!1))&&(o=t.loadFile(e)||""),e=o),a=i(e),!f(a))throw new Error("addImage does not support files of type '"+a+"', please ensure that a plugin for '"+a+"' support is added.");if(!A()||e instanceof Uint8Array||(e=S(e)),!(n=this["process"+a.toUpperCase()](e)))throw new Error("An unknown error occurred whilst processing the image");return n.fileType=a,n}}(M.API), +/** + * @license + * Copyright (c) 2014 Steven Spungin (TwelveTone LLC) steven@twelvetone.tv + * + * Licensed under the MIT License. + * http://opensource.org/licenses/mit-license + */ +function(t){var e=function(t){if(void 0!==t&&""!=t)return!0};M.API.events.push(["addPage",function(t){this.internal.getPageInfo(t.pageNumber).pageContext.annotations=[]}]),t.events.push(["putPage",function(t){for(var r,n,i,a=this.internal.getCoordinateString,o=this.internal.getVerticalCoordinateString,s=this.internal.getPageInfoByObjId(t.objId),c=t.pageContext.annotations,u=!1,l=0;l<c.length&&!u;l++)switch((r=c[l]).type){case"link":(e(r.options.url)||e(r.options.pageNumber))&&(u=!0);break;case"reference":case"text":case"freetext":u=!0}if(0!=u){this.internal.write("/Annots [");for(var h=0;h<c.length;h++){r=c[h];var f=this.internal.pdfEscape,d=this.internal.getEncryptor(t.objId);switch(r.type){case"reference":this.internal.write(" "+r.object.objId+" 0 R ");break;case"text":var p=this.internal.newAdditionalObject(),g=this.internal.newAdditionalObject(),m=this.internal.getEncryptor(p.objId),v=r.title||"Note";i="<</Type /Annot /Subtype /Text "+(n="/Rect ["+a(r.bounds.x)+" "+o(r.bounds.y+r.bounds.h)+" "+a(r.bounds.x+r.bounds.w)+" "+o(r.bounds.y)+"] ")+"/Contents ("+f(m(r.contents))+")",i+=" /Popup "+g.objId+" 0 R",i+=" /P "+s.objId+" 0 R",i+=" /T ("+f(m(v))+") >>",p.content=i;var b=p.objId+" 0 R";i="<</Type /Annot /Subtype /Popup "+(n="/Rect ["+a(r.bounds.x+30)+" "+o(r.bounds.y+r.bounds.h)+" "+a(r.bounds.x+r.bounds.w+30)+" "+o(r.bounds.y)+"] ")+" /Parent "+b,r.open&&(i+=" /Open true"),i+=" >>",g.content=i,this.internal.write(p.objId,"0 R",g.objId,"0 R");break;case"freetext":n="/Rect ["+a(r.bounds.x)+" "+o(r.bounds.y)+" "+a(r.bounds.x+r.bounds.w)+" "+o(r.bounds.y+r.bounds.h)+"] ";var y=r.color||"#000000";i="<</Type /Annot /Subtype /FreeText "+n+"/Contents ("+f(d(r.contents))+")",i+=" /DS(font: Helvetica,sans-serif 12.0pt; text-align:left; color:#"+y+")",i+=" /Border [0 0 0]",i+=" >>",this.internal.write(i);break;case"link":if(r.options.name){var w=this.annotations._nameMap[r.options.name];r.options.pageNumber=w.page,r.options.top=w.y}else r.options.top||(r.options.top=0);if(n="/Rect ["+r.finalBounds.x+" "+r.finalBounds.y+" "+r.finalBounds.w+" "+r.finalBounds.h+"] ",i="",r.options.url)i="<</Type /Annot /Subtype /Link "+n+"/Border [0 0 0] /A <</S /URI /URI ("+f(d(r.options.url))+") >>";else if(r.options.pageNumber){switch(i="<</Type /Annot /Subtype /Link "+n+"/Border [0 0 0] /Dest ["+this.internal.getPageInfo(r.options.pageNumber).objId+" 0 R",r.options.magFactor=r.options.magFactor||"XYZ",r.options.magFactor){case"Fit":i+=" /Fit]";break;case"FitH":i+=" /FitH "+r.options.top+"]";break;case"FitV":r.options.left=r.options.left||0,i+=" /FitV "+r.options.left+"]";break;case"XYZ":default:var N=o(r.options.top);r.options.left=r.options.left||0,void 0===r.options.zoom&&(r.options.zoom=0),i+=" /XYZ "+r.options.left+" "+N+" "+r.options.zoom+"]"}}""!=i&&(i+=" >>",this.internal.write(i))}}this.internal.write("]")}}]),t.createAnnotation=function(t){var e=this.internal.getCurrentPageInfo();switch(t.type){case"link":this.link(t.bounds.x,t.bounds.y,t.bounds.w,t.bounds.h,t);break;case"text":case"freetext":e.pageContext.annotations.push(t)}},t.link=function(t,e,r,n,i){var a=this.internal.getCurrentPageInfo(),o=this.internal.getCoordinateString,s=this.internal.getVerticalCoordinateString;a.pageContext.annotations.push({finalBounds:{x:o(t),y:s(e),w:o(t+r),h:s(e+n)},options:i,type:"link"})},t.textWithLink=function(t,e,r,n){var i,a,o=this.getTextWidth(t),s=this.internal.getLineHeight()/this.internal.scaleFactor;if(void 0!==n.maxWidth){a=n.maxWidth;var c=this.splitTextToSize(t,a).length;i=Math.ceil(s*c)}else a=o,i=s;return this.text(t,e,r,n),r+=.2*s,"center"===n.align&&(e-=o/2),"right"===n.align&&(e-=o),this.link(e,r-s,a,i,n),o},t.getTextWidth=function(t){var e=this.internal.getFontSize();return this.getStringUnitWidth(t)*e/this.internal.scaleFactor}}(M.API), +/** + * @license + * Copyright (c) 2017 Aras Abbasi + * + * Licensed under the MIT License. + * http://opensource.org/licenses/mit-license + */ +function(t){var e={1569:[65152],1570:[65153,65154],1571:[65155,65156],1572:[65157,65158],1573:[65159,65160],1574:[65161,65162,65163,65164],1575:[65165,65166],1576:[65167,65168,65169,65170],1577:[65171,65172],1578:[65173,65174,65175,65176],1579:[65177,65178,65179,65180],1580:[65181,65182,65183,65184],1581:[65185,65186,65187,65188],1582:[65189,65190,65191,65192],1583:[65193,65194],1584:[65195,65196],1585:[65197,65198],1586:[65199,65200],1587:[65201,65202,65203,65204],1588:[65205,65206,65207,65208],1589:[65209,65210,65211,65212],1590:[65213,65214,65215,65216],1591:[65217,65218,65219,65220],1592:[65221,65222,65223,65224],1593:[65225,65226,65227,65228],1594:[65229,65230,65231,65232],1601:[65233,65234,65235,65236],1602:[65237,65238,65239,65240],1603:[65241,65242,65243,65244],1604:[65245,65246,65247,65248],1605:[65249,65250,65251,65252],1606:[65253,65254,65255,65256],1607:[65257,65258,65259,65260],1608:[65261,65262],1609:[65263,65264,64488,64489],1610:[65265,65266,65267,65268],1649:[64336,64337],1655:[64477],1657:[64358,64359,64360,64361],1658:[64350,64351,64352,64353],1659:[64338,64339,64340,64341],1662:[64342,64343,64344,64345],1663:[64354,64355,64356,64357],1664:[64346,64347,64348,64349],1667:[64374,64375,64376,64377],1668:[64370,64371,64372,64373],1670:[64378,64379,64380,64381],1671:[64382,64383,64384,64385],1672:[64392,64393],1676:[64388,64389],1677:[64386,64387],1678:[64390,64391],1681:[64396,64397],1688:[64394,64395],1700:[64362,64363,64364,64365],1702:[64366,64367,64368,64369],1705:[64398,64399,64400,64401],1709:[64467,64468,64469,64470],1711:[64402,64403,64404,64405],1713:[64410,64411,64412,64413],1715:[64406,64407,64408,64409],1722:[64414,64415],1723:[64416,64417,64418,64419],1726:[64426,64427,64428,64429],1728:[64420,64421],1729:[64422,64423,64424,64425],1733:[64480,64481],1734:[64473,64474],1735:[64471,64472],1736:[64475,64476],1737:[64482,64483],1739:[64478,64479],1740:[64508,64509,64510,64511],1744:[64484,64485,64486,64487],1746:[64430,64431],1747:[64432,64433]},r={65247:{65154:65269,65156:65271,65160:65273,65166:65275},65248:{65154:65270,65156:65272,65160:65274,65166:65276},65165:{65247:{65248:{65258:65010}}},1617:{1612:64606,1613:64607,1614:64608,1615:64609,1616:64610}},n={1612:64606,1613:64607,1614:64608,1615:64609,1616:64610},i=[1570,1571,1573,1575];t.__arabicParser__={};var a=t.__arabicParser__.isInArabicSubstitutionA=function(t){return void 0!==e[t.charCodeAt(0)]},o=t.__arabicParser__.isArabicLetter=function(t){return"string"==typeof t&&/^[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF]+$/.test(t)},s=t.__arabicParser__.isArabicEndLetter=function(t){return o(t)&&a(t)&&e[t.charCodeAt(0)].length<=2},c=t.__arabicParser__.isArabicAlfLetter=function(t){return o(t)&&i.indexOf(t.charCodeAt(0))>=0};t.__arabicParser__.arabicLetterHasIsolatedForm=function(t){return o(t)&&a(t)&&e[t.charCodeAt(0)].length>=1};var u=t.__arabicParser__.arabicLetterHasFinalForm=function(t){return o(t)&&a(t)&&e[t.charCodeAt(0)].length>=2};t.__arabicParser__.arabicLetterHasInitialForm=function(t){return o(t)&&a(t)&&e[t.charCodeAt(0)].length>=3};var l=t.__arabicParser__.arabicLetterHasMedialForm=function(t){return o(t)&&a(t)&&4==e[t.charCodeAt(0)].length},h=t.__arabicParser__.resolveLigatures=function(t){var e=0,n=r,i="",a=0;for(e=0;e<t.length;e+=1)void 0!==n[t.charCodeAt(e)]?(a++,"number"==typeof(n=n[t.charCodeAt(e)])&&(i+=String.fromCharCode(n),n=r,a=0),e===t.length-1&&(n=r,i+=t.charAt(e-(a-1)),e-=a-1,a=0)):(n=r,i+=t.charAt(e-a),e-=a,a=0);return i};t.__arabicParser__.isArabicDiacritic=function(t){return void 0!==t&&void 0!==n[t.charCodeAt(0)]};var f=t.__arabicParser__.getCorrectForm=function(t,e,r){return o(t)?!1===a(t)?-1:!u(t)||!o(e)&&!o(r)||!o(r)&&s(e)||s(t)&&!o(e)||s(t)&&c(e)||s(t)&&s(e)?0:l(t)&&o(e)&&!s(e)&&o(r)&&u(r)?3:s(t)||!o(r)?1:2:-1},d=function(t){var r=0,n=0,i=0,a="",s="",c="",u=(t=t||"").split("\\s+"),l=[];for(r=0;r<u.length;r+=1){for(l.push(""),n=0;n<u[r].length;n+=1)a=u[r][n],s=u[r][n-1],c=u[r][n+1],o(a)?(i=f(a,s,c),l[r]+=-1!==i?String.fromCharCode(e[a.charCodeAt(0)][i]):a):l[r]+=a;l[r]=h(l[r])}return l.join(" ")},p=t.__arabicParser__.processArabic=t.processArabic=function(){var t,e="string"==typeof arguments[0]?arguments[0]:arguments[0].text,r=[];if(Array.isArray(e)){var n=0;for(r=[],n=0;n<e.length;n+=1)Array.isArray(e[n])?r.push([d(e[n][0]),e[n][1],e[n][2]]):r.push([d(e[n])]);t=r}else t=d(e);return"string"==typeof arguments[0]?t:(arguments[0].text=t,arguments[0])};t.events.push(["preProcessText",p])}(M.API), +/** @license + * jsPDF Autoprint Plugin + * + * Licensed under the MIT License. + * http://opensource.org/licenses/mit-license + */ +function(t){t.autoPrint=function(t){var e;switch((t=t||{}).variant=t.variant||"non-conform",t.variant){case"javascript":this.addJS("print({});");break;case"non-conform":default:this.internal.events.subscribe("postPutResources",(function(){e=this.internal.newObject(),this.internal.out("<<"),this.internal.out("/S /Named"),this.internal.out("/Type /Action"),this.internal.out("/N /Print"),this.internal.out(">>"),this.internal.out("endobj")})),this.internal.events.subscribe("putCatalog",(function(){this.internal.out("/OpenAction "+e+" 0 R")}))}return this}}(M.API), +/** + * @license + * Copyright (c) 2014 Steven Spungin (TwelveTone LLC) steven@twelvetone.tv + * + * Licensed under the MIT License. + * http://opensource.org/licenses/mit-license + */ +function(t){var e=function(){var t=void 0;Object.defineProperty(this,"pdf",{get:function(){return t},set:function(e){t=e}});var e=150;Object.defineProperty(this,"width",{get:function(){return e},set:function(t){e=isNaN(t)||!1===Number.isInteger(t)||t<0?150:t,this.getContext("2d").pageWrapXEnabled&&(this.getContext("2d").pageWrapX=e+1)}});var r=300;Object.defineProperty(this,"height",{get:function(){return r},set:function(t){r=isNaN(t)||!1===Number.isInteger(t)||t<0?300:t,this.getContext("2d").pageWrapYEnabled&&(this.getContext("2d").pageWrapY=r+1)}});var n=[];Object.defineProperty(this,"childNodes",{get:function(){return n},set:function(t){n=t}});var i={};Object.defineProperty(this,"style",{get:function(){return i},set:function(t){i=t}}),Object.defineProperty(this,"parentNode",{})};e.prototype.getContext=function(t,e){var r;if("2d"!==(t=t||"2d"))return null;for(r in e)this.pdf.context2d.hasOwnProperty(r)&&(this.pdf.context2d[r]=e[r]);return this.pdf.context2d._canvas=this,this.pdf.context2d},e.prototype.toDataURL=function(){throw new Error("toDataURL is not implemented.")},t.events.push(["initialized",function(){this.canvas=new e,this.canvas.pdf=this}])}(M.API),function(t){var r={left:0,top:0,bottom:0,right:0},n=!1,i=function(){void 0===this.internal.__cell__&&(this.internal.__cell__={},this.internal.__cell__.padding=3,this.internal.__cell__.headerFunction=void 0,this.internal.__cell__.margins=Object.assign({},r),this.internal.__cell__.margins.width=this.getPageWidth(),a.call(this))},a=function(){this.internal.__cell__.lastCell=new o,this.internal.__cell__.pages=1},o=function(){var t=arguments[0];Object.defineProperty(this,"x",{enumerable:!0,get:function(){return t},set:function(e){t=e}});var e=arguments[1];Object.defineProperty(this,"y",{enumerable:!0,get:function(){return e},set:function(t){e=t}});var r=arguments[2];Object.defineProperty(this,"width",{enumerable:!0,get:function(){return r},set:function(t){r=t}});var n=arguments[3];Object.defineProperty(this,"height",{enumerable:!0,get:function(){return n},set:function(t){n=t}});var i=arguments[4];Object.defineProperty(this,"text",{enumerable:!0,get:function(){return i},set:function(t){i=t}});var a=arguments[5];Object.defineProperty(this,"lineNumber",{enumerable:!0,get:function(){return a},set:function(t){a=t}});var o=arguments[6];return Object.defineProperty(this,"align",{enumerable:!0,get:function(){return o},set:function(t){o=t}}),this};o.prototype.clone=function(){return new o(this.x,this.y,this.width,this.height,this.text,this.lineNumber,this.align)},o.prototype.toArray=function(){return[this.x,this.y,this.width,this.height,this.text,this.lineNumber,this.align]},t.setHeaderFunction=function(t){return i.call(this),this.internal.__cell__.headerFunction="function"==typeof t?t:void 0,this},t.getTextDimensions=function(t,e){i.call(this);var r=(e=e||{}).fontSize||this.getFontSize(),n=e.font||this.getFont(),a=e.scaleFactor||this.internal.scaleFactor,o=0,s=0,c=0,u=this;if(!Array.isArray(t)&&"string"!=typeof t){if("number"!=typeof t)throw new Error("getTextDimensions expects text-parameter to be of type String or type Number or an Array of Strings.");t=String(t)}var l=e.maxWidth;l>0?"string"==typeof t?t=this.splitTextToSize(t,l):"[object Array]"===Object.prototype.toString.call(t)&&(t=t.reduce((function(t,e){return t.concat(u.splitTextToSize(e,l))}),[])):t=Array.isArray(t)?t:[t];for(var h=0;h<t.length;h++)o<(c=this.getStringUnitWidth(t[h],{font:n})*r)&&(o=c);return 0!==o&&(s=t.length),{w:o/=a,h:Math.max((s*r*this.getLineHeightFactor()-r*(this.getLineHeightFactor()-1))/a,0)}},t.cellAddPage=function(){i.call(this),this.addPage();var t=this.internal.__cell__.margins||r;return this.internal.__cell__.lastCell=new o(t.left,t.top,void 0,void 0),this.internal.__cell__.pages+=1,this};var s=t.cell=function(){var t;t=arguments[0]instanceof o?arguments[0]:new o(arguments[0],arguments[1],arguments[2],arguments[3],arguments[4],arguments[5]),i.call(this);var e=this.internal.__cell__.lastCell,a=this.internal.__cell__.padding,s=this.internal.__cell__.margins||r,c=this.internal.__cell__.tableHeaderRow,u=this.internal.__cell__.printHeaders;return void 0!==e.lineNumber&&(e.lineNumber===t.lineNumber?(t.x=(e.x||0)+(e.width||0),t.y=e.y||0):e.y+e.height+t.height+s.bottom>this.getPageHeight()?(this.cellAddPage(),t.y=s.top,u&&c&&(this.printHeaderRow(t.lineNumber,!0),t.y+=c[0].height)):t.y=e.y+e.height||t.y),void 0!==t.text[0]&&(this.rect(t.x,t.y,t.width,t.height,!0===n?"FD":void 0),"right"===t.align?this.text(t.text,t.x+t.width-a,t.y+a,{align:"right",baseline:"top"}):"center"===t.align?this.text(t.text,t.x+t.width/2,t.y+a,{align:"center",baseline:"top",maxWidth:t.width-a-a}):this.text(t.text,t.x+a,t.y+a,{align:"left",baseline:"top",maxWidth:t.width-a-a})),this.internal.__cell__.lastCell=t,this};t.table=function(t,n,u,l,h){if(i.call(this),!u)throw new Error("No data for PDF table.");var f,d,p,g,m=[],v=[],b=[],y={},w={},N=[],L=[],A=(h=h||{}).autoSize||!1,x=!1!==h.printHeaders,S=h.css&&void 0!==h.css["font-size"]?16*h.css["font-size"]:h.fontSize||12,_=h.margins||Object.assign({width:this.getPageWidth()},r),P="number"==typeof h.padding?h.padding:3,k=h.headerBackgroundColor||"#c8c8c8",F=h.headerTextColor||"#000";if(a.call(this),this.internal.__cell__.printHeaders=x,this.internal.__cell__.margins=_,this.internal.__cell__.table_font_size=S,this.internal.__cell__.padding=P,this.internal.__cell__.headerBackgroundColor=k,this.internal.__cell__.headerTextColor=F,this.setFontSize(S),null==l)v=m=Object.keys(u[0]),b=m.map((function(){return"left"}));else if(Array.isArray(l)&&"object"===e(l[0]))for(m=l.map((function(t){return t.name})),v=l.map((function(t){return t.prompt||t.name||""})),b=l.map((function(t){return t.align||"left"})),f=0;f<l.length;f+=1)w[l[f].name]=l[f].width*(19.049976/25.4);else Array.isArray(l)&&"string"==typeof l[0]&&(v=m=l,b=m.map((function(){return"left"})));if(A||Array.isArray(l)&&"string"==typeof l[0])for(f=0;f<m.length;f+=1){for(y[g=m[f]]=u.map((function(t){return t[g]})),this.setFont(void 0,"bold"),N.push(this.getTextDimensions(v[f],{fontSize:this.internal.__cell__.table_font_size,scaleFactor:this.internal.scaleFactor}).w),d=y[g],this.setFont(void 0,"normal"),p=0;p<d.length;p+=1)N.push(this.getTextDimensions(d[p],{fontSize:this.internal.__cell__.table_font_size,scaleFactor:this.internal.scaleFactor}).w);w[g]=Math.max.apply(null,N)+P+P,N=[]}if(x){var I={};for(f=0;f<m.length;f+=1)I[m[f]]={},I[m[f]].text=v[f],I[m[f]].align=b[f];var C=c.call(this,I,w);L=m.map((function(e){return new o(t,n,w[e],C,I[e].text,void 0,I[e].align)})),this.setTableHeaderRow(L),this.printHeaderRow(1,!1)}var j=l.reduce((function(t,e){return t[e.name]=e.align,t}),{});for(f=0;f<u.length;f+=1){"rowStart"in h&&h.rowStart instanceof Function&&h.rowStart({row:f,data:u[f]},this);var O=c.call(this,u[f],w);for(p=0;p<m.length;p+=1){var B=u[f][m[p]];"cellStart"in h&&h.cellStart instanceof Function&&h.cellStart({row:f,col:p,data:B},this),s.call(this,new o(t,n,w[m[p]],O,B,f+2,j[m[p]]))}}return this.internal.__cell__.table_x=t,this.internal.__cell__.table_y=n,this};var c=function(t,e){var r=this.internal.__cell__.padding,n=this.internal.__cell__.table_font_size,i=this.internal.scaleFactor;return Object.keys(t).map((function(n){var i=t[n];return this.splitTextToSize(i.hasOwnProperty("text")?i.text:i,e[n]-r-r)}),this).map((function(t){return this.getLineHeightFactor()*t.length*n/i+r+r}),this).reduce((function(t,e){return Math.max(t,e)}),0)};t.setTableHeaderRow=function(t){i.call(this),this.internal.__cell__.tableHeaderRow=t},t.printHeaderRow=function(t,e){if(i.call(this),!this.internal.__cell__.tableHeaderRow)throw new Error("Property tableHeaderRow does not exist.");var r;if(n=!0,"function"==typeof this.internal.__cell__.headerFunction){var a=this.internal.__cell__.headerFunction(this,this.internal.__cell__.pages);this.internal.__cell__.lastCell=new o(a[0],a[1],a[2],a[3],void 0,-1)}this.setFont(void 0,"bold");for(var c=[],u=0;u<this.internal.__cell__.tableHeaderRow.length;u+=1){r=this.internal.__cell__.tableHeaderRow[u].clone(),e&&(r.y=this.internal.__cell__.margins.top||0,c.push(r)),r.lineNumber=t;var l=this.getTextColor();this.setTextColor(this.internal.__cell__.headerTextColor),this.setFillColor(this.internal.__cell__.headerBackgroundColor),s.call(this,r),this.setTextColor(l)}c.length>0&&this.setTableHeaderRow(c),this.setFont(void 0,"normal"),n=!1}}(M.API);var _t={italic:["italic","oblique","normal"],oblique:["oblique","italic","normal"],normal:["normal","oblique","italic"]},Pt=["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded"],kt=St(Pt),Ft=[100,200,300,400,500,600,700,800,900],It=St(Ft);function Ct(t){var e=t.family.replace(/"|'/g,"").toLowerCase(),r=function(t){return _t[t=t||"normal"]?t:"normal"}(t.style),n=function(t){if(!t)return 400;if("number"==typeof t)return t>=100&&t<=900&&t%100==0?t:400;if(/^\d00$/.test(t))return parseInt(t);switch(t){case"bold":return 700;case"normal":default:return 400}}(t.weight),i=function(t){return"number"==typeof kt[t=t||"normal"]?t:"normal"}(t.stretch);return{family:e,style:r,weight:n,stretch:i,src:t.src||[],ref:t.ref||{name:e,style:[i,r,n].join(" ")}}}function jt(t,e,r,n){var i;for(i=r;i>=0&&i<e.length;i+=n)if(t[e[i]])return t[e[i]];for(i=r;i>=0&&i<e.length;i-=n)if(t[e[i]])return t[e[i]]}var Ot={"sans-serif":"helvetica",fixed:"courier",monospace:"courier",terminal:"courier",cursive:"times",fantasy:"times",serif:"times"},Bt={caption:"times",icon:"times",menu:"times","message-box":"times","small-caption":"times","status-bar":"times"};function Mt(t){return[t.stretch,t.style,t.weight,t.family].join(" ")}function Et(t,e,r){for(var n=(r=r||{}).defaultFontFamily||"times",i=Object.assign({},Ot,r.genericFontFamilies||{}),a=null,o=null,s=0;s<e.length;++s)if(i[(a=Ct(e[s])).family]&&(a.family=i[a.family]),t.hasOwnProperty(a.family)){o=t[a.family];break}if(!(o=o||t[n]))throw new Error("Could not find a font-family for the rule '"+Mt(a)+"' and default family '"+n+"'.");if(o=function(t,e){if(e[t])return e[t];var r=kt[t],n=r<=kt.normal?-1:1,i=jt(e,Pt,r,n);if(!i)throw new Error("Could not find a matching font-stretch value for "+t);return i}(a.stretch,o),o=function(t,e){if(e[t])return e[t];for(var r=_t[t],n=0;n<r.length;++n)if(e[r[n]])return e[r[n]];throw new Error("Could not find a matching font-style for "+t)}(a.style,o),!(o=function(t,e){if(e[t])return e[t];if(400===t&&e[500])return e[500];if(500===t&&e[400])return e[400];var r=It[t],n=jt(e,Ft,r,t<400?-1:1);if(!n)throw new Error("Could not find a matching font-weight for value "+t);return n}(a.weight,o)))throw new Error("Failed to resolve a font for the rule '"+Mt(a)+"'.");return o}function qt(t){return t.trimLeft()}function Dt(t,e){for(var r=0;r<t.length;){if(t.charAt(r)===e)return[t.substring(0,r),t.substring(r+1)];r+=1}return null}function Rt(t){var e=t.match(/^(-[a-z_]|[a-z_])[a-z0-9_-]*/i);return null===e?null:[e[0],t.substring(e[0].length)]}var Tt=["times"];!function(t){var r,n,a,o,s,c,u,l,f,d=function(t){return t=t||{},this.isStrokeTransparent=t.isStrokeTransparent||!1,this.strokeOpacity=t.strokeOpacity||1,this.strokeStyle=t.strokeStyle||"#000000",this.fillStyle=t.fillStyle||"#000000",this.isFillTransparent=t.isFillTransparent||!1,this.fillOpacity=t.fillOpacity||1,this.font=t.font||"10px sans-serif",this.textBaseline=t.textBaseline||"alphabetic",this.textAlign=t.textAlign||"left",this.lineWidth=t.lineWidth||1,this.lineJoin=t.lineJoin||"miter",this.lineCap=t.lineCap||"butt",this.path=t.path||[],this.transform=void 0!==t.transform?t.transform.clone():new l,this.globalCompositeOperation=t.globalCompositeOperation||"normal",this.globalAlpha=t.globalAlpha||1,this.clip_path=t.clip_path||[],this.currentPoint=t.currentPoint||new c,this.miterLimit=t.miterLimit||10,this.lastPoint=t.lastPoint||new c,this.lineDashOffset=t.lineDashOffset||0,this.lineDash=t.lineDash||[],this.margin=t.margin||[0,0,0,0],this.prevPageLastElemOffset=t.prevPageLastElemOffset||0,this.ignoreClearRect="boolean"!=typeof t.ignoreClearRect||t.ignoreClearRect,this};t.events.push(["initialized",function(){this.context2d=new p(this),r=this.internal.f2,n=this.internal.getCoordinateString,a=this.internal.getVerticalCoordinateString,o=this.internal.getHorizontalCoordinate,s=this.internal.getVerticalCoordinate,c=this.internal.Point,u=this.internal.Rectangle,l=this.internal.Matrix,f=new d}]);var p=function(t){Object.defineProperty(this,"canvas",{get:function(){return{parentNode:!1,style:!1}}});var e=t;Object.defineProperty(this,"pdf",{get:function(){return e}});var r=!1;Object.defineProperty(this,"pageWrapXEnabled",{get:function(){return r},set:function(t){r=Boolean(t)}});var n=!1;Object.defineProperty(this,"pageWrapYEnabled",{get:function(){return n},set:function(t){n=Boolean(t)}});var i=0;Object.defineProperty(this,"posX",{get:function(){return i},set:function(t){isNaN(t)||(i=t)}});var a=0;Object.defineProperty(this,"posY",{get:function(){return a},set:function(t){isNaN(t)||(a=t)}}),Object.defineProperty(this,"margin",{get:function(){return f.margin},set:function(t){var e;"number"==typeof t?e=[t,t,t,t]:((e=new Array(4))[0]=t[0],e[1]=t.length>=2?t[1]:e[0],e[2]=t.length>=3?t[2]:e[0],e[3]=t.length>=4?t[3]:e[1]),f.margin=e}});var o=!1;Object.defineProperty(this,"autoPaging",{get:function(){return o},set:function(t){o=t}});var s=0;Object.defineProperty(this,"lastBreak",{get:function(){return s},set:function(t){s=t}});var c=[];Object.defineProperty(this,"pageBreaks",{get:function(){return c},set:function(t){c=t}}),Object.defineProperty(this,"ctx",{get:function(){return f},set:function(t){t instanceof d&&(f=t)}}),Object.defineProperty(this,"path",{get:function(){return f.path},set:function(t){f.path=t}});var u=[];Object.defineProperty(this,"ctxStack",{get:function(){return u},set:function(t){u=t}}),Object.defineProperty(this,"fillStyle",{get:function(){return this.ctx.fillStyle},set:function(t){var e;e=g(t),this.ctx.fillStyle=e.style,this.ctx.isFillTransparent=0===e.a,this.ctx.fillOpacity=e.a,this.pdf.setFillColor(e.r,e.g,e.b,{a:e.a}),this.pdf.setTextColor(e.r,e.g,e.b,{a:e.a})}}),Object.defineProperty(this,"strokeStyle",{get:function(){return this.ctx.strokeStyle},set:function(t){var e=g(t);this.ctx.strokeStyle=e.style,this.ctx.isStrokeTransparent=0===e.a,this.ctx.strokeOpacity=e.a,0===e.a?this.pdf.setDrawColor(255,255,255):(e.a,this.pdf.setDrawColor(e.r,e.g,e.b))}}),Object.defineProperty(this,"lineCap",{get:function(){return this.ctx.lineCap},set:function(t){-1!==["butt","round","square"].indexOf(t)&&(this.ctx.lineCap=t,this.pdf.setLineCap(t))}}),Object.defineProperty(this,"lineWidth",{get:function(){return this.ctx.lineWidth},set:function(t){isNaN(t)||(this.ctx.lineWidth=t,this.pdf.setLineWidth(t))}}),Object.defineProperty(this,"lineJoin",{get:function(){return this.ctx.lineJoin},set:function(t){-1!==["bevel","round","miter"].indexOf(t)&&(this.ctx.lineJoin=t,this.pdf.setLineJoin(t))}}),Object.defineProperty(this,"miterLimit",{get:function(){return this.ctx.miterLimit},set:function(t){isNaN(t)||(this.ctx.miterLimit=t,this.pdf.setMiterLimit(t))}}),Object.defineProperty(this,"textBaseline",{get:function(){return this.ctx.textBaseline},set:function(t){this.ctx.textBaseline=t}}),Object.defineProperty(this,"textAlign",{get:function(){return this.ctx.textAlign},set:function(t){-1!==["right","end","center","left","start"].indexOf(t)&&(this.ctx.textAlign=t)}});var l=null;function h(t,e){if(null===l){var r=function(t){var e=[];return Object.keys(t).forEach((function(r){t[r].forEach((function(t){var n=null;switch(t){case"bold":n={family:r,weight:"bold"};break;case"italic":n={family:r,style:"italic"};break;case"bolditalic":n={family:r,weight:"bold",style:"italic"};break;case"":case"normal":n={family:r}}null!==n&&(n.ref={name:r,style:t},e.push(n))}))})),e}(t.getFontList());l=function(t){for(var e={},r=0;r<t.length;++r){var n=Ct(t[r]),i=n.family,a=n.stretch,o=n.style,s=n.weight;e[i]=e[i]||{},e[i][a]=e[i][a]||{},e[i][a][o]=e[i][a][o]||{},e[i][a][o][s]=n}return e}(r.concat(e))}return l}var p=null;Object.defineProperty(this,"fontFaces",{get:function(){return p},set:function(t){l=null,p=t}}),Object.defineProperty(this,"font",{get:function(){return this.ctx.font},set:function(t){var e;if(this.ctx.font=t,null!==(e=/^\s*(?=(?:(?:[-a-z]+\s*){0,2}(italic|oblique))?)(?=(?:(?:[-a-z]+\s*){0,2}(small-caps))?)(?=(?:(?:[-a-z]+\s*){0,2}(bold(?:er)?|lighter|[1-9]00))?)(?:(?:normal|\1|\2|\3)\s*){0,3}((?:xx?-)?(?:small|large)|medium|smaller|larger|[.\d]+(?:\%|in|[cem]m|ex|p[ctx]))(?:\s*\/\s*(normal|[.\d]+(?:\%|in|[cem]m|ex|p[ctx])))?\s*([-_,\"\'\sa-z]+?)\s*$/i.exec(t))){var r=e[1],n=(e[2],e[3]),i=e[4],a=(e[5],e[6]),o=/^([.\d]+)((?:%|in|[cem]m|ex|p[ctx]))$/i.exec(i)[2];i="px"===o?Math.floor(parseFloat(i)*this.pdf.internal.scaleFactor):"em"===o?Math.floor(parseFloat(i)*this.pdf.getFontSize()):Math.floor(parseFloat(i)*this.pdf.internal.scaleFactor),this.pdf.setFontSize(i);var s=function(t){var e,r,n=[],i=t.trim();if(""===i)return Tt;if(i in Bt)return[Bt[i]];for(;""!==i;){switch(r=null,e=(i=qt(i)).charAt(0)){case'"':case"'":r=Dt(i.substring(1),e);break;default:r=Rt(i)}if(null===r)return Tt;if(n.push(r[0]),""!==(i=qt(r[1]))&&","!==i.charAt(0))return Tt;i=i.replace(/^,/,"")}return n}(a);if(this.fontFaces){var c=Et(h(this.pdf,this.fontFaces),s.map((function(t){return{family:t,stretch:"normal",weight:n,style:r}})));this.pdf.setFont(c.ref.name,c.ref.style)}else{var u="";("bold"===n||parseInt(n,10)>=700||"bold"===r)&&(u="bold"),"italic"===r&&(u+="italic"),0===u.length&&(u="normal");for(var l="",f={arial:"Helvetica",Arial:"Helvetica",verdana:"Helvetica",Verdana:"Helvetica",helvetica:"Helvetica",Helvetica:"Helvetica","sans-serif":"Helvetica",fixed:"Courier",monospace:"Courier",terminal:"Courier",cursive:"Times",fantasy:"Times",serif:"Times"},d=0;d<s.length;d++){if(void 0!==this.pdf.internal.getFont(s[d],u,{noFallback:!0,disableWarning:!0})){l=s[d];break}if("bolditalic"===u&&void 0!==this.pdf.internal.getFont(s[d],"bold",{noFallback:!0,disableWarning:!0}))l=s[d],u="bold";else if(void 0!==this.pdf.internal.getFont(s[d],"normal",{noFallback:!0,disableWarning:!0})){l=s[d],u="normal";break}}if(""===l)for(var p=0;p<s.length;p++)if(f[s[p]]){l=f[s[p]];break}l=""===l?"Times":l,this.pdf.setFont(l,u)}}}}),Object.defineProperty(this,"globalCompositeOperation",{get:function(){return this.ctx.globalCompositeOperation},set:function(t){this.ctx.globalCompositeOperation=t}}),Object.defineProperty(this,"globalAlpha",{get:function(){return this.ctx.globalAlpha},set:function(t){this.ctx.globalAlpha=t}}),Object.defineProperty(this,"lineDashOffset",{get:function(){return this.ctx.lineDashOffset},set:function(t){this.ctx.lineDashOffset=t,T.call(this)}}),Object.defineProperty(this,"lineDash",{get:function(){return this.ctx.lineDash},set:function(t){this.ctx.lineDash=t,T.call(this)}}),Object.defineProperty(this,"ignoreClearRect",{get:function(){return this.ctx.ignoreClearRect},set:function(t){this.ctx.ignoreClearRect=Boolean(t)}})};p.prototype.setLineDash=function(t){this.lineDash=t},p.prototype.getLineDash=function(){return this.lineDash.length%2?this.lineDash.concat(this.lineDash):this.lineDash.slice()},p.prototype.fill=function(){A.call(this,"fill",!1)},p.prototype.stroke=function(){A.call(this,"stroke",!1)},p.prototype.beginPath=function(){this.path=[{type:"begin"}]},p.prototype.moveTo=function(t,e){if(isNaN(t)||isNaN(e))throw i.error("jsPDF.context2d.moveTo: Invalid arguments",arguments),new Error("Invalid arguments passed to jsPDF.context2d.moveTo");var r=this.ctx.transform.applyToPoint(new c(t,e));this.path.push({type:"mt",x:r.x,y:r.y}),this.ctx.lastPoint=new c(t,e)},p.prototype.closePath=function(){var t=new c(0,0),r=0;for(r=this.path.length-1;-1!==r;r--)if("begin"===this.path[r].type&&"object"===e(this.path[r+1])&&"number"==typeof this.path[r+1].x){t=new c(this.path[r+1].x,this.path[r+1].y);break}this.path.push({type:"close"}),this.ctx.lastPoint=new c(t.x,t.y)},p.prototype.lineTo=function(t,e){if(isNaN(t)||isNaN(e))throw i.error("jsPDF.context2d.lineTo: Invalid arguments",arguments),new Error("Invalid arguments passed to jsPDF.context2d.lineTo");var r=this.ctx.transform.applyToPoint(new c(t,e));this.path.push({type:"lt",x:r.x,y:r.y}),this.ctx.lastPoint=new c(r.x,r.y)},p.prototype.clip=function(){this.ctx.clip_path=JSON.parse(JSON.stringify(this.path)),A.call(this,null,!0)},p.prototype.quadraticCurveTo=function(t,e,r,n){if(isNaN(r)||isNaN(n)||isNaN(t)||isNaN(e))throw i.error("jsPDF.context2d.quadraticCurveTo: Invalid arguments",arguments),new Error("Invalid arguments passed to jsPDF.context2d.quadraticCurveTo");var a=this.ctx.transform.applyToPoint(new c(r,n)),o=this.ctx.transform.applyToPoint(new c(t,e));this.path.push({type:"qct",x1:o.x,y1:o.y,x:a.x,y:a.y}),this.ctx.lastPoint=new c(a.x,a.y)},p.prototype.bezierCurveTo=function(t,e,r,n,a,o){if(isNaN(a)||isNaN(o)||isNaN(t)||isNaN(e)||isNaN(r)||isNaN(n))throw i.error("jsPDF.context2d.bezierCurveTo: Invalid arguments",arguments),new Error("Invalid arguments passed to jsPDF.context2d.bezierCurveTo");var s=this.ctx.transform.applyToPoint(new c(a,o)),u=this.ctx.transform.applyToPoint(new c(t,e)),l=this.ctx.transform.applyToPoint(new c(r,n));this.path.push({type:"bct",x1:u.x,y1:u.y,x2:l.x,y2:l.y,x:s.x,y:s.y}),this.ctx.lastPoint=new c(s.x,s.y)},p.prototype.arc=function(t,e,r,n,a,o){if(isNaN(t)||isNaN(e)||isNaN(r)||isNaN(n)||isNaN(a))throw i.error("jsPDF.context2d.arc: Invalid arguments",arguments),new Error("Invalid arguments passed to jsPDF.context2d.arc");if(o=Boolean(o),!this.ctx.transform.isIdentity){var s=this.ctx.transform.applyToPoint(new c(t,e));t=s.x,e=s.y;var u=this.ctx.transform.applyToPoint(new c(0,r)),l=this.ctx.transform.applyToPoint(new c(0,0));r=Math.sqrt(Math.pow(u.x-l.x,2)+Math.pow(u.y-l.y,2))}Math.abs(a-n)>=2*Math.PI&&(n=0,a=2*Math.PI),this.path.push({type:"arc",x:t,y:e,radius:r,startAngle:n,endAngle:a,counterclockwise:o})},p.prototype.arcTo=function(t,e,r,n,i){throw new Error("arcTo not implemented.")},p.prototype.rect=function(t,e,r,n){if(isNaN(t)||isNaN(e)||isNaN(r)||isNaN(n))throw i.error("jsPDF.context2d.rect: Invalid arguments",arguments),new Error("Invalid arguments passed to jsPDF.context2d.rect");this.moveTo(t,e),this.lineTo(t+r,e),this.lineTo(t+r,e+n),this.lineTo(t,e+n),this.lineTo(t,e),this.lineTo(t+r,e),this.lineTo(t,e)},p.prototype.fillRect=function(t,e,r,n){if(isNaN(t)||isNaN(e)||isNaN(r)||isNaN(n))throw i.error("jsPDF.context2d.fillRect: Invalid arguments",arguments),new Error("Invalid arguments passed to jsPDF.context2d.fillRect");if(!m.call(this)){var a={};"butt"!==this.lineCap&&(a.lineCap=this.lineCap,this.lineCap="butt"),"miter"!==this.lineJoin&&(a.lineJoin=this.lineJoin,this.lineJoin="miter"),this.beginPath(),this.rect(t,e,r,n),this.fill(),a.hasOwnProperty("lineCap")&&(this.lineCap=a.lineCap),a.hasOwnProperty("lineJoin")&&(this.lineJoin=a.lineJoin)}},p.prototype.strokeRect=function(t,e,r,n){if(isNaN(t)||isNaN(e)||isNaN(r)||isNaN(n))throw i.error("jsPDF.context2d.strokeRect: Invalid arguments",arguments),new Error("Invalid arguments passed to jsPDF.context2d.strokeRect");v.call(this)||(this.beginPath(),this.rect(t,e,r,n),this.stroke())},p.prototype.clearRect=function(t,e,r,n){if(isNaN(t)||isNaN(e)||isNaN(r)||isNaN(n))throw i.error("jsPDF.context2d.clearRect: Invalid arguments",arguments),new Error("Invalid arguments passed to jsPDF.context2d.clearRect");this.ignoreClearRect||(this.fillStyle="#ffffff",this.fillRect(t,e,r,n))},p.prototype.save=function(t){t="boolean"!=typeof t||t;for(var e=this.pdf.internal.getCurrentPageInfo().pageNumber,r=0;r<this.pdf.internal.getNumberOfPages();r++)this.pdf.setPage(r+1),this.pdf.internal.out("q");if(this.pdf.setPage(e),t){this.ctx.fontSize=this.pdf.internal.getFontSize();var n=new d(this.ctx);this.ctxStack.push(this.ctx),this.ctx=n}},p.prototype.restore=function(t){t="boolean"!=typeof t||t;for(var e=this.pdf.internal.getCurrentPageInfo().pageNumber,r=0;r<this.pdf.internal.getNumberOfPages();r++)this.pdf.setPage(r+1),this.pdf.internal.out("Q");this.pdf.setPage(e),t&&0!==this.ctxStack.length&&(this.ctx=this.ctxStack.pop(),this.fillStyle=this.ctx.fillStyle,this.strokeStyle=this.ctx.strokeStyle,this.font=this.ctx.font,this.lineCap=this.ctx.lineCap,this.lineWidth=this.ctx.lineWidth,this.lineJoin=this.ctx.lineJoin,this.lineDash=this.ctx.lineDash,this.lineDashOffset=this.ctx.lineDashOffset)},p.prototype.toDataURL=function(){throw new Error("toDataUrl not implemented.")};var g=function(t){var e,r,n,i;if(!0===t.isCanvasGradient&&(t=t.getColor()),!t)return{r:0,g:0,b:0,a:0,style:t};if(/transparent|rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*0+\s*\)/.test(t))e=0,r=0,n=0,i=0;else{var a=/rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/.exec(t);if(null!==a)e=parseInt(a[1]),r=parseInt(a[2]),n=parseInt(a[3]),i=1;else if(null!==(a=/rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([\d.]+)\s*\)/.exec(t)))e=parseInt(a[1]),r=parseInt(a[2]),n=parseInt(a[3]),i=parseFloat(a[4]);else{if(i=1,"string"==typeof t&&"#"!==t.charAt(0)){var o=new h(t);t=o.ok?o.toHex():"#000000"}4===t.length?(e=t.substring(1,2),e+=e,r=t.substring(2,3),r+=r,n=t.substring(3,4),n+=n):(e=t.substring(1,3),r=t.substring(3,5),n=t.substring(5,7)),e=parseInt(e,16),r=parseInt(r,16),n=parseInt(n,16)}}return{r:e,g:r,b:n,a:i,style:t}},m=function(){return this.ctx.isFillTransparent||0==this.globalAlpha},v=function(){return Boolean(this.ctx.isStrokeTransparent||0==this.globalAlpha)};p.prototype.fillText=function(t,e,r,n){if(isNaN(e)||isNaN(r)||"string"!=typeof t)throw i.error("jsPDF.context2d.fillText: Invalid arguments",arguments),new Error("Invalid arguments passed to jsPDF.context2d.fillText");if(n=isNaN(n)?void 0:n,!m.call(this)){var a=q(this.ctx.transform.rotation),o=this.ctx.transform.scaleX;C.call(this,{text:t,x:e,y:r,scale:o,angle:a,align:this.textAlign,maxWidth:n})}},p.prototype.strokeText=function(t,e,r,n){if(isNaN(e)||isNaN(r)||"string"!=typeof t)throw i.error("jsPDF.context2d.strokeText: Invalid arguments",arguments),new Error("Invalid arguments passed to jsPDF.context2d.strokeText");if(!v.call(this)){n=isNaN(n)?void 0:n;var a=q(this.ctx.transform.rotation),o=this.ctx.transform.scaleX;C.call(this,{text:t,x:e,y:r,scale:o,renderingMode:"stroke",angle:a,align:this.textAlign,maxWidth:n})}},p.prototype.measureText=function(t){if("string"!=typeof t)throw i.error("jsPDF.context2d.measureText: Invalid arguments",arguments),new Error("Invalid arguments passed to jsPDF.context2d.measureText");var e=this.pdf,r=this.pdf.internal.scaleFactor,n=e.internal.getFontSize(),a=e.getStringUnitWidth(t)*n/e.internal.scaleFactor,o=function(t){var e=(t=t||{}).width||0;return Object.defineProperty(this,"width",{get:function(){return e}}),this};return new o({width:a*=Math.round(96*r/72*1e4)/1e4})},p.prototype.scale=function(t,e){if(isNaN(t)||isNaN(e))throw i.error("jsPDF.context2d.scale: Invalid arguments",arguments),new Error("Invalid arguments passed to jsPDF.context2d.scale");var r=new l(t,0,0,e,0,0);this.ctx.transform=this.ctx.transform.multiply(r)},p.prototype.rotate=function(t){if(isNaN(t))throw i.error("jsPDF.context2d.rotate: Invalid arguments",arguments),new Error("Invalid arguments passed to jsPDF.context2d.rotate");var e=new l(Math.cos(t),Math.sin(t),-Math.sin(t),Math.cos(t),0,0);this.ctx.transform=this.ctx.transform.multiply(e)},p.prototype.translate=function(t,e){if(isNaN(t)||isNaN(e))throw i.error("jsPDF.context2d.translate: Invalid arguments",arguments),new Error("Invalid arguments passed to jsPDF.context2d.translate");var r=new l(1,0,0,1,t,e);this.ctx.transform=this.ctx.transform.multiply(r)},p.prototype.transform=function(t,e,r,n,a,o){if(isNaN(t)||isNaN(e)||isNaN(r)||isNaN(n)||isNaN(a)||isNaN(o))throw i.error("jsPDF.context2d.transform: Invalid arguments",arguments),new Error("Invalid arguments passed to jsPDF.context2d.transform");var s=new l(t,e,r,n,a,o);this.ctx.transform=this.ctx.transform.multiply(s)},p.prototype.setTransform=function(t,e,r,n,i,a){t=isNaN(t)?1:t,e=isNaN(e)?0:e,r=isNaN(r)?0:r,n=isNaN(n)?1:n,i=isNaN(i)?0:i,a=isNaN(a)?0:a,this.ctx.transform=new l(t,e,r,n,i,a)};var b=function(){return this.margin[0]>0||this.margin[1]>0||this.margin[2]>0||this.margin[3]>0};p.prototype.drawImage=function(t,e,r,n,i,a,o,s,c){var h=this.pdf.getImageProperties(t),f=1,d=1,p=1,g=1;void 0!==n&&void 0!==s&&(p=s/n,g=c/i,f=h.width/n*s/n,d=h.height/i*c/i),void 0===a&&(a=e,o=r,e=0,r=0),void 0!==n&&void 0===s&&(s=n,c=i),void 0===n&&void 0===s&&(s=h.width,c=h.height);for(var m,v=this.ctx.transform.decompose(),w=q(v.rotate.shx),A=new l,S=(A=(A=(A=A.multiply(v.translate)).multiply(v.skew)).multiply(v.scale)).applyToRectangle(new u(a-e*p,o-r*g,n*f,i*d)),_=y.call(this,S),P=[],k=0;k<_.length;k+=1)-1===P.indexOf(_[k])&&P.push(_[k]);if(L(P),this.autoPaging)for(var F=P[0],I=P[P.length-1],C=F;C<I+1;C++){this.pdf.setPage(C);var j=this.pdf.internal.pageSize.width-this.margin[3]-this.margin[1],O=1===C?this.posY+this.margin[0]:this.margin[0],B=this.pdf.internal.pageSize.height-this.posY-this.margin[0]-this.margin[2],M=this.pdf.internal.pageSize.height-this.margin[0]-this.margin[2],E=1===C?0:B+(C-2)*M;if(0!==this.ctx.clip_path.length){var D=this.path;m=JSON.parse(JSON.stringify(this.ctx.clip_path)),this.path=N(m,this.posX+this.margin[3],-E+O+this.ctx.prevPageLastElemOffset),x.call(this,"fill",!0),this.path=D}var R=JSON.parse(JSON.stringify(S));R=N([R],this.posX+this.margin[3],-E+O+this.ctx.prevPageLastElemOffset)[0];var T=(C>F||C<I)&&b.call(this);T&&(this.pdf.saveGraphicsState(),this.pdf.rect(this.margin[3],this.margin[0],j,M,null).clip().discardPath()),this.pdf.addImage(t,"JPEG",R.x,R.y,R.w,R.h,null,null,w),T&&this.pdf.restoreGraphicsState()}else this.pdf.addImage(t,"JPEG",S.x,S.y,S.w,S.h,null,null,w)};var y=function(t,e,r){var n=[];e=e||this.pdf.internal.pageSize.width,r=r||this.pdf.internal.pageSize.height-this.margin[0]-this.margin[2];var i=this.posY+this.ctx.prevPageLastElemOffset;switch(t.type){default:case"mt":case"lt":n.push(Math.floor((t.y+i)/r)+1);break;case"arc":n.push(Math.floor((t.y+i-t.radius)/r)+1),n.push(Math.floor((t.y+i+t.radius)/r)+1);break;case"qct":var a=D(this.ctx.lastPoint.x,this.ctx.lastPoint.y,t.x1,t.y1,t.x,t.y);n.push(Math.floor((a.y+i)/r)+1),n.push(Math.floor((a.y+a.h+i)/r)+1);break;case"bct":var o=R(this.ctx.lastPoint.x,this.ctx.lastPoint.y,t.x1,t.y1,t.x2,t.y2,t.x,t.y);n.push(Math.floor((o.y+i)/r)+1),n.push(Math.floor((o.y+o.h+i)/r)+1);break;case"rect":n.push(Math.floor((t.y+i)/r)+1),n.push(Math.floor((t.y+t.h+i)/r)+1)}for(var s=0;s<n.length;s+=1)for(;this.pdf.internal.getNumberOfPages()<n[s];)w.call(this);return n},w=function(){var t=this.fillStyle,e=this.strokeStyle,r=this.font,n=this.lineCap,i=this.lineWidth,a=this.lineJoin;this.pdf.addPage(),this.fillStyle=t,this.strokeStyle=e,this.font=r,this.lineCap=n,this.lineWidth=i,this.lineJoin=a},N=function(t,e,r){for(var n=0;n<t.length;n++)switch(t[n].type){case"bct":t[n].x2+=e,t[n].y2+=r;case"qct":t[n].x1+=e,t[n].y1+=r;case"mt":case"lt":case"arc":default:t[n].x+=e,t[n].y+=r}return t},L=function(t){return t.sort((function(t,e){return t-e}))},A=function(t,e){for(var r,n,i=this.fillStyle,a=this.strokeStyle,o=this.lineCap,s=this.lineWidth,c=Math.abs(s*this.ctx.transform.scaleX),u=this.lineJoin,l=JSON.parse(JSON.stringify(this.path)),h=JSON.parse(JSON.stringify(this.path)),f=[],d=0;d<h.length;d++)if(void 0!==h[d].x)for(var p=y.call(this,h[d]),g=0;g<p.length;g+=1)-1===f.indexOf(p[g])&&f.push(p[g]);for(var m=0;m<f.length;m++)for(;this.pdf.internal.getNumberOfPages()<f[m];)w.call(this);if(L(f),this.autoPaging)for(var v=f[0],A=f[f.length-1],S=v;S<A+1;S++){this.pdf.setPage(S),this.fillStyle=i,this.strokeStyle=a,this.lineCap=o,this.lineWidth=c,this.lineJoin=u;var _=this.pdf.internal.pageSize.width-this.margin[3]-this.margin[1],P=1===S?this.posY+this.margin[0]:this.margin[0],k=this.pdf.internal.pageSize.height-this.posY-this.margin[0]-this.margin[2],F=this.pdf.internal.pageSize.height-this.margin[0]-this.margin[2],I=1===S?0:k+(S-2)*F;if(0!==this.ctx.clip_path.length){var C=this.path;r=JSON.parse(JSON.stringify(this.ctx.clip_path)),this.path=N(r,this.posX+this.margin[3],-I+P+this.ctx.prevPageLastElemOffset),x.call(this,t,!0),this.path=C}if(n=JSON.parse(JSON.stringify(l)),this.path=N(n,this.posX+this.margin[3],-I+P+this.ctx.prevPageLastElemOffset),!1===e||0===S){var j=(S>v||S<A)&&b.call(this);j&&(this.pdf.saveGraphicsState(),this.pdf.rect(this.margin[3],this.margin[0],_,F,null).clip().discardPath()),x.call(this,t,e),j&&this.pdf.restoreGraphicsState()}this.lineWidth=s}else this.lineWidth=c,x.call(this,t,e),this.lineWidth=s;this.path=l},x=function(t,e){if(("stroke"!==t||e||!v.call(this))&&("stroke"===t||e||!m.call(this))){for(var r,n,i=[],a=this.path,o=0;o<a.length;o++){var s=a[o];switch(s.type){case"begin":i.push({begin:!0});break;case"close":i.push({close:!0});break;case"mt":i.push({start:s,deltas:[],abs:[]});break;case"lt":var c=i.length;if(a[o-1]&&!isNaN(a[o-1].x)&&(r=[s.x-a[o-1].x,s.y-a[o-1].y],c>0))for(;c>=0;c--)if(!0!==i[c-1].close&&!0!==i[c-1].begin){i[c-1].deltas.push(r),i[c-1].abs.push(s);break}break;case"bct":r=[s.x1-a[o-1].x,s.y1-a[o-1].y,s.x2-a[o-1].x,s.y2-a[o-1].y,s.x-a[o-1].x,s.y-a[o-1].y],i[i.length-1].deltas.push(r);break;case"qct":var u=a[o-1].x+2/3*(s.x1-a[o-1].x),l=a[o-1].y+2/3*(s.y1-a[o-1].y),h=s.x+2/3*(s.x1-s.x),f=s.y+2/3*(s.y1-s.y),d=s.x,p=s.y;r=[u-a[o-1].x,l-a[o-1].y,h-a[o-1].x,f-a[o-1].y,d-a[o-1].x,p-a[o-1].y],i[i.length-1].deltas.push(r);break;case"arc":i.push({deltas:[],abs:[],arc:!0}),Array.isArray(i[i.length-1].abs)&&i[i.length-1].abs.push(s)}}n=e?null:"stroke"===t?"stroke":"fill";for(var g=!1,b=0;b<i.length;b++)if(i[b].arc)for(var y=i[b].abs,w=0;w<y.length;w++){var N=y[w];"arc"===N.type?P.call(this,N.x,N.y,N.radius,N.startAngle,N.endAngle,N.counterclockwise,void 0,e,!g):j.call(this,N.x,N.y),g=!0}else if(!0===i[b].close)this.pdf.internal.out("h"),g=!1;else if(!0!==i[b].begin){var L=i[b].start.x,A=i[b].start.y;O.call(this,i[b].deltas,L,A),g=!0}n&&k.call(this,n),e&&F.call(this)}},S=function(t){var e=this.pdf.internal.getFontSize()/this.pdf.internal.scaleFactor,r=e*(this.pdf.internal.getLineHeightFactor()-1);switch(this.ctx.textBaseline){case"bottom":return t-r;case"top":return t+e-r;case"hanging":return t+e-2*r;case"middle":return t+e/2-r;case"ideographic":return t;case"alphabetic":default:return t}},_=function(t){return t+this.pdf.internal.getFontSize()/this.pdf.internal.scaleFactor*(this.pdf.internal.getLineHeightFactor()-1)};p.prototype.createLinearGradient=function(){var t=function(){};return t.colorStops=[],t.addColorStop=function(t,e){this.colorStops.push([t,e])},t.getColor=function(){return 0===this.colorStops.length?"#000000":this.colorStops[0][1]},t.isCanvasGradient=!0,t},p.prototype.createPattern=function(){return this.createLinearGradient()},p.prototype.createRadialGradient=function(){return this.createLinearGradient()};var P=function(t,e,r,n,i,a,o,s,c){for(var u=M.call(this,r,n,i,a),l=0;l<u.length;l++){var h=u[l];0===l&&(c?I.call(this,h.x1+t,h.y1+e):j.call(this,h.x1+t,h.y1+e)),B.call(this,t,e,h.x2,h.y2,h.x3,h.y3,h.x4,h.y4)}s?F.call(this):k.call(this,o)},k=function(t){switch(t){case"stroke":this.pdf.internal.out("S");break;case"fill":this.pdf.internal.out("f")}},F=function(){this.pdf.clip(),this.pdf.discardPath()},I=function(t,e){this.pdf.internal.out(n(t)+" "+a(e)+" m")},C=function(t){var e;switch(t.align){case"right":case"end":e="right";break;case"center":e="center";break;case"left":case"start":default:e="left"}var r=this.pdf.getTextDimensions(t.text),n=S.call(this,t.y),i=_.call(this,n)-r.h,a=this.ctx.transform.applyToPoint(new c(t.x,n)),o=this.ctx.transform.decompose(),s=new l;s=(s=(s=s.multiply(o.translate)).multiply(o.skew)).multiply(o.scale);for(var h,f,d,p=this.ctx.transform.applyToRectangle(new u(t.x,n,r.w,r.h)),g=s.applyToRectangle(new u(t.x,i,r.w,r.h)),m=y.call(this,g),v=[],w=0;w<m.length;w+=1)-1===v.indexOf(m[w])&&v.push(m[w]);if(L(v),this.autoPaging)for(var A=v[0],P=v[v.length-1],k=A;k<P+1;k++){this.pdf.setPage(k);var F=1===k?this.posY+this.margin[0]:this.margin[0],I=this.pdf.internal.pageSize.height-this.posY-this.margin[0]-this.margin[2],C=this.pdf.internal.pageSize.height-this.margin[2],j=C-this.margin[0],O=this.pdf.internal.pageSize.width-this.margin[1],B=O-this.margin[3],M=1===k?0:I+(k-2)*j;if(0!==this.ctx.clip_path.length){var E=this.path;h=JSON.parse(JSON.stringify(this.ctx.clip_path)),this.path=N(h,this.posX+this.margin[3],-1*M+F),x.call(this,"fill",!0),this.path=E}var q=N([JSON.parse(JSON.stringify(g))],this.posX+this.margin[3],-M+F+this.ctx.prevPageLastElemOffset)[0];t.scale>=.01&&(f=this.pdf.internal.getFontSize(),this.pdf.setFontSize(f*t.scale),d=this.lineWidth,this.lineWidth=d*t.scale);var D="text"!==this.autoPaging;if(D||q.y+q.h<=C){if(D||q.y>=F&&q.x<=O){var R=D?t.text:this.pdf.splitTextToSize(t.text,t.maxWidth||O-q.x)[0],T=N([JSON.parse(JSON.stringify(p))],this.posX+this.margin[3],-M+F+this.ctx.prevPageLastElemOffset)[0],U=D&&(k>A||k<P)&&b.call(this);U&&(this.pdf.saveGraphicsState(),this.pdf.rect(this.margin[3],this.margin[0],B,j,null).clip().discardPath()),this.pdf.text(R,T.x,T.y,{angle:t.angle,align:e,renderingMode:t.renderingMode}),U&&this.pdf.restoreGraphicsState()}}else q.y<C&&(this.ctx.prevPageLastElemOffset+=C-q.y);t.scale>=.01&&(this.pdf.setFontSize(f),this.lineWidth=d)}else t.scale>=.01&&(f=this.pdf.internal.getFontSize(),this.pdf.setFontSize(f*t.scale),d=this.lineWidth,this.lineWidth=d*t.scale),this.pdf.text(t.text,a.x+this.posX,a.y+this.posY,{angle:t.angle,align:e,renderingMode:t.renderingMode,maxWidth:t.maxWidth}),t.scale>=.01&&(this.pdf.setFontSize(f),this.lineWidth=d)},j=function(t,e,r,i){r=r||0,i=i||0,this.pdf.internal.out(n(t+r)+" "+a(e+i)+" l")},O=function(t,e,r){return this.pdf.lines(t,e,r,null,null)},B=function(t,e,n,i,a,c,u,l){this.pdf.internal.out([r(o(n+t)),r(s(i+e)),r(o(a+t)),r(s(c+e)),r(o(u+t)),r(s(l+e)),"c"].join(" "))},M=function(t,e,r,n){for(var i=2*Math.PI,a=Math.PI/2;e>r;)e-=i;var o=Math.abs(r-e);o<i&&n&&(o=i-o);for(var s=[],c=n?-1:1,u=e;o>1e-5;){var l=u+c*Math.min(o,a);s.push(E.call(this,t,u,l)),o-=Math.abs(l-u),u=l}return s},E=function(t,e,r){var n=(r-e)/2,i=t*Math.cos(n),a=t*Math.sin(n),o=i,s=-a,c=o*o+s*s,u=c+o*i+s*a,l=4/3*(Math.sqrt(2*c*u)-u)/(o*a-s*i),h=o-l*s,f=s+l*o,d=h,p=-f,g=n+e,m=Math.cos(g),v=Math.sin(g);return{x1:t*Math.cos(e),y1:t*Math.sin(e),x2:h*m-f*v,y2:h*v+f*m,x3:d*m-p*v,y3:d*v+p*m,x4:t*Math.cos(r),y4:t*Math.sin(r)}},q=function(t){return 180*t/Math.PI},D=function(t,e,r,n,i,a){var o=t+.5*(r-t),s=e+.5*(n-e),c=i+.5*(r-i),l=a+.5*(n-a),h=Math.min(t,i,o,c),f=Math.max(t,i,o,c),d=Math.min(e,a,s,l),p=Math.max(e,a,s,l);return new u(h,d,f-h,p-d)},R=function(t,e,r,n,i,a,o,s){var c,l,h,f,d,p,g,m,v,b,y,w,N,L,A=r-t,x=n-e,S=i-r,_=a-n,P=o-i,k=s-a;for(l=0;l<41;l++)v=(g=(h=t+(c=l/40)*A)+c*((d=r+c*S)-h))+c*(d+c*(i+c*P-d)-g),b=(m=(f=e+c*x)+c*((p=n+c*_)-f))+c*(p+c*(a+c*k-p)-m),0==l?(y=v,w=b,N=v,L=b):(y=Math.min(y,v),w=Math.min(w,b),N=Math.max(N,v),L=Math.max(L,b));return new u(Math.round(y),Math.round(w),Math.round(N-y),Math.round(L-w))},T=function(){if(this.prevLineDash||this.ctx.lineDash.length||this.ctx.lineDashOffset){var t,e,r=(t=this.ctx.lineDash,e=this.ctx.lineDashOffset,JSON.stringify({lineDash:t,lineDashOffset:e}));this.prevLineDash!==r&&(this.pdf.setLineDash(this.ctx.lineDash,this.ctx.lineDashOffset),this.prevLineDash=r)}}}(M.API);try{require("worker_threads").Worker}catch(t){}var Ut=Uint8Array,zt=Uint16Array,Ht=Uint32Array,Wt=new Ut([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Vt=new Ut([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Gt=new Ut([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Yt=function(t,e){for(var r=new zt(31),n=0;n<31;++n)r[n]=e+=1<<t[n-1];var i=new Ht(r[30]);for(n=1;n<30;++n)for(var a=r[n];a<r[n+1];++a)i[a]=a-r[n]<<5|n;return[r,i]},Jt=Yt(Wt,2),Xt=Jt[0],Kt=Jt[1];Xt[28]=258,Kt[258]=28;for(var Zt=Yt(Vt,0),$t=Zt[0],Qt=Zt[1],te=new zt(32768),ee=0;ee<32768;++ee){var re=(43690&ee)>>>1|(21845&ee)<<1;re=(61680&(re=(52428&re)>>>2|(13107&re)<<2))>>>4|(3855&re)<<4,te[ee]=((65280&re)>>>8|(255&re)<<8)>>>1}var ne=function(t,e,r){for(var n=t.length,i=0,a=new zt(e);i<n;++i)++a[t[i]-1];var o,s=new zt(e);for(i=0;i<e;++i)s[i]=s[i-1]+a[i-1]<<1;if(r){o=new zt(1<<e);var c=15-e;for(i=0;i<n;++i)if(t[i])for(var u=i<<4|t[i],l=e-t[i],h=s[t[i]-1]++<<l,f=h|(1<<l)-1;h<=f;++h)o[te[h]>>>c]=u}else for(o=new zt(n),i=0;i<n;++i)o[i]=te[s[t[i]-1]++]>>>15-t[i];return o},ie=new Ut(288);for(ee=0;ee<144;++ee)ie[ee]=8;for(ee=144;ee<256;++ee)ie[ee]=9;for(ee=256;ee<280;++ee)ie[ee]=7;for(ee=280;ee<288;++ee)ie[ee]=8;var ae=new Ut(32);for(ee=0;ee<32;++ee)ae[ee]=5;var oe=ne(ie,9,0),se=ne(ie,9,1),ce=ne(ae,5,0),ue=ne(ae,5,1),le=function(t){for(var e=t[0],r=1;r<t.length;++r)t[r]>e&&(e=t[r]);return e},he=function(t,e,r){var n=e/8>>0;return(t[n]|t[n+1]<<8)>>>(7&e)&r},fe=function(t,e){var r=e/8>>0;return(t[r]|t[r+1]<<8|t[r+2]<<16)>>>(7&e)},de=function(t){return(t/8>>0)+(7&t&&1)},pe=function(t,e,r){(null==e||e<0)&&(e=0),(null==r||r>t.length)&&(r=t.length);var n=new(t instanceof zt?zt:t instanceof Ht?Ht:Ut)(r-e);return n.set(t.subarray(e,r)),n},ge=function(t,e,r){r<<=7&e;var n=e/8>>0;t[n]|=r,t[n+1]|=r>>>8},me=function(t,e,r){r<<=7&e;var n=e/8>>0;t[n]|=r,t[n+1]|=r>>>8,t[n+2]|=r>>>16},ve=function(t,e){for(var r=[],n=0;n<t.length;++n)t[n]&&r.push({s:n,f:t[n]});var i=r.length,a=r.slice();if(!i)return[new Ut(0),0];if(1==i){var o=new Ut(r[0].s+1);return o[r[0].s]=1,[o,1]}r.sort((function(t,e){return t.f-e.f})),r.push({s:-1,f:25001});var s=r[0],c=r[1],u=0,l=1,h=2;for(r[0]={s:-1,f:s.f+c.f,l:s,r:c};l!=i-1;)s=r[r[u].f<r[h].f?u++:h++],c=r[u!=l&&r[u].f<r[h].f?u++:h++],r[l++]={s:-1,f:s.f+c.f,l:s,r:c};var f=a[0].s;for(n=1;n<i;++n)a[n].s>f&&(f=a[n].s);var d=new zt(f+1),p=be(r[l-1],d,0);if(p>e){n=0;var g=0,m=p-e,v=1<<m;for(a.sort((function(t,e){return d[e.s]-d[t.s]||t.f-e.f}));n<i;++n){var b=a[n].s;if(!(d[b]>e))break;g+=v-(1<<p-d[b]),d[b]=e}for(g>>>=m;g>0;){var y=a[n].s;d[y]<e?g-=1<<e-d[y]++-1:++n}for(;n>=0&&g;--n){var w=a[n].s;d[w]==e&&(--d[w],++g)}p=e}return[new Ut(d),p]},be=function(t,e,r){return-1==t.s?Math.max(be(t.l,e,r+1),be(t.r,e,r+1)):e[t.s]=r},ye=function(t){for(var e=t.length;e&&!t[--e];);for(var r=new zt(++e),n=0,i=t[0],a=1,o=function(t){r[n++]=t},s=1;s<=e;++s)if(t[s]==i&&s!=e)++a;else{if(!i&&a>2){for(;a>138;a-=138)o(32754);a>2&&(o(a>10?a-11<<5|28690:a-3<<5|12305),a=0)}else if(a>3){for(o(i),--a;a>6;a-=6)o(8304);a>2&&(o(a-3<<5|8208),a=0)}for(;a--;)o(i);a=1,i=t[s]}return[r.subarray(0,n),e]},we=function(t,e){for(var r=0,n=0;n<e.length;++n)r+=t[n]*e[n];return r},Ne=function(t,e,r){var n=r.length,i=de(e+2);t[i]=255&n,t[i+1]=n>>>8,t[i+2]=255^t[i],t[i+3]=255^t[i+1];for(var a=0;a<n;++a)t[i+a+4]=r[a];return 8*(i+4+n)},Le=function(t,e,r,n,i,a,o,s,c,u,l){ge(e,l++,r),++i[256];for(var h=ve(i,15),f=h[0],d=h[1],p=ve(a,15),g=p[0],m=p[1],v=ye(f),b=v[0],y=v[1],w=ye(g),N=w[0],L=w[1],A=new zt(19),x=0;x<b.length;++x)A[31&b[x]]++;for(x=0;x<N.length;++x)A[31&N[x]]++;for(var S=ve(A,7),_=S[0],P=S[1],k=19;k>4&&!_[Gt[k-1]];--k);var F,I,C,j,O=u+5<<3,B=we(i,ie)+we(a,ae)+o,M=we(i,f)+we(a,g)+o+14+3*k+we(A,_)+(2*A[16]+3*A[17]+7*A[18]);if(O<=B&&O<=M)return Ne(e,l,t.subarray(c,c+u));if(ge(e,l,1+(M<B)),l+=2,M<B){F=ne(f,d,0),I=f,C=ne(g,m,0),j=g;var E=ne(_,P,0);ge(e,l,y-257),ge(e,l+5,L-1),ge(e,l+10,k-4),l+=14;for(x=0;x<k;++x)ge(e,l+3*x,_[Gt[x]]);l+=3*k;for(var q=[b,N],D=0;D<2;++D){var R=q[D];for(x=0;x<R.length;++x){var T=31&R[x];ge(e,l,E[T]),l+=_[T],T>15&&(ge(e,l,R[x]>>>5&127),l+=R[x]>>>12)}}}else F=oe,I=ie,C=ce,j=ae;for(x=0;x<s;++x)if(n[x]>255){T=n[x]>>>18&31;me(e,l,F[T+257]),l+=I[T+257],T>7&&(ge(e,l,n[x]>>>23&31),l+=Wt[T]);var U=31&n[x];me(e,l,C[U]),l+=j[U],U>3&&(me(e,l,n[x]>>>5&8191),l+=Vt[U])}else me(e,l,F[n[x]]),l+=I[n[x]];return me(e,l,F[256]),l+I[256]},Ae=new Ht([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),xe=new Ut(0),Se=function(t,e,r,n,i){return function(t,e,r,n,i,a){var o=t.length,s=new Ut(n+o+5*(1+Math.floor(o/7e3))+i),c=s.subarray(n,s.length-i),u=0;if(!e||o<8)for(var l=0;l<=o;l+=65535){var h=l+65535;h<o?u=Ne(c,u,t.subarray(l,h)):(c[l]=a,u=Ne(c,u,t.subarray(l,o)))}else{for(var f=Ae[e-1],d=f>>>13,p=8191&f,g=(1<<r)-1,m=new zt(32768),v=new zt(g+1),b=Math.ceil(r/3),y=2*b,w=function(e){return(t[e]^t[e+1]<<b^t[e+2]<<y)&g},N=new Ht(25e3),L=new zt(288),A=new zt(32),x=0,S=0,_=(l=0,0),P=0,k=0;l<o;++l){var F=w(l),I=32767&l,C=v[F];if(m[I]=C,v[F]=I,P<=l){var j=o-l;if((x>7e3||_>24576)&&j>423){u=Le(t,c,0,N,L,A,S,_,k,l-k,u),_=x=S=0,k=l;for(var O=0;O<286;++O)L[O]=0;for(O=0;O<30;++O)A[O]=0}var B=2,M=0,E=p,q=I-C&32767;if(j>2&&F==w(l-q))for(var D=Math.min(d,j)-1,R=Math.min(32767,l),T=Math.min(258,j);q<=R&&--E&&I!=C;){if(t[l+B]==t[l+B-q]){for(var U=0;U<T&&t[l+U]==t[l+U-q];++U);if(U>B){if(B=U,M=q,U>D)break;var z=Math.min(q,U-2),H=0;for(O=0;O<z;++O){var W=l-q+O+32768&32767,V=W-m[W]+32768&32767;V>H&&(H=V,C=W)}}}q+=(I=C)-(C=m[I])+32768&32767}if(M){N[_++]=268435456|Kt[B]<<18|Qt[M];var G=31&Kt[B],Y=31&Qt[M];S+=Wt[G]+Vt[Y],++L[257+G],++A[Y],P=l+B,++x}else N[_++]=t[l],++L[t[l]]}}u=Le(t,c,a,N,L,A,S,_,k,l-k,u),a||(u=Ne(c,u,xe))}return pe(s,0,n+de(u)+i)}(t,null==e.level?6:e.level,null==e.mem?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(t.length)))):12+e.mem,r,n,!i)};function _e(t,e){void 0===e&&(e={});var r=function(){var t=1,e=0;return{p:function(r){for(var n=t,i=e,a=r.length,o=0;o!=a;){for(var s=Math.min(o+5552,a);o<s;++o)i+=n+=r[o];n%=65521,i%=65521}t=n,e=i},d:function(){return(t>>>8<<16|(255&e)<<8|e>>>8)+2*((255&t)<<23)}}}();r.p(t);var n=Se(t,e,2,4);return function(t,e){var r=e.level,n=0==r?0:r<6?1:9==r?3:2;t[0]=120,t[1]=n<<6|(n?32-2*n:1)}(n,e),function(t,e,r){for(;r;++e)t[e]=r,r>>>=8}(n,n.length-4,r.d()),n}function Pe(t,e){return function(t,e,r){var n=t.length,i=!e||r,a=!r||r.i;r||(r={}),e||(e=new Ut(3*n));var o=function(t){var r=e.length;if(t>r){var n=new Ut(Math.max(2*r,t));n.set(e),e=n}},s=r.f||0,c=r.p||0,u=r.b||0,l=r.l,h=r.d,f=r.m,d=r.n,p=8*n;do{if(!l){r.f=s=he(t,c,1);var g=he(t,c+1,3);if(c+=3,!g){var m=t[(P=de(c)+4)-4]|t[P-3]<<8,v=P+m;if(v>n){if(a)throw"unexpected EOF";break}i&&o(u+m),e.set(t.subarray(P,v),u),r.b=u+=m,r.p=c=8*v;continue}if(1==g)l=se,h=ue,f=9,d=5;else{if(2!=g)throw"invalid block type";var b=he(t,c,31)+257,y=he(t,c+10,15)+4,w=b+he(t,c+5,31)+1;c+=14;for(var N=new Ut(w),L=new Ut(19),A=0;A<y;++A)L[Gt[A]]=he(t,c+3*A,7);c+=3*y;var x=le(L),S=(1<<x)-1;if(!a&&c+w*(x+7)>p)break;var _=ne(L,x,1);for(A=0;A<w;){var P,k=_[he(t,c,S)];if(c+=15&k,(P=k>>>4)<16)N[A++]=P;else{var F=0,I=0;for(16==P?(I=3+he(t,c,3),c+=2,F=N[A-1]):17==P?(I=3+he(t,c,7),c+=3):18==P&&(I=11+he(t,c,127),c+=7);I--;)N[A++]=F}}var C=N.subarray(0,b),j=N.subarray(b);f=le(C),d=le(j),l=ne(C,f,1),h=ne(j,d,1)}if(c>p)throw"unexpected EOF"}i&&o(u+131072);for(var O=(1<<f)-1,B=(1<<d)-1,M=f+d+18;a||c+M<p;){var E=(F=l[fe(t,c)&O])>>>4;if((c+=15&F)>p)throw"unexpected EOF";if(!F)throw"invalid length/literal";if(E<256)e[u++]=E;else{if(256==E){l=null;break}var q=E-254;if(E>264){var D=Wt[A=E-257];q=he(t,c,(1<<D)-1)+Xt[A],c+=D}var R=h[fe(t,c)&B],T=R>>>4;if(!R)throw"invalid distance";c+=15&R;j=$t[T];if(T>3){D=Vt[T];j+=fe(t,c)&(1<<D)-1,c+=D}if(c>p)throw"unexpected EOF";i&&o(u+131072);for(var U=u+q;u<U;u+=4)e[u]=e[u-j],e[u+1]=e[u+1-j],e[u+2]=e[u+2-j],e[u+3]=e[u+3-j];u=U}}r.l=l,r.p=c,r.b=u,l&&(s=1,r.m=f,r.d=h,r.n=d)}while(!s);return u==e.length?e:pe(e,0,u)}((function(t){if(8!=(15&t[0])||t[0]>>>4>7||(t[0]<<8|t[1])%31)throw"invalid zlib data";if(32&t[1])throw"invalid zlib data: preset dictionaries not supported"}(t),t.subarray(2,-4)),e)} +/** + * @license + * jsPDF filters PlugIn + * Copyright (c) 2014 Aras Abbasi + * + * Licensed under the MIT License. + * http://opensource.org/licenses/mit-license + */!function(t){var e=function(t){var e,r,n,i,a,o,s,c,u,l;for(/[^\x00-\xFF]/.test(t),r=[],n=0,i=(t+=e="\0\0\0\0".slice(t.length%4||4)).length;i>n;n+=4)0!==(a=(t.charCodeAt(n)<<24)+(t.charCodeAt(n+1)<<16)+(t.charCodeAt(n+2)<<8)+t.charCodeAt(n+3))?(o=(a=((a=((a=((a=(a-(l=a%85))/85)-(u=a%85))/85)-(c=a%85))/85)-(s=a%85))/85)%85,r.push(o+33,s+33,c+33,u+33,l+33)):r.push(122);return function(t,e){for(var r=e;r>0;r--)t.pop()}(r,e.length),String.fromCharCode.apply(String,r)+"~>"},r=function(t){var e,r,n,i,a,o=String,s="length",c=255,u="charCodeAt",l="slice",h="replace";for(t[l](-2),t=t[l](0,-2)[h](/\s/g,"")[h]("z","!!!!!"),n=[],i=0,a=(t+=e="uuuuu"[l](t[s]%5||5))[s];a>i;i+=5)r=52200625*(t[u](i)-33)+614125*(t[u](i+1)-33)+7225*(t[u](i+2)-33)+85*(t[u](i+3)-33)+(t[u](i+4)-33),n.push(c&r>>24,c&r>>16,c&r>>8,c&r);return function(t,e){for(var r=e;r>0;r--)t.pop()}(n,e[s]),o.fromCharCode.apply(o,n)},n=function(t){var e=new RegExp(/^([0-9A-Fa-f]{2})+$/);if(-1!==(t=t.replace(/\s/g,"")).indexOf(">")&&(t=t.substr(0,t.indexOf(">"))),t.length%2&&(t+="0"),!1===e.test(t))return"";for(var r="",n=0;n<t.length;n+=2)r+=String.fromCharCode("0x"+(t[n]+t[n+1]));return r},i=function(t){for(var e=new Uint8Array(t.length),r=t.length;r--;)e[r]=t.charCodeAt(r);return t=(e=_e(e)).reduce((function(t,e){return t+String.fromCharCode(e)}),"")};t.processDataByFilters=function(t,a){var o=0,s=t||"",c=[];for("string"==typeof(a=a||[])&&(a=[a]),o=0;o<a.length;o+=1)switch(a[o]){case"ASCII85Decode":case"/ASCII85Decode":s=r(s),c.push("/ASCII85Encode");break;case"ASCII85Encode":case"/ASCII85Encode":s=e(s),c.push("/ASCII85Decode");break;case"ASCIIHexDecode":case"/ASCIIHexDecode":s=n(s),c.push("/ASCIIHexEncode");break;case"ASCIIHexEncode":case"/ASCIIHexEncode":s=s.split("").map((function(t){return("0"+t.charCodeAt().toString(16)).slice(-2)})).join("")+">",c.push("/ASCIIHexDecode");break;case"FlateEncode":case"/FlateEncode":s=i(s),c.push("/FlateDecode");break;default:throw new Error('The filter: "'+a[o]+'" is not implemented')}return{data:s,reverseChain:c.reverse().join(" ")}}}(M.API), +/** + * @license + * jsPDF fileloading PlugIn + * Copyright (c) 2018 Aras Abbasi (aras.abbasi@gmail.com) + * + * Licensed under the MIT License. + * http://opensource.org/licenses/mit-license + */ +function(t){t.loadFile=function(t,e,r){return function(t,e,r){e=!1!==e,r="function"==typeof r?r:function(){};var n=void 0;try{n=function(t,e,r){var n=new XMLHttpRequest,i=0,a=function(t){var e=t.length,r=[],n=String.fromCharCode;for(i=0;i<e;i+=1)r.push(n(255&t.charCodeAt(i)));return r.join("")};if(n.open("GET",t,!e),n.overrideMimeType("text/plain; charset=x-user-defined"),!1===e&&(n.onload=function(){200===n.status?r(a(this.responseText)):r(void 0)}),n.send(null),e&&200===n.status)return a(n.responseText)}(t,e,r)}catch(t){}return n}(t,e,r)},t.loadImageFile=t.loadFile}(M.API),function(n){function i(){return(r.html2canvas?Promise.resolve(r.html2canvas):"object"===(void 0===t?"undefined":e(t))&&"undefined"!=typeof module?new Promise((function(t,e){try{t(require("html2canvas"))}catch(t){e(t)}})):"function"==typeof define&&define.amd?new Promise((function(t,e){try{require(["html2canvas"],t)}catch(t){e(t)}})):Promise.reject(new Error("Could not load html2canvas"))).catch((function(t){return Promise.reject(new Error("Could not load html2canvas: "+t))})).then((function(t){return t.default?t.default:t}))}function a(){return(r.DOMPurify?Promise.resolve(r.DOMPurify):"object"===(void 0===t?"undefined":e(t))&&"undefined"!=typeof module?new Promise((function(t,e){try{t(require("dompurify"))}catch(t){e(t)}})):"function"==typeof define&&define.amd?new Promise((function(t,e){try{require(["dompurify"],t)}catch(t){e(t)}})):Promise.reject(new Error("Could not load dompurify"))).catch((function(t){return Promise.reject(new Error("Could not load dompurify: "+t))})).then((function(t){return t.default?t.default:t}))}var o=function(t){var r=e(t);return"undefined"===r?"undefined":"string"===r||t instanceof String?"string":"number"===r||t instanceof Number?"number":"function"===r||t instanceof Function?"function":t&&t.constructor===Array?"array":t&&1===t.nodeType?"element":"object"===r?"object":"unknown"},s=function(t,e){var r=document.createElement(t);for(var n in e.className&&(r.className=e.className),e.innerHTML&&e.dompurify&&(r.innerHTML=e.dompurify.sanitize(e.innerHTML)),e.style)r.style[n]=e.style[n];return r},c=function t(e){var r=Object.assign(t.convert(Promise.resolve()),JSON.parse(JSON.stringify(t.template))),n=t.convert(Promise.resolve(),r);return n=(n=n.setProgress(1,t,1,[t])).set(e)};(c.prototype=Object.create(Promise.prototype)).constructor=c,c.convert=function(t,e){return t.__proto__=e||c.prototype,t},c.template={prop:{src:null,container:null,overlay:null,canvas:null,img:null,pdf:null,pageSize:null,callback:function(){}},progress:{val:0,state:null,n:0,stack:[]},opt:{filename:"file.pdf",margin:[0,0,0,0],enableLinks:!0,x:0,y:0,html2canvas:{},jsPDF:{},backgroundColor:"transparent"}},c.prototype.from=function(t,e){return this.then((function(){switch(e=e||function(t){switch(o(t)){case"string":return"string";case"element":return"canvas"===t.nodeName.toLowerCase()?"canvas":"element";default:return"unknown"}}(t)){case"string":return this.then(a).then((function(e){return this.set({src:s("div",{innerHTML:t,dompurify:e})})}));case"element":return this.set({src:t});case"canvas":return this.set({canvas:t});case"img":return this.set({img:t});default:return this.error("Unknown source type.")}}))},c.prototype.to=function(t){switch(t){case"container":return this.toContainer();case"canvas":return this.toCanvas();case"img":return this.toImg();case"pdf":return this.toPdf();default:return this.error("Invalid target.")}},c.prototype.toContainer=function(){return this.thenList([function(){return this.prop.src||this.error("Cannot duplicate - no source HTML.")},function(){return this.prop.pageSize||this.setPageSize()}]).then((function(){var t={position:"relative",display:"inline-block",width:("number"!=typeof this.opt.width||isNaN(this.opt.width)||"number"!=typeof this.opt.windowWidth||isNaN(this.opt.windowWidth)?Math.max(this.prop.src.clientWidth,this.prop.src.scrollWidth,this.prop.src.offsetWidth):this.opt.windowWidth)+"px",left:0,right:0,top:0,margin:"auto",backgroundColor:this.opt.backgroundColor},e=function t(e,r){for(var n=3===e.nodeType?document.createTextNode(e.nodeValue):e.cloneNode(!1),i=e.firstChild;i;i=i.nextSibling)!0!==r&&1===i.nodeType&&"SCRIPT"===i.nodeName||n.appendChild(t(i,r));return 1===e.nodeType&&("CANVAS"===e.nodeName?(n.width=e.width,n.height=e.height,n.getContext("2d").drawImage(e,0,0)):"TEXTAREA"!==e.nodeName&&"SELECT"!==e.nodeName||(n.value=e.value),n.addEventListener("load",(function(){n.scrollTop=e.scrollTop,n.scrollLeft=e.scrollLeft}),!0)),n}(this.prop.src,this.opt.html2canvas.javascriptEnabled);"BODY"===e.tagName&&(t.height=Math.max(document.body.scrollHeight,document.body.offsetHeight,document.documentElement.clientHeight,document.documentElement.scrollHeight,document.documentElement.offsetHeight)+"px"),this.prop.overlay=s("div",{className:"html2pdf__overlay",style:{position:"fixed",overflow:"hidden",zIndex:1e3,left:"-100000px",right:0,bottom:0,top:0}}),this.prop.container=s("div",{className:"html2pdf__container",style:t}),this.prop.container.appendChild(e),this.prop.container.firstChild.appendChild(s("div",{style:{clear:"both",border:"0 none transparent",margin:0,padding:0,height:0}})),this.prop.container.style.float="none",this.prop.overlay.appendChild(this.prop.container),document.body.appendChild(this.prop.overlay),this.prop.container.firstChild.style.position="relative",this.prop.container.height=Math.max(this.prop.container.firstChild.clientHeight,this.prop.container.firstChild.scrollHeight,this.prop.container.firstChild.offsetHeight)+"px"}))},c.prototype.toCanvas=function(){var t=[function(){return document.body.contains(this.prop.container)||this.toContainer()}];return this.thenList(t).then(i).then((function(t){var e=Object.assign({},this.opt.html2canvas);return delete e.onrendered,t(this.prop.container,e)})).then((function(t){(this.opt.html2canvas.onrendered||function(){})(t),this.prop.canvas=t,document.body.removeChild(this.prop.overlay)}))},c.prototype.toContext2d=function(){var t=[function(){return document.body.contains(this.prop.container)||this.toContainer()}];return this.thenList(t).then(i).then((function(t){var e=this.opt.jsPDF,r=this.opt.fontFaces,n="number"!=typeof this.opt.width||isNaN(this.opt.width)||"number"!=typeof this.opt.windowWidth||isNaN(this.opt.windowWidth)?1:this.opt.width/this.opt.windowWidth,i=Object.assign({async:!0,allowTaint:!0,scale:n,scrollX:this.opt.scrollX||0,scrollY:this.opt.scrollY||0,backgroundColor:"#ffffff",imageTimeout:15e3,logging:!0,proxy:null,removeContainer:!0,foreignObjectRendering:!1,useCORS:!1},this.opt.html2canvas);if(delete i.onrendered,e.context2d.autoPaging=void 0===this.opt.autoPaging||this.opt.autoPaging,e.context2d.posX=this.opt.x,e.context2d.posY=this.opt.y,e.context2d.margin=this.opt.margin,e.context2d.fontFaces=r,r)for(var a=0;a<r.length;++a){var o=r[a],s=o.src.find((function(t){return"truetype"===t.format}));s&&e.addFont(s.url,o.ref.name,o.ref.style)}return i.windowHeight=i.windowHeight||0,i.windowHeight=0==i.windowHeight?Math.max(this.prop.container.clientHeight,this.prop.container.scrollHeight,this.prop.container.offsetHeight):i.windowHeight,e.context2d.save(!0),t(this.prop.container,i)})).then((function(t){this.opt.jsPDF.context2d.restore(!0),(this.opt.html2canvas.onrendered||function(){})(t),this.prop.canvas=t,document.body.removeChild(this.prop.overlay)}))},c.prototype.toImg=function(){return this.thenList([function(){return this.prop.canvas||this.toCanvas()}]).then((function(){var t=this.prop.canvas.toDataURL("image/"+this.opt.image.type,this.opt.image.quality);this.prop.img=document.createElement("img"),this.prop.img.src=t}))},c.prototype.toPdf=function(){return this.thenList([function(){return this.toContext2d()}]).then((function(){this.prop.pdf=this.prop.pdf||this.opt.jsPDF}))},c.prototype.output=function(t,e,r){return"img"===(r=r||"pdf").toLowerCase()||"image"===r.toLowerCase()?this.outputImg(t,e):this.outputPdf(t,e)},c.prototype.outputPdf=function(t,e){return this.thenList([function(){return this.prop.pdf||this.toPdf()}]).then((function(){return this.prop.pdf.output(t,e)}))},c.prototype.outputImg=function(t){return this.thenList([function(){return this.prop.img||this.toImg()}]).then((function(){switch(t){case void 0:case"img":return this.prop.img;case"datauristring":case"dataurlstring":return this.prop.img.src;case"datauri":case"dataurl":return document.location.href=this.prop.img.src;default:throw'Image output type "'+t+'" is not supported.'}}))},c.prototype.save=function(t){return this.thenList([function(){return this.prop.pdf||this.toPdf()}]).set(t?{filename:t}:null).then((function(){this.prop.pdf.save(this.opt.filename)}))},c.prototype.doCallback=function(){return this.thenList([function(){return this.prop.pdf||this.toPdf()}]).then((function(){this.prop.callback(this.prop.pdf)}))},c.prototype.set=function(t){if("object"!==o(t))return this;var e=Object.keys(t||{}).map((function(e){if(e in c.template.prop)return function(){this.prop[e]=t[e]};switch(e){case"margin":return this.setMargin.bind(this,t.margin);case"jsPDF":return function(){return this.opt.jsPDF=t.jsPDF,this.setPageSize()};case"pageSize":return this.setPageSize.bind(this,t.pageSize);default:return function(){this.opt[e]=t[e]}}}),this);return this.then((function(){return this.thenList(e)}))},c.prototype.get=function(t,e){return this.then((function(){var r=t in c.template.prop?this.prop[t]:this.opt[t];return e?e(r):r}))},c.prototype.setMargin=function(t){return this.then((function(){switch(o(t)){case"number":t=[t,t,t,t];case"array":if(2===t.length&&(t=[t[0],t[1],t[0],t[1]]),4===t.length)break;default:return this.error("Invalid margin array.")}this.opt.margin=t})).then(this.setPageSize)},c.prototype.setPageSize=function(t){function e(t,e){return Math.floor(t*e/72*96)}return this.then((function(){(t=t||M.getPageSize(this.opt.jsPDF)).hasOwnProperty("inner")||(t.inner={width:t.width-this.opt.margin[1]-this.opt.margin[3],height:t.height-this.opt.margin[0]-this.opt.margin[2]},t.inner.px={width:e(t.inner.width,t.k),height:e(t.inner.height,t.k)},t.inner.ratio=t.inner.height/t.inner.width),this.prop.pageSize=t}))},c.prototype.setProgress=function(t,e,r,n){return null!=t&&(this.progress.val=t),null!=e&&(this.progress.state=e),null!=r&&(this.progress.n=r),null!=n&&(this.progress.stack=n),this.progress.ratio=this.progress.val/this.progress.state,this},c.prototype.updateProgress=function(t,e,r,n){return this.setProgress(t?this.progress.val+t:null,e||null,r?this.progress.n+r:null,n?this.progress.stack.concat(n):null)},c.prototype.then=function(t,e){var r=this;return this.thenCore(t,e,(function(t,e){return r.updateProgress(null,null,1,[t]),Promise.prototype.then.call(this,(function(e){return r.updateProgress(null,t),e})).then(t,e).then((function(t){return r.updateProgress(1),t}))}))},c.prototype.thenCore=function(t,e,r){r=r||Promise.prototype.then;t&&(t=t.bind(this)),e&&(e=e.bind(this));var n=-1!==Promise.toString().indexOf("[native code]")&&"Promise"===Promise.name?this:c.convert(Object.assign({},this),Promise.prototype),i=r.call(n,t,e);return c.convert(i,this.__proto__)},c.prototype.thenExternal=function(t,e){return Promise.prototype.then.call(this,t,e)},c.prototype.thenList=function(t){var e=this;return t.forEach((function(t){e=e.thenCore(t)})),e},c.prototype.catch=function(t){t&&(t=t.bind(this));var e=Promise.prototype.catch.call(this,t);return c.convert(e,this)},c.prototype.catchExternal=function(t){return Promise.prototype.catch.call(this,t)},c.prototype.error=function(t){return this.then((function(){throw new Error(t)}))},c.prototype.using=c.prototype.set,c.prototype.saveAs=c.prototype.save,c.prototype.export=c.prototype.output,c.prototype.run=c.prototype.then,M.getPageSize=function(t,r,n){if("object"===e(t)){var i=t;t=i.orientation,r=i.unit||r,n=i.format||n}r=r||"mm",n=n||"a4",t=(""+(t||"P")).toLowerCase();var a,o=(""+n).toLowerCase(),s={a0:[2383.94,3370.39],a1:[1683.78,2383.94],a2:[1190.55,1683.78],a3:[841.89,1190.55],a4:[595.28,841.89],a5:[419.53,595.28],a6:[297.64,419.53],a7:[209.76,297.64],a8:[147.4,209.76],a9:[104.88,147.4],a10:[73.7,104.88],b0:[2834.65,4008.19],b1:[2004.09,2834.65],b2:[1417.32,2004.09],b3:[1000.63,1417.32],b4:[708.66,1000.63],b5:[498.9,708.66],b6:[354.33,498.9],b7:[249.45,354.33],b8:[175.75,249.45],b9:[124.72,175.75],b10:[87.87,124.72],c0:[2599.37,3676.54],c1:[1836.85,2599.37],c2:[1298.27,1836.85],c3:[918.43,1298.27],c4:[649.13,918.43],c5:[459.21,649.13],c6:[323.15,459.21],c7:[229.61,323.15],c8:[161.57,229.61],c9:[113.39,161.57],c10:[79.37,113.39],dl:[311.81,623.62],letter:[612,792],"government-letter":[576,756],legal:[612,1008],"junior-legal":[576,360],ledger:[1224,792],tabloid:[792,1224],"credit-card":[153,243]};switch(r){case"pt":a=1;break;case"mm":a=72/25.4;break;case"cm":a=72/2.54;break;case"in":a=72;break;case"px":a=.75;break;case"pc":case"em":a=12;break;case"ex":a=6;break;default:throw"Invalid unit: "+r}var c,u=0,l=0;if(s.hasOwnProperty(o))u=s[o][1]/a,l=s[o][0]/a;else try{u=n[1],l=n[0]}catch(t){throw new Error("Invalid format: "+n)}if("p"===t||"portrait"===t)t="p",l>u&&(c=l,l=u,u=c);else{if("l"!==t&&"landscape"!==t)throw"Invalid orientation: "+t;t="l",u>l&&(c=l,l=u,u=c)}return{width:l,height:u,unit:r,k:a,orientation:t}},n.html=function(t,e){(e=e||{}).callback=e.callback||function(){},e.html2canvas=e.html2canvas||{},e.html2canvas.canvas=e.html2canvas.canvas||this.canvas,e.jsPDF=e.jsPDF||this,e.fontFaces=e.fontFaces?e.fontFaces.map(Ct):null;var r=new c(e);return e.worker?r:r.from(t).doCallback()}}(M.API), +/** + * @license + * ==================================================================== + * Copyright (c) 2013 Youssef Beddad, youssef.beddad@gmail.com + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * ==================================================================== + */ +function(t){var e,r,n;t.addJS=function(t){return n=t,this.internal.events.subscribe("postPutResources",(function(){e=this.internal.newObject(),this.internal.out("<<"),this.internal.out("/Names [(EmbeddedJS) "+(e+1)+" 0 R]"),this.internal.out(">>"),this.internal.out("endobj"),r=this.internal.newObject(),this.internal.out("<<"),this.internal.out("/S /JavaScript"),this.internal.out("/JS ("+n+")"),this.internal.out(">>"),this.internal.out("endobj")})),this.internal.events.subscribe("putCatalog",(function(){void 0!==e&&void 0!==r&&this.internal.out("/Names <</JavaScript "+e+" 0 R>>")})),this}}(M.API), +/** + * @license + * Copyright (c) 2014 Steven Spungin (TwelveTone LLC) steven@twelvetone.tv + * + * Licensed under the MIT License. + * http://opensource.org/licenses/mit-license + */ +function(t){var e;t.events.push(["postPutResources",function(){var t=this,r=/^(\d+) 0 obj$/;if(this.outline.root.children.length>0)for(var n=t.outline.render().split(/\r\n/),i=0;i<n.length;i++){var a=n[i],o=r.exec(a);if(null!=o){var s=o[1];t.internal.newObjectDeferredBegin(s,!1)}t.internal.write(a)}if(this.outline.createNamedDestinations){var c=this.internal.pages.length,u=[];for(i=0;i<c;i++){var l=t.internal.newObject();u.push(l);var h=t.internal.getPageInfo(i+1);t.internal.write("<< /D["+h.objId+" 0 R /XYZ null null null]>> endobj")}var f=t.internal.newObject();t.internal.write("<< /Names [ ");for(i=0;i<u.length;i++)t.internal.write("(page_"+(i+1)+")"+u[i]+" 0 R");t.internal.write(" ] >>","endobj"),e=t.internal.newObject(),t.internal.write("<< /Dests "+f+" 0 R"),t.internal.write(">>","endobj")}}]),t.events.push(["putCatalog",function(){this.outline.root.children.length>0&&(this.internal.write("/Outlines",this.outline.makeRef(this.outline.root)),this.outline.createNamedDestinations&&this.internal.write("/Names "+e+" 0 R"))}]),t.events.push(["initialized",function(){var t=this;t.outline={createNamedDestinations:!1,root:{children:[]}},t.outline.add=function(t,e,r){var n={title:e,options:r,children:[]};return null==t&&(t=this.root),t.children.push(n),n},t.outline.render=function(){return this.ctx={},this.ctx.val="",this.ctx.pdf=t,this.genIds_r(this.root),this.renderRoot(this.root),this.renderItems(this.root),this.ctx.val},t.outline.genIds_r=function(e){e.id=t.internal.newObjectDeferred();for(var r=0;r<e.children.length;r++)this.genIds_r(e.children[r])},t.outline.renderRoot=function(t){this.objStart(t),this.line("/Type /Outlines"),t.children.length>0&&(this.line("/First "+this.makeRef(t.children[0])),this.line("/Last "+this.makeRef(t.children[t.children.length-1]))),this.line("/Count "+this.count_r({count:0},t)),this.objEnd()},t.outline.renderItems=function(e){for(var r=this.ctx.pdf.internal.getVerticalCoordinateString,n=0;n<e.children.length;n++){var i=e.children[n];this.objStart(i),this.line("/Title "+this.makeString(i.title)),this.line("/Parent "+this.makeRef(e)),n>0&&this.line("/Prev "+this.makeRef(e.children[n-1])),n<e.children.length-1&&this.line("/Next "+this.makeRef(e.children[n+1])),i.children.length>0&&(this.line("/First "+this.makeRef(i.children[0])),this.line("/Last "+this.makeRef(i.children[i.children.length-1])));var a=this.count=this.count_r({count:0},i);if(a>0&&this.line("/Count "+a),i.options&&i.options.pageNumber){var o=t.internal.getPageInfo(i.options.pageNumber);this.line("/Dest ["+o.objId+" 0 R /XYZ 0 "+r(0)+" 0]")}this.objEnd()}for(var s=0;s<e.children.length;s++)this.renderItems(e.children[s])},t.outline.line=function(t){this.ctx.val+=t+"\r\n"},t.outline.makeRef=function(t){return t.id+" 0 R"},t.outline.makeString=function(e){return"("+t.internal.pdfEscape(e)+")"},t.outline.objStart=function(t){this.ctx.val+="\r\n"+t.id+" 0 obj\r\n<<\r\n"},t.outline.objEnd=function(){this.ctx.val+=">> \r\nendobj\r\n"},t.outline.count_r=function(t,e){for(var r=0;r<e.children.length;r++)t.count++,this.count_r(t,e.children[r]);return t.count}}])}(M.API), +/** + * @license + * + * Licensed under the MIT License. + * http://opensource.org/licenses/mit-license + */ +function(t){var e=[192,193,194,195,196,197,198,199];t.processJPEG=function(t,r,n,i,a,o){var s,c=this.decode.DCT_DECODE,u=null;if("string"==typeof t||this.__addimage__.isArrayBuffer(t)||this.__addimage__.isArrayBufferView(t)){switch(t=a||t,t=this.__addimage__.isArrayBuffer(t)?new Uint8Array(t):t,(s=function(t){for(var r,n=256*t.charCodeAt(4)+t.charCodeAt(5),i=t.length,a={width:0,height:0,numcomponents:1},o=4;o<i;o+=2){if(o+=n,-1!==e.indexOf(t.charCodeAt(o+1))){r=256*t.charCodeAt(o+5)+t.charCodeAt(o+6),a={width:256*t.charCodeAt(o+7)+t.charCodeAt(o+8),height:r,numcomponents:t.charCodeAt(o+9)};break}n=256*t.charCodeAt(o+2)+t.charCodeAt(o+3)}return a}(t=this.__addimage__.isArrayBufferView(t)?this.__addimage__.arrayBufferToBinaryString(t):t)).numcomponents){case 1:o=this.color_spaces.DEVICE_GRAY;break;case 4:o=this.color_spaces.DEVICE_CMYK;break;case 3:o=this.color_spaces.DEVICE_RGB}u={data:t,width:s.width,height:s.height,colorSpace:o,bitsPerComponent:8,filter:c,index:r,alias:n}}return u}}(M.API);var ke,Fe,Ie,Ce,je,Oe=function(){var t,e,n;function i(t){var e,r,n,i,a,o,s,c,u,l,h,f,d,p;for(this.data=t,this.pos=8,this.palette=[],this.imgData=[],this.transparency={},this.animation=null,this.text={},o=null;;){switch(e=this.readUInt32(),u=function(){var t,e;for(e=[],t=0;t<4;++t)e.push(String.fromCharCode(this.data[this.pos++]));return e}.call(this).join("")){case"IHDR":this.width=this.readUInt32(),this.height=this.readUInt32(),this.bits=this.data[this.pos++],this.colorType=this.data[this.pos++],this.compressionMethod=this.data[this.pos++],this.filterMethod=this.data[this.pos++],this.interlaceMethod=this.data[this.pos++];break;case"acTL":this.animation={numFrames:this.readUInt32(),numPlays:this.readUInt32()||1/0,frames:[]};break;case"PLTE":this.palette=this.read(e);break;case"fcTL":o&&this.animation.frames.push(o),this.pos+=4,o={width:this.readUInt32(),height:this.readUInt32(),xOffset:this.readUInt32(),yOffset:this.readUInt32()},a=this.readUInt16(),i=this.readUInt16()||100,o.delay=1e3*a/i,o.disposeOp=this.data[this.pos++],o.blendOp=this.data[this.pos++],o.data=[];break;case"IDAT":case"fdAT":for("fdAT"===u&&(this.pos+=4,e-=4),t=(null!=o?o.data:void 0)||this.imgData,f=0;0<=e?f<e:f>e;0<=e?++f:--f)t.push(this.data[this.pos++]);break;case"tRNS":switch(this.transparency={},this.colorType){case 3:if(n=this.palette.length/3,this.transparency.indexed=this.read(e),this.transparency.indexed.length>n)throw new Error("More transparent colors than palette size");if((l=n-this.transparency.indexed.length)>0)for(d=0;0<=l?d<l:d>l;0<=l?++d:--d)this.transparency.indexed.push(255);break;case 0:this.transparency.grayscale=this.read(e)[0];break;case 2:this.transparency.rgb=this.read(e)}break;case"tEXt":s=(h=this.read(e)).indexOf(0),c=String.fromCharCode.apply(String,h.slice(0,s)),this.text[c]=String.fromCharCode.apply(String,h.slice(s+1));break;case"IEND":return o&&this.animation.frames.push(o),this.colors=function(){switch(this.colorType){case 0:case 3:case 4:return 1;case 2:case 6:return 3}}.call(this),this.hasAlphaChannel=4===(p=this.colorType)||6===p,r=this.colors+(this.hasAlphaChannel?1:0),this.pixelBitlength=this.bits*r,this.colorSpace=function(){switch(this.colors){case 1:return"DeviceGray";case 3:return"DeviceRGB"}}.call(this),void(this.imgData=new Uint8Array(this.imgData));default:this.pos+=e}if(this.pos+=4,this.pos>this.data.length)throw new Error("Incomplete or corrupt PNG file")}}i.prototype.read=function(t){var e,r;for(r=[],e=0;0<=t?e<t:e>t;0<=t?++e:--e)r.push(this.data[this.pos++]);return r},i.prototype.readUInt32=function(){return this.data[this.pos++]<<24|this.data[this.pos++]<<16|this.data[this.pos++]<<8|this.data[this.pos++]},i.prototype.readUInt16=function(){return this.data[this.pos++]<<8|this.data[this.pos++]},i.prototype.decodePixels=function(t){var e=this.pixelBitlength/8,r=new Uint8Array(this.width*this.height*e),n=0,i=this;if(null==t&&(t=this.imgData),0===t.length)return new Uint8Array(0);function a(a,o,s,c){var u,l,h,f,d,p,g,m,v,b,y,w,N,L,A,x,S,_,P,k,F,I=Math.ceil((i.width-a)/s),C=Math.ceil((i.height-o)/c),j=i.width==I&&i.height==C;for(L=e*I,w=j?r:new Uint8Array(L*C),p=t.length,N=0,l=0;N<C&&n<p;){switch(t[n++]){case 0:for(f=S=0;S<L;f=S+=1)w[l++]=t[n++];break;case 1:for(f=_=0;_<L;f=_+=1)u=t[n++],d=f<e?0:w[l-e],w[l++]=(u+d)%256;break;case 2:for(f=P=0;P<L;f=P+=1)u=t[n++],h=(f-f%e)/e,A=N&&w[(N-1)*L+h*e+f%e],w[l++]=(A+u)%256;break;case 3:for(f=k=0;k<L;f=k+=1)u=t[n++],h=(f-f%e)/e,d=f<e?0:w[l-e],A=N&&w[(N-1)*L+h*e+f%e],w[l++]=(u+Math.floor((d+A)/2))%256;break;case 4:for(f=F=0;F<L;f=F+=1)u=t[n++],h=(f-f%e)/e,d=f<e?0:w[l-e],0===N?A=x=0:(A=w[(N-1)*L+h*e+f%e],x=h&&w[(N-1)*L+(h-1)*e+f%e]),g=d+A-x,m=Math.abs(g-d),b=Math.abs(g-A),y=Math.abs(g-x),v=m<=b&&m<=y?d:b<=y?A:x,w[l++]=(u+v)%256;break;default:throw new Error("Invalid filter algorithm: "+t[n-1])}if(!j){var O=((o+N*c)*i.width+a)*e,B=N*L;for(f=0;f<I;f+=1){for(var M=0;M<e;M+=1)r[O++]=w[B++];O+=(s-1)*e}}N++}}return t=Pe(t),1==i.interlaceMethod?(a(0,0,8,8),a(4,0,8,8),a(0,4,4,8),a(2,0,4,4),a(0,2,2,4),a(1,0,2,2),a(0,1,1,2)):a(0,0,1,1),r},i.prototype.decodePalette=function(){var t,e,r,n,i,a,o,s,c;for(r=this.palette,a=this.transparency.indexed||[],i=new Uint8Array((a.length||0)+r.length),n=0,t=0,e=o=0,s=r.length;o<s;e=o+=3)i[n++]=r[e],i[n++]=r[e+1],i[n++]=r[e+2],i[n++]=null!=(c=a[t++])?c:255;return i},i.prototype.copyToImageData=function(t,e){var r,n,i,a,o,s,c,u,l,h,f;if(n=this.colors,l=null,r=this.hasAlphaChannel,this.palette.length&&(l=null!=(f=this._decodedPalette)?f:this._decodedPalette=this.decodePalette(),n=4,r=!0),u=(i=t.data||t).length,o=l||e,a=s=0,1===n)for(;a<u;)c=l?4*e[a/4]:s,h=o[c++],i[a++]=h,i[a++]=h,i[a++]=h,i[a++]=r?o[c++]:255,s=c;else for(;a<u;)c=l?4*e[a/4]:s,i[a++]=o[c++],i[a++]=o[c++],i[a++]=o[c++],i[a++]=r?o[c++]:255,s=c},i.prototype.decode=function(){var t;return t=new Uint8Array(this.width*this.height*4),this.copyToImageData(t,this.decodePixels()),t};var a=function(){if("[object Window]"===Object.prototype.toString.call(r)){try{e=r.document.createElement("canvas"),n=e.getContext("2d")}catch(t){return!1}return!0}return!1};return a(),t=function(t){var r;if(!0===a())return n.width=t.width,n.height=t.height,n.clearRect(0,0,t.width,t.height),n.putImageData(t,0,0),(r=new Image).src=e.toDataURL(),r;throw new Error("This method requires a Browser with Canvas-capability.")},i.prototype.decodeFrames=function(e){var r,n,i,a,o,s,c,u;if(this.animation){for(u=[],n=o=0,s=(c=this.animation.frames).length;o<s;n=++o)r=c[n],i=e.createImageData(r.width,r.height),a=this.decodePixels(new Uint8Array(r.data)),this.copyToImageData(i,a),r.imageData=i,u.push(r.image=t(i));return u}},i.prototype.renderFrame=function(t,e){var r,n,i;return r=(n=this.animation.frames)[e],i=n[e-1],0===e&&t.clearRect(0,0,this.width,this.height),1===(null!=i?i.disposeOp:void 0)?t.clearRect(i.xOffset,i.yOffset,i.width,i.height):2===(null!=i?i.disposeOp:void 0)&&t.putImageData(i.imageData,i.xOffset,i.yOffset),0===r.blendOp&&t.clearRect(r.xOffset,r.yOffset,r.width,r.height),t.drawImage(r.image,r.xOffset,r.yOffset)},i.prototype.animate=function(t){var e,r,n,i,a,o,s=this;return r=0,o=this.animation,i=o.numFrames,n=o.frames,a=o.numPlays,(e=function(){var o,c;if(o=r++%i,c=n[o],s.renderFrame(t,o),i>1&&r/i<a)return s.animation._timeout=setTimeout(e,c.delay)})()},i.prototype.stopAnimation=function(){var t;return clearTimeout(null!=(t=this.animation)?t._timeout:void 0)},i.prototype.render=function(t){var e,r;return t._png&&t._png.stopAnimation(),t._png=this,t.width=this.width,t.height=this.height,e=t.getContext("2d"),this.animation?(this.decodeFrames(e),this.animate(e)):(r=e.createImageData(this.width,this.height),this.copyToImageData(r,this.decodePixels()),e.putImageData(r,0,0))},i}(); +/** + * @license + * + * Copyright (c) 2014 James Robb, https://github.com/jamesbrobb + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * ==================================================================== + */ +/** + * @license + * (c) Dean McNamee <dean@gmail.com>, 2013. + * + * https://github.com/deanm/omggif + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * omggif is a JavaScript implementation of a GIF 89a encoder and decoder, + * including animation and compression. It does not rely on any specific + * underlying system, so should run in the browser, Node, or Plask. + */ +function Be(t){var e=0;if(71!==t[e++]||73!==t[e++]||70!==t[e++]||56!==t[e++]||56!=(t[e++]+1&253)||97!==t[e++])throw new Error("Invalid GIF 87a/89a header.");var r=t[e++]|t[e++]<<8,n=t[e++]|t[e++]<<8,i=t[e++],a=i>>7,o=1<<(7&i)+1;t[e++];t[e++];var s=null,c=null;a&&(s=e,c=o,e+=3*o);var u=!0,l=[],h=0,f=null,d=0,p=null;for(this.width=r,this.height=n;u&&e<t.length;)switch(t[e++]){case 33:switch(t[e++]){case 255:if(11!==t[e]||78==t[e+1]&&69==t[e+2]&&84==t[e+3]&&83==t[e+4]&&67==t[e+5]&&65==t[e+6]&&80==t[e+7]&&69==t[e+8]&&50==t[e+9]&&46==t[e+10]&&48==t[e+11]&&3==t[e+12]&&1==t[e+13]&&0==t[e+16])e+=14,p=t[e++]|t[e++]<<8,e++;else for(e+=12;;){if(!((P=t[e++])>=0))throw Error("Invalid block size");if(0===P)break;e+=P}break;case 249:if(4!==t[e++]||0!==t[e+4])throw new Error("Invalid graphics extension block.");var g=t[e++];h=t[e++]|t[e++]<<8,f=t[e++],0==(1&g)&&(f=null),d=g>>2&7,e++;break;case 254:for(;;){if(!((P=t[e++])>=0))throw Error("Invalid block size");if(0===P)break;e+=P}break;default:throw new Error("Unknown graphic control label: 0x"+t[e-1].toString(16))}break;case 44:var m=t[e++]|t[e++]<<8,v=t[e++]|t[e++]<<8,b=t[e++]|t[e++]<<8,y=t[e++]|t[e++]<<8,w=t[e++],N=w>>6&1,L=1<<(7&w)+1,A=s,x=c,S=!1;if(w>>7){S=!0;A=e,x=L,e+=3*L}var _=e;for(e++;;){var P;if(!((P=t[e++])>=0))throw Error("Invalid block size");if(0===P)break;e+=P}l.push({x:m,y:v,width:b,height:y,has_local_palette:S,palette_offset:A,palette_size:x,data_offset:_,data_length:e-_,transparent_index:f,interlaced:!!N,delay:h,disposal:d});break;case 59:u=!1;break;default:throw new Error("Unknown gif block: 0x"+t[e-1].toString(16))}this.numFrames=function(){return l.length},this.loopCount=function(){return p},this.frameInfo=function(t){if(t<0||t>=l.length)throw new Error("Frame index out of range.");return l[t]},this.decodeAndBlitFrameBGRA=function(e,n){var i=this.frameInfo(e),a=i.width*i.height,o=new Uint8Array(a);Me(t,i.data_offset,o,a);var s=i.palette_offset,c=i.transparent_index;null===c&&(c=256);var u=i.width,l=r-u,h=u,f=4*(i.y*r+i.x),d=4*((i.y+i.height)*r+i.x),p=f,g=4*l;!0===i.interlaced&&(g+=4*r*7);for(var m=8,v=0,b=o.length;v<b;++v){var y=o[v];if(0===h&&(h=u,(p+=g)>=d&&(g=4*l+4*r*(m-1),p=f+(u+l)*(m<<1),m>>=1)),y===c)p+=4;else{var w=t[s+3*y],N=t[s+3*y+1],L=t[s+3*y+2];n[p++]=L,n[p++]=N,n[p++]=w,n[p++]=255}--h}},this.decodeAndBlitFrameRGBA=function(e,n){var i=this.frameInfo(e),a=i.width*i.height,o=new Uint8Array(a);Me(t,i.data_offset,o,a);var s=i.palette_offset,c=i.transparent_index;null===c&&(c=256);var u=i.width,l=r-u,h=u,f=4*(i.y*r+i.x),d=4*((i.y+i.height)*r+i.x),p=f,g=4*l;!0===i.interlaced&&(g+=4*r*7);for(var m=8,v=0,b=o.length;v<b;++v){var y=o[v];if(0===h&&(h=u,(p+=g)>=d&&(g=4*l+4*r*(m-1),p=f+(u+l)*(m<<1),m>>=1)),y===c)p+=4;else{var w=t[s+3*y],N=t[s+3*y+1],L=t[s+3*y+2];n[p++]=w,n[p++]=N,n[p++]=L,n[p++]=255}--h}}}function Me(t,e,r,n){for(var a=t[e++],o=1<<a,s=o+1,c=s+1,u=a+1,l=(1<<u)-1,h=0,f=0,d=0,p=t[e++],g=new Int32Array(4096),m=null;;){for(;h<16&&0!==p;)f|=t[e++]<<h,h+=8,1===p?p=t[e++]:--p;if(h<u)break;var v=f&l;if(f>>=u,h-=u,v!==o){if(v===s)break;for(var b=v<c?v:m,y=0,w=b;w>o;)w=g[w]>>8,++y;var N=w;if(d+y+(b!==v?1:0)>n)return void i.log("Warning, gif stream longer than expected.");r[d++]=N;var L=d+=y;for(b!==v&&(r[d++]=N),w=b;y--;)w=g[w],r[--L]=255&w,w>>=8;null!==m&&c<4096&&(g[c++]=m<<8|N,c>=l+1&&u<12&&(++u,l=l<<1|1)),m=v}else c=s+1,l=(1<<(u=a+1))-1,m=null}return d!==n&&i.log("Warning, gif stream shorter than expected."),r} +/** + * @license + Copyright (c) 2008, Adobe Systems Incorporated + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of Adobe Systems Incorporated nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */function Ee(t){var e,r,n,i,a,o=Math.floor,s=new Array(64),c=new Array(64),u=new Array(64),l=new Array(64),h=new Array(65535),f=new Array(65535),d=new Array(64),p=new Array(64),g=[],m=0,v=7,b=new Array(64),y=new Array(64),w=new Array(64),N=new Array(256),L=new Array(2048),A=[0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18,24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63],x=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0],S=[0,1,2,3,4,5,6,7,8,9,10,11],_=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125],P=[1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193,21,82,209,240,36,51,98,114,130,9,10,22,23,24,25,26,37,38,39,40,41,42,52,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,225,226,227,228,229,230,231,232,233,234,241,242,243,244,245,246,247,248,249,250],k=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0],F=[0,1,2,3,4,5,6,7,8,9,10,11],I=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119],C=[0,1,2,3,17,4,5,33,49,6,18,65,81,7,97,113,19,34,50,129,8,20,66,145,161,177,193,9,35,51,82,240,21,98,114,209,10,22,36,52,225,37,241,23,24,25,26,38,39,40,41,42,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,130,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,226,227,228,229,230,231,232,233,234,242,243,244,245,246,247,248,249,250];function j(t,e){for(var r=0,n=0,i=new Array,a=1;a<=16;a++){for(var o=1;o<=t[a];o++)i[e[n]]=[],i[e[n]][0]=r,i[e[n]][1]=a,n++,r++;r*=2}return i}function O(t){for(var e=t[0],r=t[1]-1;r>=0;)e&1<<r&&(m|=1<<v),r--,--v<0&&(255==m?(B(255),B(0)):B(m),v=7,m=0)}function B(t){g.push(t)}function M(t){B(t>>8&255),B(255&t)}function E(t,e,r,n,i){for(var a,o=i[0],s=i[240],c=function(t,e){var r,n,i,a,o,s,c,u,l,h,f=0;for(l=0;l<8;++l){r=t[f],n=t[f+1],i=t[f+2],a=t[f+3],o=t[f+4],s=t[f+5],c=t[f+6];var p=r+(u=t[f+7]),g=r-u,m=n+c,v=n-c,b=i+s,y=i-s,w=a+o,N=a-o,L=p+w,A=p-w,x=m+b,S=m-b;t[f]=L+x,t[f+4]=L-x;var _=.707106781*(S+A);t[f+2]=A+_,t[f+6]=A-_;var P=.382683433*((L=N+y)-(S=v+g)),k=.5411961*L+P,F=1.306562965*S+P,I=.707106781*(x=y+v),C=g+I,j=g-I;t[f+5]=j+k,t[f+3]=j-k,t[f+1]=C+F,t[f+7]=C-F,f+=8}for(f=0,l=0;l<8;++l){r=t[f],n=t[f+8],i=t[f+16],a=t[f+24],o=t[f+32],s=t[f+40],c=t[f+48];var O=r+(u=t[f+56]),B=r-u,M=n+c,E=n-c,q=i+s,D=i-s,R=a+o,T=a-o,U=O+R,z=O-R,H=M+q,W=M-q;t[f]=U+H,t[f+32]=U-H;var V=.707106781*(W+z);t[f+16]=z+V,t[f+48]=z-V;var G=.382683433*((U=T+D)-(W=E+B)),Y=.5411961*U+G,J=1.306562965*W+G,X=.707106781*(H=D+E),K=B+X,Z=B-X;t[f+40]=Z+Y,t[f+24]=Z-Y,t[f+8]=K+J,t[f+56]=K-J,f++}for(l=0;l<64;++l)h=t[l]*e[l],d[l]=h>0?h+.5|0:h-.5|0;return d}(t,e),u=0;u<64;++u)p[A[u]]=c[u];var l=p[0]-r;r=p[0],0==l?O(n[0]):(O(n[f[a=32767+l]]),O(h[a]));for(var g=63;g>0&&0==p[g];)g--;if(0==g)return O(o),r;for(var m,v=1;v<=g;){for(var b=v;0==p[v]&&v<=g;)++v;var y=v-b;if(y>=16){m=y>>4;for(var w=1;w<=m;++w)O(s);y&=15}a=32767+p[v],O(i[(y<<4)+f[a]]),O(h[a]),v++}return 63!=g&&O(o),r}function q(t){(t=Math.min(Math.max(t,1),100),a!=t)&&(!function(t){for(var e=[16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99],r=0;r<64;r++){var n=o((e[r]*t+50)/100);n=Math.min(Math.max(n,1),255),s[A[r]]=n}for(var i=[17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99],a=0;a<64;a++){var h=o((i[a]*t+50)/100);h=Math.min(Math.max(h,1),255),c[A[a]]=h}for(var f=[1,1.387039845,1.306562965,1.175875602,1,.785694958,.5411961,.275899379],d=0,p=0;p<8;p++)for(var g=0;g<8;g++)u[d]=1/(s[A[d]]*f[p]*f[g]*8),l[d]=1/(c[A[d]]*f[p]*f[g]*8),d++}(t<50?Math.floor(5e3/t):Math.floor(200-2*t)),a=t)}this.encode=function(t,a){a&&q(a),g=new Array,m=0,v=7,M(65496),M(65504),M(16),B(74),B(70),B(73),B(70),B(0),B(1),B(1),B(0),M(1),M(1),B(0),B(0),function(){M(65499),M(132),B(0);for(var t=0;t<64;t++)B(s[t]);B(1);for(var e=0;e<64;e++)B(c[e])}(),function(t,e){M(65472),M(17),B(8),M(e),M(t),B(3),B(1),B(17),B(0),B(2),B(17),B(1),B(3),B(17),B(1)}(t.width,t.height),function(){M(65476),M(418),B(0);for(var t=0;t<16;t++)B(x[t+1]);for(var e=0;e<=11;e++)B(S[e]);B(16);for(var r=0;r<16;r++)B(_[r+1]);for(var n=0;n<=161;n++)B(P[n]);B(1);for(var i=0;i<16;i++)B(k[i+1]);for(var a=0;a<=11;a++)B(F[a]);B(17);for(var o=0;o<16;o++)B(I[o+1]);for(var s=0;s<=161;s++)B(C[s])}(),M(65498),M(12),B(3),B(1),B(0),B(2),B(17),B(3),B(17),B(0),B(63),B(0);var o=0,h=0,f=0;m=0,v=7,this.encode.displayName="_encode_";for(var d,p,N,A,j,D,R,T,U,z=t.data,H=t.width,W=t.height,V=4*H,G=0;G<W;){for(d=0;d<V;){for(j=V*G+d,R=-1,T=0,U=0;U<64;U++)D=j+(T=U>>3)*V+(R=4*(7&U)),G+T>=W&&(D-=V*(G+1+T-W)),d+R>=V&&(D-=d+R-V+4),p=z[D++],N=z[D++],A=z[D++],b[U]=(L[p]+L[N+256>>0]+L[A+512>>0]>>16)-128,y[U]=(L[p+768>>0]+L[N+1024>>0]+L[A+1280>>0]>>16)-128,w[U]=(L[p+1280>>0]+L[N+1536>>0]+L[A+1792>>0]>>16)-128;o=E(b,u,o,e,n),h=E(y,l,h,r,i),f=E(w,l,f,r,i),d+=32}G+=8}if(v>=0){var Y=[];Y[1]=v+1,Y[0]=(1<<v+1)-1,O(Y)}return M(65497),new Uint8Array(g)},t=t||50,function(){for(var t=String.fromCharCode,e=0;e<256;e++)N[e]=t(e)}(),e=j(x,S),r=j(k,F),n=j(_,P),i=j(I,C),function(){for(var t=1,e=2,r=1;r<=15;r++){for(var n=t;n<e;n++)f[32767+n]=r,h[32767+n]=[],h[32767+n][1]=r,h[32767+n][0]=n;for(var i=-(e-1);i<=-t;i++)f[32767+i]=r,h[32767+i]=[],h[32767+i][1]=r,h[32767+i][0]=e-1+i;t<<=1,e<<=1}}(),function(){for(var t=0;t<256;t++)L[t]=19595*t,L[t+256>>0]=38470*t,L[t+512>>0]=7471*t+32768,L[t+768>>0]=-11059*t,L[t+1024>>0]=-21709*t,L[t+1280>>0]=32768*t+8421375,L[t+1536>>0]=-27439*t,L[t+1792>>0]=-5329*t}(),q(t)} +/** + * @license + * Copyright (c) 2017 Aras Abbasi + * + * Licensed under the MIT License. + * http://opensource.org/licenses/mit-license + */function qe(t,e){if(this.pos=0,this.buffer=t,this.datav=new DataView(t.buffer),this.is_with_alpha=!!e,this.bottom_up=!0,this.flag=String.fromCharCode(this.buffer[0])+String.fromCharCode(this.buffer[1]),this.pos+=2,-1===["BM","BA","CI","CP","IC","PT"].indexOf(this.flag))throw new Error("Invalid BMP File");this.parseHeader(),this.parseBGR()}function De(t){function e(t){if(!t)throw Error("assert :P")}function r(t,e,r){for(var n=0;4>n;n++)if(t[e+n]!=r.charCodeAt(n))return!0;return!1}function n(t,e,r,n,i){for(var a=0;a<i;a++)t[e+a]=r[n+a]}function i(t,e,r,n){for(var i=0;i<n;i++)t[e+i]=r}function a(t){return new Int32Array(t)}function o(t,e){for(var r=[],n=0;n<t;n++)r.push(new e);return r}function s(t,e){var r=[];return function t(r,n,i){for(var a=i[n],o=0;o<a&&(r.push(i.length>n+1?[]:new e),!(i.length<n+1));o++)t(r[o],n+1,i)}(r,0,t),r}var c=function(){var t=this;function c(t,e){for(var r=1<<e-1>>>0;t&r;)r>>>=1;return r?(t&r-1)+r:t}function u(t,r,n,i,a){e(!(i%n));do{t[r+(i-=n)]=a}while(0<i)}function l(t,r,n,i,o){if(e(2328>=o),512>=o)var s=a(512);else if(null==(s=a(o)))return 0;return function(t,r,n,i,o,s){var l,f,d=r,p=1<<n,g=a(16),m=a(16);for(e(0!=o),e(null!=i),e(null!=t),e(0<n),f=0;f<o;++f){if(15<i[f])return 0;++g[i[f]]}if(g[0]==o)return 0;for(m[1]=0,l=1;15>l;++l){if(g[l]>1<<l)return 0;m[l+1]=m[l]+g[l]}for(f=0;f<o;++f)l=i[f],0<i[f]&&(s[m[l]++]=f);if(1==m[15])return(i=new h).g=0,i.value=s[0],u(t,d,1,p,i),p;var v,b=-1,y=p-1,w=0,N=1,L=1,A=1<<n;for(f=0,l=1,o=2;l<=n;++l,o<<=1){if(N+=L<<=1,0>(L-=g[l]))return 0;for(;0<g[l];--g[l])(i=new h).g=l,i.value=s[f++],u(t,d+w,o,A,i),w=c(w,l)}for(l=n+1,o=2;15>=l;++l,o<<=1){if(N+=L<<=1,0>(L-=g[l]))return 0;for(;0<g[l];--g[l]){if(i=new h,(w&y)!=b){for(d+=A,v=1<<(b=l)-n;15>b&&!(0>=(v-=g[b]));)++b,v<<=1;p+=A=1<<(v=b-n),t[r+(b=w&y)].g=v+n,t[r+b].value=d-r-b}i.g=l-n,i.value=s[f++],u(t,d+(w>>n),o,A,i),w=c(w,l)}}return N!=2*m[15]-1?0:p}(t,r,n,i,o,s)}function h(){this.value=this.g=0}function f(){this.value=this.g=0}function d(){this.G=o(5,h),this.H=a(5),this.jc=this.Qb=this.qb=this.nd=0,this.pd=o(Dr,f)}function p(t,r,n,i){e(null!=t),e(null!=r),e(2147483648>i),t.Ca=254,t.I=0,t.b=-8,t.Ka=0,t.oa=r,t.pa=n,t.Jd=r,t.Yc=n+i,t.Zc=4<=i?n+i-4+1:n,_(t)}function g(t,e){for(var r=0;0<e--;)r|=k(t,128)<<e;return r}function m(t,e){var r=g(t,e);return P(t)?-r:r}function v(t,r,n,i){var a,o=0;for(e(null!=t),e(null!=r),e(4294967288>i),t.Sb=i,t.Ra=0,t.u=0,t.h=0,4<i&&(i=4),a=0;a<i;++a)o+=r[n+a]<<8*a;t.Ra=o,t.bb=i,t.oa=r,t.pa=n}function b(t){for(;8<=t.u&&t.bb<t.Sb;)t.Ra>>>=8,t.Ra+=t.oa[t.pa+t.bb]<<Ur-8>>>0,++t.bb,t.u-=8;A(t)&&(t.h=1,t.u=0)}function y(t,r){if(e(0<=r),!t.h&&r<=Tr){var n=L(t)&Rr[r];return t.u+=r,b(t),n}return t.h=1,t.u=0}function w(){this.b=this.Ca=this.I=0,this.oa=[],this.pa=0,this.Jd=[],this.Yc=0,this.Zc=[],this.Ka=0}function N(){this.Ra=0,this.oa=[],this.h=this.u=this.bb=this.Sb=this.pa=0}function L(t){return t.Ra>>>(t.u&Ur-1)>>>0}function A(t){return e(t.bb<=t.Sb),t.h||t.bb==t.Sb&&t.u>Ur}function x(t,e){t.u=e,t.h=A(t)}function S(t){t.u>=zr&&(e(t.u>=zr),b(t))}function _(t){e(null!=t&&null!=t.oa),t.pa<t.Zc?(t.I=(t.oa[t.pa++]|t.I<<8)>>>0,t.b+=8):(e(null!=t&&null!=t.oa),t.pa<t.Yc?(t.b+=8,t.I=t.oa[t.pa++]|t.I<<8):t.Ka?t.b=0:(t.I<<=8,t.b+=8,t.Ka=1))}function P(t){return g(t,1)}function k(t,e){var r=t.Ca;0>t.b&&_(t);var n=t.b,i=r*e>>>8,a=(t.I>>>n>i)+0;for(a?(r-=i,t.I-=i+1<<n>>>0):r=i+1,n=r,i=0;256<=n;)i+=8,n>>=8;return n=7^i+Hr[n],t.b-=n,t.Ca=(r<<n)-1,a}function F(t,e,r){t[e+0]=r>>24&255,t[e+1]=r>>16&255,t[e+2]=r>>8&255,t[e+3]=r>>0&255}function I(t,e){return t[e+0]<<0|t[e+1]<<8}function C(t,e){return I(t,e)|t[e+2]<<16}function j(t,e){return I(t,e)|I(t,e+2)<<16}function O(t,r){var n=1<<r;return e(null!=t),e(0<r),t.X=a(n),null==t.X?0:(t.Mb=32-r,t.Xa=r,1)}function B(t,r){e(null!=t),e(null!=r),e(t.Xa==r.Xa),n(r.X,0,t.X,0,1<<r.Xa)}function M(){this.X=[],this.Xa=this.Mb=0}function E(t,r,n,i){e(null!=n),e(null!=i);var a=n[0],o=i[0];return 0==a&&(a=(t*o+r/2)/r),0==o&&(o=(r*a+t/2)/t),0>=a||0>=o?0:(n[0]=a,i[0]=o,1)}function q(t,e){return t+(1<<e)-1>>>e}function D(t,e){return((4278255360&t)+(4278255360&e)>>>0&4278255360)+((16711935&t)+(16711935&e)>>>0&16711935)>>>0}function R(e,r){t[r]=function(r,n,i,a,o,s,c){var u;for(u=0;u<o;++u){var l=t[e](s[c+u-1],i,a+u);s[c+u]=D(r[n+u],l)}}}function T(){this.ud=this.hd=this.jd=0}function U(t,e){return((4278124286&(t^e))>>>1)+(t&e)>>>0}function z(t){return 0<=t&&256>t?t:0>t?0:255<t?255:void 0}function H(t,e){return z(t+(t-e+.5>>1))}function W(t,e,r){return Math.abs(e-r)-Math.abs(t-r)}function V(t,e,r,n,i,a,o){for(n=a[o-1],r=0;r<i;++r)a[o+r]=n=D(t[e+r],n)}function G(t,e,r,n,i){var a;for(a=0;a<r;++a){var o=t[e+a],s=o>>8&255,c=16711935&(c=(c=16711935&o)+((s<<16)+s));n[i+a]=(4278255360&o)+c>>>0}}function Y(t,e){e.jd=t>>0&255,e.hd=t>>8&255,e.ud=t>>16&255}function J(t,e,r,n,i,a){var o;for(o=0;o<n;++o){var s=e[r+o],c=s>>>8,u=s,l=255&(l=(l=s>>>16)+((t.jd<<24>>24)*(c<<24>>24)>>>5));u=255&(u=(u=u+((t.hd<<24>>24)*(c<<24>>24)>>>5))+((t.ud<<24>>24)*(l<<24>>24)>>>5));i[a+o]=(4278255360&s)+(l<<16)+u}}function X(e,r,n,i,a){t[r]=function(t,e,r,n,o,s,c,u,l){for(n=c;n<u;++n)for(c=0;c<l;++c)o[s++]=a(r[i(t[e++])])},t[e]=function(e,r,o,s,c,u,l){var h=8>>e.b,f=e.Ea,d=e.K[0],p=e.w;if(8>h)for(e=(1<<e.b)-1,p=(1<<h)-1;r<o;++r){var g,m=0;for(g=0;g<f;++g)g&e||(m=i(s[c++])),u[l++]=a(d[m&p]),m>>=h}else t["VP8LMapColor"+n](s,c,d,p,u,l,r,o,f)}}function K(t,e,r,n,i){for(r=e+r;e<r;){var a=t[e++];n[i++]=a>>16&255,n[i++]=a>>8&255,n[i++]=a>>0&255}}function Z(t,e,r,n,i){for(r=e+r;e<r;){var a=t[e++];n[i++]=a>>16&255,n[i++]=a>>8&255,n[i++]=a>>0&255,n[i++]=a>>24&255}}function $(t,e,r,n,i){for(r=e+r;e<r;){var a=(o=t[e++])>>16&240|o>>12&15,o=o>>0&240|o>>28&15;n[i++]=a,n[i++]=o}}function Q(t,e,r,n,i){for(r=e+r;e<r;){var a=(o=t[e++])>>16&248|o>>13&7,o=o>>5&224|o>>3&31;n[i++]=a,n[i++]=o}}function tt(t,e,r,n,i){for(r=e+r;e<r;){var a=t[e++];n[i++]=a>>0&255,n[i++]=a>>8&255,n[i++]=a>>16&255}}function et(t,e,r,i,a,o){if(0==o)for(r=e+r;e<r;)F(i,((o=t[e++])[0]>>24|o[1]>>8&65280|o[2]<<8&16711680|o[3]<<24)>>>0),a+=32;else n(i,a,t,e,r)}function rt(e,r){t[r][0]=t[e+"0"],t[r][1]=t[e+"1"],t[r][2]=t[e+"2"],t[r][3]=t[e+"3"],t[r][4]=t[e+"4"],t[r][5]=t[e+"5"],t[r][6]=t[e+"6"],t[r][7]=t[e+"7"],t[r][8]=t[e+"8"],t[r][9]=t[e+"9"],t[r][10]=t[e+"10"],t[r][11]=t[e+"11"],t[r][12]=t[e+"12"],t[r][13]=t[e+"13"],t[r][14]=t[e+"0"],t[r][15]=t[e+"0"]}function nt(t){return t==Hn||t==Wn||t==Vn||t==Gn}function it(){this.eb=[],this.size=this.A=this.fb=0}function at(){this.y=[],this.f=[],this.ea=[],this.F=[],this.Tc=this.Ed=this.Cd=this.Fd=this.lb=this.Db=this.Ab=this.fa=this.J=this.W=this.N=this.O=0}function ot(){this.Rd=this.height=this.width=this.S=0,this.f={},this.f.RGBA=new it,this.f.kb=new at,this.sd=null}function st(){this.width=[0],this.height=[0],this.Pd=[0],this.Qd=[0],this.format=[0]}function ct(){this.Id=this.fd=this.Md=this.hb=this.ib=this.da=this.bd=this.cd=this.j=this.v=this.Da=this.Sd=this.ob=0}function ut(t){return alert("todo:WebPSamplerProcessPlane"),t.T}function lt(t,e){var r=t.T,i=e.ba.f.RGBA,a=i.eb,o=i.fb+t.ka*i.A,s=vi[e.ba.S],c=t.y,u=t.O,l=t.f,h=t.N,f=t.ea,d=t.W,p=e.cc,g=e.dc,m=e.Mc,v=e.Nc,b=t.ka,y=t.ka+t.T,w=t.U,N=w+1>>1;for(0==b?s(c,u,null,null,l,h,f,d,l,h,f,d,a,o,null,null,w):(s(e.ec,e.fc,c,u,p,g,m,v,l,h,f,d,a,o-i.A,a,o,w),++r);b+2<y;b+=2)p=l,g=h,m=f,v=d,h+=t.Rc,d+=t.Rc,o+=2*i.A,s(c,(u+=2*t.fa)-t.fa,c,u,p,g,m,v,l,h,f,d,a,o-i.A,a,o,w);return u+=t.fa,t.j+y<t.o?(n(e.ec,e.fc,c,u,w),n(e.cc,e.dc,l,h,N),n(e.Mc,e.Nc,f,d,N),r--):1&y||s(c,u,null,null,l,h,f,d,l,h,f,d,a,o+i.A,null,null,w),r}function ht(t,r,n){var i=t.F,a=[t.J];if(null!=i){var o=t.U,s=r.ba.S,c=s==Tn||s==Vn;r=r.ba.f.RGBA;var u=[0],l=t.ka;u[0]=t.T,t.Kb&&(0==l?--u[0]:(--l,a[0]-=t.width),t.j+t.ka+t.T==t.o&&(u[0]=t.o-t.j-l));var h=r.eb;l=r.fb+l*r.A;t=Sn(i,a[0],t.width,o,u,h,l+(c?0:3),r.A),e(n==u),t&&nt(s)&&An(h,l,c,o,u,r.A)}return 0}function ft(t){var e=t.ma,r=e.ba.S,n=11>r,i=r==qn||r==Rn||r==Tn||r==Un||12==r||nt(r);if(e.memory=null,e.Ib=null,e.Jb=null,e.Nd=null,!Mr(e.Oa,t,i?11:12))return 0;if(i&&nt(r)&&br(),t.da)alert("todo:use_scaling");else{if(n){if(e.Ib=ut,t.Kb){if(r=t.U+1>>1,e.memory=a(t.U+2*r),null==e.memory)return 0;e.ec=e.memory,e.fc=0,e.cc=e.ec,e.dc=e.fc+t.U,e.Mc=e.cc,e.Nc=e.dc+r,e.Ib=lt,br()}}else alert("todo:EmitYUV");i&&(e.Jb=ht,n&&mr())}if(n&&!Ci){for(t=0;256>t;++t)ji[t]=89858*(t-128)+_i>>Si,Mi[t]=-22014*(t-128)+_i,Bi[t]=-45773*(t-128),Oi[t]=113618*(t-128)+_i>>Si;for(t=Pi;t<ki;++t)e=76283*(t-16)+_i>>Si,Ei[t-Pi]=Vt(e,255),qi[t-Pi]=Vt(e+8>>4,15);Ci=1}return 1}function dt(t){var r=t.ma,n=t.U,i=t.T;return e(!(1&t.ka)),0>=n||0>=i?0:(n=r.Ib(t,r),null!=r.Jb&&r.Jb(t,r,n),r.Dc+=n,1)}function pt(t){t.ma.memory=null}function gt(t,e,r,n){return 47!=y(t,8)?0:(e[0]=y(t,14)+1,r[0]=y(t,14)+1,n[0]=y(t,1),0!=y(t,3)?0:!t.h)}function mt(t,e){if(4>t)return t+1;var r=t-2>>1;return(2+(1&t)<<r)+y(e,r)+1}function vt(t,e){return 120<e?e-120:1<=(r=((r=$n[e-1])>>4)*t+(8-(15&r)))?r:1;var r}function bt(t,e,r){var n=L(r),i=t[e+=255&n].g-8;return 0<i&&(x(r,r.u+8),n=L(r),e+=t[e].value,e+=n&(1<<i)-1),x(r,r.u+t[e].g),t[e].value}function yt(t,r,n){return n.g+=t.g,n.value+=t.value<<r>>>0,e(8>=n.g),t.g}function wt(t,r,n){var i=t.xc;return e((r=0==i?0:t.vc[t.md*(n>>i)+(r>>i)])<t.Wb),t.Ya[r]}function Nt(t,r,i,a){var o=t.ab,s=t.c*r,c=t.C;r=c+r;var u=i,l=a;for(a=t.Ta,i=t.Ua;0<o--;){var h=t.gc[o],f=c,d=r,p=u,g=l,m=(l=a,u=i,h.Ea);switch(e(f<d),e(d<=h.nc),h.hc){case 2:Gr(p,g,(d-f)*m,l,u);break;case 0:var v=f,b=d,y=l,w=u,N=(_=h).Ea;0==v&&(Wr(p,g,null,null,1,y,w),V(p,g+1,0,0,N-1,y,w+1),g+=N,w+=N,++v);for(var L=1<<_.b,A=L-1,x=q(N,_.b),S=_.K,_=_.w+(v>>_.b)*x;v<b;){var P=S,k=_,F=1;for(Vr(p,g,y,w-N,1,y,w);F<N;){var I=(F&~A)+L;I>N&&(I=N),(0,Zr[P[k++]>>8&15])(p,g+ +F,y,w+F-N,I-F,y,w+F),F=I}g+=N,w+=N,++v&A||(_+=x)}d!=h.nc&&n(l,u-m,l,u+(d-f-1)*m,m);break;case 1:for(m=p,b=g,N=(p=h.Ea)-(w=p&~(y=(g=1<<h.b)-1)),v=q(p,h.b),L=h.K,h=h.w+(f>>h.b)*v;f<d;){for(A=L,x=h,S=new T,_=b+w,P=b+p;b<_;)Y(A[x++],S),$r(S,m,b,g,l,u),b+=g,u+=g;b<P&&(Y(A[x++],S),$r(S,m,b,N,l,u),b+=N,u+=N),++f&y||(h+=v)}break;case 3:if(p==l&&g==u&&0<h.b){for(b=l,p=m=u+(d-f)*m-(w=(d-f)*q(h.Ea,h.b)),g=l,y=u,v=[],w=(N=w)-1;0<=w;--w)v[w]=g[y+w];for(w=N-1;0<=w;--w)b[p+w]=v[w];Yr(h,f,d,l,m,l,u)}else Yr(h,f,d,p,g,l,u)}u=a,l=i}l!=i&&n(a,i,u,l,s)}function Lt(t,r){var n=t.V,i=t.Ba+t.c*t.C,a=r-t.C;if(e(r<=t.l.o),e(16>=a),0<a){var o=t.l,s=t.Ta,c=t.Ua,u=o.width;if(Nt(t,a,n,i),a=c=[c],e((n=t.C)<(i=r)),e(o.v<o.va),i>o.o&&(i=o.o),n<o.j){var l=o.j-n;n=o.j;a[0]+=l*u}if(n>=i?n=0:(a[0]+=4*o.v,o.ka=n-o.j,o.U=o.va-o.v,o.T=i-n,n=1),n){if(c=c[0],11>(n=t.ca).S){var h=n.f.RGBA,f=(i=n.S,a=o.U,o=o.T,l=h.eb,h.A),d=o;for(h=h.fb+t.Ma*h.A;0<d--;){var p=s,g=c,m=a,v=l,b=h;switch(i){case En:Qr(p,g,m,v,b);break;case qn:tn(p,g,m,v,b);break;case Hn:tn(p,g,m,v,b),An(v,b,0,m,1,0);break;case Dn:nn(p,g,m,v,b);break;case Rn:et(p,g,m,v,b,1);break;case Wn:et(p,g,m,v,b,1),An(v,b,0,m,1,0);break;case Tn:et(p,g,m,v,b,0);break;case Vn:et(p,g,m,v,b,0),An(v,b,1,m,1,0);break;case Un:en(p,g,m,v,b);break;case Gn:en(p,g,m,v,b),xn(v,b,m,1,0);break;case zn:rn(p,g,m,v,b);break;default:e(0)}c+=u,h+=f}t.Ma+=o}else alert("todo:EmitRescaledRowsYUVA");e(t.Ma<=n.height)}}t.C=r,e(t.C<=t.i)}function At(t){var e;if(0<t.ua)return 0;for(e=0;e<t.Wb;++e){var r=t.Ya[e].G,n=t.Ya[e].H;if(0<r[1][n[1]+0].g||0<r[2][n[2]+0].g||0<r[3][n[3]+0].g)return 0}return 1}function xt(t,r,n,i,a,o){if(0!=t.Z){var s=t.qd,c=t.rd;for(e(null!=mi[t.Z]);r<n;++r)mi[t.Z](s,c,i,a,i,a,o),s=i,c=a,a+=o;t.qd=s,t.rd=c}}function St(t,r){var n=t.l.ma,i=0==n.Z||1==n.Z?t.l.j:t.C;i=t.C<i?i:t.C;if(e(r<=t.l.o),r>i){var a=t.l.width,o=n.ca,s=n.tb+a*i,c=t.V,u=t.Ba+t.c*i,l=t.gc;e(1==t.ab),e(3==l[0].hc),Xr(l[0],i,r,c,u,o,s),xt(n,i,r,o,s,a)}t.C=t.Ma=r}function _t(t,r,n,i,a,o,s){var c=t.$/i,u=t.$%i,l=t.m,h=t.s,f=n+t.$,d=f;a=n+i*a;var p=n+i*o,g=280+h.ua,m=t.Pb?c:16777216,v=0<h.ua?h.Wa:null,b=h.wc,y=f<p?wt(h,u,c):null;e(t.C<o),e(p<=a);var w=!1;t:for(;;){for(;w||f<p;){var N=0;if(c>=m){var _=f-n;e((m=t).Pb),m.wd=m.m,m.xd=_,0<m.s.ua&&B(m.s.Wa,m.s.vb),m=c+ti}if(u&b||(y=wt(h,u,c)),e(null!=y),y.Qb&&(r[f]=y.qb,w=!0),!w)if(S(l),y.jc){N=l,_=r;var P=f,k=y.pd[L(N)&Dr-1];e(y.jc),256>k.g?(x(N,N.u+k.g),_[P]=k.value,N=0):(x(N,N.u+k.g-256),e(256<=k.value),N=k.value),0==N&&(w=!0)}else N=bt(y.G[0],y.H[0],l);if(l.h)break;if(w||256>N){if(!w)if(y.nd)r[f]=(y.qb|N<<8)>>>0;else{if(S(l),w=bt(y.G[1],y.H[1],l),S(l),_=bt(y.G[2],y.H[2],l),P=bt(y.G[3],y.H[3],l),l.h)break;r[f]=(P<<24|w<<16|N<<8|_)>>>0}if(w=!1,++f,++u>=i&&(u=0,++c,null!=s&&c<=o&&!(c%16)&&s(t,c),null!=v))for(;d<f;)N=r[d++],v.X[(506832829*N&4294967295)>>>v.Mb]=N}else if(280>N){if(N=mt(N-256,l),_=bt(y.G[4],y.H[4],l),S(l),_=vt(i,_=mt(_,l)),l.h)break;if(f-n<_||a-f<N)break t;for(P=0;P<N;++P)r[f+P]=r[f+P-_];for(f+=N,u+=N;u>=i;)u-=i,++c,null!=s&&c<=o&&!(c%16)&&s(t,c);if(e(f<=a),u&b&&(y=wt(h,u,c)),null!=v)for(;d<f;)N=r[d++],v.X[(506832829*N&4294967295)>>>v.Mb]=N}else{if(!(N<g))break t;for(w=N-280,e(null!=v);d<f;)N=r[d++],v.X[(506832829*N&4294967295)>>>v.Mb]=N;N=f,e(!(w>>>(_=v).Xa)),r[N]=_.X[w],w=!0}w||e(l.h==A(l))}if(t.Pb&&l.h&&f<a)e(t.m.h),t.a=5,t.m=t.wd,t.$=t.xd,0<t.s.ua&&B(t.s.vb,t.s.Wa);else{if(l.h)break t;null!=s&&s(t,c>o?o:c),t.a=0,t.$=f-n}return 1}return t.a=3,0}function Pt(t){e(null!=t),t.vc=null,t.yc=null,t.Ya=null;var r=t.Wa;null!=r&&(r.X=null),t.vb=null,e(null!=t)}function kt(){var e=new or;return null==e?null:(e.a=0,e.xb=gi,rt("Predictor","VP8LPredictors"),rt("Predictor","VP8LPredictors_C"),rt("PredictorAdd","VP8LPredictorsAdd"),rt("PredictorAdd","VP8LPredictorsAdd_C"),Gr=G,$r=J,Qr=K,tn=Z,en=$,rn=Q,nn=tt,t.VP8LMapColor32b=Jr,t.VP8LMapColor8b=Kr,e)}function Ft(t,r,n,s,c){var u=1,f=[t],p=[r],g=s.m,m=s.s,v=null,b=0;t:for(;;){if(n)for(;u&&y(g,1);){var w=f,N=p,A=s,_=1,P=A.m,k=A.gc[A.ab],F=y(P,2);if(A.Oc&1<<F)u=0;else{switch(A.Oc|=1<<F,k.hc=F,k.Ea=w[0],k.nc=N[0],k.K=[null],++A.ab,e(4>=A.ab),F){case 0:case 1:k.b=y(P,3)+2,_=Ft(q(k.Ea,k.b),q(k.nc,k.b),0,A,k.K),k.K=k.K[0];break;case 3:var I,C=y(P,8)+1,j=16<C?0:4<C?1:2<C?2:3;if(w[0]=q(k.Ea,j),k.b=j,I=_=Ft(C,1,0,A,k.K)){var B,M=C,E=k,R=1<<(8>>E.b),T=a(R);if(null==T)I=0;else{var U=E.K[0],z=E.w;for(T[0]=E.K[0][0],B=1;B<1*M;++B)T[B]=D(U[z+B],T[B-1]);for(;B<4*R;++B)T[B]=0;E.K[0]=null,E.K[0]=T,I=1}}_=I;break;case 2:break;default:e(0)}u=_}}if(f=f[0],p=p[0],u&&y(g,1)&&!(u=1<=(b=y(g,4))&&11>=b)){s.a=3;break t}var H;if(H=u)e:{var W,V,G,Y=s,J=f,X=p,K=b,Z=n,$=Y.m,Q=Y.s,tt=[null],et=1,rt=0,nt=Qn[K];r:for(;;){if(Z&&y($,1)){var it=y($,3)+2,at=q(J,it),ot=q(X,it),st=at*ot;if(!Ft(at,ot,0,Y,tt))break r;for(tt=tt[0],Q.xc=it,W=0;W<st;++W){var ct=tt[W]>>8&65535;tt[W]=ct,ct>=et&&(et=ct+1)}}if($.h)break r;for(V=0;5>V;++V){var ut=Xn[V];!V&&0<K&&(ut+=1<<K),rt<ut&&(rt=ut)}var lt=o(et*nt,h),ht=et,ft=o(ht,d);if(null==ft)var dt=null;else e(65536>=ht),dt=ft;var pt=a(rt);if(null==dt||null==pt||null==lt){Y.a=1;break r}var gt=lt;for(W=G=0;W<et;++W){var mt=dt[W],vt=mt.G,bt=mt.H,wt=0,Nt=1,Lt=0;for(V=0;5>V;++V){ut=Xn[V],vt[V]=gt,bt[V]=G,!V&&0<K&&(ut+=1<<K);n:{var At,xt=ut,St=Y,kt=pt,It=gt,Ct=G,jt=0,Ot=St.m,Bt=y(Ot,1);if(i(kt,0,0,xt),Bt){var Mt=y(Ot,1)+1,Et=y(Ot,1),qt=y(Ot,0==Et?1:8);kt[qt]=1,2==Mt&&(kt[qt=y(Ot,8)]=1);var Dt=1}else{var Rt=a(19),Tt=y(Ot,4)+4;if(19<Tt){St.a=3;var Ut=0;break n}for(At=0;At<Tt;++At)Rt[Zn[At]]=y(Ot,3);var zt=void 0,Ht=void 0,Wt=St,Vt=Rt,Gt=xt,Yt=kt,Jt=0,Xt=Wt.m,Kt=8,Zt=o(128,h);i:for(;l(Zt,0,7,Vt,19);){if(y(Xt,1)){var $t=2+2*y(Xt,3);if((zt=2+y(Xt,$t))>Gt)break i}else zt=Gt;for(Ht=0;Ht<Gt&&zt--;){S(Xt);var Qt=Zt[0+(127&L(Xt))];x(Xt,Xt.u+Qt.g);var te=Qt.value;if(16>te)Yt[Ht++]=te,0!=te&&(Kt=te);else{var ee=16==te,re=te-16,ne=Jn[re],ie=y(Xt,Yn[re])+ne;if(Ht+ie>Gt)break i;for(var ae=ee?Kt:0;0<ie--;)Yt[Ht++]=ae}}Jt=1;break i}Jt||(Wt.a=3),Dt=Jt}(Dt=Dt&&!Ot.h)&&(jt=l(It,Ct,8,kt,xt)),Dt&&0!=jt?Ut=jt:(St.a=3,Ut=0)}if(0==Ut)break r;if(Nt&&1==Kn[V]&&(Nt=0==gt[G].g),wt+=gt[G].g,G+=Ut,3>=V){var oe,se=pt[0];for(oe=1;oe<ut;++oe)pt[oe]>se&&(se=pt[oe]);Lt+=se}}if(mt.nd=Nt,mt.Qb=0,Nt&&(mt.qb=(vt[3][bt[3]+0].value<<24|vt[1][bt[1]+0].value<<16|vt[2][bt[2]+0].value)>>>0,0==wt&&256>vt[0][bt[0]+0].value&&(mt.Qb=1,mt.qb+=vt[0][bt[0]+0].value<<8)),mt.jc=!mt.Qb&&6>Lt,mt.jc){var ce,ue=mt;for(ce=0;ce<Dr;++ce){var le=ce,he=ue.pd[le],fe=ue.G[0][ue.H[0]+le];256<=fe.value?(he.g=fe.g+256,he.value=fe.value):(he.g=0,he.value=0,le>>=yt(fe,8,he),le>>=yt(ue.G[1][ue.H[1]+le],16,he),le>>=yt(ue.G[2][ue.H[2]+le],0,he),yt(ue.G[3][ue.H[3]+le],24,he))}}}Q.vc=tt,Q.Wb=et,Q.Ya=dt,Q.yc=lt,H=1;break e}H=0}if(!(u=H)){s.a=3;break t}if(0<b){if(m.ua=1<<b,!O(m.Wa,b)){s.a=1,u=0;break t}}else m.ua=0;var de=s,pe=f,ge=p,me=de.s,ve=me.xc;if(de.c=pe,de.i=ge,me.md=q(pe,ve),me.wc=0==ve?-1:(1<<ve)-1,n){s.xb=pi;break t}if(null==(v=a(f*p))){s.a=1,u=0;break t}u=(u=_t(s,v,0,f,p,p,null))&&!g.h;break t}return u?(null!=c?c[0]=v:(e(null==v),e(n)),s.$=0,n||Pt(m)):Pt(m),u}function It(t,r){var n=t.c*t.i,i=n+r+16*r;return e(t.c<=r),t.V=a(i),null==t.V?(t.Ta=null,t.Ua=0,t.a=1,0):(t.Ta=t.V,t.Ua=t.Ba+n+r,1)}function Ct(t,r){var n=t.C,i=r-n,a=t.V,o=t.Ba+t.c*n;for(e(r<=t.l.o);0<i;){var s=16<i?16:i,c=t.l.ma,u=t.l.width,l=u*s,h=c.ca,f=c.tb+u*n,d=t.Ta,p=t.Ua;Nt(t,s,a,o),_n(d,p,h,f,l),xt(c,n,n+s,h,f,u),i-=s,a+=s*t.c,n+=s}e(n==r),t.C=t.Ma=r}function jt(){this.ub=this.yd=this.td=this.Rb=0}function Ot(){this.Kd=this.Ld=this.Ud=this.Td=this.i=this.c=0}function Bt(){this.Fb=this.Bb=this.Cb=0,this.Zb=a(4),this.Lb=a(4)}function Mt(){this.Yb=function(){var t=[];return function t(e,r,n){for(var i=n[r],a=0;a<i&&(e.push(n.length>r+1?[]:0),!(n.length<r+1));a++)t(e[a],r+1,n)}(t,0,[3,11]),t}()}function Et(){this.jb=a(3),this.Wc=s([4,8],Mt),this.Xc=s([4,17],Mt)}function qt(){this.Pc=this.wb=this.Tb=this.zd=0,this.vd=new a(4),this.od=new a(4)}function Dt(){this.ld=this.La=this.dd=this.tc=0}function Rt(){this.Na=this.la=0}function Tt(){this.Sc=[0,0],this.Eb=[0,0],this.Qc=[0,0],this.ia=this.lc=0}function Ut(){this.ad=a(384),this.Za=0,this.Ob=a(16),this.$b=this.Ad=this.ia=this.Gc=this.Hc=this.Dd=0}function zt(){this.uc=this.M=this.Nb=0,this.wa=Array(new Dt),this.Y=0,this.ya=Array(new Ut),this.aa=0,this.l=new Gt}function Ht(){this.y=a(16),this.f=a(8),this.ea=a(8)}function Wt(){this.cb=this.a=0,this.sc="",this.m=new w,this.Od=new jt,this.Kc=new Ot,this.ed=new qt,this.Qa=new Bt,this.Ic=this.$c=this.Aa=0,this.D=new zt,this.Xb=this.Va=this.Hb=this.zb=this.yb=this.Ub=this.za=0,this.Jc=o(8,w),this.ia=0,this.pb=o(4,Tt),this.Pa=new Et,this.Bd=this.kc=0,this.Ac=[],this.Bc=0,this.zc=[0,0,0,0],this.Gd=Array(new Ht),this.Hd=0,this.rb=Array(new Rt),this.sb=0,this.wa=Array(new Dt),this.Y=0,this.oc=[],this.pc=0,this.sa=[],this.ta=0,this.qa=[],this.ra=0,this.Ha=[],this.B=this.R=this.Ia=0,this.Ec=[],this.M=this.ja=this.Vb=this.Fc=0,this.ya=Array(new Ut),this.L=this.aa=0,this.gd=s([4,2],Dt),this.ga=null,this.Fa=[],this.Cc=this.qc=this.P=0,this.Gb=[],this.Uc=0,this.mb=[],this.nb=0,this.rc=[],this.Ga=this.Vc=0}function Vt(t,e){return 0>t?0:t>e?e:t}function Gt(){this.T=this.U=this.ka=this.height=this.width=0,this.y=[],this.f=[],this.ea=[],this.Rc=this.fa=this.W=this.N=this.O=0,this.ma="void",this.put="VP8IoPutHook",this.ac="VP8IoSetupHook",this.bc="VP8IoTeardownHook",this.ha=this.Kb=0,this.data=[],this.hb=this.ib=this.da=this.o=this.j=this.va=this.v=this.Da=this.ob=this.w=0,this.F=[],this.J=0}function Yt(){var t=new Wt;return null!=t&&(t.a=0,t.sc="OK",t.cb=0,t.Xb=0,ni||(ni=Zt)),t}function Jt(t,e,r){return 0==t.a&&(t.a=e,t.sc=r,t.cb=0),0}function Xt(t,e,r){return 3<=r&&157==t[e+0]&&1==t[e+1]&&42==t[e+2]}function Kt(t,r){if(null==t)return 0;if(t.a=0,t.sc="OK",null==r)return Jt(t,2,"null VP8Io passed to VP8GetHeaders()");var n=r.data,a=r.w,o=r.ha;if(4>o)return Jt(t,7,"Truncated header.");var s=n[a+0]|n[a+1]<<8|n[a+2]<<16,c=t.Od;if(c.Rb=!(1&s),c.td=s>>1&7,c.yd=s>>4&1,c.ub=s>>5,3<c.td)return Jt(t,3,"Incorrect keyframe parameters.");if(!c.yd)return Jt(t,4,"Frame not displayable.");a+=3,o-=3;var u=t.Kc;if(c.Rb){if(7>o)return Jt(t,7,"cannot parse picture header");if(!Xt(n,a,o))return Jt(t,3,"Bad code word");u.c=16383&(n[a+4]<<8|n[a+3]),u.Td=n[a+4]>>6,u.i=16383&(n[a+6]<<8|n[a+5]),u.Ud=n[a+6]>>6,a+=7,o-=7,t.za=u.c+15>>4,t.Ub=u.i+15>>4,r.width=u.c,r.height=u.i,r.Da=0,r.j=0,r.v=0,r.va=r.width,r.o=r.height,r.da=0,r.ib=r.width,r.hb=r.height,r.U=r.width,r.T=r.height,i((s=t.Pa).jb,0,255,s.jb.length),e(null!=(s=t.Qa)),s.Cb=0,s.Bb=0,s.Fb=1,i(s.Zb,0,0,s.Zb.length),i(s.Lb,0,0,s.Lb)}if(c.ub>o)return Jt(t,7,"bad partition length");p(s=t.m,n,a,c.ub),a+=c.ub,o-=c.ub,c.Rb&&(u.Ld=P(s),u.Kd=P(s)),u=t.Qa;var l,h=t.Pa;if(e(null!=s),e(null!=u),u.Cb=P(s),u.Cb){if(u.Bb=P(s),P(s)){for(u.Fb=P(s),l=0;4>l;++l)u.Zb[l]=P(s)?m(s,7):0;for(l=0;4>l;++l)u.Lb[l]=P(s)?m(s,6):0}if(u.Bb)for(l=0;3>l;++l)h.jb[l]=P(s)?g(s,8):255}else u.Bb=0;if(s.Ka)return Jt(t,3,"cannot parse segment header");if((u=t.ed).zd=P(s),u.Tb=g(s,6),u.wb=g(s,3),u.Pc=P(s),u.Pc&&P(s)){for(h=0;4>h;++h)P(s)&&(u.vd[h]=m(s,6));for(h=0;4>h;++h)P(s)&&(u.od[h]=m(s,6))}if(t.L=0==u.Tb?0:u.zd?1:2,s.Ka)return Jt(t,3,"cannot parse filter header");var f=o;if(o=l=a,a=l+f,u=f,t.Xb=(1<<g(t.m,2))-1,f<3*(h=t.Xb))n=7;else{for(l+=3*h,u-=3*h,f=0;f<h;++f){var d=n[o+0]|n[o+1]<<8|n[o+2]<<16;d>u&&(d=u),p(t.Jc[+f],n,l,d),l+=d,u-=d,o+=3}p(t.Jc[+h],n,l,u),n=l<a?0:5}if(0!=n)return Jt(t,n,"cannot parse partitions");for(n=g(l=t.m,7),o=P(l)?m(l,4):0,a=P(l)?m(l,4):0,u=P(l)?m(l,4):0,h=P(l)?m(l,4):0,l=P(l)?m(l,4):0,f=t.Qa,d=0;4>d;++d){if(f.Cb){var v=f.Zb[d];f.Fb||(v+=n)}else{if(0<d){t.pb[d]=t.pb[0];continue}v=n}var b=t.pb[d];b.Sc[0]=ei[Vt(v+o,127)],b.Sc[1]=ri[Vt(v+0,127)],b.Eb[0]=2*ei[Vt(v+a,127)],b.Eb[1]=101581*ri[Vt(v+u,127)]>>16,8>b.Eb[1]&&(b.Eb[1]=8),b.Qc[0]=ei[Vt(v+h,117)],b.Qc[1]=ri[Vt(v+l,127)],b.lc=v+l}if(!c.Rb)return Jt(t,4,"Not a key frame.");for(P(s),c=t.Pa,n=0;4>n;++n){for(o=0;8>o;++o)for(a=0;3>a;++a)for(u=0;11>u;++u)h=k(s,ui[n][o][a][u])?g(s,8):si[n][o][a][u],c.Wc[n][o].Yb[a][u]=h;for(o=0;17>o;++o)c.Xc[n][o]=c.Wc[n][li[o]]}return t.kc=P(s),t.kc&&(t.Bd=g(s,8)),t.cb=1}function Zt(t,e,r,n,i,a,o){var s=e[i].Yb[r];for(r=0;16>i;++i){if(!k(t,s[r+0]))return i;for(;!k(t,s[r+1]);)if(s=e[++i].Yb[0],r=0,16==i)return 16;var c=e[i+1].Yb;if(k(t,s[r+2])){var u=t,l=0;if(k(u,(f=s)[(h=r)+3]))if(k(u,f[h+6])){for(s=0,h=2*(l=k(u,f[h+8]))+(f=k(u,f[h+9+l])),l=0,f=ii[h];f[s];++s)l+=l+k(u,f[s]);l+=3+(8<<h)}else k(u,f[h+7])?(l=7+2*k(u,165),l+=k(u,145)):l=5+k(u,159);else l=k(u,f[h+4])?3+k(u,f[h+5]):2;s=c[2]}else l=1,s=c[1];c=o+ai[i],0>(u=t).b&&_(u);var h,f=u.b,d=(h=u.Ca>>1)-(u.I>>f)>>31;--u.b,u.Ca+=d,u.Ca|=1,u.I-=(h+1&d)<<f,a[c]=((l^d)-d)*n[(0<i)+0]}return 16}function $t(t){var e=t.rb[t.sb-1];e.la=0,e.Na=0,i(t.zc,0,0,t.zc.length),t.ja=0}function Qt(t,r){if(null==t)return 0;if(null==r)return Jt(t,2,"NULL VP8Io parameter in VP8Decode().");if(!t.cb&&!Kt(t,r))return 0;if(e(t.cb),null==r.ac||r.ac(r)){r.ob&&(t.L=0);var s=Ri[t.L];if(2==t.L?(t.yb=0,t.zb=0):(t.yb=r.v-s>>4,t.zb=r.j-s>>4,0>t.yb&&(t.yb=0),0>t.zb&&(t.zb=0)),t.Va=r.o+15+s>>4,t.Hb=r.va+15+s>>4,t.Hb>t.za&&(t.Hb=t.za),t.Va>t.Ub&&(t.Va=t.Ub),0<t.L){var c=t.ed;for(s=0;4>s;++s){var u;if(t.Qa.Cb){var l=t.Qa.Lb[s];t.Qa.Fb||(l+=c.Tb)}else l=c.Tb;for(u=0;1>=u;++u){var h=t.gd[s][u],f=l;if(c.Pc&&(f+=c.vd[0],u&&(f+=c.od[0])),0<(f=0>f?0:63<f?63:f)){var d=f;0<c.wb&&((d=4<c.wb?d>>2:d>>1)>9-c.wb&&(d=9-c.wb)),1>d&&(d=1),h.dd=d,h.tc=2*f+d,h.ld=40<=f?2:15<=f?1:0}else h.tc=0;h.La=u}}}s=0}else Jt(t,6,"Frame setup failed"),s=t.a;if(s=0==s){if(s){t.$c=0,0<t.Aa||(t.Ic=Ui);t:{s=t.Ic;c=4*(d=t.za);var p=32*d,g=d+1,m=0<t.L?d*(0<t.Aa?2:1):0,v=(2==t.Aa?2:1)*d;if((h=c+832+(u=3*(16*s+Ri[t.L])/2*p)+(l=null!=t.Fa&&0<t.Fa.length?t.Kc.c*t.Kc.i:0))!=h)s=0;else{if(h>t.Vb){if(t.Vb=0,t.Ec=a(h),t.Fc=0,null==t.Ec){s=Jt(t,1,"no memory during frame initialization.");break t}t.Vb=h}h=t.Ec,f=t.Fc,t.Ac=h,t.Bc=f,f+=c,t.Gd=o(p,Ht),t.Hd=0,t.rb=o(g+1,Rt),t.sb=1,t.wa=m?o(m,Dt):null,t.Y=0,t.D.Nb=0,t.D.wa=t.wa,t.D.Y=t.Y,0<t.Aa&&(t.D.Y+=d),e(!0),t.oc=h,t.pc=f,f+=832,t.ya=o(v,Ut),t.aa=0,t.D.ya=t.ya,t.D.aa=t.aa,2==t.Aa&&(t.D.aa+=d),t.R=16*d,t.B=8*d,d=(p=Ri[t.L])*t.R,p=p/2*t.B,t.sa=h,t.ta=f+d,t.qa=t.sa,t.ra=t.ta+16*s*t.R+p,t.Ha=t.qa,t.Ia=t.ra+8*s*t.B+p,t.$c=0,f+=u,t.mb=l?h:null,t.nb=l?f:null,e(f+l<=t.Fc+t.Vb),$t(t),i(t.Ac,t.Bc,0,c),s=1}}if(s){if(r.ka=0,r.y=t.sa,r.O=t.ta,r.f=t.qa,r.N=t.ra,r.ea=t.Ha,r.Vd=t.Ia,r.fa=t.R,r.Rc=t.B,r.F=null,r.J=0,!Cn){for(s=-255;255>=s;++s)Pn[255+s]=0>s?-s:s;for(s=-1020;1020>=s;++s)kn[1020+s]=-128>s?-128:127<s?127:s;for(s=-112;112>=s;++s)Fn[112+s]=-16>s?-16:15<s?15:s;for(s=-255;510>=s;++s)In[255+s]=0>s?0:255<s?255:s;Cn=1}an=ue,on=ae,cn=oe,un=se,ln=ce,sn=ie,hn=Je,fn=Xe,dn=$e,pn=Qe,gn=Ke,mn=Ze,vn=tr,bn=er,yn=ze,wn=He,Nn=We,Ln=Ve,fi[0]=xe,fi[1]=he,fi[2]=Le,fi[3]=Ae,fi[4]=Se,fi[5]=Pe,fi[6]=_e,fi[7]=ke,fi[8]=Ie,fi[9]=Fe,hi[0]=ve,hi[1]=de,hi[2]=pe,hi[3]=ge,hi[4]=be,hi[5]=ye,hi[6]=we,di[0]=Be,di[1]=fe,di[2]=Ce,di[3]=je,di[4]=Ee,di[5]=Me,di[6]=qe,s=1}else s=0}s&&(s=function(t,r){for(t.M=0;t.M<t.Va;++t.M){var o,s=t.Jc[t.M&t.Xb],c=t.m,u=t;for(o=0;o<u.za;++o){var l=c,h=u,f=h.Ac,d=h.Bc+4*o,p=h.zc,g=h.ya[h.aa+o];if(h.Qa.Bb?g.$b=k(l,h.Pa.jb[0])?2+k(l,h.Pa.jb[2]):k(l,h.Pa.jb[1]):g.$b=0,h.kc&&(g.Ad=k(l,h.Bd)),g.Za=!k(l,145)+0,g.Za){var m=g.Ob,v=0;for(h=0;4>h;++h){var b,y=p[0+h];for(b=0;4>b;++b){y=ci[f[d+b]][y];for(var w=oi[k(l,y[0])];0<w;)w=oi[2*w+k(l,y[w])];y=-w,f[d+b]=y}n(m,v,f,d,4),v+=4,p[0+h]=y}}else y=k(l,156)?k(l,128)?1:3:k(l,163)?2:0,g.Ob[0]=y,i(f,d,y,4),i(p,0,y,4);g.Dd=k(l,142)?k(l,114)?k(l,183)?1:3:2:0}if(u.m.Ka)return Jt(t,7,"Premature end-of-partition0 encountered.");for(;t.ja<t.za;++t.ja){if(u=s,l=(c=t).rb[c.sb-1],f=c.rb[c.sb+c.ja],o=c.ya[c.aa+c.ja],d=c.kc?o.Ad:0)l.la=f.la=0,o.Za||(l.Na=f.Na=0),o.Hc=0,o.Gc=0,o.ia=0;else{var N,L;l=f,f=u,d=c.Pa.Xc,p=c.ya[c.aa+c.ja],g=c.pb[p.$b];if(h=p.ad,m=0,v=c.rb[c.sb-1],y=b=0,i(h,m,0,384),p.Za)var A=0,x=d[3];else{w=a(16);var S=l.Na+v.Na;if(S=ni(f,d[1],S,g.Eb,0,w,0),l.Na=v.Na=(0<S)+0,1<S)an(w,0,h,m);else{var _=w[0]+3>>3;for(w=0;256>w;w+=16)h[m+w]=_}A=1,x=d[0]}var P=15&l.la,F=15&v.la;for(w=0;4>w;++w){var I=1&F;for(_=L=0;4>_;++_)P=P>>1|(I=(S=ni(f,x,S=I+(1&P),g.Sc,A,h,m))>A)<<7,L=L<<2|(3<S?3:1<S?2:0!=h[m+0]),m+=16;P>>=4,F=F>>1|I<<7,b=(b<<8|L)>>>0}for(x=P,A=F>>4,N=0;4>N;N+=2){for(L=0,P=l.la>>4+N,F=v.la>>4+N,w=0;2>w;++w){for(I=1&F,_=0;2>_;++_)S=I+(1&P),P=P>>1|(I=0<(S=ni(f,d[2],S,g.Qc,0,h,m)))<<3,L=L<<2|(3<S?3:1<S?2:0!=h[m+0]),m+=16;P>>=2,F=F>>1|I<<5}y|=L<<4*N,x|=P<<4<<N,A|=(240&F)<<N}l.la=x,v.la=A,p.Hc=b,p.Gc=y,p.ia=43690&y?0:g.ia,d=!(b|y)}if(0<c.L&&(c.wa[c.Y+c.ja]=c.gd[o.$b][o.Za],c.wa[c.Y+c.ja].La|=!d),u.Ka)return Jt(t,7,"Premature end-of-file encountered.")}if($t(t),c=r,u=1,o=(s=t).D,l=0<s.L&&s.M>=s.zb&&s.M<=s.Va,0==s.Aa)t:{if(o.M=s.M,o.uc=l,Or(s,o),u=1,o=(L=s.D).Nb,l=(y=Ri[s.L])*s.R,f=y/2*s.B,w=16*o*s.R,_=8*o*s.B,d=s.sa,p=s.ta-l+w,g=s.qa,h=s.ra-f+_,m=s.Ha,v=s.Ia-f+_,F=0==(P=L.M),b=P>=s.Va-1,2==s.Aa&&Or(s,L),L.uc)for(I=(S=s).D.M,e(S.D.uc),L=S.yb;L<S.Hb;++L){A=L,x=I;var C=(j=(U=S).D).Nb;N=U.R;var j=j.wa[j.Y+A],O=U.sa,B=U.ta+16*C*N+16*A,M=j.dd,E=j.tc;if(0!=E)if(e(3<=E),1==U.L)0<A&&wn(O,B,N,E+4),j.La&&Ln(O,B,N,E),0<x&&yn(O,B,N,E+4),j.La&&Nn(O,B,N,E);else{var q=U.B,D=U.qa,R=U.ra+8*C*q+8*A,T=U.Ha,U=U.Ia+8*C*q+8*A;C=j.ld;0<A&&(fn(O,B,N,E+4,M,C),pn(D,R,T,U,q,E+4,M,C)),j.La&&(mn(O,B,N,E,M,C),bn(D,R,T,U,q,E,M,C)),0<x&&(hn(O,B,N,E+4,M,C),dn(D,R,T,U,q,E+4,M,C)),j.La&&(gn(O,B,N,E,M,C),vn(D,R,T,U,q,E,M,C))}}if(s.ia&&alert("todo:DitherRow"),null!=c.put){if(L=16*P,P=16*(P+1),F?(c.y=s.sa,c.O=s.ta+w,c.f=s.qa,c.N=s.ra+_,c.ea=s.Ha,c.W=s.Ia+_):(L-=y,c.y=d,c.O=p,c.f=g,c.N=h,c.ea=m,c.W=v),b||(P-=y),P>c.o&&(P=c.o),c.F=null,c.J=null,null!=s.Fa&&0<s.Fa.length&&L<P&&(c.J=hr(s,c,L,P-L),c.F=s.mb,null==c.F&&0==c.F.length)){u=Jt(s,3,"Could not decode alpha data.");break t}L<c.j&&(y=c.j-L,L=c.j,e(!(1&y)),c.O+=s.R*y,c.N+=s.B*(y>>1),c.W+=s.B*(y>>1),null!=c.F&&(c.J+=c.width*y)),L<P&&(c.O+=c.v,c.N+=c.v>>1,c.W+=c.v>>1,null!=c.F&&(c.J+=c.v),c.ka=L-c.j,c.U=c.va-c.v,c.T=P-L,u=c.put(c))}o+1!=s.Ic||b||(n(s.sa,s.ta-l,d,p+16*s.R,l),n(s.qa,s.ra-f,g,h+8*s.B,f),n(s.Ha,s.Ia-f,m,v+8*s.B,f))}if(!u)return Jt(t,6,"Output aborted.")}return 1}(t,r)),null!=r.bc&&r.bc(r),s&=1}return s?(t.cb=0,s):0}function te(t,e,r,n,i){i=t[e+r+32*n]+(i>>3),t[e+r+32*n]=-256&i?0>i?0:255:i}function ee(t,e,r,n,i,a){te(t,e,0,r,n+i),te(t,e,1,r,n+a),te(t,e,2,r,n-a),te(t,e,3,r,n-i)}function re(t){return(20091*t>>16)+t}function ne(t,e,r,n){var i,o=0,s=a(16);for(i=0;4>i;++i){var c=t[e+0]+t[e+8],u=t[e+0]-t[e+8],l=(35468*t[e+4]>>16)-re(t[e+12]),h=re(t[e+4])+(35468*t[e+12]>>16);s[o+0]=c+h,s[o+1]=u+l,s[o+2]=u-l,s[o+3]=c-h,o+=4,e++}for(i=o=0;4>i;++i)c=(t=s[o+0]+4)+s[o+8],u=t-s[o+8],l=(35468*s[o+4]>>16)-re(s[o+12]),te(r,n,0,0,c+(h=re(s[o+4])+(35468*s[o+12]>>16))),te(r,n,1,0,u+l),te(r,n,2,0,u-l),te(r,n,3,0,c-h),o++,n+=32}function ie(t,e,r,n){var i=t[e+0]+4,a=35468*t[e+4]>>16,o=re(t[e+4]),s=35468*t[e+1]>>16;ee(r,n,0,i+o,t=re(t[e+1]),s),ee(r,n,1,i+a,t,s),ee(r,n,2,i-a,t,s),ee(r,n,3,i-o,t,s)}function ae(t,e,r,n,i){ne(t,e,r,n),i&&ne(t,e+16,r,n+4)}function oe(t,e,r,n){on(t,e+0,r,n,1),on(t,e+32,r,n+128,1)}function se(t,e,r,n){var i;for(t=t[e+0]+4,i=0;4>i;++i)for(e=0;4>e;++e)te(r,n,e,i,t)}function ce(t,e,r,n){t[e+0]&&un(t,e+0,r,n),t[e+16]&&un(t,e+16,r,n+4),t[e+32]&&un(t,e+32,r,n+128),t[e+48]&&un(t,e+48,r,n+128+4)}function ue(t,e,r,n){var i,o=a(16);for(i=0;4>i;++i){var s=t[e+0+i]+t[e+12+i],c=t[e+4+i]+t[e+8+i],u=t[e+4+i]-t[e+8+i],l=t[e+0+i]-t[e+12+i];o[0+i]=s+c,o[8+i]=s-c,o[4+i]=l+u,o[12+i]=l-u}for(i=0;4>i;++i)s=(t=o[0+4*i]+3)+o[3+4*i],c=o[1+4*i]+o[2+4*i],u=o[1+4*i]-o[2+4*i],l=t-o[3+4*i],r[n+0]=s+c>>3,r[n+16]=l+u>>3,r[n+32]=s-c>>3,r[n+48]=l-u>>3,n+=64}function le(t,e,r){var n,i=e-32,a=Bn,o=255-t[i-1];for(n=0;n<r;++n){var s,c=a,u=o+t[e-1];for(s=0;s<r;++s)t[e+s]=c[u+t[i+s]];e+=32}}function he(t,e){le(t,e,4)}function fe(t,e){le(t,e,8)}function de(t,e){le(t,e,16)}function pe(t,e){var r;for(r=0;16>r;++r)n(t,e+32*r,t,e-32,16)}function ge(t,e){var r;for(r=16;0<r;--r)i(t,e,t[e-1],16),e+=32}function me(t,e,r){var n;for(n=0;16>n;++n)i(e,r+32*n,t,16)}function ve(t,e){var r,n=16;for(r=0;16>r;++r)n+=t[e-1+32*r]+t[e+r-32];me(n>>5,t,e)}function be(t,e){var r,n=8;for(r=0;16>r;++r)n+=t[e-1+32*r];me(n>>4,t,e)}function ye(t,e){var r,n=8;for(r=0;16>r;++r)n+=t[e+r-32];me(n>>4,t,e)}function we(t,e){me(128,t,e)}function Ne(t,e,r){return t+2*e+r+2>>2}function Le(t,e){var r,i=e-32;i=new Uint8Array([Ne(t[i-1],t[i+0],t[i+1]),Ne(t[i+0],t[i+1],t[i+2]),Ne(t[i+1],t[i+2],t[i+3]),Ne(t[i+2],t[i+3],t[i+4])]);for(r=0;4>r;++r)n(t,e+32*r,i,0,i.length)}function Ae(t,e){var r=t[e-1],n=t[e-1+32],i=t[e-1+64],a=t[e-1+96];F(t,e+0,16843009*Ne(t[e-1-32],r,n)),F(t,e+32,16843009*Ne(r,n,i)),F(t,e+64,16843009*Ne(n,i,a)),F(t,e+96,16843009*Ne(i,a,a))}function xe(t,e){var r,n=4;for(r=0;4>r;++r)n+=t[e+r-32]+t[e-1+32*r];for(n>>=3,r=0;4>r;++r)i(t,e+32*r,n,4)}function Se(t,e){var r=t[e-1+0],n=t[e-1+32],i=t[e-1+64],a=t[e-1-32],o=t[e+0-32],s=t[e+1-32],c=t[e+2-32],u=t[e+3-32];t[e+0+96]=Ne(n,i,t[e-1+96]),t[e+1+96]=t[e+0+64]=Ne(r,n,i),t[e+2+96]=t[e+1+64]=t[e+0+32]=Ne(a,r,n),t[e+3+96]=t[e+2+64]=t[e+1+32]=t[e+0+0]=Ne(o,a,r),t[e+3+64]=t[e+2+32]=t[e+1+0]=Ne(s,o,a),t[e+3+32]=t[e+2+0]=Ne(c,s,o),t[e+3+0]=Ne(u,c,s)}function _e(t,e){var r=t[e+1-32],n=t[e+2-32],i=t[e+3-32],a=t[e+4-32],o=t[e+5-32],s=t[e+6-32],c=t[e+7-32];t[e+0+0]=Ne(t[e+0-32],r,n),t[e+1+0]=t[e+0+32]=Ne(r,n,i),t[e+2+0]=t[e+1+32]=t[e+0+64]=Ne(n,i,a),t[e+3+0]=t[e+2+32]=t[e+1+64]=t[e+0+96]=Ne(i,a,o),t[e+3+32]=t[e+2+64]=t[e+1+96]=Ne(a,o,s),t[e+3+64]=t[e+2+96]=Ne(o,s,c),t[e+3+96]=Ne(s,c,c)}function Pe(t,e){var r=t[e-1+0],n=t[e-1+32],i=t[e-1+64],a=t[e-1-32],o=t[e+0-32],s=t[e+1-32],c=t[e+2-32],u=t[e+3-32];t[e+0+0]=t[e+1+64]=a+o+1>>1,t[e+1+0]=t[e+2+64]=o+s+1>>1,t[e+2+0]=t[e+3+64]=s+c+1>>1,t[e+3+0]=c+u+1>>1,t[e+0+96]=Ne(i,n,r),t[e+0+64]=Ne(n,r,a),t[e+0+32]=t[e+1+96]=Ne(r,a,o),t[e+1+32]=t[e+2+96]=Ne(a,o,s),t[e+2+32]=t[e+3+96]=Ne(o,s,c),t[e+3+32]=Ne(s,c,u)}function ke(t,e){var r=t[e+0-32],n=t[e+1-32],i=t[e+2-32],a=t[e+3-32],o=t[e+4-32],s=t[e+5-32],c=t[e+6-32],u=t[e+7-32];t[e+0+0]=r+n+1>>1,t[e+1+0]=t[e+0+64]=n+i+1>>1,t[e+2+0]=t[e+1+64]=i+a+1>>1,t[e+3+0]=t[e+2+64]=a+o+1>>1,t[e+0+32]=Ne(r,n,i),t[e+1+32]=t[e+0+96]=Ne(n,i,a),t[e+2+32]=t[e+1+96]=Ne(i,a,o),t[e+3+32]=t[e+2+96]=Ne(a,o,s),t[e+3+64]=Ne(o,s,c),t[e+3+96]=Ne(s,c,u)}function Fe(t,e){var r=t[e-1+0],n=t[e-1+32],i=t[e-1+64],a=t[e-1+96];t[e+0+0]=r+n+1>>1,t[e+2+0]=t[e+0+32]=n+i+1>>1,t[e+2+32]=t[e+0+64]=i+a+1>>1,t[e+1+0]=Ne(r,n,i),t[e+3+0]=t[e+1+32]=Ne(n,i,a),t[e+3+32]=t[e+1+64]=Ne(i,a,a),t[e+3+64]=t[e+2+64]=t[e+0+96]=t[e+1+96]=t[e+2+96]=t[e+3+96]=a}function Ie(t,e){var r=t[e-1+0],n=t[e-1+32],i=t[e-1+64],a=t[e-1+96],o=t[e-1-32],s=t[e+0-32],c=t[e+1-32],u=t[e+2-32];t[e+0+0]=t[e+2+32]=r+o+1>>1,t[e+0+32]=t[e+2+64]=n+r+1>>1,t[e+0+64]=t[e+2+96]=i+n+1>>1,t[e+0+96]=a+i+1>>1,t[e+3+0]=Ne(s,c,u),t[e+2+0]=Ne(o,s,c),t[e+1+0]=t[e+3+32]=Ne(r,o,s),t[e+1+32]=t[e+3+64]=Ne(n,r,o),t[e+1+64]=t[e+3+96]=Ne(i,n,r),t[e+1+96]=Ne(a,i,n)}function Ce(t,e){var r;for(r=0;8>r;++r)n(t,e+32*r,t,e-32,8)}function je(t,e){var r;for(r=0;8>r;++r)i(t,e,t[e-1],8),e+=32}function Oe(t,e,r){var n;for(n=0;8>n;++n)i(e,r+32*n,t,8)}function Be(t,e){var r,n=8;for(r=0;8>r;++r)n+=t[e+r-32]+t[e-1+32*r];Oe(n>>4,t,e)}function Me(t,e){var r,n=4;for(r=0;8>r;++r)n+=t[e+r-32];Oe(n>>3,t,e)}function Ee(t,e){var r,n=4;for(r=0;8>r;++r)n+=t[e-1+32*r];Oe(n>>3,t,e)}function qe(t,e){Oe(128,t,e)}function De(t,e,r){var n=t[e-r],i=t[e+0],a=3*(i-n)+jn[1020+t[e-2*r]-t[e+r]],o=On[112+(a+4>>3)];t[e-r]=Bn[255+n+On[112+(a+3>>3)]],t[e+0]=Bn[255+i-o]}function Re(t,e,r,n){var i=t[e+0],a=t[e+r];return Mn[255+t[e-2*r]-t[e-r]]>n||Mn[255+a-i]>n}function Te(t,e,r,n){return 4*Mn[255+t[e-r]-t[e+0]]+Mn[255+t[e-2*r]-t[e+r]]<=n}function Ue(t,e,r,n,i){var a=t[e-3*r],o=t[e-2*r],s=t[e-r],c=t[e+0],u=t[e+r],l=t[e+2*r],h=t[e+3*r];return 4*Mn[255+s-c]+Mn[255+o-u]>n?0:Mn[255+t[e-4*r]-a]<=i&&Mn[255+a-o]<=i&&Mn[255+o-s]<=i&&Mn[255+h-l]<=i&&Mn[255+l-u]<=i&&Mn[255+u-c]<=i}function ze(t,e,r,n){var i=2*n+1;for(n=0;16>n;++n)Te(t,e+n,r,i)&&De(t,e+n,r)}function He(t,e,r,n){var i=2*n+1;for(n=0;16>n;++n)Te(t,e+n*r,1,i)&&De(t,e+n*r,1)}function We(t,e,r,n){var i;for(i=3;0<i;--i)ze(t,e+=4*r,r,n)}function Ve(t,e,r,n){var i;for(i=3;0<i;--i)He(t,e+=4,r,n)}function Ge(t,e,r,n,i,a,o,s){for(a=2*a+1;0<i--;){if(Ue(t,e,r,a,o))if(Re(t,e,r,s))De(t,e,r);else{var c=t,u=e,l=r,h=c[u-2*l],f=c[u-l],d=c[u+0],p=c[u+l],g=c[u+2*l],m=27*(b=jn[1020+3*(d-f)+jn[1020+h-p]])+63>>7,v=18*b+63>>7,b=9*b+63>>7;c[u-3*l]=Bn[255+c[u-3*l]+b],c[u-2*l]=Bn[255+h+v],c[u-l]=Bn[255+f+m],c[u+0]=Bn[255+d-m],c[u+l]=Bn[255+p-v],c[u+2*l]=Bn[255+g-b]}e+=n}}function Ye(t,e,r,n,i,a,o,s){for(a=2*a+1;0<i--;){if(Ue(t,e,r,a,o))if(Re(t,e,r,s))De(t,e,r);else{var c=t,u=e,l=r,h=c[u-l],f=c[u+0],d=c[u+l],p=On[112+((g=3*(f-h))+4>>3)],g=On[112+(g+3>>3)],m=p+1>>1;c[u-2*l]=Bn[255+c[u-2*l]+m],c[u-l]=Bn[255+h+g],c[u+0]=Bn[255+f-p],c[u+l]=Bn[255+d-m]}e+=n}}function Je(t,e,r,n,i,a){Ge(t,e,r,1,16,n,i,a)}function Xe(t,e,r,n,i,a){Ge(t,e,1,r,16,n,i,a)}function Ke(t,e,r,n,i,a){var o;for(o=3;0<o;--o)Ye(t,e+=4*r,r,1,16,n,i,a)}function Ze(t,e,r,n,i,a){var o;for(o=3;0<o;--o)Ye(t,e+=4,1,r,16,n,i,a)}function $e(t,e,r,n,i,a,o,s){Ge(t,e,i,1,8,a,o,s),Ge(r,n,i,1,8,a,o,s)}function Qe(t,e,r,n,i,a,o,s){Ge(t,e,1,i,8,a,o,s),Ge(r,n,1,i,8,a,o,s)}function tr(t,e,r,n,i,a,o,s){Ye(t,e+4*i,i,1,8,a,o,s),Ye(r,n+4*i,i,1,8,a,o,s)}function er(t,e,r,n,i,a,o,s){Ye(t,e+4,1,i,8,a,o,s),Ye(r,n+4,1,i,8,a,o,s)}function rr(){this.ba=new ot,this.ec=[],this.cc=[],this.Mc=[],this.Dc=this.Nc=this.dc=this.fc=0,this.Oa=new ct,this.memory=0,this.Ib="OutputFunc",this.Jb="OutputAlphaFunc",this.Nd="OutputRowFunc"}function nr(){this.data=[],this.offset=this.kd=this.ha=this.w=0,this.na=[],this.xa=this.gb=this.Ja=this.Sa=this.P=0}function ir(){this.nc=this.Ea=this.b=this.hc=0,this.K=[],this.w=0}function ar(){this.ua=0,this.Wa=new M,this.vb=new M,this.md=this.xc=this.wc=0,this.vc=[],this.Wb=0,this.Ya=new d,this.yc=new h}function or(){this.xb=this.a=0,this.l=new Gt,this.ca=new ot,this.V=[],this.Ba=0,this.Ta=[],this.Ua=0,this.m=new N,this.Pb=0,this.wd=new N,this.Ma=this.$=this.C=this.i=this.c=this.xd=0,this.s=new ar,this.ab=0,this.gc=o(4,ir),this.Oc=0}function sr(){this.Lc=this.Z=this.$a=this.i=this.c=0,this.l=new Gt,this.ic=0,this.ca=[],this.tb=0,this.qd=null,this.rd=0}function cr(t,e,r,n,i,a,o){for(t=null==t?0:t[e+0],e=0;e<o;++e)i[a+e]=t+r[n+e]&255,t=i[a+e]}function ur(t,e,r,n,i,a,o){var s;if(null==t)cr(null,null,r,n,i,a,o);else for(s=0;s<o;++s)i[a+s]=t[e+s]+r[n+s]&255}function lr(t,e,r,n,i,a,o){if(null==t)cr(null,null,r,n,i,a,o);else{var s,c=t[e+0],u=c,l=c;for(s=0;s<o;++s)u=l+(c=t[e+s])-u,l=r[n+s]+(-256&u?0>u?0:255:u)&255,u=c,i[a+s]=l}}function hr(t,r,i,o){var s=r.width,c=r.o;if(e(null!=t&&null!=r),0>i||0>=o||i+o>c)return null;if(!t.Cc){if(null==t.ga){var u;if(t.ga=new sr,(u=null==t.ga)||(u=r.width*r.o,e(0==t.Gb.length),t.Gb=a(u),t.Uc=0,null==t.Gb?u=0:(t.mb=t.Gb,t.nb=t.Uc,t.rc=null,u=1),u=!u),!u){u=t.ga;var l=t.Fa,h=t.P,f=t.qc,d=t.mb,p=t.nb,g=h+1,m=f-1,b=u.l;if(e(null!=l&&null!=d&&null!=r),mi[0]=null,mi[1]=cr,mi[2]=ur,mi[3]=lr,u.ca=d,u.tb=p,u.c=r.width,u.i=r.height,e(0<u.c&&0<u.i),1>=f)r=0;else if(u.$a=l[h+0]>>0&3,u.Z=l[h+0]>>2&3,u.Lc=l[h+0]>>4&3,h=l[h+0]>>6&3,0>u.$a||1<u.$a||4<=u.Z||1<u.Lc||h)r=0;else if(b.put=dt,b.ac=ft,b.bc=pt,b.ma=u,b.width=r.width,b.height=r.height,b.Da=r.Da,b.v=r.v,b.va=r.va,b.j=r.j,b.o=r.o,u.$a)t:{e(1==u.$a),r=kt();e:for(;;){if(null==r){r=0;break t}if(e(null!=u),u.mc=r,r.c=u.c,r.i=u.i,r.l=u.l,r.l.ma=u,r.l.width=u.c,r.l.height=u.i,r.a=0,v(r.m,l,g,m),!Ft(u.c,u.i,1,r,null))break e;if(1==r.ab&&3==r.gc[0].hc&&At(r.s)?(u.ic=1,l=r.c*r.i,r.Ta=null,r.Ua=0,r.V=a(l),r.Ba=0,null==r.V?(r.a=1,r=0):r=1):(u.ic=0,r=It(r,u.c)),!r)break e;r=1;break t}u.mc=null,r=0}else r=m>=u.c*u.i;u=!r}if(u)return null;1!=t.ga.Lc?t.Ga=0:o=c-i}e(null!=t.ga),e(i+o<=c);t:{if(r=(l=t.ga).c,c=l.l.o,0==l.$a){if(g=t.rc,m=t.Vc,b=t.Fa,h=t.P+1+i*r,f=t.mb,d=t.nb+i*r,e(h<=t.P+t.qc),0!=l.Z)for(e(null!=mi[l.Z]),u=0;u<o;++u)mi[l.Z](g,m,b,h,f,d,r),g=f,m=d,d+=r,h+=r;else for(u=0;u<o;++u)n(f,d,b,h,r),g=f,m=d,d+=r,h+=r;t.rc=g,t.Vc=m}else{if(e(null!=l.mc),r=i+o,e(null!=(u=l.mc)),e(r<=u.i),u.C>=r)r=1;else if(l.ic||mr(),l.ic){l=u.V,g=u.Ba,m=u.c;var y=u.i,w=(b=1,h=u.$/m,f=u.$%m,d=u.m,p=u.s,u.$),N=m*y,L=m*r,x=p.wc,_=w<L?wt(p,f,h):null;e(w<=N),e(r<=y),e(At(p));e:for(;;){for(;!d.h&&w<L;){if(f&x||(_=wt(p,f,h)),e(null!=_),S(d),256>(y=bt(_.G[0],_.H[0],d)))l[g+w]=y,++w,++f>=m&&(f=0,++h<=r&&!(h%16)&&St(u,h));else{if(!(280>y)){b=0;break e}y=mt(y-256,d);var P,k=bt(_.G[4],_.H[4],d);if(S(d),!(w>=(k=vt(m,k=mt(k,d)))&&N-w>=y)){b=0;break e}for(P=0;P<y;++P)l[g+w+P]=l[g+w+P-k];for(w+=y,f+=y;f>=m;)f-=m,++h<=r&&!(h%16)&&St(u,h);w<L&&f&x&&(_=wt(p,f,h))}e(d.h==A(d))}St(u,h>r?r:h);break e}!b||d.h&&w<N?(b=0,u.a=d.h?5:3):u.$=w,r=b}else r=_t(u,u.V,u.Ba,u.c,u.i,r,Ct);if(!r){o=0;break t}}i+o>=c&&(t.Cc=1),o=1}if(!o)return null;if(t.Cc&&(null!=(o=t.ga)&&(o.mc=null),t.ga=null,0<t.Ga))return alert("todo:WebPDequantizeLevels"),null}return t.nb+i*s}function fr(t,e,r,n,i,a){for(;0<i--;){var o,s=t,c=e+(r?1:0),u=t,l=e+(r?0:3);for(o=0;o<n;++o){var h=u[l+4*o];255!=h&&(h*=32897,s[c+4*o+0]=s[c+4*o+0]*h>>23,s[c+4*o+1]=s[c+4*o+1]*h>>23,s[c+4*o+2]=s[c+4*o+2]*h>>23)}e+=a}}function dr(t,e,r,n,i){for(;0<n--;){var a;for(a=0;a<r;++a){var o=t[e+2*a+0],s=15&(u=t[e+2*a+1]),c=4369*s,u=(240&u|u>>4)*c>>16;t[e+2*a+0]=(240&o|o>>4)*c>>16&240|(15&o|o<<4)*c>>16>>4&15,t[e+2*a+1]=240&u|s}e+=i}}function pr(t,e,r,n,i,a,o,s){var c,u,l=255;for(u=0;u<i;++u){for(c=0;c<n;++c){var h=t[e+c];a[o+4*c]=h,l&=h}e+=r,o+=s}return 255!=l}function gr(t,e,r,n,i){var a;for(a=0;a<i;++a)r[n+a]=t[e+a]>>8}function mr(){An=fr,xn=dr,Sn=pr,_n=gr}function vr(r,n,i){t[r]=function(t,r,a,o,s,c,u,l,h,f,d,p,g,m,v,b,y){var w,N=y-1>>1,L=s[c+0]|u[l+0]<<16,A=h[f+0]|d[p+0]<<16;e(null!=t);var x=3*L+A+131074>>2;for(n(t[r+0],255&x,x>>16,g,m),null!=a&&(x=3*A+L+131074>>2,n(a[o+0],255&x,x>>16,v,b)),w=1;w<=N;++w){var S=s[c+w]|u[l+w]<<16,_=h[f+w]|d[p+w]<<16,P=L+S+A+_+524296,k=P+2*(S+A)>>3;x=k+L>>1,L=(P=P+2*(L+_)>>3)+S>>1,n(t[r+2*w-1],255&x,x>>16,g,m+(2*w-1)*i),n(t[r+2*w-0],255&L,L>>16,g,m+(2*w-0)*i),null!=a&&(x=P+A>>1,L=k+_>>1,n(a[o+2*w-1],255&x,x>>16,v,b+(2*w-1)*i),n(a[o+2*w+0],255&L,L>>16,v,b+(2*w+0)*i)),L=S,A=_}1&y||(x=3*L+A+131074>>2,n(t[r+y-1],255&x,x>>16,g,m+(y-1)*i),null!=a&&(x=3*A+L+131074>>2,n(a[o+y-1],255&x,x>>16,v,b+(y-1)*i)))}}function br(){vi[En]=bi,vi[qn]=wi,vi[Dn]=yi,vi[Rn]=Ni,vi[Tn]=Li,vi[Un]=Ai,vi[zn]=xi,vi[Hn]=wi,vi[Wn]=Ni,vi[Vn]=Li,vi[Gn]=Ai}function yr(t){return t&~Ii?0>t?0:255:t>>Fi}function wr(t,e){return yr((19077*t>>8)+(26149*e>>8)-14234)}function Nr(t,e,r){return yr((19077*t>>8)-(6419*e>>8)-(13320*r>>8)+8708)}function Lr(t,e){return yr((19077*t>>8)+(33050*e>>8)-17685)}function Ar(t,e,r,n,i){n[i+0]=wr(t,r),n[i+1]=Nr(t,e,r),n[i+2]=Lr(t,e)}function xr(t,e,r,n,i){n[i+0]=Lr(t,e),n[i+1]=Nr(t,e,r),n[i+2]=wr(t,r)}function Sr(t,e,r,n,i){var a=Nr(t,e,r);e=a<<3&224|Lr(t,e)>>3,n[i+0]=248&wr(t,r)|a>>5,n[i+1]=e}function _r(t,e,r,n,i){var a=240&Lr(t,e)|15;n[i+0]=240&wr(t,r)|Nr(t,e,r)>>4,n[i+1]=a}function Pr(t,e,r,n,i){n[i+0]=255,Ar(t,e,r,n,i+1)}function kr(t,e,r,n,i){xr(t,e,r,n,i),n[i+3]=255}function Fr(t,e,r,n,i){Ar(t,e,r,n,i),n[i+3]=255}function Vt(t,e){return 0>t?0:t>e?e:t}function Ir(e,r,n){t[e]=function(t,e,i,a,o,s,c,u,l){for(var h=u+(-2&l)*n;u!=h;)r(t[e+0],i[a+0],o[s+0],c,u),r(t[e+1],i[a+0],o[s+0],c,u+n),e+=2,++a,++s,u+=2*n;1&l&&r(t[e+0],i[a+0],o[s+0],c,u)}}function Cr(t,e,r){return 0==r?0==t?0==e?6:5:0==e?4:0:r}function jr(t,e,r,n,i){switch(t>>>30){case 3:on(e,r,n,i,0);break;case 2:sn(e,r,n,i);break;case 1:un(e,r,n,i)}}function Or(t,e){var r,a,o=e.M,s=e.Nb,c=t.oc,u=t.pc+40,l=t.oc,h=t.pc+584,f=t.oc,d=t.pc+600;for(r=0;16>r;++r)c[u+32*r-1]=129;for(r=0;8>r;++r)l[h+32*r-1]=129,f[d+32*r-1]=129;for(0<o?c[u-1-32]=l[h-1-32]=f[d-1-32]=129:(i(c,u-32-1,127,21),i(l,h-32-1,127,9),i(f,d-32-1,127,9)),a=0;a<t.za;++a){var p=e.ya[e.aa+a];if(0<a){for(r=-1;16>r;++r)n(c,u+32*r-4,c,u+32*r+12,4);for(r=-1;8>r;++r)n(l,h+32*r-4,l,h+32*r+4,4),n(f,d+32*r-4,f,d+32*r+4,4)}var g=t.Gd,m=t.Hd+a,v=p.ad,b=p.Hc;if(0<o&&(n(c,u-32,g[m].y,0,16),n(l,h-32,g[m].f,0,8),n(f,d-32,g[m].ea,0,8)),p.Za){var y=c,w=u-32+16;for(0<o&&(a>=t.za-1?i(y,w,g[m].y[15],4):n(y,w,g[m+1].y,0,4)),r=0;4>r;r++)y[w+128+r]=y[w+256+r]=y[w+384+r]=y[w+0+r];for(r=0;16>r;++r,b<<=2)y=c,w=u+Di[r],fi[p.Ob[r]](y,w),jr(b,v,16*+r,y,w)}else if(y=Cr(a,o,p.Ob[0]),hi[y](c,u),0!=b)for(r=0;16>r;++r,b<<=2)jr(b,v,16*+r,c,u+Di[r]);for(r=p.Gc,y=Cr(a,o,p.Dd),di[y](l,h),di[y](f,d),b=v,y=l,w=h,255&(p=r>>0)&&(170&p?cn(b,256,y,w):ln(b,256,y,w)),p=f,b=d,255&(r>>=8)&&(170&r?cn(v,320,p,b):ln(v,320,p,b)),o<t.Ub-1&&(n(g[m].y,0,c,u+480,16),n(g[m].f,0,l,h+224,8),n(g[m].ea,0,f,d+224,8)),r=8*s*t.B,g=t.sa,m=t.ta+16*a+16*s*t.R,v=t.qa,p=t.ra+8*a+r,b=t.Ha,y=t.Ia+8*a+r,r=0;16>r;++r)n(g,m+r*t.R,c,u+32*r,16);for(r=0;8>r;++r)n(v,p+r*t.B,l,h+32*r,8),n(b,y+r*t.B,f,d+32*r,8)}}function Br(t,n,i,a,o,s,c,u,l){var h=[0],f=[0],d=0,p=null!=l?l.kd:0,g=null!=l?l:new nr;if(null==t||12>i)return 7;g.data=t,g.w=n,g.ha=i,n=[n],i=[i],g.gb=[g.gb];t:{var m=n,b=i,y=g.gb;if(e(null!=t),e(null!=b),e(null!=y),y[0]=0,12<=b[0]&&!r(t,m[0],"RIFF")){if(r(t,m[0]+8,"WEBP")){y=3;break t}var w=j(t,m[0]+4);if(12>w||4294967286<w){y=3;break t}if(p&&w>b[0]-8){y=7;break t}y[0]=w,m[0]+=12,b[0]-=12}y=0}if(0!=y)return y;for(w=0<g.gb[0],i=i[0];;){t:{var L=t;b=n,y=i;var A=h,x=f,S=m=[0];if((k=d=[d])[0]=0,8>y[0])y=7;else{if(!r(L,b[0],"VP8X")){if(10!=j(L,b[0]+4)){y=3;break t}if(18>y[0]){y=7;break t}var _=j(L,b[0]+8),P=1+C(L,b[0]+12);if(2147483648<=P*(L=1+C(L,b[0]+15))){y=3;break t}null!=S&&(S[0]=_),null!=A&&(A[0]=P),null!=x&&(x[0]=L),b[0]+=18,y[0]-=18,k[0]=1}y=0}}if(d=d[0],m=m[0],0!=y)return y;if(b=!!(2&m),!w&&d)return 3;if(null!=s&&(s[0]=!!(16&m)),null!=c&&(c[0]=b),null!=u&&(u[0]=0),c=h[0],m=f[0],d&&b&&null==l){y=0;break}if(4>i){y=7;break}if(w&&d||!w&&!d&&!r(t,n[0],"ALPH")){i=[i],g.na=[g.na],g.P=[g.P],g.Sa=[g.Sa];t:{_=t,y=n,w=i;var k=g.gb;A=g.na,x=g.P,S=g.Sa;P=22,e(null!=_),e(null!=w),L=y[0];var F=w[0];for(e(null!=A),e(null!=S),A[0]=null,x[0]=null,S[0]=0;;){if(y[0]=L,w[0]=F,8>F){y=7;break t}var I=j(_,L+4);if(4294967286<I){y=3;break t}var O=8+I+1&-2;if(P+=O,0<k&&P>k){y=3;break t}if(!r(_,L,"VP8 ")||!r(_,L,"VP8L")){y=0;break t}if(F[0]<O){y=7;break t}r(_,L,"ALPH")||(A[0]=_,x[0]=L+8,S[0]=I),L+=O,F-=O}}if(i=i[0],g.na=g.na[0],g.P=g.P[0],g.Sa=g.Sa[0],0!=y)break}i=[i],g.Ja=[g.Ja],g.xa=[g.xa];t:if(k=t,y=n,w=i,A=g.gb[0],x=g.Ja,S=g.xa,_=y[0],L=!r(k,_,"VP8 "),P=!r(k,_,"VP8L"),e(null!=k),e(null!=w),e(null!=x),e(null!=S),8>w[0])y=7;else{if(L||P){if(k=j(k,_+4),12<=A&&k>A-12){y=3;break t}if(p&&k>w[0]-8){y=7;break t}x[0]=k,y[0]+=8,w[0]-=8,S[0]=P}else S[0]=5<=w[0]&&47==k[_+0]&&!(k[_+4]>>5),x[0]=w[0];y=0}if(i=i[0],g.Ja=g.Ja[0],g.xa=g.xa[0],n=n[0],0!=y)break;if(4294967286<g.Ja)return 3;if(null==u||b||(u[0]=g.xa?2:1),c=[c],m=[m],g.xa){if(5>i){y=7;break}u=c,p=m,b=s,null==t||5>i?t=0:5<=i&&47==t[n+0]&&!(t[n+4]>>5)?(w=[0],k=[0],A=[0],v(x=new N,t,n,i),gt(x,w,k,A)?(null!=u&&(u[0]=w[0]),null!=p&&(p[0]=k[0]),null!=b&&(b[0]=A[0]),t=1):t=0):t=0}else{if(10>i){y=7;break}u=m,null==t||10>i||!Xt(t,n+3,i-3)?t=0:(p=t[n+0]|t[n+1]<<8|t[n+2]<<16,b=16383&(t[n+7]<<8|t[n+6]),t=16383&(t[n+9]<<8|t[n+8]),1&p||3<(p>>1&7)||!(p>>4&1)||p>>5>=g.Ja||!b||!t?t=0:(c&&(c[0]=b),u&&(u[0]=t),t=1))}if(!t)return 3;if(c=c[0],m=m[0],d&&(h[0]!=c||f[0]!=m))return 3;null!=l&&(l[0]=g,l.offset=n-l.w,e(4294967286>n-l.w),e(l.offset==l.ha-i));break}return 0==y||7==y&&d&&null==l?(null!=s&&(s[0]|=null!=g.na&&0<g.na.length),null!=a&&(a[0]=c),null!=o&&(o[0]=m),0):y}function Mr(t,e,r){var n=e.width,i=e.height,a=0,o=0,s=n,c=i;if(e.Da=null!=t&&0<t.Da,e.Da&&(s=t.cd,c=t.bd,a=t.v,o=t.j,11>r||(a&=-2,o&=-2),0>a||0>o||0>=s||0>=c||a+s>n||o+c>i))return 0;if(e.v=a,e.j=o,e.va=a+s,e.o=o+c,e.U=s,e.T=c,e.da=null!=t&&0<t.da,e.da){if(!E(s,c,r=[t.ib],a=[t.hb]))return 0;e.ib=r[0],e.hb=a[0]}return e.ob=null!=t&&t.ob,e.Kb=null==t||!t.Sd,e.da&&(e.ob=e.ib<3*n/4&&e.hb<3*i/4,e.Kb=0),1}function Er(t){if(null==t)return 2;if(11>t.S){var e=t.f.RGBA;e.fb+=(t.height-1)*e.A,e.A=-e.A}else e=t.f.kb,t=t.height,e.O+=(t-1)*e.fa,e.fa=-e.fa,e.N+=(t-1>>1)*e.Ab,e.Ab=-e.Ab,e.W+=(t-1>>1)*e.Db,e.Db=-e.Db,null!=e.F&&(e.J+=(t-1)*e.lb,e.lb=-e.lb);return 0}function qr(t,e,r,n){if(null==n||0>=t||0>=e)return 2;if(null!=r){if(r.Da){var i=r.cd,o=r.bd,s=-2&r.v,c=-2&r.j;if(0>s||0>c||0>=i||0>=o||s+i>t||c+o>e)return 2;t=i,e=o}if(r.da){if(!E(t,e,i=[r.ib],o=[r.hb]))return 2;t=i[0],e=o[0]}}n.width=t,n.height=e;t:{var u=n.width,l=n.height;if(t=n.S,0>=u||0>=l||!(t>=En&&13>t))t=2;else{if(0>=n.Rd&&null==n.sd){s=o=i=e=0;var h=(c=u*zi[t])*l;if(11>t||(o=(l+1)/2*(e=(u+1)/2),12==t&&(s=(i=u)*l)),null==(l=a(h+2*o+s))){t=1;break t}n.sd=l,11>t?((u=n.f.RGBA).eb=l,u.fb=0,u.A=c,u.size=h):((u=n.f.kb).y=l,u.O=0,u.fa=c,u.Fd=h,u.f=l,u.N=0+h,u.Ab=e,u.Cd=o,u.ea=l,u.W=0+h+o,u.Db=e,u.Ed=o,12==t&&(u.F=l,u.J=0+h+2*o),u.Tc=s,u.lb=i)}if(e=1,i=n.S,o=n.width,s=n.height,i>=En&&13>i)if(11>i)t=n.f.RGBA,e&=(c=Math.abs(t.A))*(s-1)+o<=t.size,e&=c>=o*zi[i],e&=null!=t.eb;else{t=n.f.kb,c=(o+1)/2,h=(s+1)/2,u=Math.abs(t.fa);l=Math.abs(t.Ab);var f=Math.abs(t.Db),d=Math.abs(t.lb),p=d*(s-1)+o;e&=u*(s-1)+o<=t.Fd,e&=l*(h-1)+c<=t.Cd,e=(e&=f*(h-1)+c<=t.Ed)&u>=o&l>=c&f>=c,e&=null!=t.y,e&=null!=t.f,e&=null!=t.ea,12==i&&(e&=d>=o,e&=p<=t.Tc,e&=null!=t.F)}else e=0;t=e?0:2}}return 0!=t||null!=r&&r.fd&&(t=Er(n)),t}var Dr=64,Rr=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215],Tr=24,Ur=32,zr=8,Hr=[0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7];R("Predictor0","PredictorAdd0"),t.Predictor0=function(){return 4278190080},t.Predictor1=function(t){return t},t.Predictor2=function(t,e,r){return e[r+0]},t.Predictor3=function(t,e,r){return e[r+1]},t.Predictor4=function(t,e,r){return e[r-1]},t.Predictor5=function(t,e,r){return U(U(t,e[r+1]),e[r+0])},t.Predictor6=function(t,e,r){return U(t,e[r-1])},t.Predictor7=function(t,e,r){return U(t,e[r+0])},t.Predictor8=function(t,e,r){return U(e[r-1],e[r+0])},t.Predictor9=function(t,e,r){return U(e[r+0],e[r+1])},t.Predictor10=function(t,e,r){return U(U(t,e[r-1]),U(e[r+0],e[r+1]))},t.Predictor11=function(t,e,r){var n=e[r+0];return 0>=W(n>>24&255,t>>24&255,(e=e[r-1])>>24&255)+W(n>>16&255,t>>16&255,e>>16&255)+W(n>>8&255,t>>8&255,e>>8&255)+W(255&n,255&t,255&e)?n:t},t.Predictor12=function(t,e,r){var n=e[r+0];return(z((t>>24&255)+(n>>24&255)-((e=e[r-1])>>24&255))<<24|z((t>>16&255)+(n>>16&255)-(e>>16&255))<<16|z((t>>8&255)+(n>>8&255)-(e>>8&255))<<8|z((255&t)+(255&n)-(255&e)))>>>0},t.Predictor13=function(t,e,r){var n=e[r-1];return(H((t=U(t,e[r+0]))>>24&255,n>>24&255)<<24|H(t>>16&255,n>>16&255)<<16|H(t>>8&255,n>>8&255)<<8|H(t>>0&255,n>>0&255))>>>0};var Wr=t.PredictorAdd0;t.PredictorAdd1=V,R("Predictor2","PredictorAdd2"),R("Predictor3","PredictorAdd3"),R("Predictor4","PredictorAdd4"),R("Predictor5","PredictorAdd5"),R("Predictor6","PredictorAdd6"),R("Predictor7","PredictorAdd7"),R("Predictor8","PredictorAdd8"),R("Predictor9","PredictorAdd9"),R("Predictor10","PredictorAdd10"),R("Predictor11","PredictorAdd11"),R("Predictor12","PredictorAdd12"),R("Predictor13","PredictorAdd13");var Vr=t.PredictorAdd2;X("ColorIndexInverseTransform","MapARGB","32b",(function(t){return t>>8&255}),(function(t){return t})),X("VP8LColorIndexInverseTransformAlpha","MapAlpha","8b",(function(t){return t}),(function(t){return t>>8&255}));var Gr,Yr=t.ColorIndexInverseTransform,Jr=t.MapARGB,Xr=t.VP8LColorIndexInverseTransformAlpha,Kr=t.MapAlpha,Zr=t.VP8LPredictorsAdd=[];Zr.length=16,(t.VP8LPredictors=[]).length=16,(t.VP8LPredictorsAdd_C=[]).length=16,(t.VP8LPredictors_C=[]).length=16;var $r,Qr,tn,en,rn,nn,an,on,sn,cn,un,ln,hn,fn,dn,pn,gn,mn,vn,bn,yn,wn,Nn,Ln,An,xn,Sn,_n,Pn=a(511),kn=a(2041),Fn=a(225),In=a(767),Cn=0,jn=kn,On=Fn,Bn=In,Mn=Pn,En=0,qn=1,Dn=2,Rn=3,Tn=4,Un=5,zn=6,Hn=7,Wn=8,Vn=9,Gn=10,Yn=[2,3,7],Jn=[3,3,11],Xn=[280,256,256,256,40],Kn=[0,1,1,1,0],Zn=[17,18,0,1,2,3,4,5,16,6,7,8,9,10,11,12,13,14,15],$n=[24,7,23,25,40,6,39,41,22,26,38,42,56,5,55,57,21,27,54,58,37,43,72,4,71,73,20,28,53,59,70,74,36,44,88,69,75,52,60,3,87,89,19,29,86,90,35,45,68,76,85,91,51,61,104,2,103,105,18,30,102,106,34,46,84,92,67,77,101,107,50,62,120,1,119,121,83,93,17,31,100,108,66,78,118,122,33,47,117,123,49,63,99,109,82,94,0,116,124,65,79,16,32,98,110,48,115,125,81,95,64,114,126,97,111,80,113,127,96,112],Qn=[2954,2956,2958,2962,2970,2986,3018,3082,3212,3468,3980,5004],ti=8,ei=[4,5,6,7,8,9,10,10,11,12,13,14,15,16,17,17,18,19,20,20,21,21,22,22,23,23,24,25,25,26,27,28,29,30,31,32,33,34,35,36,37,37,38,39,40,41,42,43,44,45,46,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,76,77,78,79,80,81,82,83,84,85,86,87,88,89,91,93,95,96,98,100,101,102,104,106,108,110,112,114,116,118,122,124,126,128,130,132,134,136,138,140,143,145,148,151,154,157],ri=[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,119,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,177,181,185,189,193,197,201,205,209,213,217,221,225,229,234,239,245,249,254,259,264,269,274,279,284],ni=null,ii=[[173,148,140,0],[176,155,140,135,0],[180,157,141,134,130,0],[254,254,243,230,196,177,153,140,133,130,129,0]],ai=[0,1,4,8,5,2,3,6,9,12,13,10,7,11,14,15],oi=[-0,1,-1,2,-2,3,4,6,-3,5,-4,-5,-6,7,-7,8,-8,-9],si=[[[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]],[[253,136,254,255,228,219,128,128,128,128,128],[189,129,242,255,227,213,255,219,128,128,128],[106,126,227,252,214,209,255,255,128,128,128]],[[1,98,248,255,236,226,255,255,128,128,128],[181,133,238,254,221,234,255,154,128,128,128],[78,134,202,247,198,180,255,219,128,128,128]],[[1,185,249,255,243,255,128,128,128,128,128],[184,150,247,255,236,224,128,128,128,128,128],[77,110,216,255,236,230,128,128,128,128,128]],[[1,101,251,255,241,255,128,128,128,128,128],[170,139,241,252,236,209,255,255,128,128,128],[37,116,196,243,228,255,255,255,128,128,128]],[[1,204,254,255,245,255,128,128,128,128,128],[207,160,250,255,238,128,128,128,128,128,128],[102,103,231,255,211,171,128,128,128,128,128]],[[1,152,252,255,240,255,128,128,128,128,128],[177,135,243,255,234,225,128,128,128,128,128],[80,129,211,255,194,224,128,128,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[246,1,255,128,128,128,128,128,128,128,128],[255,128,128,128,128,128,128,128,128,128,128]]],[[[198,35,237,223,193,187,162,160,145,155,62],[131,45,198,221,172,176,220,157,252,221,1],[68,47,146,208,149,167,221,162,255,223,128]],[[1,149,241,255,221,224,255,255,128,128,128],[184,141,234,253,222,220,255,199,128,128,128],[81,99,181,242,176,190,249,202,255,255,128]],[[1,129,232,253,214,197,242,196,255,255,128],[99,121,210,250,201,198,255,202,128,128,128],[23,91,163,242,170,187,247,210,255,255,128]],[[1,200,246,255,234,255,128,128,128,128,128],[109,178,241,255,231,245,255,255,128,128,128],[44,130,201,253,205,192,255,255,128,128,128]],[[1,132,239,251,219,209,255,165,128,128,128],[94,136,225,251,218,190,255,255,128,128,128],[22,100,174,245,186,161,255,199,128,128,128]],[[1,182,249,255,232,235,128,128,128,128,128],[124,143,241,255,227,234,128,128,128,128,128],[35,77,181,251,193,211,255,205,128,128,128]],[[1,157,247,255,236,231,255,255,128,128,128],[121,141,235,255,225,227,255,255,128,128,128],[45,99,188,251,195,217,255,224,128,128,128]],[[1,1,251,255,213,255,128,128,128,128,128],[203,1,248,255,255,128,128,128,128,128,128],[137,1,177,255,224,255,128,128,128,128,128]]],[[[253,9,248,251,207,208,255,192,128,128,128],[175,13,224,243,193,185,249,198,255,255,128],[73,17,171,221,161,179,236,167,255,234,128]],[[1,95,247,253,212,183,255,255,128,128,128],[239,90,244,250,211,209,255,255,128,128,128],[155,77,195,248,188,195,255,255,128,128,128]],[[1,24,239,251,218,219,255,205,128,128,128],[201,51,219,255,196,186,128,128,128,128,128],[69,46,190,239,201,218,255,228,128,128,128]],[[1,191,251,255,255,128,128,128,128,128,128],[223,165,249,255,213,255,128,128,128,128,128],[141,124,248,255,255,128,128,128,128,128,128]],[[1,16,248,255,255,128,128,128,128,128,128],[190,36,230,255,236,255,128,128,128,128,128],[149,1,255,128,128,128,128,128,128,128,128]],[[1,226,255,128,128,128,128,128,128,128,128],[247,192,255,128,128,128,128,128,128,128,128],[240,128,255,128,128,128,128,128,128,128,128]],[[1,134,252,255,255,128,128,128,128,128,128],[213,62,250,255,255,128,128,128,128,128,128],[55,93,255,128,128,128,128,128,128,128,128]],[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]]],[[[202,24,213,235,186,191,220,160,240,175,255],[126,38,182,232,169,184,228,174,255,187,128],[61,46,138,219,151,178,240,170,255,216,128]],[[1,112,230,250,199,191,247,159,255,255,128],[166,109,228,252,211,215,255,174,128,128,128],[39,77,162,232,172,180,245,178,255,255,128]],[[1,52,220,246,198,199,249,220,255,255,128],[124,74,191,243,183,193,250,221,255,255,128],[24,71,130,219,154,170,243,182,255,255,128]],[[1,182,225,249,219,240,255,224,128,128,128],[149,150,226,252,216,205,255,171,128,128,128],[28,108,170,242,183,194,254,223,255,255,128]],[[1,81,230,252,204,203,255,192,128,128,128],[123,102,209,247,188,196,255,233,128,128,128],[20,95,153,243,164,173,255,203,128,128,128]],[[1,222,248,255,216,213,128,128,128,128,128],[168,175,246,252,235,205,255,255,128,128,128],[47,116,215,255,211,212,255,255,128,128,128]],[[1,121,236,253,212,214,255,255,128,128,128],[141,84,213,252,201,202,255,219,128,128,128],[42,80,160,240,162,185,255,205,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[244,1,255,128,128,128,128,128,128,128,128],[238,1,255,128,128,128,128,128,128,128,128]]]],ci=[[[231,120,48,89,115,113,120,152,112],[152,179,64,126,170,118,46,70,95],[175,69,143,80,85,82,72,155,103],[56,58,10,171,218,189,17,13,152],[114,26,17,163,44,195,21,10,173],[121,24,80,195,26,62,44,64,85],[144,71,10,38,171,213,144,34,26],[170,46,55,19,136,160,33,206,71],[63,20,8,114,114,208,12,9,226],[81,40,11,96,182,84,29,16,36]],[[134,183,89,137,98,101,106,165,148],[72,187,100,130,157,111,32,75,80],[66,102,167,99,74,62,40,234,128],[41,53,9,178,241,141,26,8,107],[74,43,26,146,73,166,49,23,157],[65,38,105,160,51,52,31,115,128],[104,79,12,27,217,255,87,17,7],[87,68,71,44,114,51,15,186,23],[47,41,14,110,182,183,21,17,194],[66,45,25,102,197,189,23,18,22]],[[88,88,147,150,42,46,45,196,205],[43,97,183,117,85,38,35,179,61],[39,53,200,87,26,21,43,232,171],[56,34,51,104,114,102,29,93,77],[39,28,85,171,58,165,90,98,64],[34,22,116,206,23,34,43,166,73],[107,54,32,26,51,1,81,43,31],[68,25,106,22,64,171,36,225,114],[34,19,21,102,132,188,16,76,124],[62,18,78,95,85,57,50,48,51]],[[193,101,35,159,215,111,89,46,111],[60,148,31,172,219,228,21,18,111],[112,113,77,85,179,255,38,120,114],[40,42,1,196,245,209,10,25,109],[88,43,29,140,166,213,37,43,154],[61,63,30,155,67,45,68,1,209],[100,80,8,43,154,1,51,26,71],[142,78,78,16,255,128,34,197,171],[41,40,5,102,211,183,4,1,221],[51,50,17,168,209,192,23,25,82]],[[138,31,36,171,27,166,38,44,229],[67,87,58,169,82,115,26,59,179],[63,59,90,180,59,166,93,73,154],[40,40,21,116,143,209,34,39,175],[47,15,16,183,34,223,49,45,183],[46,17,33,183,6,98,15,32,183],[57,46,22,24,128,1,54,17,37],[65,32,73,115,28,128,23,128,205],[40,3,9,115,51,192,18,6,223],[87,37,9,115,59,77,64,21,47]],[[104,55,44,218,9,54,53,130,226],[64,90,70,205,40,41,23,26,57],[54,57,112,184,5,41,38,166,213],[30,34,26,133,152,116,10,32,134],[39,19,53,221,26,114,32,73,255],[31,9,65,234,2,15,1,118,73],[75,32,12,51,192,255,160,43,51],[88,31,35,67,102,85,55,186,85],[56,21,23,111,59,205,45,37,192],[55,38,70,124,73,102,1,34,98]],[[125,98,42,88,104,85,117,175,82],[95,84,53,89,128,100,113,101,45],[75,79,123,47,51,128,81,171,1],[57,17,5,71,102,57,53,41,49],[38,33,13,121,57,73,26,1,85],[41,10,67,138,77,110,90,47,114],[115,21,2,10,102,255,166,23,6],[101,29,16,10,85,128,101,196,26],[57,18,10,102,102,213,34,20,43],[117,20,15,36,163,128,68,1,26]],[[102,61,71,37,34,53,31,243,192],[69,60,71,38,73,119,28,222,37],[68,45,128,34,1,47,11,245,171],[62,17,19,70,146,85,55,62,70],[37,43,37,154,100,163,85,160,1],[63,9,92,136,28,64,32,201,85],[75,15,9,9,64,255,184,119,16],[86,6,28,5,64,255,25,248,1],[56,8,17,132,137,255,55,116,128],[58,15,20,82,135,57,26,121,40]],[[164,50,31,137,154,133,25,35,218],[51,103,44,131,131,123,31,6,158],[86,40,64,135,148,224,45,183,128],[22,26,17,131,240,154,14,1,209],[45,16,21,91,64,222,7,1,197],[56,21,39,155,60,138,23,102,213],[83,12,13,54,192,255,68,47,28],[85,26,85,85,128,128,32,146,171],[18,11,7,63,144,171,4,4,246],[35,27,10,146,174,171,12,26,128]],[[190,80,35,99,180,80,126,54,45],[85,126,47,87,176,51,41,20,32],[101,75,128,139,118,146,116,128,85],[56,41,15,176,236,85,37,9,62],[71,30,17,119,118,255,17,18,138],[101,38,60,138,55,70,43,26,142],[146,36,19,30,171,255,97,27,20],[138,45,61,62,219,1,81,188,64],[32,41,20,117,151,142,20,21,163],[112,19,12,61,195,128,48,4,24]]],ui=[[[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[176,246,255,255,255,255,255,255,255,255,255],[223,241,252,255,255,255,255,255,255,255,255],[249,253,253,255,255,255,255,255,255,255,255]],[[255,244,252,255,255,255,255,255,255,255,255],[234,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255]],[[255,246,254,255,255,255,255,255,255,255,255],[239,253,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[251,255,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[251,254,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,254,253,255,254,255,255,255,255,255,255],[250,255,254,255,254,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[217,255,255,255,255,255,255,255,255,255,255],[225,252,241,253,255,255,254,255,255,255,255],[234,250,241,250,253,255,253,254,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[223,254,254,255,255,255,255,255,255,255,255],[238,253,254,254,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[249,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,255,255,255,255,255,255,255,255,255],[247,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[252,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[186,251,250,255,255,255,255,255,255,255,255],[234,251,244,254,255,255,255,255,255,255,255],[251,251,243,253,254,255,254,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[236,253,254,255,255,255,255,255,255,255,255],[251,253,253,254,254,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[254,254,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[254,254,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[248,255,255,255,255,255,255,255,255,255,255],[250,254,252,254,255,255,255,255,255,255,255],[248,254,249,253,255,255,255,255,255,255,255]],[[255,253,253,255,255,255,255,255,255,255,255],[246,253,253,255,255,255,255,255,255,255,255],[252,254,251,254,254,255,255,255,255,255,255]],[[255,254,252,255,255,255,255,255,255,255,255],[248,254,253,255,255,255,255,255,255,255,255],[253,255,254,254,255,255,255,255,255,255,255]],[[255,251,254,255,255,255,255,255,255,255,255],[245,251,254,255,255,255,255,255,255,255,255],[253,253,254,255,255,255,255,255,255,255,255]],[[255,251,253,255,255,255,255,255,255,255,255],[252,253,254,255,255,255,255,255,255,255,255],[255,254,255,255,255,255,255,255,255,255,255]],[[255,252,255,255,255,255,255,255,255,255,255],[249,255,254,255,255,255,255,255,255,255,255],[255,255,254,255,255,255,255,255,255,255,255]],[[255,255,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]]],li=[0,1,2,3,6,4,5,6,6,6,6,6,6,6,6,7,0],hi=[],fi=[],di=[],pi=1,gi=2,mi=[],vi=[];vr("UpsampleRgbLinePair",Ar,3),vr("UpsampleBgrLinePair",xr,3),vr("UpsampleRgbaLinePair",Fr,4),vr("UpsampleBgraLinePair",kr,4),vr("UpsampleArgbLinePair",Pr,4),vr("UpsampleRgba4444LinePair",_r,2),vr("UpsampleRgb565LinePair",Sr,2);var bi=t.UpsampleRgbLinePair,yi=t.UpsampleBgrLinePair,wi=t.UpsampleRgbaLinePair,Ni=t.UpsampleBgraLinePair,Li=t.UpsampleArgbLinePair,Ai=t.UpsampleRgba4444LinePair,xi=t.UpsampleRgb565LinePair,Si=16,_i=1<<Si-1,Pi=-227,ki=482,Fi=6,Ii=(256<<Fi)-1,Ci=0,ji=a(256),Oi=a(256),Bi=a(256),Mi=a(256),Ei=a(ki-Pi),qi=a(ki-Pi);Ir("YuvToRgbRow",Ar,3),Ir("YuvToBgrRow",xr,3),Ir("YuvToRgbaRow",Fr,4),Ir("YuvToBgraRow",kr,4),Ir("YuvToArgbRow",Pr,4),Ir("YuvToRgba4444Row",_r,2),Ir("YuvToRgb565Row",Sr,2);var Di=[0,4,8,12,128,132,136,140,256,260,264,268,384,388,392,396],Ri=[0,2,8],Ti=[8,7,6,4,4,2,2,2,1,1,1,1],Ui=1;this.WebPDecodeRGBA=function(t,r,n,i,a){var o=qn,s=new rr,c=new ot;s.ba=c,c.S=o,c.width=[c.width],c.height=[c.height];var u=c.width,l=c.height,h=new st;if(null==h||null==t)var f=2;else e(null!=h),f=Br(t,r,n,h.width,h.height,h.Pd,h.Qd,h.format,null);if(0!=f?u=0:(null!=u&&(u[0]=h.width[0]),null!=l&&(l[0]=h.height[0]),u=1),u){c.width=c.width[0],c.height=c.height[0],null!=i&&(i[0]=c.width),null!=a&&(a[0]=c.height);t:{if(i=new Gt,(a=new nr).data=t,a.w=r,a.ha=n,a.kd=1,r=[0],e(null!=a),(0==(t=Br(a.data,a.w,a.ha,null,null,null,r,null,a))||7==t)&&r[0]&&(t=4),0==(r=t)){if(e(null!=s),i.data=a.data,i.w=a.w+a.offset,i.ha=a.ha-a.offset,i.put=dt,i.ac=ft,i.bc=pt,i.ma=s,a.xa){if(null==(t=kt())){s=1;break t}if(function(t,r){var n=[0],i=[0],a=[0];e:for(;;){if(null==t)return 0;if(null==r)return t.a=2,0;if(t.l=r,t.a=0,v(t.m,r.data,r.w,r.ha),!gt(t.m,n,i,a)){t.a=3;break e}if(t.xb=gi,r.width=n[0],r.height=i[0],!Ft(n[0],i[0],1,t,null))break e;return 1}return e(0!=t.a),0}(t,i)){if(i=0==(r=qr(i.width,i.height,s.Oa,s.ba))){e:{i=t;r:for(;;){if(null==i){i=0;break e}if(e(null!=i.s.yc),e(null!=i.s.Ya),e(0<i.s.Wb),e(null!=(n=i.l)),e(null!=(a=n.ma)),0!=i.xb){if(i.ca=a.ba,i.tb=a.tb,e(null!=i.ca),!Mr(a.Oa,n,Rn)){i.a=2;break r}if(!It(i,n.width))break r;if(n.da)break r;if((n.da||nt(i.ca.S))&&mr(),11>i.ca.S||(alert("todo:WebPInitConvertARGBToYUV"),null!=i.ca.f.kb.F&&mr()),i.Pb&&0<i.s.ua&&null==i.s.vb.X&&!O(i.s.vb,i.s.Wa.Xa)){i.a=1;break r}i.xb=0}if(!_t(i,i.V,i.Ba,i.c,i.i,n.o,Lt))break r;a.Dc=i.Ma,i=1;break e}e(0!=i.a),i=0}i=!i}i&&(r=t.a)}else r=t.a}else{if(null==(t=new Yt)){s=1;break t}if(t.Fa=a.na,t.P=a.P,t.qc=a.Sa,Kt(t,i)){if(0==(r=qr(i.width,i.height,s.Oa,s.ba))){if(t.Aa=0,n=s.Oa,e(null!=(a=t)),null!=n){if(0<(u=0>(u=n.Md)?0:100<u?255:255*u/100)){for(l=h=0;4>l;++l)12>(f=a.pb[l]).lc&&(f.ia=u*Ti[0>f.lc?0:f.lc]>>3),h|=f.ia;h&&(alert("todo:VP8InitRandom"),a.ia=1)}a.Ga=n.Id,100<a.Ga?a.Ga=100:0>a.Ga&&(a.Ga=0)}Qt(t,i)||(r=t.a)}}else r=t.a}0==r&&null!=s.Oa&&s.Oa.fd&&(r=Er(s.ba))}s=r}o=0!=s?null:11>o?c.f.RGBA.eb:c.f.kb.y}else o=null;return o};var zi=[3,4,3,4,4,2,2,4,4,4,2,1,1]};function u(t,e){for(var r="",n=0;n<4;n++)r+=String.fromCharCode(t[e++]);return r}function l(t,e){return(t[e+0]<<0|t[e+1]<<8|t[e+2]<<16)>>>0}function h(t,e){return(t[e+0]<<0|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24)>>>0}new c;var f=[0],d=[0],p=[],g=new c,m=t,v=function(t,e){var r={},n=0,i=!1,a=0,o=0;if(r.frames=[],! +/** @license + * Copyright (c) 2017 Dominik Homberger + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + https://webpjs.appspot.com + WebPRiffParser dominikhlbg@gmail.com + */ +function(t,e,r,n){for(var i=0;i<n;i++)if(t[e+i]!=r.charCodeAt(i))return!0;return!1}(t,e,"RIFF",4)){var s,c;h(t,e+=4);for(e+=8;e<t.length;){var f=u(t,e),d=h(t,e+=4);e+=4;var p=d+(1&d);switch(f){case"VP8 ":case"VP8L":void 0===r.frames[n]&&(r.frames[n]={});(v=r.frames[n]).src_off=i?o:e-8,v.src_size=a+d+8,n++,i&&(i=!1,a=0,o=0);break;case"VP8X":(v=r.header={}).feature_flags=t[e];var g=e+4;v.canvas_width=1+l(t,g);g+=3;v.canvas_height=1+l(t,g);g+=3;break;case"ALPH":i=!0,a=p+8,o=e-8;break;case"ANIM":(v=r.header).bgcolor=h(t,e);g=e+4;v.loop_count=(s=t)[(c=g)+0]<<0|s[c+1]<<8;g+=2;break;case"ANMF":var m,v;(v=r.frames[n]={}).offset_x=2*l(t,e),e+=3,v.offset_y=2*l(t,e),e+=3,v.width=1+l(t,e),e+=3,v.height=1+l(t,e),e+=3,v.duration=l(t,e),e+=3,m=t[e++],v.dispose=1&m,v.blend=m>>1&1}"ANMF"!=f&&(e+=p)}return r}}(m,0);v.response=m,v.rgbaoutput=!0,v.dataurl=!1;var b=v.header?v.header:null,y=v.frames?v.frames:null;if(b){b.loop_counter=b.loop_count,f=[b.canvas_height],d=[b.canvas_width];for(var w=0;w<y.length&&0!=y[w].blend;w++);}var N=y[0],L=g.WebPDecodeRGBA(m,N.src_off,N.src_size,d,f);N.rgba=L,N.imgwidth=d[0],N.imgheight=f[0];for(var A=0;A<d[0]*f[0]*4;A++)p[A]=L[A];return this.width=d,this.height=f,this.data=p,this}!function(t){var e=function(){return!0},r=function(e,r,i,u){var l=4,h=o;switch(u){case t.image_compression.FAST:l=1,h=a;break;case t.image_compression.MEDIUM:l=6,h=s;break;case t.image_compression.SLOW:l=9,h=c}var f=_e(e=n(e,r,i,h),{level:l});return t.__addimage__.arrayBufferToBinaryString(f)},n=function(t,e,r,n){for(var i,a,o,s=t.length/e,c=new Uint8Array(t.length+s),u=l(),f=0;f<s;f+=1){if(o=f*e,i=t.subarray(o,o+e),n)c.set(n(i,r,a),o+f);else{for(var d,p=u.length,g=[];d<p;d+=1)g[d]=u[d](i,r,a);var m=h(g.concat());c.set(g[m],o+f)}a=i}return c},i=function(t){var e=Array.apply([],t);return e.unshift(0),e},a=function(t,e){var r,n=[],i=t.length;n[0]=1;for(var a=0;a<i;a+=1)r=t[a-e]||0,n[a+1]=t[a]-r+256&255;return n},o=function(t,e,r){var n,i=[],a=t.length;i[0]=2;for(var o=0;o<a;o+=1)n=r&&r[o]||0,i[o+1]=t[o]-n+256&255;return i},s=function(t,e,r){var n,i,a=[],o=t.length;a[0]=3;for(var s=0;s<o;s+=1)n=t[s-e]||0,i=r&&r[s]||0,a[s+1]=t[s]+256-(n+i>>>1)&255;return a},c=function(t,e,r){var n,i,a,o,s=[],c=t.length;s[0]=4;for(var l=0;l<c;l+=1)n=t[l-e]||0,i=r&&r[l]||0,a=r&&r[l-e]||0,o=u(n,i,a),s[l+1]=t[l]-o+256&255;return s},u=function(t,e,r){if(t===e&&e===r)return t;var n=Math.abs(e-r),i=Math.abs(t-r),a=Math.abs(t+e-r-r);return n<=i&&n<=a?t:i<=a?e:r},l=function(){return[i,a,o,s,c]},h=function(t){var e=t.map((function(t){return t.reduce((function(t,e){return t+Math.abs(e)}),0)}));return e.indexOf(Math.min.apply(null,e))};t.processPNG=function(n,i,a,o){var s,c,u,l,h,f,d,p,g,m,v,b,y,w,N,L=this.decode.FLATE_DECODE,A="";if(this.__addimage__.isArrayBuffer(n)&&(n=new Uint8Array(n)),this.__addimage__.isArrayBufferView(n)){if(n=(u=new Oe(n)).imgData,c=u.bits,s=u.colorSpace,h=u.colors,-1!==[4,6].indexOf(u.colorType)){if(8===u.bits){g=(p=32==u.pixelBitlength?new Uint32Array(u.decodePixels().buffer):16==u.pixelBitlength?new Uint16Array(u.decodePixels().buffer):new Uint8Array(u.decodePixels().buffer)).length,v=new Uint8Array(g*u.colors),m=new Uint8Array(g);var x,S=u.pixelBitlength-u.bits;for(w=0,N=0;w<g;w++){for(y=p[w],x=0;x<S;)v[N++]=y>>>x&255,x+=u.bits;m[w]=y>>>x&255}}if(16===u.bits){g=(p=new Uint32Array(u.decodePixels().buffer)).length,v=new Uint8Array(g*(32/u.pixelBitlength)*u.colors),m=new Uint8Array(g*(32/u.pixelBitlength)),b=u.colors>1,w=0,N=0;for(var _=0;w<g;)y=p[w++],v[N++]=y>>>0&255,b&&(v[N++]=y>>>16&255,y=p[w++],v[N++]=y>>>0&255),m[_++]=y>>>16&255;c=8}o!==t.image_compression.NONE&&e()?(n=r(v,u.width*u.colors,u.colors,o),d=r(m,u.width,1,o)):(n=v,d=m,L=void 0)}if(3===u.colorType&&(s=this.color_spaces.INDEXED,f=u.palette,u.transparency.indexed)){var P=u.transparency.indexed,k=0;for(w=0,g=P.length;w<g;++w)k+=P[w];if((k/=255)===g-1&&-1!==P.indexOf(0))l=[P.indexOf(0)];else if(k!==g){for(p=u.decodePixels(),m=new Uint8Array(p.length),w=0,g=p.length;w<g;w++)m[w]=P[p[w]];d=r(m,u.width,1)}}var F=function(e){var r;switch(e){case t.image_compression.FAST:r=11;break;case t.image_compression.MEDIUM:r=13;break;case t.image_compression.SLOW:r=14;break;default:r=12}return r}(o);return L===this.decode.FLATE_DECODE&&(A="/Predictor "+F+" "),A+="/Colors "+h+" /BitsPerComponent "+c+" /Columns "+u.width,(this.__addimage__.isArrayBuffer(n)||this.__addimage__.isArrayBufferView(n))&&(n=this.__addimage__.arrayBufferToBinaryString(n)),(d&&this.__addimage__.isArrayBuffer(d)||this.__addimage__.isArrayBufferView(d))&&(d=this.__addimage__.arrayBufferToBinaryString(d)),{alias:a,data:n,index:i,filter:L,decodeParameters:A,transparency:l,palette:f,sMask:d,predictor:F,width:u.width,height:u.height,bitsPerComponent:c,colorSpace:s}}}}(M.API),function(t){t.processGIF89A=function(e,r,n,i){var a=new Be(e),o=a.width,s=a.height,c=[];a.decodeAndBlitFrameRGBA(0,c);var u={data:c,width:o,height:s},l=new Ee(100).encode(u,100);return t.processJPEG.call(this,l,r,n,i)},t.processGIF87A=t.processGIF89A}(M.API),qe.prototype.parseHeader=function(){if(this.fileSize=this.datav.getUint32(this.pos,!0),this.pos+=4,this.reserved=this.datav.getUint32(this.pos,!0),this.pos+=4,this.offset=this.datav.getUint32(this.pos,!0),this.pos+=4,this.headerSize=this.datav.getUint32(this.pos,!0),this.pos+=4,this.width=this.datav.getUint32(this.pos,!0),this.pos+=4,this.height=this.datav.getInt32(this.pos,!0),this.pos+=4,this.planes=this.datav.getUint16(this.pos,!0),this.pos+=2,this.bitPP=this.datav.getUint16(this.pos,!0),this.pos+=2,this.compress=this.datav.getUint32(this.pos,!0),this.pos+=4,this.rawSize=this.datav.getUint32(this.pos,!0),this.pos+=4,this.hr=this.datav.getUint32(this.pos,!0),this.pos+=4,this.vr=this.datav.getUint32(this.pos,!0),this.pos+=4,this.colors=this.datav.getUint32(this.pos,!0),this.pos+=4,this.importantColors=this.datav.getUint32(this.pos,!0),this.pos+=4,16===this.bitPP&&this.is_with_alpha&&(this.bitPP=15),this.bitPP<15){var t=0===this.colors?1<<this.bitPP:this.colors;this.palette=new Array(t);for(var e=0;e<t;e++){var r=this.datav.getUint8(this.pos++,!0),n=this.datav.getUint8(this.pos++,!0),i=this.datav.getUint8(this.pos++,!0),a=this.datav.getUint8(this.pos++,!0);this.palette[e]={red:i,green:n,blue:r,quad:a}}}this.height<0&&(this.height*=-1,this.bottom_up=!1)},qe.prototype.parseBGR=function(){this.pos=this.offset;try{var t="bit"+this.bitPP,e=this.width*this.height*4;this.data=new Uint8Array(e),this[t]()}catch(t){i.log("bit decode error:"+t)}},qe.prototype.bit1=function(){var t,e=Math.ceil(this.width/8),r=e%4;for(t=this.height-1;t>=0;t--){for(var n=this.bottom_up?t:this.height-1-t,i=0;i<e;i++)for(var a=this.datav.getUint8(this.pos++,!0),o=n*this.width*4+8*i*4,s=0;s<8&&8*i+s<this.width;s++){var c=this.palette[a>>7-s&1];this.data[o+4*s]=c.blue,this.data[o+4*s+1]=c.green,this.data[o+4*s+2]=c.red,this.data[o+4*s+3]=255}0!==r&&(this.pos+=4-r)}},qe.prototype.bit4=function(){for(var t=Math.ceil(this.width/2),e=t%4,r=this.height-1;r>=0;r--){for(var n=this.bottom_up?r:this.height-1-r,i=0;i<t;i++){var a=this.datav.getUint8(this.pos++,!0),o=n*this.width*4+2*i*4,s=a>>4,c=15&a,u=this.palette[s];if(this.data[o]=u.blue,this.data[o+1]=u.green,this.data[o+2]=u.red,this.data[o+3]=255,2*i+1>=this.width)break;u=this.palette[c],this.data[o+4]=u.blue,this.data[o+4+1]=u.green,this.data[o+4+2]=u.red,this.data[o+4+3]=255}0!==e&&(this.pos+=4-e)}},qe.prototype.bit8=function(){for(var t=this.width%4,e=this.height-1;e>=0;e--){for(var r=this.bottom_up?e:this.height-1-e,n=0;n<this.width;n++){var i=this.datav.getUint8(this.pos++,!0),a=r*this.width*4+4*n;if(i<this.palette.length){var o=this.palette[i];this.data[a]=o.red,this.data[a+1]=o.green,this.data[a+2]=o.blue,this.data[a+3]=255}else this.data[a]=255,this.data[a+1]=255,this.data[a+2]=255,this.data[a+3]=255}0!==t&&(this.pos+=4-t)}},qe.prototype.bit15=function(){for(var t=this.width%3,e=parseInt("11111",2),r=this.height-1;r>=0;r--){for(var n=this.bottom_up?r:this.height-1-r,i=0;i<this.width;i++){var a=this.datav.getUint16(this.pos,!0);this.pos+=2;var o=(a&e)/e*255|0,s=(a>>5&e)/e*255|0,c=(a>>10&e)/e*255|0,u=a>>15?255:0,l=n*this.width*4+4*i;this.data[l]=c,this.data[l+1]=s,this.data[l+2]=o,this.data[l+3]=u}this.pos+=t}},qe.prototype.bit16=function(){for(var t=this.width%3,e=parseInt("11111",2),r=parseInt("111111",2),n=this.height-1;n>=0;n--){for(var i=this.bottom_up?n:this.height-1-n,a=0;a<this.width;a++){var o=this.datav.getUint16(this.pos,!0);this.pos+=2;var s=(o&e)/e*255|0,c=(o>>5&r)/r*255|0,u=(o>>11)/e*255|0,l=i*this.width*4+4*a;this.data[l]=u,this.data[l+1]=c,this.data[l+2]=s,this.data[l+3]=255}this.pos+=t}},qe.prototype.bit24=function(){for(var t=this.height-1;t>=0;t--){for(var e=this.bottom_up?t:this.height-1-t,r=0;r<this.width;r++){var n=this.datav.getUint8(this.pos++,!0),i=this.datav.getUint8(this.pos++,!0),a=this.datav.getUint8(this.pos++,!0),o=e*this.width*4+4*r;this.data[o]=a,this.data[o+1]=i,this.data[o+2]=n,this.data[o+3]=255}this.pos+=this.width%4}},qe.prototype.bit32=function(){for(var t=this.height-1;t>=0;t--)for(var e=this.bottom_up?t:this.height-1-t,r=0;r<this.width;r++){var n=this.datav.getUint8(this.pos++,!0),i=this.datav.getUint8(this.pos++,!0),a=this.datav.getUint8(this.pos++,!0),o=this.datav.getUint8(this.pos++,!0),s=e*this.width*4+4*r;this.data[s]=a,this.data[s+1]=i,this.data[s+2]=n,this.data[s+3]=o}},qe.prototype.getData=function(){return this.data}, +/** + * @license + * Copyright (c) 2018 Aras Abbasi + * + * Licensed under the MIT License. + * http://opensource.org/licenses/mit-license + */ +function(t){t.processBMP=function(e,r,n,i){var a=new qe(e,!1),o=a.width,s=a.height,c={data:a.getData(),width:o,height:s},u=new Ee(100).encode(c,100);return t.processJPEG.call(this,u,r,n,i)}}(M.API),De.prototype.getData=function(){return this.data}, +/** + * @license + * Copyright (c) 2019 Aras Abbasi + * + * Licensed under the MIT License. + * http://opensource.org/licenses/mit-license + */ +function(t){t.processWEBP=function(e,r,n,i){var a=new De(e,!1),o=a.width,s=a.height,c={data:a.getData(),width:o,height:s},u=new Ee(100).encode(c,100);return t.processJPEG.call(this,u,r,n,i)}}(M.API), +/** + * @license + * + * Copyright (c) 2021 Antti Palola, https://github.com/Pantura + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * ==================================================================== + */ +function(t){t.processRGBA=function(t,e,r){for(var n=t.data,i=n.length,a=new Uint8Array(i/4*3),o=new Uint8Array(i/4),s=0,c=0,u=0;u<i;u+=4){var l=n[u],h=n[u+1],f=n[u+2],d=n[u+3];a[s++]=l,a[s++]=h,a[s++]=f,o[c++]=d}var p=this.__addimage__.arrayBufferToBinaryString(a);return{alpha:this.__addimage__.arrayBufferToBinaryString(o),data:p,index:e,alias:r,colorSpace:"DeviceRGB",bitsPerComponent:8,width:t.width,height:t.height}}}(M.API), +/** + * @license + * Licensed under the MIT License. + * http://opensource.org/licenses/mit-license + */ +function(t){t.setLanguage=function(t){return void 0===this.internal.languageSettings&&(this.internal.languageSettings={},this.internal.languageSettings.isSubscribed=!1),void 0!=={af:"Afrikaans",sq:"Albanian",ar:"Arabic (Standard)","ar-DZ":"Arabic (Algeria)","ar-BH":"Arabic (Bahrain)","ar-EG":"Arabic (Egypt)","ar-IQ":"Arabic (Iraq)","ar-JO":"Arabic (Jordan)","ar-KW":"Arabic (Kuwait)","ar-LB":"Arabic (Lebanon)","ar-LY":"Arabic (Libya)","ar-MA":"Arabic (Morocco)","ar-OM":"Arabic (Oman)","ar-QA":"Arabic (Qatar)","ar-SA":"Arabic (Saudi Arabia)","ar-SY":"Arabic (Syria)","ar-TN":"Arabic (Tunisia)","ar-AE":"Arabic (U.A.E.)","ar-YE":"Arabic (Yemen)",an:"Aragonese",hy:"Armenian",as:"Assamese",ast:"Asturian",az:"Azerbaijani",eu:"Basque",be:"Belarusian",bn:"Bengali",bs:"Bosnian",br:"Breton",bg:"Bulgarian",my:"Burmese",ca:"Catalan",ch:"Chamorro",ce:"Chechen",zh:"Chinese","zh-HK":"Chinese (Hong Kong)","zh-CN":"Chinese (PRC)","zh-SG":"Chinese (Singapore)","zh-TW":"Chinese (Taiwan)",cv:"Chuvash",co:"Corsican",cr:"Cree",hr:"Croatian",cs:"Czech",da:"Danish",nl:"Dutch (Standard)","nl-BE":"Dutch (Belgian)",en:"English","en-AU":"English (Australia)","en-BZ":"English (Belize)","en-CA":"English (Canada)","en-IE":"English (Ireland)","en-JM":"English (Jamaica)","en-NZ":"English (New Zealand)","en-PH":"English (Philippines)","en-ZA":"English (South Africa)","en-TT":"English (Trinidad & Tobago)","en-GB":"English (United Kingdom)","en-US":"English (United States)","en-ZW":"English (Zimbabwe)",eo:"Esperanto",et:"Estonian",fo:"Faeroese",fj:"Fijian",fi:"Finnish",fr:"French (Standard)","fr-BE":"French (Belgium)","fr-CA":"French (Canada)","fr-FR":"French (France)","fr-LU":"French (Luxembourg)","fr-MC":"French (Monaco)","fr-CH":"French (Switzerland)",fy:"Frisian",fur:"Friulian",gd:"Gaelic (Scots)","gd-IE":"Gaelic (Irish)",gl:"Galacian",ka:"Georgian",de:"German (Standard)","de-AT":"German (Austria)","de-DE":"German (Germany)","de-LI":"German (Liechtenstein)","de-LU":"German (Luxembourg)","de-CH":"German (Switzerland)",el:"Greek",gu:"Gujurati",ht:"Haitian",he:"Hebrew",hi:"Hindi",hu:"Hungarian",is:"Icelandic",id:"Indonesian",iu:"Inuktitut",ga:"Irish",it:"Italian (Standard)","it-CH":"Italian (Switzerland)",ja:"Japanese",kn:"Kannada",ks:"Kashmiri",kk:"Kazakh",km:"Khmer",ky:"Kirghiz",tlh:"Klingon",ko:"Korean","ko-KP":"Korean (North Korea)","ko-KR":"Korean (South Korea)",la:"Latin",lv:"Latvian",lt:"Lithuanian",lb:"Luxembourgish",mk:"North Macedonia",ms:"Malay",ml:"Malayalam",mt:"Maltese",mi:"Maori",mr:"Marathi",mo:"Moldavian",nv:"Navajo",ng:"Ndonga",ne:"Nepali",no:"Norwegian",nb:"Norwegian (Bokmal)",nn:"Norwegian (Nynorsk)",oc:"Occitan",or:"Oriya",om:"Oromo",fa:"Persian","fa-IR":"Persian/Iran",pl:"Polish",pt:"Portuguese","pt-BR":"Portuguese (Brazil)",pa:"Punjabi","pa-IN":"Punjabi (India)","pa-PK":"Punjabi (Pakistan)",qu:"Quechua",rm:"Rhaeto-Romanic",ro:"Romanian","ro-MO":"Romanian (Moldavia)",ru:"Russian","ru-MO":"Russian (Moldavia)",sz:"Sami (Lappish)",sg:"Sango",sa:"Sanskrit",sc:"Sardinian",sd:"Sindhi",si:"Singhalese",sr:"Serbian",sk:"Slovak",sl:"Slovenian",so:"Somani",sb:"Sorbian",es:"Spanish","es-AR":"Spanish (Argentina)","es-BO":"Spanish (Bolivia)","es-CL":"Spanish (Chile)","es-CO":"Spanish (Colombia)","es-CR":"Spanish (Costa Rica)","es-DO":"Spanish (Dominican Republic)","es-EC":"Spanish (Ecuador)","es-SV":"Spanish (El Salvador)","es-GT":"Spanish (Guatemala)","es-HN":"Spanish (Honduras)","es-MX":"Spanish (Mexico)","es-NI":"Spanish (Nicaragua)","es-PA":"Spanish (Panama)","es-PY":"Spanish (Paraguay)","es-PE":"Spanish (Peru)","es-PR":"Spanish (Puerto Rico)","es-ES":"Spanish (Spain)","es-UY":"Spanish (Uruguay)","es-VE":"Spanish (Venezuela)",sx:"Sutu",sw:"Swahili",sv:"Swedish","sv-FI":"Swedish (Finland)","sv-SV":"Swedish (Sweden)",ta:"Tamil",tt:"Tatar",te:"Teluga",th:"Thai",tig:"Tigre",ts:"Tsonga",tn:"Tswana",tr:"Turkish",tk:"Turkmen",uk:"Ukrainian",hsb:"Upper Sorbian",ur:"Urdu",ve:"Venda",vi:"Vietnamese",vo:"Volapuk",wa:"Walloon",cy:"Welsh",xh:"Xhosa",ji:"Yiddish",zu:"Zulu"}[t]&&(this.internal.languageSettings.languageCode=t,!1===this.internal.languageSettings.isSubscribed&&(this.internal.events.subscribe("putCatalog",(function(){this.internal.write("/Lang ("+this.internal.languageSettings.languageCode+")")})),this.internal.languageSettings.isSubscribed=!0)),this}}(M.API),ke=M.API,Fe=ke.getCharWidthsArray=function(t,r){var n,i,a=(r=r||{}).font||this.internal.getFont(),o=r.fontSize||this.internal.getFontSize(),s=r.charSpace||this.internal.getCharSpace(),c=r.widths?r.widths:a.metadata.Unicode.widths,u=c.fof?c.fof:1,l=r.kerning?r.kerning:a.metadata.Unicode.kerning,h=l.fof?l.fof:1,f=!1!==r.doKerning,d=0,p=t.length,g=0,m=c[0]||u,v=[];for(n=0;n<p;n++)i=t.charCodeAt(n),"function"==typeof a.metadata.widthOfString?v.push((a.metadata.widthOfGlyph(a.metadata.characterToGlyph(i))+s*(1e3/o)||0)/1e3):(d=f&&"object"===e(l[i])&&!isNaN(parseInt(l[i][g],10))?l[i][g]/h:0,v.push((c[i]||m)/u+d)),g=i;return v},Ie=ke.getStringUnitWidth=function(t,e){var r=(e=e||{}).fontSize||this.internal.getFontSize(),n=e.font||this.internal.getFont(),i=e.charSpace||this.internal.getCharSpace();return ke.processArabic&&(t=ke.processArabic(t)),"function"==typeof n.metadata.widthOfString?n.metadata.widthOfString(t,r,i)/r:Fe.apply(this,arguments).reduce((function(t,e){return t+e}),0)},Ce=function(t,e,r,n){for(var i=[],a=0,o=t.length,s=0;a!==o&&s+e[a]<r;)s+=e[a],a++;i.push(t.slice(0,a));var c=a;for(s=0;a!==o;)s+e[a]>n&&(i.push(t.slice(c,a)),s=0,c=a),s+=e[a],a++;return c!==a&&i.push(t.slice(c,a)),i},je=function(t,e,r){r||(r={});var n,i,a,o,s,c,u,l=[],h=[l],f=r.textIndent||0,d=0,p=0,g=t.split(" "),m=Fe.apply(this,[" ",r])[0];if(c=-1===r.lineIndent?g[0].length+2:r.lineIndent||0){var v=Array(c).join(" "),b=[];g.map((function(t){(t=t.split(/\s*\n/)).length>1?b=b.concat(t.map((function(t,e){return(e&&t.length?"\n":"")+t}))):b.push(t[0])})),g=b,c=Ie.apply(this,[v,r])}for(a=0,o=g.length;a<o;a++){var y=0;if(n=g[a],c&&"\n"==n[0]&&(n=n.substr(1),y=1),f+d+(p=(i=Fe.apply(this,[n,r])).reduce((function(t,e){return t+e}),0))>e||y){if(p>e){for(s=Ce.apply(this,[n,i,e-(f+d),e]),l.push(s.shift()),l=[s.pop()];s.length;)h.push([s.shift()]);p=i.slice(n.length-(l[0]?l[0].length:0)).reduce((function(t,e){return t+e}),0)}else l=[n];h.push(l),f=p+c,d=m}else l.push(n),f+=d+p,d=m}return u=c?function(t,e){return(e?v:"")+t.join(" ")}:function(t){return t.join(" ")},h.map(u)},ke.splitTextToSize=function(t,e,r){var n,i=(r=r||{}).fontSize||this.internal.getFontSize(),a=function(t){if(t.widths&&t.kerning)return{widths:t.widths,kerning:t.kerning};var e=this.internal.getFont(t.fontName,t.fontStyle);return e.metadata.Unicode?{widths:e.metadata.Unicode.widths||{0:1},kerning:e.metadata.Unicode.kerning||{}}:{font:e.metadata,fontSize:this.internal.getFontSize(),charSpace:this.internal.getCharSpace()}}.call(this,r);n=Array.isArray(t)?t:String(t).split(/\r?\n/);var o=1*this.internal.scaleFactor*e/i;a.textIndent=r.textIndent?1*r.textIndent*this.internal.scaleFactor/i:0,a.lineIndent=r.lineIndent;var s,c,u=[];for(s=0,c=n.length;s<c;s++)u=u.concat(je.apply(this,[n[s],o,a]));return u},function(t){t.__fontmetrics__=t.__fontmetrics__||{};for(var r="klmnopqrstuvwxyz",n={},i={},a=0;a<r.length;a++)n[r[a]]="0123456789abcdef"[a],i["0123456789abcdef"[a]]=r[a];var o=function(t){return"0x"+parseInt(t,10).toString(16)},s=t.__fontmetrics__.compress=function(t){var r,n,a,c,u=["{"];for(var l in t){if(r=t[l],isNaN(parseInt(l,10))?n="'"+l+"'":(l=parseInt(l,10),n=(n=o(l).slice(2)).slice(0,-1)+i[n.slice(-1)]),"number"==typeof r)r<0?(a=o(r).slice(3),c="-"):(a=o(r).slice(2),c=""),a=c+a.slice(0,-1)+i[a.slice(-1)];else{if("object"!==e(r))throw new Error("Don't know what to do with value type "+e(r)+".");a=s(r)}u.push(n+a)}return u.push("}"),u.join("")},c=t.__fontmetrics__.uncompress=function(t){if("string"!=typeof t)throw new Error("Invalid argument passed to uncompress.");for(var e,r,i,a,o={},s=1,c=o,u=[],l="",h="",f=t.length-1,d=1;d<f;d+=1)"'"==(a=t[d])?e?(i=e.join(""),e=void 0):e=[]:e?e.push(a):"{"==a?(u.push([c,i]),c={},i=void 0):"}"==a?((r=u.pop())[0][r[1]]=c,i=void 0,c=r[0]):"-"==a?s=-1:void 0===i?n.hasOwnProperty(a)?(l+=n[a],i=parseInt(l,16)*s,s=1,l=""):l+=a:n.hasOwnProperty(a)?(h+=n[a],c[i]=parseInt(h,16)*s,s=1,i=void 0,h=""):h+=a;return o},u={codePages:["WinAnsiEncoding"],WinAnsiEncoding:c("{19m8n201n9q201o9r201s9l201t9m201u8m201w9n201x9o201y8o202k8q202l8r202m9p202q8p20aw8k203k8t203t8v203u9v2cq8s212m9t15m8w15n9w2dw9s16k8u16l9u17s9z17x8y17y9y}")},l={Unicode:{Courier:u,"Courier-Bold":u,"Courier-BoldOblique":u,"Courier-Oblique":u,Helvetica:u,"Helvetica-Bold":u,"Helvetica-BoldOblique":u,"Helvetica-Oblique":u,"Times-Roman":u,"Times-Bold":u,"Times-BoldItalic":u,"Times-Italic":u}},h={Unicode:{"Courier-Oblique":c("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}"),"Times-BoldItalic":c("{'widths'{k3o2q4ycx2r201n3m201o6o201s2l201t2l201u2l201w3m201x3m201y3m2k1t2l2r202m2n2n3m2o3m2p5n202q6o2r1w2s2l2t2l2u3m2v3t2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v2l3w3t3x3t3y3t3z3m4k5n4l4m4m4m4n4m4o4s4p4m4q4m4r4s4s4y4t2r4u3m4v4m4w3x4x5t4y4s4z4s5k3x5l4s5m4m5n3r5o3x5p4s5q4m5r5t5s4m5t3x5u3x5v2l5w1w5x2l5y3t5z3m6k2l6l3m6m3m6n2w6o3m6p2w6q2l6r3m6s3r6t1w6u1w6v3m6w1w6x4y6y3r6z3m7k3m7l3m7m2r7n2r7o1w7p3r7q2w7r4m7s3m7t2w7u2r7v2n7w1q7x2n7y3t202l3mcl4mal2ram3man3mao3map3mar3mas2lat4uau1uav3maw3way4uaz2lbk2sbl3t'fof'6obo2lbp3tbq3mbr1tbs2lbu1ybv3mbz3mck4m202k3mcm4mcn4mco4mcp4mcq5ycr4mcs4mct4mcu4mcv4mcw2r2m3rcy2rcz2rdl4sdm4sdn4sdo4sdp4sdq4sds4sdt4sdu4sdv4sdw4sdz3mek3mel3mem3men3meo3mep3meq4ser2wes2wet2weu2wev2wew1wex1wey1wez1wfl3rfm3mfn3mfo3mfp3mfq3mfr3tfs3mft3rfu3rfv3rfw3rfz2w203k6o212m6o2dw2l2cq2l3t3m3u2l17s3x19m3m}'kerning'{cl{4qu5kt5qt5rs17ss5ts}201s{201ss}201t{cks4lscmscnscoscpscls2wu2yu201ts}201x{2wu2yu}2k{201ts}2w{4qx5kx5ou5qx5rs17su5tu}2x{17su5tu5ou}2y{4qx5kx5ou5qx5rs17ss5ts}'fof'-6ofn{17sw5tw5ou5qw5rs}7t{cksclscmscnscoscps4ls}3u{17su5tu5os5qs}3v{17su5tu5os5qs}7p{17su5tu}ck{4qu5kt5qt5rs17ss5ts}4l{4qu5kt5qt5rs17ss5ts}cm{4qu5kt5qt5rs17ss5ts}cn{4qu5kt5qt5rs17ss5ts}co{4qu5kt5qt5rs17ss5ts}cp{4qu5kt5qt5rs17ss5ts}6l{4qu5ou5qw5rt17su5tu}5q{ckuclucmucnucoucpu4lu}5r{ckuclucmucnucoucpu4lu}7q{cksclscmscnscoscps4ls}6p{4qu5ou5qw5rt17sw5tw}ek{4qu5ou5qw5rt17su5tu}el{4qu5ou5qw5rt17su5tu}em{4qu5ou5qw5rt17su5tu}en{4qu5ou5qw5rt17su5tu}eo{4qu5ou5qw5rt17su5tu}ep{4qu5ou5qw5rt17su5tu}es{17ss5ts5qs4qu}et{4qu5ou5qw5rt17sw5tw}eu{4qu5ou5qw5rt17ss5ts}ev{17ss5ts5qs4qu}6z{17sw5tw5ou5qw5rs}fm{17sw5tw5ou5qw5rs}7n{201ts}fo{17sw5tw5ou5qw5rs}fp{17sw5tw5ou5qw5rs}fq{17sw5tw5ou5qw5rs}7r{cksclscmscnscoscps4ls}fs{17sw5tw5ou5qw5rs}ft{17su5tu}fu{17su5tu}fv{17su5tu}fw{17su5tu}fz{cksclscmscnscoscps4ls}}}"),"Helvetica-Bold":c("{'widths'{k3s2q4scx1w201n3r201o6o201s1w201t1w201u1w201w3m201x3m201y3m2k1w2l2l202m2n2n3r2o3r2p5t202q6o2r1s2s2l2t2l2u2r2v3u2w1w2x2l2y1w2z1w3k3r3l3r3m3r3n3r3o3r3p3r3q3r3r3r3s3r203t2l203u2l3v2l3w3u3x3u3y3u3z3x4k6l4l4s4m4s4n4s4o4s4p4m4q3x4r4y4s4s4t1w4u3r4v4s4w3x4x5n4y4s4z4y5k4m5l4y5m4s5n4m5o3x5p4s5q4m5r5y5s4m5t4m5u3x5v2l5w1w5x2l5y3u5z3r6k2l6l3r6m3x6n3r6o3x6p3r6q2l6r3x6s3x6t1w6u1w6v3r6w1w6x5t6y3x6z3x7k3x7l3x7m2r7n3r7o2l7p3x7q3r7r4y7s3r7t3r7u3m7v2r7w1w7x2r7y3u202l3rcl4sal2lam3ran3rao3rap3rar3ras2lat4tau2pav3raw3uay4taz2lbk2sbl3u'fof'6obo2lbp3xbq3rbr1wbs2lbu2obv3rbz3xck4s202k3rcm4scn4sco4scp4scq6ocr4scs4mct4mcu4mcv4mcw1w2m2zcy1wcz1wdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3xek3rel3rem3ren3reo3rep3req5ter3res3ret3reu3rev3rew1wex1wey1wez1wfl3xfm3xfn3xfo3xfp3xfq3xfr3ufs3xft3xfu3xfv3xfw3xfz3r203k6o212m6o2dw2l2cq2l3t3r3u2l17s4m19m3r}'kerning'{cl{4qs5ku5ot5qs17sv5tv}201t{2ww4wy2yw}201w{2ks}201x{2ww4wy2yw}2k{201ts201xs}2w{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}2x{5ow5qs}2y{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}'fof'-6o7p{17su5tu5ot}ck{4qs5ku5ot5qs17sv5tv}4l{4qs5ku5ot5qs17sv5tv}cm{4qs5ku5ot5qs17sv5tv}cn{4qs5ku5ot5qs17sv5tv}co{4qs5ku5ot5qs17sv5tv}cp{4qs5ku5ot5qs17sv5tv}6l{17st5tt5os}17s{2kwclvcmvcnvcovcpv4lv4wwckv}5o{2kucltcmtcntcotcpt4lt4wtckt}5q{2ksclscmscnscoscps4ls4wvcks}5r{2ks4ws}5t{2kwclvcmvcnvcovcpv4lv4wwckv}eo{17st5tt5os}fu{17su5tu5ot}6p{17ss5ts}ek{17st5tt5os}el{17st5tt5os}em{17st5tt5os}en{17st5tt5os}6o{201ts}ep{17st5tt5os}es{17ss5ts}et{17ss5ts}eu{17ss5ts}ev{17ss5ts}6z{17su5tu5os5qt}fm{17su5tu5os5qt}fn{17su5tu5os5qt}fo{17su5tu5os5qt}fp{17su5tu5os5qt}fq{17su5tu5os5qt}fs{17su5tu5os5qt}ft{17su5tu5ot}7m{5os}fv{17su5tu5ot}fw{17su5tu5ot}}}"),Courier:c("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}"),"Courier-BoldOblique":c("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}"),"Times-Bold":c("{'widths'{k3q2q5ncx2r201n3m201o6o201s2l201t2l201u2l201w3m201x3m201y3m2k1t2l2l202m2n2n3m2o3m2p6o202q6o2r1w2s2l2t2l2u3m2v3t2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v2l3w3t3x3t3y3t3z3m4k5x4l4s4m4m4n4s4o4s4p4m4q3x4r4y4s4y4t2r4u3m4v4y4w4m4x5y4y4s4z4y5k3x5l4y5m4s5n3r5o4m5p4s5q4s5r6o5s4s5t4s5u4m5v2l5w1w5x2l5y3u5z3m6k2l6l3m6m3r6n2w6o3r6p2w6q2l6r3m6s3r6t1w6u2l6v3r6w1w6x5n6y3r6z3m7k3r7l3r7m2w7n2r7o2l7p3r7q3m7r4s7s3m7t3m7u2w7v2r7w1q7x2r7y3o202l3mcl4sal2lam3man3mao3map3mar3mas2lat4uau1yav3maw3tay4uaz2lbk2sbl3t'fof'6obo2lbp3rbr1tbs2lbu2lbv3mbz3mck4s202k3mcm4scn4sco4scp4scq6ocr4scs4mct4mcu4mcv4mcw2r2m3rcy2rcz2rdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3rek3mel3mem3men3meo3mep3meq4ser2wes2wet2weu2wev2wew1wex1wey1wez1wfl3rfm3mfn3mfo3mfp3mfq3mfr3tfs3mft3rfu3rfv3rfw3rfz3m203k6o212m6o2dw2l2cq2l3t3m3u2l17s4s19m3m}'kerning'{cl{4qt5ks5ot5qy5rw17sv5tv}201t{cks4lscmscnscoscpscls4wv}2k{201ts}2w{4qu5ku7mu5os5qx5ru17su5tu}2x{17su5tu5ou5qs}2y{4qv5kv7mu5ot5qz5ru17su5tu}'fof'-6o7t{cksclscmscnscoscps4ls}3u{17su5tu5os5qu}3v{17su5tu5os5qu}fu{17su5tu5ou5qu}7p{17su5tu5ou5qu}ck{4qt5ks5ot5qy5rw17sv5tv}4l{4qt5ks5ot5qy5rw17sv5tv}cm{4qt5ks5ot5qy5rw17sv5tv}cn{4qt5ks5ot5qy5rw17sv5tv}co{4qt5ks5ot5qy5rw17sv5tv}cp{4qt5ks5ot5qy5rw17sv5tv}6l{17st5tt5ou5qu}17s{ckuclucmucnucoucpu4lu4wu}5o{ckuclucmucnucoucpu4lu4wu}5q{ckzclzcmzcnzcozcpz4lz4wu}5r{ckxclxcmxcnxcoxcpx4lx4wu}5t{ckuclucmucnucoucpu4lu4wu}7q{ckuclucmucnucoucpu4lu}6p{17sw5tw5ou5qu}ek{17st5tt5qu}el{17st5tt5ou5qu}em{17st5tt5qu}en{17st5tt5qu}eo{17st5tt5qu}ep{17st5tt5ou5qu}es{17ss5ts5qu}et{17sw5tw5ou5qu}eu{17sw5tw5ou5qu}ev{17ss5ts5qu}6z{17sw5tw5ou5qu5rs}fm{17sw5tw5ou5qu5rs}fn{17sw5tw5ou5qu5rs}fo{17sw5tw5ou5qu5rs}fp{17sw5tw5ou5qu5rs}fq{17sw5tw5ou5qu5rs}7r{cktcltcmtcntcotcpt4lt5os}fs{17sw5tw5ou5qu5rs}ft{17su5tu5ou5qu}7m{5os}fv{17su5tu5ou5qu}fw{17su5tu5ou5qu}fz{cksclscmscnscoscps4ls}}}"),Symbol:c("{'widths'{k3uaw4r19m3m2k1t2l2l202m2y2n3m2p5n202q6o3k3m2s2l2t2l2v3r2w1t3m3m2y1t2z1wbk2sbl3r'fof'6o3n3m3o3m3p3m3q3m3r3m3s3m3t3m3u1w3v1w3w3r3x3r3y3r3z2wbp3t3l3m5v2l5x2l5z3m2q4yfr3r7v3k7w1o7x3k}'kerning'{'fof'-6o}}"),Helvetica:c("{'widths'{k3p2q4mcx1w201n3r201o6o201s1q201t1q201u1q201w2l201x2l201y2l2k1w2l1w202m2n2n3r2o3r2p5t202q6o2r1n2s2l2t2l2u2r2v3u2w1w2x2l2y1w2z1w3k3r3l3r3m3r3n3r3o3r3p3r3q3r3r3r3s3r203t2l203u2l3v1w3w3u3x3u3y3u3z3r4k6p4l4m4m4m4n4s4o4s4p4m4q3x4r4y4s4s4t1w4u3m4v4m4w3r4x5n4y4s4z4y5k4m5l4y5m4s5n4m5o3x5p4s5q4m5r5y5s4m5t4m5u3x5v1w5w1w5x1w5y2z5z3r6k2l6l3r6m3r6n3m6o3r6p3r6q1w6r3r6s3r6t1q6u1q6v3m6w1q6x5n6y3r6z3r7k3r7l3r7m2l7n3m7o1w7p3r7q3m7r4s7s3m7t3m7u3m7v2l7w1u7x2l7y3u202l3rcl4mal2lam3ran3rao3rap3rar3ras2lat4tau2pav3raw3uay4taz2lbk2sbl3u'fof'6obo2lbp3rbr1wbs2lbu2obv3rbz3xck4m202k3rcm4mcn4mco4mcp4mcq6ocr4scs4mct4mcu4mcv4mcw1w2m2ncy1wcz1wdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3xek3rel3rem3ren3reo3rep3req5ter3mes3ret3reu3rev3rew1wex1wey1wez1wfl3rfm3rfn3rfo3rfp3rfq3rfr3ufs3xft3rfu3rfv3rfw3rfz3m203k6o212m6o2dw2l2cq2l3t3r3u1w17s4m19m3r}'kerning'{5q{4wv}cl{4qs5kw5ow5qs17sv5tv}201t{2wu4w1k2yu}201x{2wu4wy2yu}17s{2ktclucmucnu4otcpu4lu4wycoucku}2w{7qs4qz5k1m17sy5ow5qx5rsfsu5ty7tufzu}2x{17sy5ty5oy5qs}2y{7qs4qz5k1m17sy5ow5qx5rsfsu5ty7tufzu}'fof'-6o7p{17sv5tv5ow}ck{4qs5kw5ow5qs17sv5tv}4l{4qs5kw5ow5qs17sv5tv}cm{4qs5kw5ow5qs17sv5tv}cn{4qs5kw5ow5qs17sv5tv}co{4qs5kw5ow5qs17sv5tv}cp{4qs5kw5ow5qs17sv5tv}6l{17sy5ty5ow}do{17st5tt}4z{17st5tt}7s{fst}dm{17st5tt}dn{17st5tt}5o{ckwclwcmwcnwcowcpw4lw4wv}dp{17st5tt}dq{17st5tt}7t{5ow}ds{17st5tt}5t{2ktclucmucnu4otcpu4lu4wycoucku}fu{17sv5tv5ow}6p{17sy5ty5ow5qs}ek{17sy5ty5ow}el{17sy5ty5ow}em{17sy5ty5ow}en{5ty}eo{17sy5ty5ow}ep{17sy5ty5ow}es{17sy5ty5qs}et{17sy5ty5ow5qs}eu{17sy5ty5ow5qs}ev{17sy5ty5ow5qs}6z{17sy5ty5ow5qs}fm{17sy5ty5ow5qs}fn{17sy5ty5ow5qs}fo{17sy5ty5ow5qs}fp{17sy5ty5qs}fq{17sy5ty5ow5qs}7r{5ow}fs{17sy5ty5ow5qs}ft{17sv5tv5ow}7m{5ow}fv{17sv5tv5ow}fw{17sv5tv5ow}}}"),"Helvetica-BoldOblique":c("{'widths'{k3s2q4scx1w201n3r201o6o201s1w201t1w201u1w201w3m201x3m201y3m2k1w2l2l202m2n2n3r2o3r2p5t202q6o2r1s2s2l2t2l2u2r2v3u2w1w2x2l2y1w2z1w3k3r3l3r3m3r3n3r3o3r3p3r3q3r3r3r3s3r203t2l203u2l3v2l3w3u3x3u3y3u3z3x4k6l4l4s4m4s4n4s4o4s4p4m4q3x4r4y4s4s4t1w4u3r4v4s4w3x4x5n4y4s4z4y5k4m5l4y5m4s5n4m5o3x5p4s5q4m5r5y5s4m5t4m5u3x5v2l5w1w5x2l5y3u5z3r6k2l6l3r6m3x6n3r6o3x6p3r6q2l6r3x6s3x6t1w6u1w6v3r6w1w6x5t6y3x6z3x7k3x7l3x7m2r7n3r7o2l7p3x7q3r7r4y7s3r7t3r7u3m7v2r7w1w7x2r7y3u202l3rcl4sal2lam3ran3rao3rap3rar3ras2lat4tau2pav3raw3uay4taz2lbk2sbl3u'fof'6obo2lbp3xbq3rbr1wbs2lbu2obv3rbz3xck4s202k3rcm4scn4sco4scp4scq6ocr4scs4mct4mcu4mcv4mcw1w2m2zcy1wcz1wdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3xek3rel3rem3ren3reo3rep3req5ter3res3ret3reu3rev3rew1wex1wey1wez1wfl3xfm3xfn3xfo3xfp3xfq3xfr3ufs3xft3xfu3xfv3xfw3xfz3r203k6o212m6o2dw2l2cq2l3t3r3u2l17s4m19m3r}'kerning'{cl{4qs5ku5ot5qs17sv5tv}201t{2ww4wy2yw}201w{2ks}201x{2ww4wy2yw}2k{201ts201xs}2w{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}2x{5ow5qs}2y{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}'fof'-6o7p{17su5tu5ot}ck{4qs5ku5ot5qs17sv5tv}4l{4qs5ku5ot5qs17sv5tv}cm{4qs5ku5ot5qs17sv5tv}cn{4qs5ku5ot5qs17sv5tv}co{4qs5ku5ot5qs17sv5tv}cp{4qs5ku5ot5qs17sv5tv}6l{17st5tt5os}17s{2kwclvcmvcnvcovcpv4lv4wwckv}5o{2kucltcmtcntcotcpt4lt4wtckt}5q{2ksclscmscnscoscps4ls4wvcks}5r{2ks4ws}5t{2kwclvcmvcnvcovcpv4lv4wwckv}eo{17st5tt5os}fu{17su5tu5ot}6p{17ss5ts}ek{17st5tt5os}el{17st5tt5os}em{17st5tt5os}en{17st5tt5os}6o{201ts}ep{17st5tt5os}es{17ss5ts}et{17ss5ts}eu{17ss5ts}ev{17ss5ts}6z{17su5tu5os5qt}fm{17su5tu5os5qt}fn{17su5tu5os5qt}fo{17su5tu5os5qt}fp{17su5tu5os5qt}fq{17su5tu5os5qt}fs{17su5tu5os5qt}ft{17su5tu5ot}7m{5os}fv{17su5tu5ot}fw{17su5tu5ot}}}"),ZapfDingbats:c("{'widths'{k4u2k1w'fof'6o}'kerning'{'fof'-6o}}"),"Courier-Bold":c("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}"),"Times-Italic":c("{'widths'{k3n2q4ycx2l201n3m201o5t201s2l201t2l201u2l201w3r201x3r201y3r2k1t2l2l202m2n2n3m2o3m2p5n202q5t2r1p2s2l2t2l2u3m2v4n2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v2l3w4n3x4n3y4n3z3m4k5w4l3x4m3x4n4m4o4s4p3x4q3x4r4s4s4s4t2l4u2w4v4m4w3r4x5n4y4m4z4s5k3x5l4s5m3x5n3m5o3r5p4s5q3x5r5n5s3x5t3r5u3r5v2r5w1w5x2r5y2u5z3m6k2l6l3m6m3m6n2w6o3m6p2w6q1w6r3m6s3m6t1w6u1w6v2w6w1w6x4s6y3m6z3m7k3m7l3m7m2r7n2r7o1w7p3m7q2w7r4m7s2w7t2w7u2r7v2s7w1v7x2s7y3q202l3mcl3xal2ram3man3mao3map3mar3mas2lat4wau1vav3maw4nay4waz2lbk2sbl4n'fof'6obo2lbp3mbq3obr1tbs2lbu1zbv3mbz3mck3x202k3mcm3xcn3xco3xcp3xcq5tcr4mcs3xct3xcu3xcv3xcw2l2m2ucy2lcz2ldl4mdm4sdn4sdo4sdp4sdq4sds4sdt4sdu4sdv4sdw4sdz3mek3mel3mem3men3meo3mep3meq4mer2wes2wet2weu2wev2wew1wex1wey1wez1wfl3mfm3mfn3mfo3mfp3mfq3mfr4nfs3mft3mfu3mfv3mfw3mfz2w203k6o212m6m2dw2l2cq2l3t3m3u2l17s3r19m3m}'kerning'{cl{5kt4qw}201s{201sw}201t{201tw2wy2yy6q-t}201x{2wy2yy}2k{201tw}2w{7qs4qy7rs5ky7mw5os5qx5ru17su5tu}2x{17ss5ts5os}2y{7qs4qy7rs5ky7mw5os5qx5ru17su5tu}'fof'-6o6t{17ss5ts5qs}7t{5os}3v{5qs}7p{17su5tu5qs}ck{5kt4qw}4l{5kt4qw}cm{5kt4qw}cn{5kt4qw}co{5kt4qw}cp{5kt4qw}6l{4qs5ks5ou5qw5ru17su5tu}17s{2ks}5q{ckvclvcmvcnvcovcpv4lv}5r{ckuclucmucnucoucpu4lu}5t{2ks}6p{4qs5ks5ou5qw5ru17su5tu}ek{4qs5ks5ou5qw5ru17su5tu}el{4qs5ks5ou5qw5ru17su5tu}em{4qs5ks5ou5qw5ru17su5tu}en{4qs5ks5ou5qw5ru17su5tu}eo{4qs5ks5ou5qw5ru17su5tu}ep{4qs5ks5ou5qw5ru17su5tu}es{5ks5qs4qs}et{4qs5ks5ou5qw5ru17su5tu}eu{4qs5ks5qw5ru17su5tu}ev{5ks5qs4qs}ex{17ss5ts5qs}6z{4qv5ks5ou5qw5ru17su5tu}fm{4qv5ks5ou5qw5ru17su5tu}fn{4qv5ks5ou5qw5ru17su5tu}fo{4qv5ks5ou5qw5ru17su5tu}fp{4qv5ks5ou5qw5ru17su5tu}fq{4qv5ks5ou5qw5ru17su5tu}7r{5os}fs{4qv5ks5ou5qw5ru17su5tu}ft{17su5tu5qs}fu{17su5tu5qs}fv{17su5tu5qs}fw{17su5tu5qs}}}"),"Times-Roman":c("{'widths'{k3n2q4ycx2l201n3m201o6o201s2l201t2l201u2l201w2w201x2w201y2w2k1t2l2l202m2n2n3m2o3m2p5n202q6o2r1m2s2l2t2l2u3m2v3s2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v1w3w3s3x3s3y3s3z2w4k5w4l4s4m4m4n4m4o4s4p3x4q3r4r4s4s4s4t2l4u2r4v4s4w3x4x5t4y4s4z4s5k3r5l4s5m4m5n3r5o3x5p4s5q4s5r5y5s4s5t4s5u3x5v2l5w1w5x2l5y2z5z3m6k2l6l2w6m3m6n2w6o3m6p2w6q2l6r3m6s3m6t1w6u1w6v3m6w1w6x4y6y3m6z3m7k3m7l3m7m2l7n2r7o1w7p3m7q3m7r4s7s3m7t3m7u2w7v3k7w1o7x3k7y3q202l3mcl4sal2lam3man3mao3map3mar3mas2lat4wau1vav3maw3say4waz2lbk2sbl3s'fof'6obo2lbp3mbq2xbr1tbs2lbu1zbv3mbz2wck4s202k3mcm4scn4sco4scp4scq5tcr4mcs3xct3xcu3xcv3xcw2l2m2tcy2lcz2ldl4sdm4sdn4sdo4sdp4sdq4sds4sdt4sdu4sdv4sdw4sdz3mek2wel2wem2wen2weo2wep2weq4mer2wes2wet2weu2wev2wew1wex1wey1wez1wfl3mfm3mfn3mfo3mfp3mfq3mfr3sfs3mft3mfu3mfv3mfw3mfz3m203k6o212m6m2dw2l2cq2l3t3m3u1w17s4s19m3m}'kerning'{cl{4qs5ku17sw5ou5qy5rw201ss5tw201ws}201s{201ss}201t{ckw4lwcmwcnwcowcpwclw4wu201ts}2k{201ts}2w{4qs5kw5os5qx5ru17sx5tx}2x{17sw5tw5ou5qu}2y{4qs5kw5os5qx5ru17sx5tx}'fof'-6o7t{ckuclucmucnucoucpu4lu5os5rs}3u{17su5tu5qs}3v{17su5tu5qs}7p{17sw5tw5qs}ck{4qs5ku17sw5ou5qy5rw201ss5tw201ws}4l{4qs5ku17sw5ou5qy5rw201ss5tw201ws}cm{4qs5ku17sw5ou5qy5rw201ss5tw201ws}cn{4qs5ku17sw5ou5qy5rw201ss5tw201ws}co{4qs5ku17sw5ou5qy5rw201ss5tw201ws}cp{4qs5ku17sw5ou5qy5rw201ss5tw201ws}6l{17su5tu5os5qw5rs}17s{2ktclvcmvcnvcovcpv4lv4wuckv}5o{ckwclwcmwcnwcowcpw4lw4wu}5q{ckyclycmycnycoycpy4ly4wu5ms}5r{cktcltcmtcntcotcpt4lt4ws}5t{2ktclvcmvcnvcovcpv4lv4wuckv}7q{cksclscmscnscoscps4ls}6p{17su5tu5qw5rs}ek{5qs5rs}el{17su5tu5os5qw5rs}em{17su5tu5os5qs5rs}en{17su5qs5rs}eo{5qs5rs}ep{17su5tu5os5qw5rs}es{5qs}et{17su5tu5qw5rs}eu{17su5tu5qs5rs}ev{5qs}6z{17sv5tv5os5qx5rs}fm{5os5qt5rs}fn{17sv5tv5os5qx5rs}fo{17sv5tv5os5qx5rs}fp{5os5qt5rs}fq{5os5qt5rs}7r{ckuclucmucnucoucpu4lu5os}fs{17sv5tv5os5qx5rs}ft{17ss5ts5qs}fu{17sw5tw5qs}fv{17sw5tw5qs}fw{17ss5ts5qs}fz{ckuclucmucnucoucpu4lu5os5rs}}}"),"Helvetica-Oblique":c("{'widths'{k3p2q4mcx1w201n3r201o6o201s1q201t1q201u1q201w2l201x2l201y2l2k1w2l1w202m2n2n3r2o3r2p5t202q6o2r1n2s2l2t2l2u2r2v3u2w1w2x2l2y1w2z1w3k3r3l3r3m3r3n3r3o3r3p3r3q3r3r3r3s3r203t2l203u2l3v1w3w3u3x3u3y3u3z3r4k6p4l4m4m4m4n4s4o4s4p4m4q3x4r4y4s4s4t1w4u3m4v4m4w3r4x5n4y4s4z4y5k4m5l4y5m4s5n4m5o3x5p4s5q4m5r5y5s4m5t4m5u3x5v1w5w1w5x1w5y2z5z3r6k2l6l3r6m3r6n3m6o3r6p3r6q1w6r3r6s3r6t1q6u1q6v3m6w1q6x5n6y3r6z3r7k3r7l3r7m2l7n3m7o1w7p3r7q3m7r4s7s3m7t3m7u3m7v2l7w1u7x2l7y3u202l3rcl4mal2lam3ran3rao3rap3rar3ras2lat4tau2pav3raw3uay4taz2lbk2sbl3u'fof'6obo2lbp3rbr1wbs2lbu2obv3rbz3xck4m202k3rcm4mcn4mco4mcp4mcq6ocr4scs4mct4mcu4mcv4mcw1w2m2ncy1wcz1wdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3xek3rel3rem3ren3reo3rep3req5ter3mes3ret3reu3rev3rew1wex1wey1wez1wfl3rfm3rfn3rfo3rfp3rfq3rfr3ufs3xft3rfu3rfv3rfw3rfz3m203k6o212m6o2dw2l2cq2l3t3r3u1w17s4m19m3r}'kerning'{5q{4wv}cl{4qs5kw5ow5qs17sv5tv}201t{2wu4w1k2yu}201x{2wu4wy2yu}17s{2ktclucmucnu4otcpu4lu4wycoucku}2w{7qs4qz5k1m17sy5ow5qx5rsfsu5ty7tufzu}2x{17sy5ty5oy5qs}2y{7qs4qz5k1m17sy5ow5qx5rsfsu5ty7tufzu}'fof'-6o7p{17sv5tv5ow}ck{4qs5kw5ow5qs17sv5tv}4l{4qs5kw5ow5qs17sv5tv}cm{4qs5kw5ow5qs17sv5tv}cn{4qs5kw5ow5qs17sv5tv}co{4qs5kw5ow5qs17sv5tv}cp{4qs5kw5ow5qs17sv5tv}6l{17sy5ty5ow}do{17st5tt}4z{17st5tt}7s{fst}dm{17st5tt}dn{17st5tt}5o{ckwclwcmwcnwcowcpw4lw4wv}dp{17st5tt}dq{17st5tt}7t{5ow}ds{17st5tt}5t{2ktclucmucnu4otcpu4lu4wycoucku}fu{17sv5tv5ow}6p{17sy5ty5ow5qs}ek{17sy5ty5ow}el{17sy5ty5ow}em{17sy5ty5ow}en{5ty}eo{17sy5ty5ow}ep{17sy5ty5ow}es{17sy5ty5qs}et{17sy5ty5ow5qs}eu{17sy5ty5ow5qs}ev{17sy5ty5ow5qs}6z{17sy5ty5ow5qs}fm{17sy5ty5ow5qs}fn{17sy5ty5ow5qs}fo{17sy5ty5ow5qs}fp{17sy5ty5qs}fq{17sy5ty5ow5qs}7r{5ow}fs{17sy5ty5ow5qs}ft{17sv5tv5ow}7m{5ow}fv{17sv5tv5ow}fw{17sv5tv5ow}}}")}};t.events.push(["addFont",function(t){var e=t.font,r=h.Unicode[e.postScriptName];r&&(e.metadata.Unicode={},e.metadata.Unicode.widths=r.widths,e.metadata.Unicode.kerning=r.kerning);var n=l.Unicode[e.postScriptName];n&&(e.metadata.Unicode.encoding=n,e.encoding=n.codePages[0])}])}(M.API), +/** + * @license + * Licensed under the MIT License. + * http://opensource.org/licenses/mit-license + */ +function(t){var e=function(t){for(var e=t.length,r=new Uint8Array(e),n=0;n<e;n++)r[n]=t.charCodeAt(n);return r};t.API.events.push(["addFont",function(r){var n=void 0,i=r.font,a=r.instance;if(!i.isStandardFont){if(void 0===a)throw new Error("Font does not exist in vFS, import fonts or remove declaration doc.addFont('"+i.postScriptName+"').");if("string"!=typeof(n=!1===a.existsFileInVFS(i.postScriptName)?a.loadFile(i.postScriptName):a.getFileFromVFS(i.postScriptName)))throw new Error("Font is not stored as string-data in vFS, import fonts or remove declaration doc.addFont('"+i.postScriptName+"').");!function(r,n){n=/^\x00\x01\x00\x00/.test(n)?e(n):e(c(n)),r.metadata=t.API.TTFFont.open(n),r.metadata.Unicode=r.metadata.Unicode||{encoding:{},kerning:{},widths:[]},r.metadata.glyIdsUsed=[0]}(i,n)}}])}(M),function(n){function a(){return(r.canvg?Promise.resolve(r.canvg):"object"===(void 0===t?"undefined":e(t))&&"undefined"!=typeof module?new Promise((function(t,e){try{t(require("canvg"))}catch(t){e(t)}})):"function"==typeof define&&define.amd?new Promise((function(t,e){try{require(["canvg"],t)}catch(t){e(t)}})):Promise.reject(new Error("Could not load canvg"))).catch((function(t){return Promise.reject(new Error("Could not load canvg: "+t))})).then((function(t){return t.default?t.default:t}))}n.addSvgAsImage=function(t,e,r,n,o,s,c,u){if(isNaN(e)||isNaN(r))throw i.error("jsPDF.addSvgAsImage: Invalid coordinates",arguments),new Error("Invalid coordinates passed to jsPDF.addSvgAsImage");if(isNaN(n)||isNaN(o))throw i.error("jsPDF.addSvgAsImage: Invalid measurements",arguments),new Error("Invalid measurements (width and/or height) passed to jsPDF.addSvgAsImage");var l=document.createElement("canvas");l.width=n,l.height=o;var h=l.getContext("2d");h.fillStyle="#fff",h.fillRect(0,0,l.width,l.height);var f={ignoreMouse:!0,ignoreAnimation:!0,ignoreDimensions:!0},d=this;return a().then((function(e){return e.fromString(h,t,f)}),(function(){return Promise.reject(new Error("Could not load canvg."))})).then((function(t){return t.render(f)})).then((function(){d.addImage(l.toDataURL("image/jpeg",1),e,r,n,o,c,u)}))}}(M.API), +/** + * @license + * ==================================================================== + * Copyright (c) 2013 Eduardo Menezes de Morais, eduardo.morais@usp.br + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * ==================================================================== + */ +function(t){t.putTotalPages=function(t){var e,r=0;parseInt(this.internal.getFont().id.substr(1),10)<15?(e=new RegExp(t,"g"),r=this.internal.getNumberOfPages()):(e=new RegExp(this.pdfEscape16(t,this.internal.getFont()),"g"),r=this.pdfEscape16(this.internal.getNumberOfPages()+"",this.internal.getFont()));for(var n=1;n<=this.internal.getNumberOfPages();n++)for(var i=0;i<this.internal.pages[n].length;i++)this.internal.pages[n][i]=this.internal.pages[n][i].replace(e,r);return this}}(M.API),function(t){t.viewerPreferences=function(t,r){var n;t=t||{},r=r||!1;var i,a,o,s={HideToolbar:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},HideMenubar:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},HideWindowUI:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},FitWindow:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},CenterWindow:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.3},DisplayDocTitle:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.4},NonFullScreenPageMode:{defaultValue:"UseNone",value:"UseNone",type:"name",explicitSet:!1,valueSet:["UseNone","UseOutlines","UseThumbs","UseOC"],pdfVersion:1.3},Direction:{defaultValue:"L2R",value:"L2R",type:"name",explicitSet:!1,valueSet:["L2R","R2L"],pdfVersion:1.3},ViewArea:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},ViewClip:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},PrintArea:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},PrintClip:{defaultValue:"CropBox",value:"CropBox",type:"name",explicitSet:!1,valueSet:["MediaBox","CropBox","TrimBox","BleedBox","ArtBox"],pdfVersion:1.4},PrintScaling:{defaultValue:"AppDefault",value:"AppDefault",type:"name",explicitSet:!1,valueSet:["AppDefault","None"],pdfVersion:1.6},Duplex:{defaultValue:"",value:"none",type:"name",explicitSet:!1,valueSet:["Simplex","DuplexFlipShortEdge","DuplexFlipLongEdge","none"],pdfVersion:1.7},PickTrayByPDFSize:{defaultValue:!1,value:!1,type:"boolean",explicitSet:!1,valueSet:[!0,!1],pdfVersion:1.7},PrintPageRange:{defaultValue:"",value:"",type:"array",explicitSet:!1,valueSet:null,pdfVersion:1.7},NumCopies:{defaultValue:1,value:1,type:"integer",explicitSet:!1,valueSet:null,pdfVersion:1.7}},c=Object.keys(s),u=[],l=0,h=0,f=0;function d(t,e){var r,n=!1;for(r=0;r<t.length;r+=1)t[r]===e&&(n=!0);return n}if(void 0===this.internal.viewerpreferences&&(this.internal.viewerpreferences={},this.internal.viewerpreferences.configuration=JSON.parse(JSON.stringify(s)),this.internal.viewerpreferences.isSubscribed=!1),n=this.internal.viewerpreferences.configuration,"reset"===t||!0===r){var p=c.length;for(f=0;f<p;f+=1)n[c[f]].value=n[c[f]].defaultValue,n[c[f]].explicitSet=!1}if("object"===e(t))for(a in t)if(o=t[a],d(c,a)&&void 0!==o){if("boolean"===n[a].type&&"boolean"==typeof o)n[a].value=o;else if("name"===n[a].type&&d(n[a].valueSet,o))n[a].value=o;else if("integer"===n[a].type&&Number.isInteger(o))n[a].value=o;else if("array"===n[a].type){for(l=0;l<o.length;l+=1)if(i=!0,1===o[l].length&&"number"==typeof o[l][0])u.push(String(o[l]-1));else if(o[l].length>1){for(h=0;h<o[l].length;h+=1)"number"!=typeof o[l][h]&&(i=!1);!0===i&&u.push([o[l][0]-1,o[l][1]-1].join(" "))}n[a].value="["+u.join(" ")+"]"}else n[a].value=n[a].defaultValue;n[a].explicitSet=!0}return!1===this.internal.viewerpreferences.isSubscribed&&(this.internal.events.subscribe("putCatalog",(function(){var t,e=[];for(t in n)!0===n[t].explicitSet&&("name"===n[t].type?e.push("/"+t+" /"+n[t].value):e.push("/"+t+" "+n[t].value));0!==e.length&&this.internal.write("/ViewerPreferences\n<<\n"+e.join("\n")+"\n>>")})),this.internal.viewerpreferences.isSubscribed=!0),this.internal.viewerpreferences.configuration=n,this}}(M.API), +/** ==================================================================== + * @license + * jsPDF XMP metadata plugin + * Copyright (c) 2016 Jussi Utunen, u-jussi@suomi24.fi + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * ==================================================================== + */ +function(t){var e=function(){var t='<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><rdf:Description rdf:about="" xmlns:jspdf="'+this.internal.__metadata__.namespaceuri+'"><jspdf:metadata>',e=unescape(encodeURIComponent('<x:xmpmeta xmlns:x="adobe:ns:meta/">')),r=unescape(encodeURIComponent(t)),n=unescape(encodeURIComponent(this.internal.__metadata__.metadata)),i=unescape(encodeURIComponent("</jspdf:metadata></rdf:Description></rdf:RDF>")),a=unescape(encodeURIComponent("</x:xmpmeta>")),o=r.length+n.length+i.length+e.length+a.length;this.internal.__metadata__.metadata_object_number=this.internal.newObject(),this.internal.write("<< /Type /Metadata /Subtype /XML /Length "+o+" >>"),this.internal.write("stream"),this.internal.write(e+r+n+i+a),this.internal.write("endstream"),this.internal.write("endobj")},r=function(){this.internal.__metadata__.metadata_object_number&&this.internal.write("/Metadata "+this.internal.__metadata__.metadata_object_number+" 0 R")};t.addMetadata=function(t,n){return void 0===this.internal.__metadata__&&(this.internal.__metadata__={metadata:t,namespaceuri:n||"http://jspdf.default.namespaceuri/"},this.internal.events.subscribe("putCatalog",r),this.internal.events.subscribe("postPutResources",e)),this}}(M.API),function(t){var e=t.API,r=e.pdfEscape16=function(t,e){for(var r,n=e.metadata.Unicode.widths,i=["","0","00","000","0000"],a=[""],o=0,s=t.length;o<s;++o){if(r=e.metadata.characterToGlyph(t.charCodeAt(o)),e.metadata.glyIdsUsed.push(r),e.metadata.toUnicode[r]=t.charCodeAt(o),-1==n.indexOf(r)&&(n.push(r),n.push([parseInt(e.metadata.widthOfGlyph(r),10)])),"0"==r)return a.join("");r=r.toString(16),a.push(i[4-r.length],r)}return a.join("")},n=function(t){var e,r,n,i,a,o,s;for(a="/CIDInit /ProcSet findresource begin\n12 dict begin\nbegincmap\n/CIDSystemInfo <<\n /Registry (Adobe)\n /Ordering (UCS)\n /Supplement 0\n>> def\n/CMapName /Adobe-Identity-UCS def\n/CMapType 2 def\n1 begincodespacerange\n<0000><ffff>\nendcodespacerange",n=[],o=0,s=(r=Object.keys(t).sort((function(t,e){return t-e}))).length;o<s;o++)e=r[o],n.length>=100&&(a+="\n"+n.length+" beginbfchar\n"+n.join("\n")+"\nendbfchar",n=[]),void 0!==t[e]&&null!==t[e]&&"function"==typeof t[e].toString&&(i=("0000"+t[e].toString(16)).slice(-4),e=("0000"+(+e).toString(16)).slice(-4),n.push("<"+e+"><"+i+">"));return n.length&&(a+="\n"+n.length+" beginbfchar\n"+n.join("\n")+"\nendbfchar\n"),a+="endcmap\nCMapName currentdict /CMap defineresource pop\nend\nend"};e.events.push(["putFont",function(e){!function(e){var r=e.font,i=e.out,a=e.newObject,o=e.putStream;if(r.metadata instanceof t.API.TTFFont&&"Identity-H"===r.encoding){for(var s=r.metadata.Unicode.widths,c=r.metadata.subset.encode(r.metadata.glyIdsUsed,1),u="",l=0;l<c.length;l++)u+=String.fromCharCode(c[l]);var h=a();o({data:u,addLength1:!0,objectId:h}),i("endobj");var f=a();o({data:n(r.metadata.toUnicode),addLength1:!0,objectId:f}),i("endobj");var d=a();i("<<"),i("/Type /FontDescriptor"),i("/FontName /"+F(r.fontName)),i("/FontFile2 "+h+" 0 R"),i("/FontBBox "+t.API.PDFObject.convert(r.metadata.bbox)),i("/Flags "+r.metadata.flags),i("/StemV "+r.metadata.stemV),i("/ItalicAngle "+r.metadata.italicAngle),i("/Ascent "+r.metadata.ascender),i("/Descent "+r.metadata.decender),i("/CapHeight "+r.metadata.capHeight),i(">>"),i("endobj");var p=a();i("<<"),i("/Type /Font"),i("/BaseFont /"+F(r.fontName)),i("/FontDescriptor "+d+" 0 R"),i("/W "+t.API.PDFObject.convert(s)),i("/CIDToGIDMap /Identity"),i("/DW 1000"),i("/Subtype /CIDFontType2"),i("/CIDSystemInfo"),i("<<"),i("/Supplement 0"),i("/Registry (Adobe)"),i("/Ordering ("+r.encoding+")"),i(">>"),i(">>"),i("endobj"),r.objectNumber=a(),i("<<"),i("/Type /Font"),i("/Subtype /Type0"),i("/ToUnicode "+f+" 0 R"),i("/BaseFont /"+F(r.fontName)),i("/Encoding /"+r.encoding),i("/DescendantFonts ["+p+" 0 R]"),i(">>"),i("endobj"),r.isAlreadyPutted=!0}}(e)}]);e.events.push(["putFont",function(e){!function(e){var r=e.font,i=e.out,a=e.newObject,o=e.putStream;if(r.metadata instanceof t.API.TTFFont&&"WinAnsiEncoding"===r.encoding){for(var s=r.metadata.rawData,c="",u=0;u<s.length;u++)c+=String.fromCharCode(s[u]);var l=a();o({data:c,addLength1:!0,objectId:l}),i("endobj");var h=a();o({data:n(r.metadata.toUnicode),addLength1:!0,objectId:h}),i("endobj");var f=a();i("<<"),i("/Descent "+r.metadata.decender),i("/CapHeight "+r.metadata.capHeight),i("/StemV "+r.metadata.stemV),i("/Type /FontDescriptor"),i("/FontFile2 "+l+" 0 R"),i("/Flags 96"),i("/FontBBox "+t.API.PDFObject.convert(r.metadata.bbox)),i("/FontName /"+F(r.fontName)),i("/ItalicAngle "+r.metadata.italicAngle),i("/Ascent "+r.metadata.ascender),i(">>"),i("endobj"),r.objectNumber=a();for(var d=0;d<r.metadata.hmtx.widths.length;d++)r.metadata.hmtx.widths[d]=parseInt(r.metadata.hmtx.widths[d]*(1e3/r.metadata.head.unitsPerEm));i("<</Subtype/TrueType/Type/Font/ToUnicode "+h+" 0 R/BaseFont/"+F(r.fontName)+"/FontDescriptor "+f+" 0 R/Encoding/"+r.encoding+" /FirstChar 29 /LastChar 255 /Widths "+t.API.PDFObject.convert(r.metadata.hmtx.widths)+">>"),i("endobj"),r.isAlreadyPutted=!0}}(e)}]);var i=function(t){var e,n=t.text||"",i=t.x,a=t.y,o=t.options||{},s=t.mutex||{},c=s.pdfEscape,u=s.activeFontKey,l=s.fonts,h=u,f="",d=0,p="",g=l[h].encoding;if("Identity-H"!==l[h].encoding)return{text:n,x:i,y:a,options:o,mutex:s};for(p=n,h=u,Array.isArray(n)&&(p=n[0]),d=0;d<p.length;d+=1)l[h].metadata.hasOwnProperty("cmap")&&(e=l[h].metadata.cmap.unicode.codeMap[p[d].charCodeAt(0)]),e||p[d].charCodeAt(0)<256&&l[h].metadata.hasOwnProperty("Unicode")?f+=p[d]:f+="";var m="";return parseInt(h.slice(1))<14||"WinAnsiEncoding"===g?m=c(f,h).split("").map((function(t){return t.charCodeAt(0).toString(16)})).join(""):"Identity-H"===g&&(m=r(f,l[h])),s.isHex=!0,{text:m,x:i,y:a,options:o,mutex:s}};e.events.push(["postProcessText",function(t){var e=t.text||"",r=[],n={text:e,x:t.x,y:t.y,options:t.options,mutex:t.mutex};if(Array.isArray(e)){var a=0;for(a=0;a<e.length;a+=1)Array.isArray(e[a])&&3===e[a].length?r.push([i(Object.assign({},n,{text:e[a][0]})).text,e[a][1],e[a][2]]):r.push(i(Object.assign({},n,{text:e[a]})).text);t.text=r}else t.text=i(Object.assign({},n,{text:e})).text}])}(M), +/** + * @license + * jsPDF virtual FileSystem functionality + * + * Licensed under the MIT License. + * http://opensource.org/licenses/mit-license + */ +function(t){var e=function(){return void 0===this.internal.vFS&&(this.internal.vFS={}),!0};t.existsFileInVFS=function(t){return e.call(this),void 0!==this.internal.vFS[t]},t.addFileToVFS=function(t,r){return e.call(this),this.internal.vFS[t]=r,this},t.getFileFromVFS=function(t){return e.call(this),void 0!==this.internal.vFS[t]?this.internal.vFS[t]:null}}(M.API), +/** + * @license + * Unicode Bidi Engine based on the work of Alex Shensis (@asthensis) + * MIT License + */ +function(t){t.__bidiEngine__=t.prototype.__bidiEngine__=function(t){var r,n,i,a,o,s,c,u=e,l=[[0,3,0,1,0,0,0],[0,3,0,1,2,2,0],[0,3,0,17,2,0,1],[0,3,5,5,4,1,0],[0,3,21,21,4,0,1],[0,3,5,5,4,2,0]],h=[[2,0,1,1,0,1,0],[2,0,1,1,0,2,0],[2,0,2,1,3,2,0],[2,0,2,33,3,1,1]],f={L:0,R:1,EN:2,AN:3,N:4,B:5,S:6},d={0:0,5:1,6:2,7:3,32:4,251:5,254:6,255:7},p=["(",")","(","<",">","<","[","]","[","{","}","{","«","»","«","‹","›","‹","â…","â†","â…","â˝","âľ","â˝","₍","₎","₍","≤","≥","≤","〈","〉","〈","ďą™","ďąš","ďą™","ďą›","ďąś","ďą›","ďąť","ďąž","ďąť","﹤","﹥","﹤"],g=new RegExp(/^([1-4|9]|1[0-9]|2[0-9]|3[0168]|4[04589]|5[012]|7[78]|159|16[0-9]|17[0-2]|21[569]|22[03489]|250)$/),m=!1,v=0;this.__bidiEngine__={};var b=function(t){var e=t.charCodeAt(),r=e>>8,n=d[r];return void 0!==n?u[256*n+(255&e)]:252===r||253===r?"AL":g.test(r)?"L":8===r?"R":"N"},y=function(t){for(var e,r=0;r<t.length;r++){if("L"===(e=b(t.charAt(r))))return!1;if("R"===e)return!0}return!1},w=function(t,e,o,s){var c,u,l,h,f=e[s];switch(f){case"L":case"R":m=!1;break;case"N":case"AN":break;case"EN":m&&(f="AN");break;case"AL":m=!0,f="R";break;case"WS":f="N";break;case"CS":s<1||s+1>=e.length||"EN"!==(c=o[s-1])&&"AN"!==c||"EN"!==(u=e[s+1])&&"AN"!==u?f="N":m&&(u="AN"),f=u===c?u:"N";break;case"ES":f="EN"===(c=s>0?o[s-1]:"B")&&s+1<e.length&&"EN"===e[s+1]?"EN":"N";break;case"ET":if(s>0&&"EN"===o[s-1]){f="EN";break}if(m){f="N";break}for(l=s+1,h=e.length;l<h&&"ET"===e[l];)l++;f=l<h&&"EN"===e[l]?"EN":"N";break;case"NSM":if(i&&!a){for(h=e.length,l=s+1;l<h&&"NSM"===e[l];)l++;if(l<h){var d=t[s],p=d>=1425&&d<=2303||64286===d;if(c=e[l],p&&("R"===c||"AL"===c)){f="R";break}}}f=s<1||"B"===(c=e[s-1])?"N":o[s-1];break;case"B":m=!1,r=!0,f=v;break;case"S":n=!0,f="N";break;case"LRE":case"RLE":case"LRO":case"RLO":case"PDF":m=!1;break;case"BN":f="N"}return f},N=function(t,e,r){var n=t.split("");return r&&L(n,r,{hiLevel:v}),n.reverse(),e&&e.reverse(),n.join("")},L=function(t,e,i){var a,o,s,c,u,d=-1,p=t.length,g=0,y=[],N=v?h:l,L=[];for(m=!1,r=!1,n=!1,o=0;o<p;o++)L[o]=b(t[o]);for(s=0;s<p;s++){if(u=g,y[s]=w(t,L,y,s),a=240&(g=N[u][f[y[s]]]),g&=15,e[s]=c=N[g][5],a>0)if(16===a){for(o=d;o<s;o++)e[o]=1;d=-1}else d=-1;if(N[g][6])-1===d&&(d=s);else if(d>-1){for(o=d;o<s;o++)e[o]=c;d=-1}"B"===L[s]&&(e[s]=0),i.hiLevel|=c}n&&function(t,e,r){for(var n=0;n<r;n++)if("S"===t[n]){e[n]=v;for(var i=n-1;i>=0&&"WS"===t[i];i--)e[i]=v}}(L,e,p)},A=function(t,e,n,i,a){if(!(a.hiLevel<t)){if(1===t&&1===v&&!r)return e.reverse(),void(n&&n.reverse());for(var o,s,c,u,l=e.length,h=0;h<l;){if(i[h]>=t){for(c=h+1;c<l&&i[c]>=t;)c++;for(u=h,s=c-1;u<s;u++,s--)o=e[u],e[u]=e[s],e[s]=o,n&&(o=n[u],n[u]=n[s],n[s]=o);h=c}h++}}},x=function(t,e,r){var n=t.split(""),i={hiLevel:v};return r||(r=[]),L(n,r,i),function(t,e,r){if(0!==r.hiLevel&&c)for(var n,i=0;i<t.length;i++)1===e[i]&&(n=p.indexOf(t[i]))>=0&&(t[i]=p[n+1])}(n,r,i),A(2,n,e,r,i),A(1,n,e,r,i),n.join("")};return this.__bidiEngine__.doBidiReorder=function(t,e,r){if(function(t,e){if(e)for(var r=0;r<t.length;r++)e[r]=r;void 0===a&&(a=y(t)),void 0===s&&(s=y(t))}(t,e),i||!o||s)if(i&&o&&a^s)v=a?1:0,t=N(t,e,r);else if(!i&&o&&s)v=a?1:0,t=x(t,e,r),t=N(t,e);else if(!i||a||o||s){if(i&&!o&&a^s)t=N(t,e),a?(v=0,t=x(t,e,r)):(v=1,t=x(t,e,r),t=N(t,e));else if(i&&a&&!o&&s)v=1,t=x(t,e,r),t=N(t,e);else if(!i&&!o&&a^s){var n=c;a?(v=1,t=x(t,e,r),v=0,c=!1,t=x(t,e,r),c=n):(v=0,t=x(t,e,r),t=N(t,e),v=1,c=!1,t=x(t,e,r),c=n,t=N(t,e))}}else v=0,t=x(t,e,r);else v=a?1:0,t=x(t,e,r);return t},this.__bidiEngine__.setOptions=function(t){t&&(i=t.isInputVisual,o=t.isOutputVisual,a=t.isInputRtl,s=t.isOutputRtl,c=t.isSymmetricSwapping)},this.__bidiEngine__.setOptions(t),this.__bidiEngine__};var e=["BN","BN","BN","BN","BN","BN","BN","BN","BN","S","B","S","WS","B","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","B","B","B","S","WS","N","N","ET","ET","ET","N","N","N","N","N","ES","CS","ES","CS","CS","EN","EN","EN","EN","EN","EN","EN","EN","EN","EN","CS","N","N","N","N","N","N","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","N","N","N","N","N","N","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","N","N","N","N","BN","BN","BN","BN","BN","BN","B","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","CS","N","ET","ET","ET","ET","N","N","N","N","L","N","N","BN","N","N","ET","ET","EN","EN","N","L","N","N","N","EN","L","N","N","N","N","N","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","N","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","N","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","N","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","N","N","L","L","L","L","L","L","L","N","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","N","L","N","N","N","N","N","ET","N","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","R","NSM","R","NSM","NSM","R","NSM","NSM","R","NSM","N","N","N","N","N","N","N","N","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","N","N","N","N","N","R","R","R","R","R","N","N","N","N","N","N","N","N","N","N","N","AN","AN","AN","AN","AN","AN","N","N","AL","ET","ET","AL","CS","AL","N","N","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AL","AL","N","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AN","AN","AN","AN","AN","AN","AN","AN","AN","AN","ET","AN","AN","AL","AL","AL","NSM","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AN","N","NSM","NSM","NSM","NSM","NSM","NSM","AL","AL","NSM","NSM","N","NSM","NSM","NSM","NSM","AL","AL","EN","EN","EN","EN","EN","EN","EN","EN","EN","EN","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","N","AL","AL","NSM","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","N","N","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AL","N","N","N","N","N","N","N","N","N","N","N","N","N","N","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","R","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","R","R","N","N","N","N","R","N","N","N","N","N","WS","WS","WS","WS","WS","WS","WS","WS","WS","WS","WS","BN","BN","BN","L","R","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","WS","B","LRE","RLE","PDF","LRO","RLO","CS","ET","ET","ET","ET","ET","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","CS","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","WS","BN","BN","BN","BN","BN","N","LRI","RLI","FSI","PDI","BN","BN","BN","BN","BN","BN","EN","L","N","N","EN","EN","EN","EN","EN","EN","ES","ES","N","N","N","L","EN","EN","EN","EN","EN","EN","EN","EN","EN","EN","ES","ES","N","N","N","N","L","L","L","L","L","L","L","L","L","L","L","L","L","N","N","N","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","ET","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","L","L","L","L","L","L","L","N","N","N","N","N","N","N","N","N","N","N","N","L","L","L","L","L","N","N","N","N","N","R","NSM","R","R","R","R","R","R","R","R","R","R","ES","R","R","R","R","R","R","R","R","R","R","R","R","R","N","R","R","R","R","R","N","R","N","R","R","N","R","R","N","R","R","R","R","R","R","R","R","R","R","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","CS","N","CS","N","N","CS","N","N","N","N","N","N","N","N","N","ET","N","N","ES","ES","N","N","N","N","N","ET","ET","N","N","N","N","N","AL","AL","AL","AL","AL","N","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","N","N","BN","N","N","N","ET","ET","ET","N","N","N","N","N","ES","CS","ES","CS","CS","EN","EN","EN","EN","EN","EN","EN","EN","EN","EN","CS","N","N","N","N","N","N","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","N","N","N","N","N","N","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","N","N","N","N","N","N","N","N","N","N","N","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","N","N","N","L","L","L","L","L","L","N","N","L","L","L","L","L","L","N","N","L","L","L","L","L","L","N","N","L","L","L","N","N","N","ET","ET","N","N","N","ET","ET","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N","N"],r=new t.__bidiEngine__({isInputVisual:!0});t.API.events.push(["postProcessText",function(t){var e=t.text,n=(t.x,t.y,t.options||{}),i=(t.mutex,n.lang,[]);if(n.isInputVisual="boolean"!=typeof n.isInputVisual||n.isInputVisual,r.setOptions(n),"[object Array]"===Object.prototype.toString.call(e)){var a=0;for(i=[],a=0;a<e.length;a+=1)"[object Array]"===Object.prototype.toString.call(e[a])?i.push([r.doBidiReorder(e[a][0]),e[a][1],e[a][2]]):i.push([r.doBidiReorder(e[a])]);t.text=i}else t.text=r.doBidiReorder(e);r.setOptions({isInputVisual:!0})}])}(M),M.API.TTFFont=function(){function t(t){var e;if(this.rawData=t,e=this.contents=new Te(t),this.contents.pos=4,"ttcf"===e.readString(4))throw new Error("TTCF not supported.");e.pos=0,this.parse(),this.subset=new ar(this),this.registerTTF()}return t.open=function(e){return new t(e)},t.prototype.parse=function(){return this.directory=new Ue(this.contents),this.head=new We(this),this.name=new Ze(this),this.cmap=new Ge(this),this.toUnicode={},this.hhea=new Ye(this),this.maxp=new $e(this),this.hmtx=new Qe(this),this.post=new Xe(this),this.os2=new Je(this),this.loca=new ir(this),this.glyf=new er(this),this.ascender=this.os2.exists&&this.os2.ascender||this.hhea.ascender,this.decender=this.os2.exists&&this.os2.decender||this.hhea.decender,this.lineGap=this.os2.exists&&this.os2.lineGap||this.hhea.lineGap,this.bbox=[this.head.xMin,this.head.yMin,this.head.xMax,this.head.yMax]},t.prototype.registerTTF=function(){var t,e,r,n,i;if(this.scaleFactor=1e3/this.head.unitsPerEm,this.bbox=function(){var e,r,n,i;for(i=[],e=0,r=(n=this.bbox).length;e<r;e++)t=n[e],i.push(Math.round(t*this.scaleFactor));return i}.call(this),this.stemV=0,this.post.exists?(r=255&(n=this.post.italic_angle),0!=(32768&(e=n>>16))&&(e=-(1+(65535^e))),this.italicAngle=+(e+"."+r)):this.italicAngle=0,this.ascender=Math.round(this.ascender*this.scaleFactor),this.decender=Math.round(this.decender*this.scaleFactor),this.lineGap=Math.round(this.lineGap*this.scaleFactor),this.capHeight=this.os2.exists&&this.os2.capHeight||this.ascender,this.xHeight=this.os2.exists&&this.os2.xHeight||0,this.familyClass=(this.os2.exists&&this.os2.familyClass||0)>>8,this.isSerif=1===(i=this.familyClass)||2===i||3===i||4===i||5===i||7===i,this.isScript=10===this.familyClass,this.flags=0,this.post.isFixedPitch&&(this.flags|=1),this.isSerif&&(this.flags|=2),this.isScript&&(this.flags|=8),0!==this.italicAngle&&(this.flags|=64),this.flags|=32,!this.cmap.unicode)throw new Error("No unicode cmap for font")},t.prototype.characterToGlyph=function(t){var e;return(null!=(e=this.cmap.unicode)?e.codeMap[t]:void 0)||0},t.prototype.widthOfGlyph=function(t){var e;return e=1e3/this.head.unitsPerEm,this.hmtx.forGlyph(t).advance*e},t.prototype.widthOfString=function(t,e,r){var n,i,a,o;for(a=0,i=0,o=(t=""+t).length;0<=o?i<o:i>o;i=0<=o?++i:--i)n=t.charCodeAt(i),a+=this.widthOfGlyph(this.characterToGlyph(n))+r*(1e3/e)||0;return a*(e/1e3)},t.prototype.lineHeight=function(t,e){var r;return null==e&&(e=!1),r=e?this.lineGap:0,(this.ascender+r-this.decender)/1e3*t},t}();var Re,Te=function(){function t(t){this.data=null!=t?t:[],this.pos=0,this.length=this.data.length}return t.prototype.readByte=function(){return this.data[this.pos++]},t.prototype.writeByte=function(t){return this.data[this.pos++]=t},t.prototype.readUInt32=function(){return 16777216*this.readByte()+(this.readByte()<<16)+(this.readByte()<<8)+this.readByte()},t.prototype.writeUInt32=function(t){return this.writeByte(t>>>24&255),this.writeByte(t>>16&255),this.writeByte(t>>8&255),this.writeByte(255&t)},t.prototype.readInt32=function(){var t;return(t=this.readUInt32())>=2147483648?t-4294967296:t},t.prototype.writeInt32=function(t){return t<0&&(t+=4294967296),this.writeUInt32(t)},t.prototype.readUInt16=function(){return this.readByte()<<8|this.readByte()},t.prototype.writeUInt16=function(t){return this.writeByte(t>>8&255),this.writeByte(255&t)},t.prototype.readInt16=function(){var t;return(t=this.readUInt16())>=32768?t-65536:t},t.prototype.writeInt16=function(t){return t<0&&(t+=65536),this.writeUInt16(t)},t.prototype.readString=function(t){var e,r;for(r=[],e=0;0<=t?e<t:e>t;e=0<=t?++e:--e)r[e]=String.fromCharCode(this.readByte());return r.join("")},t.prototype.writeString=function(t){var e,r,n;for(n=[],e=0,r=t.length;0<=r?e<r:e>r;e=0<=r?++e:--e)n.push(this.writeByte(t.charCodeAt(e)));return n},t.prototype.readShort=function(){return this.readInt16()},t.prototype.writeShort=function(t){return this.writeInt16(t)},t.prototype.readLongLong=function(){var t,e,r,n,i,a,o,s;return t=this.readByte(),e=this.readByte(),r=this.readByte(),n=this.readByte(),i=this.readByte(),a=this.readByte(),o=this.readByte(),s=this.readByte(),128&t?-1*(72057594037927940*(255^t)+281474976710656*(255^e)+1099511627776*(255^r)+4294967296*(255^n)+16777216*(255^i)+65536*(255^a)+256*(255^o)+(255^s)+1):72057594037927940*t+281474976710656*e+1099511627776*r+4294967296*n+16777216*i+65536*a+256*o+s},t.prototype.writeLongLong=function(t){var e,r;return e=Math.floor(t/4294967296),r=4294967295&t,this.writeByte(e>>24&255),this.writeByte(e>>16&255),this.writeByte(e>>8&255),this.writeByte(255&e),this.writeByte(r>>24&255),this.writeByte(r>>16&255),this.writeByte(r>>8&255),this.writeByte(255&r)},t.prototype.readInt=function(){return this.readInt32()},t.prototype.writeInt=function(t){return this.writeInt32(t)},t.prototype.read=function(t){var e,r;for(e=[],r=0;0<=t?r<t:r>t;r=0<=t?++r:--r)e.push(this.readByte());return e},t.prototype.write=function(t){var e,r,n,i;for(i=[],r=0,n=t.length;r<n;r++)e=t[r],i.push(this.writeByte(e));return i},t}(),Ue=function(){var t;function e(t){var e,r,n;for(this.scalarType=t.readInt(),this.tableCount=t.readShort(),this.searchRange=t.readShort(),this.entrySelector=t.readShort(),this.rangeShift=t.readShort(),this.tables={},r=0,n=this.tableCount;0<=n?r<n:r>n;r=0<=n?++r:--r)e={tag:t.readString(4),checksum:t.readInt(),offset:t.readInt(),length:t.readInt()},this.tables[e.tag]=e}return e.prototype.encode=function(e){var r,n,i,a,o,s,c,u,l,h,f,d,p;for(p in f=Object.keys(e).length,s=Math.log(2),l=16*Math.floor(Math.log(f)/s),a=Math.floor(l/s),u=16*f-l,(n=new Te).writeInt(this.scalarType),n.writeShort(f),n.writeShort(l),n.writeShort(a),n.writeShort(u),i=16*f,c=n.pos+i,o=null,d=[],e)for(h=e[p],n.writeString(p),n.writeInt(t(h)),n.writeInt(c),n.writeInt(h.length),d=d.concat(h),"head"===p&&(o=c),c+=h.length;c%4;)d.push(0),c++;return n.write(d),r=2981146554-t(n.data),n.pos=o+8,n.writeUInt32(r),n.data},t=function(t){var e,r,n,i;for(t=tr.call(t);t.length%4;)t.push(0);for(n=new Te(t),r=0,e=0,i=t.length;e<i;e=e+=4)r+=n.readUInt32();return 4294967295&r},e}(),ze={}.hasOwnProperty,He=function(t,e){for(var r in e)ze.call(e,r)&&(t[r]=e[r]);function n(){this.constructor=t}return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},We=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return He(e,t),e.prototype.tag="head",e.prototype.parse=function(t){return t.pos=this.offset,this.version=t.readInt(),this.revision=t.readInt(),this.checkSumAdjustment=t.readInt(),this.magicNumber=t.readInt(),this.flags=t.readShort(),this.unitsPerEm=t.readShort(),this.created=t.readLongLong(),this.modified=t.readLongLong(),this.xMin=t.readShort(),this.yMin=t.readShort(),this.xMax=t.readShort(),this.yMax=t.readShort(),this.macStyle=t.readShort(),this.lowestRecPPEM=t.readShort(),this.fontDirectionHint=t.readShort(),this.indexToLocFormat=t.readShort(),this.glyphDataFormat=t.readShort()},e.prototype.encode=function(t){var e;return(e=new Te).writeInt(this.version),e.writeInt(this.revision),e.writeInt(this.checkSumAdjustment),e.writeInt(this.magicNumber),e.writeShort(this.flags),e.writeShort(this.unitsPerEm),e.writeLongLong(this.created),e.writeLongLong(this.modified),e.writeShort(this.xMin),e.writeShort(this.yMin),e.writeShort(this.xMax),e.writeShort(this.yMax),e.writeShort(this.macStyle),e.writeShort(this.lowestRecPPEM),e.writeShort(this.fontDirectionHint),e.writeShort(t),e.writeShort(this.glyphDataFormat),e.data},e}(Re=function(){function t(t){var e;this.file=t,e=this.file.directory.tables[this.tag],this.exists=!!e,e&&(this.offset=e.offset,this.length=e.length,this.parse(this.file.contents))}return t.prototype.parse=function(){},t.prototype.encode=function(){},t.prototype.raw=function(){return this.exists?(this.file.contents.pos=this.offset,this.file.contents.read(this.length)):null},t}()),Ve=function(){function t(t,e){var r,n,i,a,o,s,c,u,l,h,f,d,p,g,m,v,b;switch(this.platformID=t.readUInt16(),this.encodingID=t.readShort(),this.offset=e+t.readInt(),l=t.pos,t.pos=this.offset,this.format=t.readUInt16(),this.length=t.readUInt16(),this.language=t.readUInt16(),this.isUnicode=3===this.platformID&&1===this.encodingID&&4===this.format||0===this.platformID&&4===this.format,this.codeMap={},this.format){case 0:for(s=0;s<256;++s)this.codeMap[s]=t.readByte();break;case 4:for(f=t.readUInt16(),h=f/2,t.pos+=6,i=function(){var e,r;for(r=[],s=e=0;0<=h?e<h:e>h;s=0<=h?++e:--e)r.push(t.readUInt16());return r}(),t.pos+=2,p=function(){var e,r;for(r=[],s=e=0;0<=h?e<h:e>h;s=0<=h?++e:--e)r.push(t.readUInt16());return r}(),c=function(){var e,r;for(r=[],s=e=0;0<=h?e<h:e>h;s=0<=h?++e:--e)r.push(t.readUInt16());return r}(),u=function(){var e,r;for(r=[],s=e=0;0<=h?e<h:e>h;s=0<=h?++e:--e)r.push(t.readUInt16());return r}(),n=(this.length-t.pos+this.offset)/2,o=function(){var e,r;for(r=[],s=e=0;0<=n?e<n:e>n;s=0<=n?++e:--e)r.push(t.readUInt16());return r}(),s=m=0,b=i.length;m<b;s=++m)for(g=i[s],r=v=d=p[s];d<=g?v<=g:v>=g;r=d<=g?++v:--v)0===u[s]?a=r+c[s]:0!==(a=o[u[s]/2+(r-d)-(h-s)]||0)&&(a+=c[s]),this.codeMap[r]=65535&a}t.pos=l}return t.encode=function(t,e){var r,n,i,a,o,s,c,u,l,h,f,d,p,g,m,v,b,y,w,N,L,A,x,S,_,P,k,F,I,C,j,O,B,M,E,q,D,R,T,U,z,H,W,V,G,Y;switch(F=new Te,a=Object.keys(t).sort((function(t,e){return t-e})),e){case"macroman":for(p=0,g=function(){var t=[];for(d=0;d<256;++d)t.push(0);return t}(),v={0:0},i={},I=0,B=a.length;I<B;I++)null==v[W=t[n=a[I]]]&&(v[W]=++p),i[n]={old:t[n],new:v[t[n]]},g[n]=v[t[n]];return F.writeUInt16(1),F.writeUInt16(0),F.writeUInt32(12),F.writeUInt16(0),F.writeUInt16(262),F.writeUInt16(0),F.write(g),{charMap:i,subtable:F.data,maxGlyphID:p+1};case"unicode":for(P=[],l=[],b=0,v={},r={},m=c=null,C=0,M=a.length;C<M;C++)null==v[w=t[n=a[C]]]&&(v[w]=++b),r[n]={old:w,new:v[w]},o=v[w]-n,null!=m&&o===c||(m&&l.push(m),P.push(n),c=o),m=n;for(m&&l.push(m),l.push(65535),P.push(65535),S=2*(x=P.length),A=2*Math.pow(Math.log(x)/Math.LN2,2),h=Math.log(A/2)/Math.LN2,L=2*x-A,s=[],N=[],f=[],d=j=0,E=P.length;j<E;d=++j){if(_=P[d],u=l[d],65535===_){s.push(0),N.push(0);break}if(_-(k=r[_].new)>=32768)for(s.push(0),N.push(2*(f.length+x-d)),n=O=_;_<=u?O<=u:O>=u;n=_<=u?++O:--O)f.push(r[n].new);else s.push(k-_),N.push(0)}for(F.writeUInt16(3),F.writeUInt16(1),F.writeUInt32(12),F.writeUInt16(4),F.writeUInt16(16+8*x+2*f.length),F.writeUInt16(0),F.writeUInt16(S),F.writeUInt16(A),F.writeUInt16(h),F.writeUInt16(L),z=0,q=l.length;z<q;z++)n=l[z],F.writeUInt16(n);for(F.writeUInt16(0),H=0,D=P.length;H<D;H++)n=P[H],F.writeUInt16(n);for(V=0,R=s.length;V<R;V++)o=s[V],F.writeUInt16(o);for(G=0,T=N.length;G<T;G++)y=N[G],F.writeUInt16(y);for(Y=0,U=f.length;Y<U;Y++)p=f[Y],F.writeUInt16(p);return{charMap:r,subtable:F.data,maxGlyphID:b+1}}},t}(),Ge=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return He(e,t),e.prototype.tag="cmap",e.prototype.parse=function(t){var e,r,n;for(t.pos=this.offset,this.version=t.readUInt16(),n=t.readUInt16(),this.tables=[],this.unicode=null,r=0;0<=n?r<n:r>n;r=0<=n?++r:--r)e=new Ve(t,this.offset),this.tables.push(e),e.isUnicode&&null==this.unicode&&(this.unicode=e);return!0},e.encode=function(t,e){var r,n;return null==e&&(e="macroman"),r=Ve.encode(t,e),(n=new Te).writeUInt16(0),n.writeUInt16(1),r.table=n.data.concat(r.subtable),r},e}(Re),Ye=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return He(e,t),e.prototype.tag="hhea",e.prototype.parse=function(t){return t.pos=this.offset,this.version=t.readInt(),this.ascender=t.readShort(),this.decender=t.readShort(),this.lineGap=t.readShort(),this.advanceWidthMax=t.readShort(),this.minLeftSideBearing=t.readShort(),this.minRightSideBearing=t.readShort(),this.xMaxExtent=t.readShort(),this.caretSlopeRise=t.readShort(),this.caretSlopeRun=t.readShort(),this.caretOffset=t.readShort(),t.pos+=8,this.metricDataFormat=t.readShort(),this.numberOfMetrics=t.readUInt16()},e}(Re),Je=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return He(e,t),e.prototype.tag="OS/2",e.prototype.parse=function(t){if(t.pos=this.offset,this.version=t.readUInt16(),this.averageCharWidth=t.readShort(),this.weightClass=t.readUInt16(),this.widthClass=t.readUInt16(),this.type=t.readShort(),this.ySubscriptXSize=t.readShort(),this.ySubscriptYSize=t.readShort(),this.ySubscriptXOffset=t.readShort(),this.ySubscriptYOffset=t.readShort(),this.ySuperscriptXSize=t.readShort(),this.ySuperscriptYSize=t.readShort(),this.ySuperscriptXOffset=t.readShort(),this.ySuperscriptYOffset=t.readShort(),this.yStrikeoutSize=t.readShort(),this.yStrikeoutPosition=t.readShort(),this.familyClass=t.readShort(),this.panose=function(){var e,r;for(r=[],e=0;e<10;++e)r.push(t.readByte());return r}(),this.charRange=function(){var e,r;for(r=[],e=0;e<4;++e)r.push(t.readInt());return r}(),this.vendorID=t.readString(4),this.selection=t.readShort(),this.firstCharIndex=t.readShort(),this.lastCharIndex=t.readShort(),this.version>0&&(this.ascent=t.readShort(),this.descent=t.readShort(),this.lineGap=t.readShort(),this.winAscent=t.readShort(),this.winDescent=t.readShort(),this.codePageRange=function(){var e,r;for(r=[],e=0;e<2;e=++e)r.push(t.readInt());return r}(),this.version>1))return this.xHeight=t.readShort(),this.capHeight=t.readShort(),this.defaultChar=t.readShort(),this.breakChar=t.readShort(),this.maxContext=t.readShort()},e}(Re),Xe=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return He(e,t),e.prototype.tag="post",e.prototype.parse=function(t){var e,r,n;switch(t.pos=this.offset,this.format=t.readInt(),this.italicAngle=t.readInt(),this.underlinePosition=t.readShort(),this.underlineThickness=t.readShort(),this.isFixedPitch=t.readInt(),this.minMemType42=t.readInt(),this.maxMemType42=t.readInt(),this.minMemType1=t.readInt(),this.maxMemType1=t.readInt(),this.format){case 65536:break;case 131072:var i;for(r=t.readUInt16(),this.glyphNameIndex=[],i=0;0<=r?i<r:i>r;i=0<=r?++i:--i)this.glyphNameIndex.push(t.readUInt16());for(this.names=[],n=[];t.pos<this.offset+this.length;)e=t.readByte(),n.push(this.names.push(t.readString(e)));return n;case 151552:return r=t.readUInt16(),this.offsets=t.read(r);case 196608:break;case 262144:return this.map=function(){var e,r,n;for(n=[],i=e=0,r=this.file.maxp.numGlyphs;0<=r?e<r:e>r;i=0<=r?++e:--e)n.push(t.readUInt32());return n}.call(this)}},e}(Re),Ke=function(t,e){this.raw=t,this.length=t.length,this.platformID=e.platformID,this.encodingID=e.encodingID,this.languageID=e.languageID},Ze=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return He(e,t),e.prototype.tag="name",e.prototype.parse=function(t){var e,r,n,i,a,o,s,c,u,l,h;for(t.pos=this.offset,t.readShort(),e=t.readShort(),o=t.readShort(),r=[],i=0;0<=e?i<e:i>e;i=0<=e?++i:--i)r.push({platformID:t.readShort(),encodingID:t.readShort(),languageID:t.readShort(),nameID:t.readShort(),length:t.readShort(),offset:this.offset+o+t.readShort()});for(s={},i=u=0,l=r.length;u<l;i=++u)n=r[i],t.pos=n.offset,c=t.readString(n.length),a=new Ke(c,n),null==s[h=n.nameID]&&(s[h]=[]),s[n.nameID].push(a);this.strings=s,this.copyright=s[0],this.fontFamily=s[1],this.fontSubfamily=s[2],this.uniqueSubfamily=s[3],this.fontName=s[4],this.version=s[5];try{this.postscriptName=s[6][0].raw.replace(/[\x00-\x19\x80-\xff]/g,"")}catch(t){this.postscriptName=s[4][0].raw.replace(/[\x00-\x19\x80-\xff]/g,"")}return this.trademark=s[7],this.manufacturer=s[8],this.designer=s[9],this.description=s[10],this.vendorUrl=s[11],this.designerUrl=s[12],this.license=s[13],this.licenseUrl=s[14],this.preferredFamily=s[15],this.preferredSubfamily=s[17],this.compatibleFull=s[18],this.sampleText=s[19]},e}(Re),$e=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return He(e,t),e.prototype.tag="maxp",e.prototype.parse=function(t){return t.pos=this.offset,this.version=t.readInt(),this.numGlyphs=t.readUInt16(),this.maxPoints=t.readUInt16(),this.maxContours=t.readUInt16(),this.maxCompositePoints=t.readUInt16(),this.maxComponentContours=t.readUInt16(),this.maxZones=t.readUInt16(),this.maxTwilightPoints=t.readUInt16(),this.maxStorage=t.readUInt16(),this.maxFunctionDefs=t.readUInt16(),this.maxInstructionDefs=t.readUInt16(),this.maxStackElements=t.readUInt16(),this.maxSizeOfInstructions=t.readUInt16(),this.maxComponentElements=t.readUInt16(),this.maxComponentDepth=t.readUInt16()},e}(Re),Qe=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return He(e,t),e.prototype.tag="hmtx",e.prototype.parse=function(t){var e,r,n,i,a,o,s;for(t.pos=this.offset,this.metrics=[],e=0,o=this.file.hhea.numberOfMetrics;0<=o?e<o:e>o;e=0<=o?++e:--e)this.metrics.push({advance:t.readUInt16(),lsb:t.readInt16()});for(n=this.file.maxp.numGlyphs-this.file.hhea.numberOfMetrics,this.leftSideBearings=function(){var r,i;for(i=[],e=r=0;0<=n?r<n:r>n;e=0<=n?++r:--r)i.push(t.readInt16());return i}(),this.widths=function(){var t,e,r,n;for(n=[],t=0,e=(r=this.metrics).length;t<e;t++)i=r[t],n.push(i.advance);return n}.call(this),r=this.widths[this.widths.length-1],s=[],e=a=0;0<=n?a<n:a>n;e=0<=n?++a:--a)s.push(this.widths.push(r));return s},e.prototype.forGlyph=function(t){return t in this.metrics?this.metrics[t]:{advance:this.metrics[this.metrics.length-1].advance,lsb:this.leftSideBearings[t-this.metrics.length]}},e}(Re),tr=[].slice,er=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return He(e,t),e.prototype.tag="glyf",e.prototype.parse=function(){return this.cache={}},e.prototype.glyphFor=function(t){var e,r,n,i,a,o,s,c,u,l;return t in this.cache?this.cache[t]:(i=this.file.loca,e=this.file.contents,r=i.indexOf(t),0===(n=i.lengthOf(t))?this.cache[t]=null:(e.pos=this.offset+r,a=(o=new Te(e.read(n))).readShort(),c=o.readShort(),l=o.readShort(),s=o.readShort(),u=o.readShort(),this.cache[t]=-1===a?new nr(o,c,l,s,u):new rr(o,a,c,l,s,u),this.cache[t]))},e.prototype.encode=function(t,e,r){var n,i,a,o,s;for(a=[],i=[],o=0,s=e.length;o<s;o++)n=t[e[o]],i.push(a.length),n&&(a=a.concat(n.encode(r)));return i.push(a.length),{table:a,offsets:i}},e}(Re),rr=function(){function t(t,e,r,n,i,a){this.raw=t,this.numberOfContours=e,this.xMin=r,this.yMin=n,this.xMax=i,this.yMax=a,this.compound=!1}return t.prototype.encode=function(){return this.raw.data},t}(),nr=function(){function t(t,e,r,n,i){var a,o;for(this.raw=t,this.xMin=e,this.yMin=r,this.xMax=n,this.yMax=i,this.compound=!0,this.glyphIDs=[],this.glyphOffsets=[],a=this.raw;o=a.readShort(),this.glyphOffsets.push(a.pos),this.glyphIDs.push(a.readUInt16()),32&o;)a.pos+=1&o?4:2,128&o?a.pos+=8:64&o?a.pos+=4:8&o&&(a.pos+=2)}return 1,8,32,64,128,t.prototype.encode=function(){var t,e,r;for(e=new Te(tr.call(this.raw.data)),t=0,r=this.glyphIDs.length;t<r;++t)e.pos=this.glyphOffsets[t];return e.data},t}(),ir=function(t){function e(){return e.__super__.constructor.apply(this,arguments)}return He(e,t),e.prototype.tag="loca",e.prototype.parse=function(t){var e,r;return t.pos=this.offset,e=this.file.head.indexToLocFormat,this.offsets=0===e?function(){var e,n;for(n=[],r=0,e=this.length;r<e;r+=2)n.push(2*t.readUInt16());return n}.call(this):function(){var e,n;for(n=[],r=0,e=this.length;r<e;r+=4)n.push(t.readUInt32());return n}.call(this)},e.prototype.indexOf=function(t){return this.offsets[t]},e.prototype.lengthOf=function(t){return this.offsets[t+1]-this.offsets[t]},e.prototype.encode=function(t,e){for(var r=new Uint32Array(this.offsets.length),n=0,i=0,a=0;a<r.length;++a)if(r[a]=n,i<e.length&&e[i]==a){++i,r[a]=n;var o=this.offsets[a],s=this.offsets[a+1]-o;s>0&&(n+=s)}for(var c=new Array(4*r.length),u=0;u<r.length;++u)c[4*u+3]=255&r[u],c[4*u+2]=(65280&r[u])>>8,c[4*u+1]=(16711680&r[u])>>16,c[4*u]=(4278190080&r[u])>>24;return c},e}(Re),ar=function(){function t(t){this.font=t,this.subset={},this.unicodes={},this.next=33}return t.prototype.generateCmap=function(){var t,e,r,n,i;for(e in n=this.font.cmap.tables[0].codeMap,t={},i=this.subset)r=i[e],t[e]=n[r];return t},t.prototype.glyphsFor=function(t){var e,r,n,i,a,o,s;for(n={},a=0,o=t.length;a<o;a++)n[i=t[a]]=this.font.glyf.glyphFor(i);for(i in e=[],n)(null!=(r=n[i])?r.compound:void 0)&&e.push.apply(e,r.glyphIDs);if(e.length>0)for(i in s=this.glyphsFor(e))r=s[i],n[i]=r;return n},t.prototype.encode=function(t,e){var r,n,i,a,o,s,c,u,l,h,f,d,p,g,m;for(n in r=Ge.encode(this.generateCmap(),"unicode"),a=this.glyphsFor(t),f={0:0},m=r.charMap)f[(s=m[n]).old]=s.new;for(d in h=r.maxGlyphID,a)d in f||(f[d]=h++);return u=function(t){var e,r;for(e in r={},t)r[t[e]]=e;return r}(f),l=Object.keys(u).sort((function(t,e){return t-e})),p=function(){var t,e,r;for(r=[],t=0,e=l.length;t<e;t++)o=l[t],r.push(u[o]);return r}(),i=this.font.glyf.encode(a,p,f),c=this.font.loca.encode(i.offsets,p),g={cmap:this.font.cmap.raw(),glyf:i.table,loca:c,hmtx:this.font.hmtx.raw(),hhea:this.font.hhea.raw(),maxp:this.font.maxp.raw(),post:this.font.post.raw(),name:this.font.name.raw(),head:this.font.head.encode(e)},this.font.os2.exists&&(g["OS/2"]=this.font.os2.raw()),this.font.directory.encode(g)},t}();M.API.PDFObject=function(){var t;function e(){}return t=function(t,e){return(Array(e+1).join("0")+t).slice(-e)},e.convert=function(r){var n,i,a,o;if(Array.isArray(r))return"["+function(){var t,i,a;for(a=[],t=0,i=r.length;t<i;t++)n=r[t],a.push(e.convert(n));return a}().join(" ")+"]";if("string"==typeof r)return"/"+r;if(null!=r?r.isString:void 0)return"("+r+")";if(r instanceof Date)return"(D:"+t(r.getUTCFullYear(),4)+t(r.getUTCMonth(),2)+t(r.getUTCDate(),2)+t(r.getUTCHours(),2)+t(r.getUTCMinutes(),2)+t(r.getUTCSeconds(),2)+"Z)";if("[object Object]"==={}.toString.call(r)){for(i in a=["<<"],r)o=r[i],a.push("/"+i+" "+e.convert(o));return a.push(">>"),a.join("\n")}return""+r},e}(),t.AcroForm=xt,t.AcroFormAppearance=Lt,t.AcroFormButton=gt,t.AcroFormCheckBox=yt,t.AcroFormChoiceField=ht,t.AcroFormComboBox=dt,t.AcroFormEditBox=pt,t.AcroFormListBox=ft,t.AcroFormPasswordField=Nt,t.AcroFormPushButton=mt,t.AcroFormRadioButton=vt,t.AcroFormTextField=wt,t.GState=C,t.ShadingPattern=O,t.TilingPattern=B,t.default=M,t.jsPDF=M,Object.defineProperty(t,"__esModule",{value:!0})})); +//# sourceMappingURL=jspdf.umd.min.js.map diff --git a/privacyidea/static/templates/footer.html b/privacyidea/static/templates/footer.html index 9b36fb13f..878d6d211 100644 --- a/privacyidea/static/templates/footer.html +++ b/privacyidea/static/templates/footer.html @@ -86,8 +86,8 @@ <script src="{{ instance }}/{{ "static/contrib/js/webauthn-client/pi-webauthn.js" | versioned }}"></script> <script src="{{ instance }}/{{ "static/contrib/js/u2f-api.js" | versioned }}"></script> <!-- jsPDF - Script for generating PDF files --> -<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js" integrity="sha512-qZvrmS2ekKPF2mSznTQsxqPgnpkI4DNTlrdUmTzrDgektczlKNRRhy5X5AAOnx5S09ydFYWWNSfcEqDTTHgtNA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> +<script src="static/jspdf.umd.min.js"></script> <!-- autotable - Script for creating formatted tables compatible with jsPDF --> -<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf-autotable/3.5.28/jspdf.plugin.autotable.min.js" integrity="sha512-03CCNkeosDFN2zCCu4vLpu3pJfZcrL48F3yB8k87ejT+OVMwco7IH3FW02vtbGhdncS6gyYZ/duYaC/K62xQPQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> +<script src="static/jspdf.plugin.autotable.min.js"></script> </body> </html> -- GitLab From 6ba38a2f466d6e7420659896d28be568508de04f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ou=C5=A1ek?= <brousek@ics.muni.cz> Date: Fri, 19 May 2023 23:41:46 +0200 Subject: [PATCH 08/39] fix: translation bugfixes --- .../token/controllers/tokenControllers.js | 6 ------ .../views/token.enrolled.backupcode.html | 2 +- .../token/views/token.enrolled.totp.html | 19 ++++--------------- .../token/views/token.info.totp.html | 2 +- .../token/views/token.modified.enroll.html | 7 +++++-- 5 files changed, 11 insertions(+), 25 deletions(-) diff --git a/privacyidea/static/components/token/controllers/tokenControllers.js b/privacyidea/static/components/token/controllers/tokenControllers.js index 1d2251b30..2f85271b2 100644 --- a/privacyidea/static/components/token/controllers/tokenControllers.js +++ b/privacyidea/static/components/token/controllers/tokenControllers.js @@ -732,12 +732,6 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", doc.setTextColor(colorGray); doc.text(now, xOffset, yOffset * 3); - doc.setTextColor(colorBlack); - doc.text(xOffset, yOffset * 5, "In case you lose access to your token (e.g. lost smartphone) you can still authenticate to the " + - "services of the Masaryk University using one of the following backup codes. Please mind that the backup " + - "codes are single use, meaning each code gets invalidated after being used to authenticate.", - { maxWidth: contentWidth }); - // Prepare table with OTP keys doc.autoTable({ head: [{id: '#', otp: 'OTP'}], diff --git a/privacyidea/static/components/token/views/token.enrolled.backupcode.html b/privacyidea/static/components/token/views/token.enrolled.backupcode.html index 98db02125..e72c565ae 100644 --- a/privacyidea/static/components/token/views/token.enrolled.backupcode.html +++ b/privacyidea/static/components/token/views/token.enrolled.backupcode.html @@ -17,7 +17,7 @@ <div class="col-sm-12"> <uib-accordion close-others="oneAtATime"> <div uib-accordion-group - heading="{{ 'Show backup codes'|translate }}"> + heading="{{ browserLanguage === 'cs' ? 'Zobrazit záloĹľnĂ kĂłdy' : 'Show backup codes' }}"> <ul class="list-group no-margin-bottom"> <li class="list-group-item alternate-row" ng-repeat="otp in enrolledOtps"><b>{{$index + 1}}.</b> {{otp}} diff --git a/privacyidea/static/components/token/views/token.enrolled.totp.html b/privacyidea/static/components/token/views/token.enrolled.totp.html index 76cc22d86..2ecd00993 100644 --- a/privacyidea/static/components/token/views/token.enrolled.totp.html +++ b/privacyidea/static/components/token/views/token.enrolled.totp.html @@ -1,6 +1,6 @@ <div class="totp-verify-mobile limit-max-width"> <div ng-show="enrolledToken.rollout_state === 'enrolled'" class="limit-max-width'"> - <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b>Token enrolled</b></h3> + <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate>Token enrolled</h3> <div class="margin-bottom"> {{ browserLanguage === 'cs' ? 'Vaše aplikace pro ověřovacĂ kĂłdy byla ĂşspěšnÄ› zaregistrována a ověřena.' : 'Your verification code app has been successfully enrolled and verified.' }} </div> @@ -58,21 +58,10 @@ </div> <div ng-hide="form['2stepinit']" ng-class="$state.includes('token.wizard') == true && form['2stepinit'] == false ? 'col-sm-12' : 'col-sm-6'"> - <uib-accordion close-others="oneAtATime" ng-show="show_seed"> - <div uib-accordion-group - class="panel-default" - heading="{{ 'The OTP key'|translate }}"> - Hex: {{ enrolledToken.otpkey.value }}<br/> - Base32: {{ enrolledToken.otpkey.value_b32 }} - </div> - </uib-accordion> - <div class="col-sm-12 margin-bottom-large" ng-hide="$state.includes('token.wizard')"> - <p translate> - The QR Code contains the secret key of your token. You need to - protect it. <b>If you are in doubt, that someone else saw it, please - regenerate the QR Code, when no one else is watching.</b> - </p> + <p translate>The QR Code contains the secret key of your token. You need to + protect it. <b>If you are in doubt, that someone else saw it, please + regenerate the QR Code, when no one else is watching.</b></p> <button ng-click="regenerateToken()" class="btn btn-warning" translate> Regenerate QR Code </button> diff --git a/privacyidea/static/components/token/views/token.info.totp.html b/privacyidea/static/components/token/views/token.info.totp.html index ca1b6ceeb..4778b9956 100644 --- a/privacyidea/static/components/token/views/token.info.totp.html +++ b/privacyidea/static/components/token/views/token.info.totp.html @@ -2,5 +2,5 @@ Verification codes are generated by an authenticator application or by a password manager installed in your device, e.g. <a href="https://getaegis.app/" target="_blank" rel="noopener nofollow"><b>Aegis Authenticator</b></a> (Android) or <a href="https://raivo-otp.com/" target="_blank" rel="noopener nofollow"><b>Raivo OTP</b></a> (iOS). It will display a new verification code every 30 seconds. You can copy this code and insert it or type it while logging in. </div> <div ng-show="browserLanguage === 'cs'"> - OvěřovacĂ kĂłdy jsou generovány ověřovacĂ aplikacĂ nebo správcem hesel nainstalovanĂ˝m ve vašem zaĹ™ĂzenĂ, napĹ™. <a href="https://getaegis.app/" target="_blank" rel="noopener nofollow"><b>Aegis Authenticator</b></a> (pro Android) nebo <a href="https: //raivo-otp.com/" target="_blank" rel="noopener nofollow"><b>Raivo OTP</b></a> (pro iOS). KaĹľdĂ˝ch 30 sekund se zobrazĂ novĂ˝ ověřovacĂ kĂłd. Tento kĂłd mĹŻĹľete zkopĂrovat a vloĹľit nebo opsat pĹ™i pĹ™ihlašovánĂ. + OvěřovacĂ kĂłdy jsou generovány ověřovacĂ aplikacĂ nebo správcem hesel nainstalovanĂ˝m ve vašem zaĹ™ĂzenĂ, napĹ™. <a href="https://getaegis.app/" target="_blank" rel="noopener nofollow"><b>Aegis Authenticator</b></a> (pro Android) nebo <a href="https://raivo-otp.com/" target="_blank" rel="noopener nofollow"><b>Raivo OTP</b></a> (pro iOS). KaĹľdĂ˝ch 30 sekund se zobrazĂ novĂ˝ ověřovacĂ kĂłd. Tento kĂłd mĹŻĹľete zkopĂrovat a vloĹľit nebo opsat pĹ™i pĹ™ihlašovánĂ. </div> diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index 6931aaf7d..b8fdae2e6 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -26,7 +26,10 @@ > <label class="form-check-label custom-form-check-label" for="radio{{type}}" ng-style="!(hasUsableTokens || isAllowedInitially(type)) ? { color: 'darkgray' } : {}"> - {{desc}} + <span ng-show="type == 'backupcode'">záloĹľnĂ kĂłdy</span> + <span ng-show="type == 'totp'">ověřovacĂ kĂłdy</span> + <span ng-show="type == 'webauthn'">bezpeÄŤnostnĂ klĂÄŤ</span> + <span ng-hide="type == 'backupcode' || type == 'totp' || type == 'webauthn'">{{desc}}</span> </label> <ng-include src="instanceUrl + '/static/components/token/views/token.info.' + type + '.html'"></ng-include> @@ -141,7 +144,7 @@ <button type="button" ng-click="enrollToken()" ng-disabled="!checkEnroll() || formEnrollToken.$invalid || enrolling" class="btn btn-primary margin-bottom"> - <span ng-if="$state.includes('token.rollover') == false" translate>Continue</span> + <span ng-if="$state.includes('token.rollover') == false">{{ browserLanguage == 'cs' ? 'PokraÄŤovat' : 'Continue' }}</span> <span ng-if="$state.includes('token.rollover')" translate>Rollover Token</span> </button> </div> -- GitLab From 64b62f672dfcb9d75d4951a21ab1a64ab99ab709 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ou=C5=A1ek?= <brousek@ics.muni.cz> Date: Sat, 20 May 2023 00:06:34 +0200 Subject: [PATCH 09/39] fix: more translation bugfixes --- .../components/token/views/token.modified.enroll.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index b8fdae2e6..4a0b000a1 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -26,9 +26,9 @@ > <label class="form-check-label custom-form-check-label" for="radio{{type}}" ng-style="!(hasUsableTokens || isAllowedInitially(type)) ? { color: 'darkgray' } : {}"> - <span ng-show="type == 'backupcode'">záloĹľnĂ kĂłdy</span> - <span ng-show="type == 'totp'">ověřovacĂ kĂłdy</span> - <span ng-show="type == 'webauthn'">bezpeÄŤnostnĂ klĂÄŤ</span> + <span ng-show="type == 'backupcode'">{{ browserLanguage == 'cs' ? 'záloĹľnĂ kĂłdy' : 'backup codes' }}</span> + <span ng-show="type == 'totp'">{{ browserLanguage == 'cs' ? 'ověřovacĂ kĂłdy' : 'verification codes' }}</span> + <span ng-show="type == 'webauthn'">{{ browserLanguage == 'cs' ? 'bezpeÄŤnostnĂ klĂÄŤ' : 'security key' }}</span> <span ng-hide="type == 'backupcode' || type == 'totp' || type == 'webauthn'">{{desc}}</span> </label> <ng-include @@ -42,7 +42,7 @@ Optionally, you can provide a description for your token. This will help you tell them apart if you enroll multiple tokens. For example, you can use your device name or the authenticator app name as a hint. </p> - <p ng-show="browserLanguage === 'en'"> + <p ng-show="browserLanguage === 'cs'"> MĹŻĹľete zadat popis svĂ©ho tokenu (nepovinnĂ©). Popis sloužà k rozlišenĂ tokenĹŻ, pokud si jich zaregistrujete vĂce. MĹŻĹľete napĹ™Ăklad pouĹľĂt název svĂ©ho zaĹ™ĂzenĂ nebo název ověřovacĂ aplikace. </p> -- GitLab From 5b4a86a046039a9926584cb8c584a8a64e52a172 Mon Sep 17 00:00:00 2001 From: Peter Bolha <xbolha@fi.muni.cz> Date: Tue, 23 May 2023 10:28:37 +0200 Subject: [PATCH 10/39] refactor: remove dead code --- .../components/token/views/token.modified.enroll.html | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index 4a0b000a1..81b41e669 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -205,11 +205,7 @@ ng-hide="hasUsableTokens || hasSeenMFADialog" class="btn btn-primary margin-bottom">{{ browserLanguage == 'cs' ? 'PokraÄŤovat' : 'Continue' }} </button> - <!-- Proceed to next page after confirming the MFA activation dialog --> - <!-- <button ng-click="enrollToken(); enrolledToken = null; enrolling = false; awaitingBackupcodeEnroll = true; form.type='backupcode';"--> - <!-- ng-hide="hasUsableTokens || !hasSeenMFADialog"--> - <!-- class="btn btn-primary margin-bottom" translate>Continue--> - <!-- </button>--> + <!-- Finish the enrollment process if this wasn't the user's initial token --> <button ng-click="enrolledToken = null; enrolling = false;" ng-hide="!hasUsableTokens" -- GitLab From 7c6db277fa86cfa4187d48d67afcbf31e6cd69fd Mon Sep 17 00:00:00 2001 From: Peter Bolha <xbolha@fi.muni.cz> Date: Tue, 23 May 2023 11:50:54 +0200 Subject: [PATCH 11/39] refactor: extract enrollment of init buc to method --- .../token/controllers/tokenControllers.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/privacyidea/static/components/token/controllers/tokenControllers.js b/privacyidea/static/components/token/controllers/tokenControllers.js index 2f85271b2..7c5935447 100644 --- a/privacyidea/static/components/token/controllers/tokenControllers.js +++ b/privacyidea/static/components/token/controllers/tokenControllers.js @@ -514,6 +514,14 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", return false; }; + $scope.enrollInitialBackupcodes = function () { + $scope.enrolledToken = null; + $scope.enrolling = false; + $scope.awaitingBackupcodeEnroll = true; + $scope.form.type = 'backupcode'; + $scope.enrollToken(); + } + $scope.showMFAActivationDialog = function () { const dialogMFAActivated = $('#dialogMFAActivated'); @@ -521,12 +529,7 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", // Continue to next stage after the modal has been closed dialogMFAActivated.on('hidden.bs.modal', function () { - $scope.enrollToken(); - $scope.enrolledToken = null; - $scope.enrolling = false; - $scope.awaitingBackupcodeEnroll = true; - $scope.form.type='backupcode'; - console.log('Modal closed'); + $scope.enrollInitialBackupcodes(); }); }; -- GitLab From d8be91aa9eee2769a4dd0cc592ac65e02243c510 Mon Sep 17 00:00:00 2001 From: Peter Bolha <xbolha@fi.muni.cz> Date: Tue, 23 May 2023 11:51:34 +0200 Subject: [PATCH 12/39] feat: add automatic description for initial buc --- .../static/components/token/controllers/tokenControllers.js | 1 + 1 file changed, 1 insertion(+) diff --git a/privacyidea/static/components/token/controllers/tokenControllers.js b/privacyidea/static/components/token/controllers/tokenControllers.js index 7c5935447..982a94848 100644 --- a/privacyidea/static/components/token/controllers/tokenControllers.js +++ b/privacyidea/static/components/token/controllers/tokenControllers.js @@ -519,6 +519,7 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", $scope.enrolling = false; $scope.awaitingBackupcodeEnroll = true; $scope.form.type = 'backupcode'; + $scope.form.description = navigator.language === 'cs' ? 'záloĹľnĂ kĂłdy' : 'backup codes'; $scope.enrollToken(); } -- GitLab From af5b92905aca897181177a6e5129ca576ce46370 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ou=C5=A1ek?= <brousek@ics.muni.cz> Date: Tue, 6 Jun 2023 10:05:20 +0200 Subject: [PATCH 13/39] feat: styles for search bar and links --- privacyidea/static/css/token-enroll-flow.css | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/privacyidea/static/css/token-enroll-flow.css b/privacyidea/static/css/token-enroll-flow.css index d43ba55b3..862c4343c 100644 --- a/privacyidea/static/css/token-enroll-flow.css +++ b/privacyidea/static/css/token-enroll-flow.css @@ -156,3 +156,15 @@ body { border-radius: 50%; padding: 20px; } + +/* hide links to PI docs */ + +a[href*="privacyidea.readthedocs.io"] { + display: none !important; +} + +/* search bar */ + +#find-user { + margin-right: 1em; +} -- GitLab From 94430c5630fc51a6e5117bece37e8ce975db5988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ou=C5=A1ek?= <brousek@ics.muni.cz> Date: Tue, 6 Jun 2023 10:05:31 +0200 Subject: [PATCH 14/39] fix: hide welcome dialog --- .../dialogs/views/dialog.welcome.html | 172 ------------------ 1 file changed, 172 deletions(-) diff --git a/privacyidea/static/components/dialogs/views/dialog.welcome.html b/privacyidea/static/components/dialogs/views/dialog.welcome.html index 80895e711..e69de29bb 100644 --- a/privacyidea/static/components/dialogs/views/dialog.welcome.html +++ b/privacyidea/static/components/dialogs/views/dialog.welcome.html @@ -1,172 +0,0 @@ -<!-- Modal --> - -<div class="modal fade lock-dialog" id="dialogWelcome" tabindex="-1" - role="dialog" - ng-show="welcomeStep < 5" - data-backdrop="static" data-keyboard="false" - aria-labelledby="myModalLabel" - aria-hidden="true"> - <div class="modal-dialog"> - - <div class="modal-content" ng-show="welcomeStep === 0"> - <div class="modal-header"> - <h4 class="modal-title" id="myModalLabel" translate - >Welcome</h4> - </div> - - <!-- In case of no subscription and less than 50 users --> - <div class="modal-body" translate> - <p>First, we would like to give you some background - information on privacyIDEA.</p> - <p>privacyIDEA is an <b>Enterprise Level</b> - Multi Factor Authentication System. It is open source. - The core developers are employed at NetKnights GmbH, Germany. - NetKnights provides the - <a target=netknights - href="https://netknights.it/en/produkte/privacyidea/">privacyIDEA Enterprise Edition</a> - including <b>Support and Service Level Agreements</b>. - Moreover NetKnights provides services, consultancy and - paid programming of new features. - </p> - </div> - - <div class="modal-footer"> - <button type="button" class="btn btn-default" - ng-click="nextWelcome()" translate>Next - </button> - </div> - </div> - - <div class="modal-content" ng-show="welcomeStep === 1"> - <div class="modal-header"> - <h4 class="modal-title" id="myModalLabel" translate - >The value of open source</h4> - </div> - <div class="modal-body" translate> - <p> - You are reading books, which do not belong to you anymore. Your ebook reader - only provides them for the time of reading. You are using software as a service - and you do not have any control, when the software will be updated, - which features will be added or removed or if the service might even be stopped. - You only get a legal right of time limited use. - </p> - <p> - You could install proprietary software on your own server, but you also have only - limited rights in regards to this installation. You are not allowed to modify or pass along - this proprietary software. - </p> - <p> - The open source software privacyIDEA now is <b>your property</b>! No one can take away this software - or this installation. According to the license AGPLv3 you can modify or distribute this software. - You do not have to worry about end-of-life. - </p> - <p> - <b>Using open source is not about spending no money, but is is about full control you get over - your own system! Forever!</b> - </p> - </div> - <div class="modal-footer"> - <button type="button" class="btn btn-default" - ng-click="nextWelcome()" translate>Next - </button> - </div> - </div> - - <div class="modal-content" ng-show="welcomeStep === 2"> - <div class="modal-header"> - <h4 class="modal-title" id="myModalLabel" translate - >The added value of privacyIDEA Enterprise Edition</h4> - </div> - <div class="modal-body"> - <p translate>According to the - <a target=license href="https://github.com/privacyidea/privacyidea/blob/master/LICENSE">AGPLv3</a> - </p> - <p class="text-center" translate> - <b>THIS SOFTWARE COMES WITHOUT ANY WARRANTY!</b> - </p> - <p translate>The added values of the - <a target=netknights - href="https://netknights.it/en/produkte/privacyidea/">privacyIDEA Enterprise Edition</a> - are</p> - <ul translate> - <li>Support and - <a target=netknights href="https://netknights.it/en/leistungen/service-level-agreements/"> - Service Level Agreements by NetKnights</a>, Germany. - </li> - <li>Stable enterprise packages for Debian, Ubuntu, RHEL allow for an easy update and secure - operations. - </li> - <li>An exclusive <b>Appliance</b>-Tool, which allows easy setup of RADIUS clients, MySQL master - master replications, - backup and restore... - </li> - <li>Exclusive timely news and bug reports.</li> - <li>Depending on the support level you get help with updates and yearly consultancy.</li> - <li>By buying the - <a target=netknights - href="https://netknights.it/en/produkte/privacyidea/">privacyIDEA Enterprise Edition</a> - you ensure that professional developers can work full time - on privacyIDEA, add new features and fix bugs in a timely manner. In addition you allow for - external services - like code audits. - </li> - </ul> - <p translate> - <a target=netknights href="https://netknights.it/en/unternehmen/kontakt/"> - Ask for the privacyIDEA Enterprise Edition, now!</a> - </p> - </div> - <div class="modal-footer"> - <button type="button" class="btn btn-default" - ng-click="nextWelcome()" translate>Next - </button> - </div> - </div> - - <div class="modal-content" ng-show="welcomeStep === 3"> - <div class="modal-header"> - <h4 class="modal-title" id="myModalLabel" translate - >Thank you for improving your security!</h4> - </div> - <div class="modal-body" translate> - <p>Thank you for using privacyIDEA and making your network - and thus this world a more secure place!</p> - <p>Have fun using privacyIDEA!</p> - </div> - <div class="modal-footer"> - <button type="button" class="btn btn-default" - ng-click="resetWelcome()" translate> - Read again - </button> - <button type="button" class="btn btn-success" - ng-click="nextWelcome()" translate>Dive In! - </button> - </div> - </div> - - <div class="modal-content" ng-show="welcomeStep === 4"> - <!-- In case of no subscription and more than 50 users --> - <div class="modal-body" translate> - <p><b>You are using privacyIDEA with more than 50 users.</b></p> - <p>Thank you for your trust!</p> - <p>For the productive enterprise use we recommend the - <a target=netknights - href="https://netknights.it/en/produkte/privacyidea/">privacyIDEA Enterprise Edition</a>. - </p> - <p>NetKnights provides the - <a target=netknights - href="https://netknights.it/en/produkte/privacyidea/">privacyIDEA Enterprise Edition</a> - including <b>Support and Service Level Agreements</b>. - Moreover NetKnights provides services, consultancy and - paid programming of new features. - </p> - </div> - <div class="modal-footer"> - <button type="button" class="btn btn-success" - ng-click="nextWelcome()" translate>Okay - </button> - </div> - </div> - </div> -</div> - -- GitLab From cbd1746c0ba768b2fa7e415f643f7e44d8e03219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ou=C5=A1ek?= <brousek@ics.muni.cz> Date: Tue, 6 Jun 2023 11:59:03 +0200 Subject: [PATCH 15/39] fix: remove MUNI-specific translations --- .../static/components/dialogs/views/dialog.mfa.activated.html | 2 +- .../components/token/views/token.enrolled.backupcode.html | 4 ++-- .../static/components/token/views/token.modified.enroll.html | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/privacyidea/static/components/dialogs/views/dialog.mfa.activated.html b/privacyidea/static/components/dialogs/views/dialog.mfa.activated.html index 8a8877014..551827904 100644 --- a/privacyidea/static/components/dialogs/views/dialog.mfa.activated.html +++ b/privacyidea/static/components/dialogs/views/dialog.mfa.activated.html @@ -14,7 +14,7 @@ </div> <div class="modal-body"> <p translate> - {{ browserLanguage === 'cs' ? 'Všechny sluĹľby, kterĂ© pouĹľĂvajĂ JednotnĂ© pĹ™ihlášenĂ MUNI, budou od tohoto okamĹľiku vyĹľadovat vĂcefázovĂ© ověřenĂ. NastavenĂ mĹŻĹľete pozdÄ›ji zmÄ›nit a vybrat si sluĹľby, pro kterĂ© budete mĂt vĂcefázovĂ© ověřenĂ aktivováno.' : 'All services which use MUNI Unified Login will require multi-factor authentication from this point onwards. If you want to change this, you can manage the list of services for which you will have MFA activated later in this setup.' }} + {{ browserLanguage === 'cs' ? 'Všechny sluĹľby budou od tohoto okamĹľiku vyĹľadovat vĂcefázovĂ© ověřenĂ. NastavenĂ mĹŻĹľete pozdÄ›ji zmÄ›nit a vybrat si sluĹľby, pro kterĂ© budete mĂt vĂcefázovĂ© ověřenĂ aktivováno.' : 'All services will now require multi-factor authentication. If you want to change this, you can manage the list of services for which you will have MFA activated later in this setup.' }} </p> </div> <div class="modal-footer"> diff --git a/privacyidea/static/components/token/views/token.enrolled.backupcode.html b/privacyidea/static/components/token/views/token.enrolled.backupcode.html index e72c565ae..21b878075 100644 --- a/privacyidea/static/components/token/views/token.enrolled.backupcode.html +++ b/privacyidea/static/components/token/views/token.enrolled.backupcode.html @@ -30,11 +30,11 @@ <div> <h5><b>{{ browserLanguage === 'cs' ? 'ProÄŤ jsou záloĹľnĂ kĂłdy dĹŻleĹľitĂ©?' : 'Why are backup codes important?' }}</b></h5> <p ng-show="browserLanguage === 'en'"> - In case you lose access to your token (e.g. lost smartphone) you can still authenticate to the services behind MUNI Unified Login using backup codes. You can simply enter a backup code instead of the code generated by the authenticator application or a password manager. Keep in mind that the backup codes are <b>single use</b>, meaning each code gets <b>invalidated after being used</b> to authenticate. If you have used up most or all of your + In case you lose access to your token (e.g. lost smartphone) you can still authenticate using backup codes. You can simply enter a backup code instead of the code generated by the authenticator application or a password manager. Keep in mind that the backup codes are <b>single use</b>, meaning each code gets <b>invalidated after being used</b> to authenticate. If you have used up most or all of your codes, it is recommended to generate new ones. </p> <p ng-show="browserLanguage === 'cs'"> - V pĹ™ĂpadÄ›, Ĺľe ztratĂte pĹ™Ăstup ke svĂ©mu tokenu (napĹ™. pĹ™i ztrátÄ› smartphonu), mĹŻĹľete se stále autentizovat ke sluĹľbám za JednotnĂ˝m pĹ™ihlášenĂm MUNI pomocĂ záloĹľnĂch kĂłdĹŻ. MĹŻĹľete jednoduše zadat záloĹľnĂ kĂłd mĂsto kĂłdu vygenerovanĂ©ho autentizaÄŤnĂ aplikacĂ nebo správcem hesel. ZáloĹľnĂ kĂłdy jsou <b>jednorázovĂ©</b>, coĹľ znamená, Ĺľe kaĹľdĂ˝ kĂłd je <b>po jednom pouĹľitĂ zneplatnÄ›n</b>. Pokud jste spotĹ™ebovali vÄ›tšinu nebo všechny svĂ© kĂłdy, doporuÄŤujeme vygenerovat si novĂ©. + V pĹ™ĂpadÄ›, Ĺľe ztratĂte pĹ™Ăstup ke svĂ©mu tokenu (napĹ™. pĹ™i ztrátÄ› smartphonu), mĹŻĹľete se pĹ™ihlásit pomocĂ záloĹľnĂch kĂłdĹŻ. MĹŻĹľete jednoduše zadat záloĹľnĂ kĂłd mĂsto kĂłdu vygenerovanĂ©ho autentizaÄŤnĂ aplikacĂ nebo správcem hesel. ZáloĹľnĂ kĂłdy jsou <b>jednorázovĂ©</b>, coĹľ znamená, Ĺľe kaĹľdĂ˝ kĂłd je <b>po jednom pouĹľitĂ zneplatnÄ›n</b>. Pokud jste spotĹ™ebovali vÄ›tšinu nebo všechny svĂ© kĂłdy, doporuÄŤujeme vygenerovat si novĂ©. </p> </div> </div> diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index 81b41e669..00e3790ff 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -253,11 +253,11 @@ <p ng-show="browserLanguage === 'en'"><b>Which services will now require multi-factor authentication?</b></p> <p ng-show="browserLanguage === 'cs'"><b>KterĂ© sluĹľby budou nynĂ vyĹľadovat vĂcefázovĂ© ověřenĂ?</b></p> <p ng-show="browserLanguage === 'en'"> - Multi-factor authentication is currently activated for all services behind MUNI Unified Login. + Multi-factor authentication is currently activated for all services. To manage your settings, click the Service settings button below. </p> <p ng-show="browserLanguage === 'cs'"> - VĂcefázovĂ© ověřenĂ je nynĂ aktivnĂ pro všechny sluĹľby za JednotnĂ˝m pĹ™ihlášenĂm MUNI. + VĂcefázovĂ© ověřenĂ je nynĂ aktivnĂ pro všechny sluĹľby. Chcete-li upravit toto nastavenĂ, pouĹľijte tlaÄŤĂtko NastavenĂ sluĹľeb nĂĹľe. </p> -- GitLab From 7a5893b58e155bf965aae70e6cc0cd5d4599b4ca Mon Sep 17 00:00:00 2001 From: Peter Bolha <xbolha@fi.muni.cz> Date: Wed, 7 Jun 2023 09:47:19 +0200 Subject: [PATCH 16/39] feat: jti in backchannel logout token --- privacyidea/api/token.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/privacyidea/api/token.py b/privacyidea/api/token.py index 0e1623237..ded961ffa 100644 --- a/privacyidea/api/token.py +++ b/privacyidea/api/token.py @@ -58,6 +58,7 @@ import json import os import re +import uuid import jwt from datetime import datetime @@ -183,11 +184,13 @@ def perform_backchannel_logout(user): headers = { "Content-type": "application/x-www-form-urlencoded" } + jti = str(uuid.uuid4()) token = { "iss": cfg.get("issuer"), "sub": f"{user.login}@{user.realm}", "aud": cfg.get("audience"), "iat": int(datetime.now().timestamp()), + "jti": jti, "events": { "http://schemas.openid.net/event/backchannel-logout": {} } @@ -435,8 +438,7 @@ def init(): user_usable_tokens_after = get_usable_tokens_count(user) has_first_usable_token = user_usable_tokens_before == 0 and user_usable_tokens_after > 0 if has_first_usable_token: - # TODO enable logout after the endpoint has been configured and deployed - # perform_backchannel_logout(user) + perform_backchannel_logout(user) enable_mfa_everywhere(user) g.audit_object.log({'user': user.login, -- GitLab From be8140279cfd424fbdbe06dd9a77284a8597bea4 Mon Sep 17 00:00:00 2001 From: Peter Bolha <xbolha@fi.muni.cz> Date: Wed, 7 Jun 2023 11:34:49 +0200 Subject: [PATCH 17/39] feat: perun attribute update of user active tokens --- privacyidea/api/token.py | 62 +++++++++++++++---- .../lib/auditmodules/customloggeraudit.py | 20 +++++- 2 files changed, 69 insertions(+), 13 deletions(-) diff --git a/privacyidea/api/token.py b/privacyidea/api/token.py index ded961ffa..b1638e890 100644 --- a/privacyidea/api/token.py +++ b/privacyidea/api/token.py @@ -138,13 +138,13 @@ To see how to authenticate read :ref:`rest_auth`. """ -def get_usable_tokens_count(user, all_user_tokens=None): +def get_usable_tokens(user, all_user_tokens=None): if not all_user_tokens: all_user_tokens = get_tokens(user=user) token_dicts = [tokenobject.get_as_dict() for tokenobject in all_user_tokens] - usable_tokens_count = 0 + usable_tokens = [] for token in token_dicts: if ( @@ -154,9 +154,14 @@ def get_usable_tokens_count(user, all_user_tokens=None): and not token["rollout_state"] == ROLLOUTSTATE.CLIENTWAIT and not token["rollout_state"] == ROLLOUTSTATE.VERIFYPENDING ): - usable_tokens_count += 1 + usable_tokens.append(token) + + return usable_tokens + - return usable_tokens_count +def get_usable_tokens_count(user, all_user_tokens=None): + usable_tokens = get_usable_tokens(user, all_user_tokens) + return len(usable_tokens) @token_blueprint.route('/count_usable', methods=['GET']) @@ -224,22 +229,57 @@ def load_attrs_manager_config(config_filepath): return None -def enable_mfa_everywhere(user): +def get_adapters_manager(): cfg = load_attrs_manager_config('/etc/perun-connector.yaml') if not cfg: - log.debug("Wasn't able to load the attributes manager config, " - "so the MFA activation will not be performed.") - return + log.debug("Wasn't able to load the attributes manager config") + return None - # TODO load attr from cfg(?) - mfa_enforce_attr = "urn:perun:user:attribute-def:def:mfaEnforceSettings:mu" adapters_manager = AdaptersManager(cfg['attributes_manager_config'], cfg['attributes_map']) + return adapters_manager + + +def set_perun_user_attributes(user, attrs_to_set, action_name): + adapters_manager = get_adapters_manager() + + if not adapters_manager: + log.debug( + f"'{action_name}' wasn't performed because the AdaptersManager " + "couldn't be loaded.") + return + perun_user_id_candidates = re.findall(r'\d+', user.uid) perun_user_id = int(perun_user_id_candidates[0]) - adapters_manager.set_user_attributes(perun_user_id, {mfa_enforce_attr: "{\"all\":true}"}) + + adapters_manager.set_user_attributes(perun_user_id, attrs_to_set) + + +def enable_mfa_everywhere(user): + mfa_enforce_attr_name = "urn:perun:user:attribute-def:def:mfaEnforceSettings:mu" + mfa_enforce_attr_value = "{\"all\":true}" + mfa_enforce_action_name = "MFA activation" + + set_perun_user_attributes(user, + {mfa_enforce_attr_name: mfa_enforce_attr_value}, + mfa_enforce_action_name) + + +def update_user_active_token_types(user, all_user_tokens=None): + usable_tokens = get_usable_tokens(user, all_user_tokens) + log.info("my tokens", usable_tokens) + active_token_types = [token["tokentype"] for token in usable_tokens] + + # TODO find proper attribute name to set + mfa_active_tokens_attr_name = "urn:perun:user:attribute-def:def:mfaActiveTokens:mu" + mfa_active_tokens_attr_value = active_token_types + mfa_enforce_action_name = "Update of user's active token types" + + set_perun_user_attributes(user, + {mfa_active_tokens_attr_name: mfa_active_tokens_attr_value}, + mfa_enforce_action_name) @token_blueprint.route('/init', methods=['POST']) diff --git a/privacyidea/lib/auditmodules/customloggeraudit.py b/privacyidea/lib/auditmodules/customloggeraudit.py index c22c82a5c..e96790ce3 100644 --- a/privacyidea/lib/auditmodules/customloggeraudit.py +++ b/privacyidea/lib/auditmodules/customloggeraudit.py @@ -63,7 +63,8 @@ import logging import logging.config from datetime import datetime -from privacyidea.api.token import get_usable_tokens_count +from privacyidea.api.token import get_usable_tokens_count, get_usable_tokens, \ + update_user_active_token_types from privacyidea.lib.auditmodules.base import Audit as AuditBase from privacyidea.lib.token import get_tokens from privacyidea.lib.user import User @@ -111,7 +112,6 @@ class Audit(AuditBase): serial = self.audit_data["serial"] if self.has_usable_token(user, all_user_tokens): - # self.custom_logger.info(self.audit_data["logout_result_msg"]) self.custom_logger.info( f"user '{user.login}' has successfully registered their " f"first " @@ -126,6 +126,8 @@ class Audit(AuditBase): f"registered token is not usable." ) + update_user_active_token_types(user, all_user_tokens) + def handle_token_deletion(self): user = self.get_user_object() serial = self.audit_data["serial"] @@ -137,6 +139,8 @@ class Audit(AuditBase): f"{serial}' leaving them with no usable tokens left." ) + update_user_active_token_types(user, all_user_tokens) + def handle_single_token_disabling(self): user = self.get_user_object() serial = self.audit_data["serial"] @@ -149,6 +153,8 @@ class Audit(AuditBase): f"usable." ) + update_user_active_token_types(user) + def handle_all_tokens_disabling(self): user = self.get_user_object() all_user_tokens = get_tokens(user=user) @@ -161,6 +167,8 @@ class Audit(AuditBase): f"token serial numbers: {affected_serials}" ) + update_user_active_token_types(user, all_user_tokens) + def handle_all_tokens_enabling(self): user = self.get_user_object() all_user_tokens = get_tokens(user=user) @@ -183,6 +191,8 @@ class Audit(AuditBase): self.custom_logger.info(all_tokens_enabled_message) + update_user_active_token_types(user, all_user_tokens) + def handle_single_token_enabling(self): user = self.get_user_object() serial = self.audit_data["serial"] @@ -194,6 +204,8 @@ class Audit(AuditBase): f"{serial}'. User has a usable token again." ) + update_user_active_token_types(user) + def handle_single_token_revoking(self): user = self.get_user_object() serial = self.audit_data["serial"] @@ -205,6 +217,8 @@ class Audit(AuditBase): f"{serial}' leaving them with no usable tokens left." ) + update_user_active_token_types(user, all_user_tokens) + def handle_all_tokens_revoking(self): user = self.get_user_object() all_user_tokens = get_tokens(user=user) @@ -217,6 +231,8 @@ class Audit(AuditBase): f"token serial numbers: {affected_serials}" ) + update_user_active_token_types(user, all_user_tokens) + def add_custom_log_info(self): api_call = self.audit_data["action"] -- GitLab From b698cab276dcfdd5e3c6a2014d402da98e78f00c Mon Sep 17 00:00:00 2001 From: peterbolha <xbolha@fi.muni.cz> Date: Wed, 7 Jun 2023 14:44:47 +0200 Subject: [PATCH 18/39] refactor: load perun attribute names from config --- privacyidea/api/token.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/privacyidea/api/token.py b/privacyidea/api/token.py index b1638e890..77ecc7f4e 100644 --- a/privacyidea/api/token.py +++ b/privacyidea/api/token.py @@ -258,7 +258,8 @@ def set_perun_user_attributes(user, attrs_to_set, action_name): def enable_mfa_everywhere(user): - mfa_enforce_attr_name = "urn:perun:user:attribute-def:def:mfaEnforceSettings:mu" + cfg = current_app.config + mfa_enforce_attr_name = cfg.get("ENFORCE_MFA_ATTR_NAME") mfa_enforce_attr_value = "{\"all\":true}" mfa_enforce_action_name = "MFA activation" @@ -269,11 +270,10 @@ def enable_mfa_everywhere(user): def update_user_active_token_types(user, all_user_tokens=None): usable_tokens = get_usable_tokens(user, all_user_tokens) - log.info("my tokens", usable_tokens) active_token_types = [token["tokentype"] for token in usable_tokens] - # TODO find proper attribute name to set - mfa_active_tokens_attr_name = "urn:perun:user:attribute-def:def:mfaActiveTokens:mu" + cfg = current_app.config + mfa_active_tokens_attr_name = cfg.get("AVAILABLE_TOKEN_TYPES_ATTR_NAME") mfa_active_tokens_attr_value = active_token_types mfa_enforce_action_name = "Update of user's active token types" -- GitLab From f61aa1e3af7df4f9d9ab2bcfc81afed034a61341 Mon Sep 17 00:00:00 2001 From: peterbolha <xbolha@fi.muni.cz> Date: Wed, 7 Jun 2023 15:31:05 +0200 Subject: [PATCH 19/39] feat: hide unavailable tokens in enrollment window --- .../token/views/token.modified.enroll.html | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index 00e3790ff..9a4ae55ae 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -22,16 +22,16 @@ <input class="form-check-input" type="radio" name="{type}" id="radio{{type}}" value="{{type}}" ng-model="form.type" ng-change="changeTokenType()" - ng-disabled="!(hasUsableTokens || isAllowedInitially(type))" + ng-hide="!(hasUsableTokens || isAllowedInitially(type))" > <label class="form-check-label custom-form-check-label" for="radio{{type}}" - ng-style="!(hasUsableTokens || isAllowedInitially(type)) ? { color: 'darkgray' } : {}"> - <span ng-show="type == 'backupcode'">{{ browserLanguage == 'cs' ? 'záloĹľnĂ kĂłdy' : 'backup codes' }}</span> - <span ng-show="type == 'totp'">{{ browserLanguage == 'cs' ? 'ověřovacĂ kĂłdy' : 'verification codes' }}</span> - <span ng-show="type == 'webauthn'">{{ browserLanguage == 'cs' ? 'bezpeÄŤnostnĂ klĂÄŤ' : 'security key' }}</span> - <span ng-hide="type == 'backupcode' || type == 'totp' || type == 'webauthn'">{{desc}}</span> + ng-hide="!(hasUsableTokens || isAllowedInitially(type))"> + <span ng-show="type === 'backupcode' && hasUsableTokens">{{ browserLanguage == 'cs' ? 'záloĹľnĂ kĂłdy' : 'backup codes' }}</span> + <span ng-show="type === 'totp'">{{ browserLanguage == 'cs' ? 'ověřovacĂ kĂłdy' : 'verification codes' }}</span> + <span ng-show="type === 'webauthn' && hasUsableTokens">{{ browserLanguage == 'cs' ? 'bezpeÄŤnostnĂ klĂÄŤ' : 'security key' }}</span> + <span ng-hide="type === 'backupcode' || type === 'totp' || type === 'webauthn'">{{desc}}</span> </label> - <ng-include + <ng-include ng-hide="!(hasUsableTokens || isAllowedInitially(type))" src="instanceUrl + '/static/components/token/views/token.info.' + type + '.html'"></ng-include> </div> -- GitLab From a9fb8865780862dbb83c2988113f39f055cbf302 Mon Sep 17 00:00:00 2001 From: Peter Bolha <xbolha@fi.muni.cz> Date: Thu, 8 Jun 2023 12:56:23 +0200 Subject: [PATCH 20/39] feat: page for downloading totp app in token enroll flow --- .../token/controllers/tokenControllers.js | 68 +++++++-- .../components/token/factories/token.js | 31 ++-- ...s.bar.1of4.html => progress.bar.1of5.html} | 6 + ...s.bar.2of4.html => progress.bar.2of5.html} | 6 + ...s.bar.3of4.html => progress.bar.3of5.html} | 6 + ...s.bar.4of4.html => progress.bar.4of5.html} | 6 + .../progress_bars/progress.bar.5of5.html | 29 ++++ .../token/views/token.modified.enroll.html | 139 +++++++++++++----- privacyidea/static/css/token-enroll-flow.css | 13 ++ privacyidea/static/templates/footer.html | 2 + 10 files changed, 241 insertions(+), 65 deletions(-) rename privacyidea/static/components/token/views/progress_bars/{progress.bar.1of4.html => progress.bar.1of5.html} (80%) rename privacyidea/static/components/token/views/progress_bars/{progress.bar.2of4.html => progress.bar.2of5.html} (80%) rename privacyidea/static/components/token/views/progress_bars/{progress.bar.3of4.html => progress.bar.3of5.html} (80%) rename privacyidea/static/components/token/views/progress_bars/{progress.bar.4of4.html => progress.bar.4of5.html} (81%) create mode 100644 privacyidea/static/components/token/views/progress_bars/progress.bar.5of5.html diff --git a/privacyidea/static/components/token/controllers/tokenControllers.js b/privacyidea/static/components/token/controllers/tokenControllers.js index 982a94848..3a7cb2902 100644 --- a/privacyidea/static/components/token/controllers/tokenControllers.js +++ b/privacyidea/static/components/token/controllers/tokenControllers.js @@ -192,6 +192,7 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", $scope.enrolling = false; $scope.awaitingBackupcodeEnroll = false; $scope.awaitingSetupCompletion = false; + $scope.awaitingTOTPAppDisclaimerConfirm = false; $scope.hasUsableTokens = false; $scope.hasSeenMFADialog = false; $scope.hasDownloadedBackupcodes = false; @@ -478,7 +479,12 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", }; $scope.enrollToken = function () { - $scope.enrolling = true; + $scope.enrolling = true + + if (!$scope.hasUsableTokens) { + $scope.awaitingTOTPAppDisclaimerConfirm = true; + } + //debug: console.log($scope.newUser.user); //debug: console.log($scope.newUser.realm); //debug: console.log($scope.newUser.pin); @@ -492,7 +498,8 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", ); }; - $scope.calculateHasUsableTokens = function () { + $scope.calculateHasUsableTokens = async function () { + console.log("Calculating usable tokens"); // Having usable tokens is a prerequisite for enrolling some token types. // Admin, however can enroll any token at any time for any user. if ($scope.loggedInUser.role === 'admin') { @@ -501,16 +508,19 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", } $scope.newUser.user = fixUser($scope.newUser.user); - TokenFactory.getUsableTokensCount($scope.newUser, - function (data) { - if (data) { + + try { + const data = await TokenFactory.getUsableTokensCount($scope.newUser); + if (data) { $scope.hasUsableTokens = data.result.value > 0; - console.log(`"${$scope.newUser.user} has usable token: ${$scope.hasUsableTokens}"`); return $scope.hasUsableTokens; - } - console.log(`"${$scope.newUser.user} has no usable token"`); - }, function () {console.log("An Error occurred while fetching the number of available tokens.")} - ); + } else { + console.log("Request for usable tokens count didn't return any data."); + } + } catch(error) { + console.log("An Error occurred while fetching the number of available tokens.") + } + return false; }; @@ -529,21 +539,53 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", dialogMFAActivated.modal(); // Continue to next stage after the modal has been closed - dialogMFAActivated.on('hidden.bs.modal', function () { + dialogMFAActivated.on('hidden.bs.modal', async function () { + await $scope.calculateHasUsableTokens(); $scope.enrollInitialBackupcodes(); }); }; + $scope.getQrCodeFromUrl = function(url, elementName) { + return new QRCode(document.getElementById(elementName), { + text: url, + width: $scope.qrCodeWidth, + height: $scope.qrCodeWidth + }); + } + + $scope.getQrIosTotpApp = function() { + const appUrl = "https://apps.apple.com/app/raivo-otp/id1459042137?platform=iphone"; + const elementName = "iosAppQrCode"; + + const qrCode = $scope.getQrCodeFromUrl(appUrl, elementName); + } + + $scope.getQrAndroidTotpApp = function() { + const appUrl = "https://play.google.com/store/apps/details?id=com.beemdevelopment.aegis"; + const elementName = "androidAppQrCode"; + + const qrCode = $scope.getQrCodeFromUrl(appUrl, elementName); + } + + $scope.generateTotpAppsQrCodes = function () { + $scope.getQrIosTotpApp(); + $scope.getQrAndroidTotpApp(); + }; + $scope.isAllowedInitially = function (tokentype) { return $scope.initiallyAllowedTokenTypes.includes(tokentype); }; - - $scope.toggleTOTPAppCodeVisibility = function () { $scope.isVisibleTOTPAppCode = !$scope.isVisibleTOTPAppCode; }; + + $scope.toggleAwaitingTOTPAppDisclaimer = function () { + $scope.awaitingTOTPAppDisclaimerConfirm = !$scope.awaitingTOTPAppDisclaimerConfirm; + console.log(`awaiting totp disclaimer: ${$scope.awaitingTOTPAppDisclaimerConfirm}, awaiting enroll: ${$scope.awaitingBackupcodeEnroll}, enrolling: ${$scope.enrolledToken}`) + }; + $scope.pollTokenInfo = function () { TokenFactory.getTokenForSerial($scope.enrolledToken.serial, function(data) { $scope.enrolledToken.rollout_state = data.result.value.tokens[0].rollout_state; diff --git a/privacyidea/static/components/token/factories/token.js b/privacyidea/static/components/token/factories/token.js index c4afeebee..febc72abb 100644 --- a/privacyidea/static/components/token/factories/token.js +++ b/privacyidea/static/components/token/factories/token.js @@ -257,22 +257,21 @@ angular.module("TokenModule", ["privacyideaAuth"]) headers: {'PI-Authorization': AuthFactory.getAuthToken()} }).then(function (response) { callback(response.data) }, function(error) { AuthFactory.authError(error.data) }); }, - getUsableTokensCount: function (userObject, callback, callback_error) { - const username = fixUser(userObject.user); - let params = {}; - if (username) { - params.user = username; - params.realm = userObject.realm; - } - $http.get(tokenUrl + "/count_usable", { - // params: params, - headers: {'PI-Authorization': AuthFactory.getAuthToken()} - }).then(function (response) { callback(response.data) }, - function(error) { AuthFactory.authError(error.data); - if (callback_error) { - callback_error(error.data); - } - }); + getUsableTokensCount: function (userObject) { + return new Promise(function(resolve, reject) { + const username = fixUser(userObject.user); + let params = {}; + if (username) { + params.user = username; + params.realm = userObject.realm; + } + $http.get(tokenUrl + "/count_usable", { + headers: {'PI-Authorization': AuthFactory.getAuthToken()} + }).then(function (response) { resolve(response.data) }) + .catch(function(error) { + reject(error); + }); + }) }, }; }]); diff --git a/privacyidea/static/components/token/views/progress_bars/progress.bar.1of4.html b/privacyidea/static/components/token/views/progress_bars/progress.bar.1of5.html similarity index 80% rename from privacyidea/static/components/token/views/progress_bars/progress.bar.1of4.html rename to privacyidea/static/components/token/views/progress_bars/progress.bar.1of5.html index ee6fdf146..2e91f76e7 100644 --- a/privacyidea/static/components/token/views/progress_bars/progress.bar.1of4.html +++ b/privacyidea/static/components/token/views/progress_bars/progress.bar.1of5.html @@ -17,6 +17,12 @@ <span class="line empty"></span> + <div class="steps empty"> + <span><b>4</b></span> + </div> + + <span class="line empty"></span> + <div class="steps empty"> <span><i class="glyphicon glyphicon-ok"></i></span> </div> diff --git a/privacyidea/static/components/token/views/progress_bars/progress.bar.2of4.html b/privacyidea/static/components/token/views/progress_bars/progress.bar.2of5.html similarity index 80% rename from privacyidea/static/components/token/views/progress_bars/progress.bar.2of4.html rename to privacyidea/static/components/token/views/progress_bars/progress.bar.2of5.html index ac5e00db0..4be75c397 100644 --- a/privacyidea/static/components/token/views/progress_bars/progress.bar.2of4.html +++ b/privacyidea/static/components/token/views/progress_bars/progress.bar.2of5.html @@ -17,6 +17,12 @@ <span class="line empty"></span> + <div class="steps empty"> + <span><b>4</b></span> + </div> + + <span class="line empty"></span> + <div class="steps empty"> <span><i class="glyphicon glyphicon-ok"></i></span> </div> diff --git a/privacyidea/static/components/token/views/progress_bars/progress.bar.3of4.html b/privacyidea/static/components/token/views/progress_bars/progress.bar.3of5.html similarity index 80% rename from privacyidea/static/components/token/views/progress_bars/progress.bar.3of4.html rename to privacyidea/static/components/token/views/progress_bars/progress.bar.3of5.html index 2cb3211fe..4f38da72e 100644 --- a/privacyidea/static/components/token/views/progress_bars/progress.bar.3of4.html +++ b/privacyidea/static/components/token/views/progress_bars/progress.bar.3of5.html @@ -17,6 +17,12 @@ <span class="line empty"></span> + <div class="steps empty"> + <span><b>4</b></span> + </div> + + <span class="line empty"></span> + <div class="steps empty"> <span><i class="glyphicon glyphicon-ok"></i></span> </div> diff --git a/privacyidea/static/components/token/views/progress_bars/progress.bar.4of4.html b/privacyidea/static/components/token/views/progress_bars/progress.bar.4of5.html similarity index 81% rename from privacyidea/static/components/token/views/progress_bars/progress.bar.4of4.html rename to privacyidea/static/components/token/views/progress_bars/progress.bar.4of5.html index 35e5f9013..2f2e2aa6c 100644 --- a/privacyidea/static/components/token/views/progress_bars/progress.bar.4of4.html +++ b/privacyidea/static/components/token/views/progress_bars/progress.bar.4of5.html @@ -18,6 +18,12 @@ <span class="line filled"></span> <div class="steps filled"> + <span><b>4</b></span> + </div> + + <span class="line empty"></span> + + <div class="steps empty"> <span><i class="glyphicon glyphicon-ok"></i></span> </div> </div> \ No newline at end of file diff --git a/privacyidea/static/components/token/views/progress_bars/progress.bar.5of5.html b/privacyidea/static/components/token/views/progress_bars/progress.bar.5of5.html new file mode 100644 index 000000000..5402c7507 --- /dev/null +++ b/privacyidea/static/components/token/views/progress_bars/progress.bar.5of5.html @@ -0,0 +1,29 @@ +<div class="progresses"> + <div class="steps filled"> + <span><b>1</b></span> + </div> + + <span class="line filled"></span> + + <div class="steps filled"> + <span><b>2</b></span> + </div> + + <span class="line filled"></span> + + <div class="steps filled"> + <span><b>3</b></span> + </div> + + <span class="line filled"></span> + + <div class="steps filled"> + <span><b>4</b></span> + </div> + + <span class="line filled"></span> + + <div class="steps filled"> + <span><i class="glyphicon glyphicon-ok"></i></span> + </div> +</div> \ No newline at end of file diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index 9a4ae55ae..6671f601e 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -1,17 +1,18 @@ <div ng-init="calculateHasUsableTokens()" class="panel padded-panel"> <!-- Hide the form, after the token was enrolled --> - <!-- 1/4 Show this only before the initial TOTP token is registered --> + <!-- 1/5 Show this only before the initial TOTP token is registered --> <div ng-hide="enrolledToken || awaitingBackupcodeEnroll || awaitingSetupCompletion"> <div ng-if="!hasUsableTokens"> <ng-include - src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.1of4.html'"></ng-include> + src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.1of5.html'"></ng-include> </div> <div ng-if="hasUsableTokens"> <ng-include src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.1of2.html'"></ng-include> </div> - <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b>{{ browserLanguage == 'cs' ? 'VĂcefázovĂ© ověřenĂ' : 'Multi-factor authentication' }}</b></h3> + <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b> + {{ browserLanguage == 'cs' ? 'VĂcefázovĂ© ověřenĂ' : 'Multi-factor authentication' }}</b></h3> <!-- Configurable prolog --> <div ng-if="$state.includes('token.wizard')" ng-include="instanceUrl+'/'+piCustomization+ @@ -19,20 +20,24 @@ <form name="formEnrollToken" role="form" validate ng-init="form.type = 'totp'"> <div class="form-group" ng-repeat="(type, desc) in formInit.tokenTypes"> - <input class="form-check-input" type="radio" name="{type}" id="radio{{type}}" value="{{type}}" + <input class="form-check-input" type="radio" name="{type}" id="radio{{ type }}" value="{{ type }}" ng-model="form.type" ng-change="changeTokenType()" ng-hide="!(hasUsableTokens || isAllowedInitially(type))" + ng-checked="type === 'totp'" > - <label class="form-check-label custom-form-check-label" for="radio{{type}}" + <label class="form-check-label custom-form-check-label" for="radio{{ type }}" ng-hide="!(hasUsableTokens || isAllowedInitially(type))"> - <span ng-show="type === 'backupcode' && hasUsableTokens">{{ browserLanguage == 'cs' ? 'záloĹľnĂ kĂłdy' : 'backup codes' }}</span> - <span ng-show="type === 'totp'">{{ browserLanguage == 'cs' ? 'ověřovacĂ kĂłdy' : 'verification codes' }}</span> - <span ng-show="type === 'webauthn' && hasUsableTokens">{{ browserLanguage == 'cs' ? 'bezpeÄŤnostnĂ klĂÄŤ' : 'security key' }}</span> - <span ng-hide="type === 'backupcode' || type === 'totp' || type === 'webauthn'">{{desc}}</span> + <span ng-show="type === 'backupcode' && hasUsableTokens">{{ browserLanguage == 'cs' ? 'záloĹľnĂ kĂłdy' : 'backup codes' + }}</span> + <span ng-show="type === 'totp'">{{ browserLanguage == 'cs' ? 'ověřovacĂ kĂłdy' : 'verification codes' + }}</span> + <span ng-show="type === 'webauthn' && hasUsableTokens">{{ browserLanguage == 'cs' ? 'bezpeÄŤnostnĂ klĂÄŤ' : 'security key' + }}</span> + <span ng-hide="type === 'backupcode' || type === 'totp' || type === 'webauthn'">{{ desc }}</span> </label> <ng-include ng-hide="!(hasUsableTokens || isAllowedInitially(type))" - src="instanceUrl + '/static/components/token/views/token.info.' + type + '.html'"></ng-include> + src="instanceUrl + '/static/components/token/views/token.info.' + type + '.html'"></ng-include> </div> <!-- The description input field for all token types --> @@ -40,10 +45,12 @@ <label for="description" translate>Description</label> <p ng-show="browserLanguage === 'en'"> Optionally, you can provide a description for your token. This will help you tell them apart if you - enroll multiple tokens. For example, you can use your device name or the authenticator app name as a hint. + enroll multiple tokens. For example, you can use your device name or the authenticator app name as a + hint. </p> <p ng-show="browserLanguage === 'cs'"> - MĹŻĹľete zadat popis svĂ©ho tokenu (nepovinnĂ©). Popis sloužà k rozlišenĂ tokenĹŻ, pokud si jich zaregistrujete vĂce. + MĹŻĹľete zadat popis svĂ©ho tokenu (nepovinnĂ©). Popis sloužà k rozlišenĂ tokenĹŻ, pokud si jich + zaregistrujete vĂce. MĹŻĹľete napĹ™Ăklad pouĹľĂt název svĂ©ho zaĹ™ĂzenĂ nebo název ověřovacĂ aplikace. </p> <input type="text" class="form-control" id="description" @@ -141,10 +148,11 @@ ng-init="form.rollover = $state.includes('token.rollover')" ng-model="form.rollover"/> <div class="text-center"> - <button type="button" ng-click="enrollToken()" + <button type="button" ng-click="enrollToken(); generateTotpAppsQrCodes()" ng-disabled="!checkEnroll() || formEnrollToken.$invalid || enrolling" class="btn btn-primary margin-bottom"> - <span ng-if="$state.includes('token.rollover') == false">{{ browserLanguage == 'cs' ? 'PokraÄŤovat' : 'Continue' }}</span> + <span ng-if="$state.includes('token.rollover') == false">{{ browserLanguage == 'cs' ? 'PokraÄŤovat' : 'Continue' + }}</span> <span ng-if="$state.includes('token.rollover')" translate>Rollover Token</span> </button> </div> @@ -154,15 +162,60 @@ <div ng-if="$state.includes('token.wizard')" ng-include="instanceUrl+'/'+piCustomization+ '/views/includes/token.enroll.pre.bottom.html'"></div> + </div> + + <!-- Intermediate step to make sure the user has some TOTP app installed --> + <!-- 2/5 Show this after the initial TOTP token was registered --> + <div ng-show="enrolledToken && awaitingTOTPAppDisclaimerConfirm "> + <ng-include + src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.2of5.html'"></ng-include> + <h3 class="main-heading-element" translate><b> + {{ browserLanguage == 'cs' ? 'Máte aplikaci pro ukládánĂ ověřovacĂch kĂłdĹŻ?' : 'Do you have a TOTP application?' + }}</b> + </h3> + <div class="margin-bottom-large"> + <p ng-show="browserLanguage === 'cs'"> + Dalšà krok aktivace vyĹľaduje, aby jste na svĂ©m chytrĂ©m telefonu mÄ›li nainstalovanou aplikaci pro správu + ověřovacĂch kĂłdĹŻ. Pokud takovou aplikaci nemáte, mĹŻĹľete vyuĹľĂt ku pĹ™Ăkladu <a + href="https://getaegis.app/" + target="_blank" + rel="noopener nofollow"><b>Aegis + Authenticator</b></a> (pro Android) nebo <a href="https://raivo-otp.com/" target="_blank" + rel="noopener nofollow"><b>Raivo OTP</b></a> (pro iOS). + </p> + <p ng-show="browserLanguage !== 'cs'"> + The next step of activation requires that you have a TOTP app installed on your smartphone. If you don't + have such app already, you can use for example <a href="https://getaegis.app/" target="_blank" + rel="noopener nofollow"><b>Aegis Authenticator</b></a> + (Android) or <a href="https://raivo-otp.com/" target="_blank" rel="noopener nofollow"><b>Raivo + OTP</b></a> + (iOS). + </p> + </div> + + <div class="qr-codes totp-verify-mobile"> + <div id="androidAppQrCode" class="max-available-width margin-bottom-large"> + <h5 class="margin-bottom"><b>Aegis Authenticator (Android)</b></h5> + </div> + <div id="iosAppQrCode" class="max-available-width margin-bottom-large"> + <h5 class="margin-bottom"><b>Raivo OTP (iOS)</b></h5> + </div> + </div> + <div class="text-center"> + <button type="button" ng-click="toggleAwaitingTOTPAppDisclaimer()" + class="btn btn-primary margin-bottom"> + <span>{{ browserLanguage == 'cs' ? 'Mám aplikaci pro ověřenĂ' : 'I have a TOTP app' }}</span> + </button> + </div> </div> <!-- Show this information after the token was enrolled completely --> - <!-- 2/4 Show this after the initial TOTP token was registered --> - <div ng-show="enrolledToken && !awaitingBackupcodeEnroll"> + <!-- 3/5 Show this after the user was reminded to download a TOTP app --> + <div ng-show="enrolledToken && !awaitingBackupcodeEnroll && !awaitingTOTPAppDisclaimerConfirm"> <div ng-if="!hasUsableTokens"> <ng-include - src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.2of4.html'"></ng-include> + src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.3of5.html'"></ng-include> </div> <div ng-if="hasUsableTokens"> <ng-include @@ -188,8 +241,9 @@ name="verifyResponse"> </div> <div class="text-center"> - <button type="button" ng-click="sendVerifyResponse()" - class="btn btn-primary margin-bottom" translate>Verify Token</button> + <button type="button" ng-click="sendVerifyResponse();" + class="btn btn-primary margin-bottom" translate>Verify Token + </button> </div> </div> @@ -203,23 +257,25 @@ <!-- Confirm MFA activation dialog after registering initial token --> <button ng-click="hasSeenMFADialog = true; showMFAActivationDialog()" ng-hide="hasUsableTokens || hasSeenMFADialog" - class="btn btn-primary margin-bottom">{{ browserLanguage == 'cs' ? 'PokraÄŤovat' : 'Continue' }} + class="btn btn-primary margin-bottom"> + {{ browserLanguage == 'cs' ? 'PokraÄŤovat' : 'Continue' }} </button> <!-- Finish the enrollment process if this wasn't the user's initial token --> <button ng-click="enrolledToken = null; enrolling = false;" ng-hide="!hasUsableTokens" ui-sref="token.list" - class="btn btn-primary margin-bottom" translate>{{ browserLanguage == 'cs' ? 'DokonÄŤit' : 'Finish' }} + class="btn btn-primary margin-bottom" translate> + {{ browserLanguage == 'cs' ? 'DokonÄŤit' : 'Finish' }} </button> </div> </div> - <!-- 3/4 Show this after the initial TOTP token was registered --> + <!-- 4/5 Show this after the initial TOTP token was registered --> <div ng-show="awaitingBackupcodeEnroll"> <div ng-if="!hasUsableTokens"> <ng-include - src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.3of4.html'"></ng-include> + src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.4of5.html'"></ng-include> </div> <div ng-if="$state.includes('token.wizard')" @@ -233,25 +289,29 @@ <div class="text-center"> <button ng-click="awaitingBackupcodeEnroll = false; awaitingSetupCompletion = true; enrolledToken = null;" ng-disabled="!hasDownloadedBackupcodes" - class="btn btn-primary margin-bottom">{{ browserLanguage == 'cs' ? 'ZáloĹľnĂ kĂłdy mám' : 'I have my backup codes' }} + class="btn btn-primary margin-bottom"> + {{ browserLanguage == 'cs' ? 'ZáloĹľnĂ kĂłdy mám' : 'I have my backup codes' }} </button> </div> </div> - <!-- 4/4 Show this after the initial TOTP token and the initial backupcodes have been registered --> + <!-- 5/5 Show this after the initial TOTP token and the initial backupcodes have been registered --> <div ng-show="awaitingSetupCompletion"> <div ng-if="!hasUsableTokens"> <ng-include - src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.4of4.html'"></ng-include> + src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.5of5.html'"></ng-include> </div> <div class="totp-verify-mobile"> <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element"><b> - {{ browserLanguage == 'cs' ? 'VĂcefázovĂ© ověřenĂ bylo ĂşspěšnÄ› nastaveno.' : 'Multi-factor authentication has been successfully set up!' }} + {{ browserLanguage == 'cs' ? 'VĂcefázovĂ© ověřenĂ bylo ĂşspěšnÄ› nastaveno.' : 'Multi-factor authentication has been successfully set up!' + }} </b></h3> - <p ng-show="browserLanguage === 'en'"><b>Which services will now require multi-factor authentication?</b></p> - <p ng-show="browserLanguage === 'cs'"><b>KterĂ© sluĹľby budou nynĂ vyĹľadovat vĂcefázovĂ© ověřenĂ?</b></p> + <p ng-show="browserLanguage === 'en'"><b>Which services will now require multi-factor + authentication?</b></p> + <p ng-show="browserLanguage === 'cs'"><b>KterĂ© sluĹľby budou nynĂ vyĹľadovat vĂcefázovĂ© + ověřenĂ?</b></p> <p ng-show="browserLanguage === 'en'"> Multi-factor authentication is currently activated for all services. To manage your settings, click the Service settings button below. @@ -262,21 +322,27 @@ </p> <!-- Open Perun settings in a new tab --> - <a class="btn-default btn margin-bottom-large" href="https://account.muni.cz/profile/settings/auth" target="_blank"> + <a class="btn-default btn margin-bottom-large" + href="https://account.muni.cz/profile/settings/auth" target="_blank"> {{ browserLanguage == 'cs' ? 'NastavenĂ sluĹľeb' : 'Service settings' }} </a> </div> <div class="totp-verify-mobile"> - <h3 ng-show="browserLanguage === 'en'"><b>Add another method of multi-factor authentication (optional)</b></h3> - <h3 ng-show="browserLanguage === 'cs'"><b>PĹ™idat dalšà metodu vĂcefázovĂ©ho ověřenĂ (nepovinnĂ©)</b></h3> + <h3 ng-show="browserLanguage === 'en'"><b>Add another method of multi-factor authentication + (optional)</b></h3> + <h3 ng-show="browserLanguage === 'cs'"><b>PĹ™idat dalšà metodu vĂcefázovĂ©ho ověřenĂ + (nepovinnĂ©)</b></h3> <p ng-show="browserLanguage === 'en'"><b> - We highly recommend setting up an additional method of authentication using security keys, for easier and more secure log in from your devices. + We highly recommend setting up an additional method of authentication using security keys, + for easier and more secure log in from your devices. You can set up multiple security keys and sign in with the one you have most handy. </b></p> <p ng-show="browserLanguage === 'cs'"><b> - DoporuÄŤujeme nastavit dalšà metodu ověřovánĂ pomocĂ bezpeÄŤnostnĂch klĂÄŤĹŻ, pro snadnÄ›jšà a bezpeÄŤnÄ›jšà pĹ™ihlašovánĂ ze svĂ˝ch zaĹ™ĂzenĂ. - MĹŻĹľete si nastavit vĂce bezpeÄŤnostnĂch klĂÄŤĹŻ a pĹ™ihlásit se pomocĂ toho, kterĂ˝ máte zrovna po ruce. + DoporuÄŤujeme nastavit dalšà metodu ověřovánĂ pomocĂ bezpeÄŤnostnĂch klĂÄŤĹŻ, pro snadnÄ›jšà a + bezpeÄŤnÄ›jšà pĹ™ihlašovánĂ ze svĂ˝ch zaĹ™ĂzenĂ. + MĹŻĹľete si nastavit vĂce bezpeÄŤnostnĂch klĂÄŤĹŻ a pĹ™ihlásit se pomocĂ toho, kterĂ˝ máte zrovna + po ruce. </b></p> <button class="btn-default btn margin-bottom-large" ng-click="calculateHasUsableTokens(); awaitingSetupCompletion = false; form.type='webauthn'; form.description=''"> @@ -286,7 +352,8 @@ <div class="text-center"> <button ng-click="awaitingSetupCompletion=false;" ui-sref="token.list" - class="btn btn-primary margin-bottom" translate>{{ browserLanguage == 'cs' ? 'DokonÄŤit' : 'Finish' }} + class="btn btn-primary margin-bottom" translate> + {{ browserLanguage == 'cs' ? 'DokonÄŤit' : 'Finish' }} </button> </div> </div> diff --git a/privacyidea/static/css/token-enroll-flow.css b/privacyidea/static/css/token-enroll-flow.css index 862c4343c..f32177438 100644 --- a/privacyidea/static/css/token-enroll-flow.css +++ b/privacyidea/static/css/token-enroll-flow.css @@ -94,6 +94,11 @@ input[type="radio"] { width: 30%; } +.qr-codes { + display: flex; + justify-content: space-between; +} + @media (max-width: 600px) { .verify-totp { width: 100%; @@ -168,3 +173,11 @@ a[href*="privacyidea.readthedocs.io"] { #find-user { margin-right: 1em; } + +#androidAppQrCode img { + max-width: -webkit-fill-available; +} + +#iosAppQrCode img { + max-width: -webkit-fill-available; +} \ No newline at end of file diff --git a/privacyidea/static/templates/footer.html b/privacyidea/static/templates/footer.html index 878d6d211..ef31450b0 100644 --- a/privacyidea/static/templates/footer.html +++ b/privacyidea/static/templates/footer.html @@ -89,5 +89,7 @@ <script src="static/jspdf.umd.min.js"></script> <!-- autotable - Script for creating formatted tables compatible with jsPDF --> <script src="static/jspdf.plugin.autotable.min.js"></script> +<!-- QRCode - Script for creating QR codes from URL (download links for TOTP apps) --> +<script src="https://cdn.jsdelivr.net/gh/davidshimjs/qrcodejs/qrcode.min.js"></script> </body> </html> -- GitLab From 1a8358917f33b2d8eabf6b78dd7dfad9a2a39fb0 Mon Sep 17 00:00:00 2001 From: Peter Bolha <xbolha@fi.muni.cz> Date: Thu, 8 Jun 2023 14:58:35 +0200 Subject: [PATCH 21/39] feat: new token enroll flow in wizard --- .../static/components/token/states/states.js | 2 +- .../views/token.enrolled.backupcode.html | 2 +- .../token/views/token.enrolled.totp.html | 6 ++-- .../token/views/token.modified.enroll.html | 31 +++++++------------ 4 files changed, 17 insertions(+), 24 deletions(-) diff --git a/privacyidea/static/components/token/states/states.js b/privacyidea/static/components/token/states/states.js index 6ccbafd11..43b8cef67 100644 --- a/privacyidea/static/components/token/states/states.js +++ b/privacyidea/static/components/token/states/states.js @@ -75,7 +75,7 @@ angular.module('privacyideaApp.tokenStates', ['ui.router', 'privacyideaApp.versi }) .state('token.wizard', { url: "/wizard", - templateUrl: tokenpath + "token.enroll.html" + versioningSuffixProviderProvider.$get().$get(), + templateUrl: tokenpath + "token.modified.enroll.html" + versioningSuffixProviderProvider.$get().$get(), controller: "tokenEnrollController" }) .state('token.import', { diff --git a/privacyidea/static/components/token/views/token.enrolled.backupcode.html b/privacyidea/static/components/token/views/token.enrolled.backupcode.html index 21b878075..00d2d5a94 100644 --- a/privacyidea/static/components/token/views/token.enrolled.backupcode.html +++ b/privacyidea/static/components/token/views/token.enrolled.backupcode.html @@ -1,6 +1,6 @@ <div> <div class="progress-bar" id="colorSampleElement"></div> - <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b>{{ browserLanguage === 'cs' ? 'UloĹľte si záloĹľnĂ kĂłdy pro obnovenĂ pĹ™Ăstupu' : 'Save backup codes for restoring access to your account' }}</b></h3> + <h3 class="main-heading-element" translate><b>{{ browserLanguage === 'cs' ? 'UloĹľte si záloĹľnĂ kĂłdy pro obnovenĂ pĹ™Ăstupu' : 'Save backup codes for restoring access to your account' }}</b></h3> <button class="btn-default btn margin-vertical margin-right" ng-click="downloadBackupcodePDF()"> <span class="glyphicon glyphicon-download-alt"></span> diff --git a/privacyidea/static/components/token/views/token.enrolled.totp.html b/privacyidea/static/components/token/views/token.enrolled.totp.html index 2ecd00993..0d67ff3b5 100644 --- a/privacyidea/static/components/token/views/token.enrolled.totp.html +++ b/privacyidea/static/components/token/views/token.enrolled.totp.html @@ -1,12 +1,12 @@ <div class="totp-verify-mobile limit-max-width"> <div ng-show="enrolledToken.rollout_state === 'enrolled'" class="limit-max-width'"> - <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate>Token enrolled</h3> + <h3 class="main-heading-element" translate>Token enrolled</h3> <div class="margin-bottom"> {{ browserLanguage === 'cs' ? 'Vaše aplikace pro ověřovacĂ kĂłdy byla ĂşspěšnÄ› zaregistrována a ověřena.' : 'Your verification code app has been successfully enrolled and verified.' }} </div> </div> <div ng-show="enrolledToken.rollout_state === 'verify'" class="limit-max-width"> - <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element"><b>{{ browserLanguage === 'cs' ? 'NastavenĂ autentizace' : 'Authentication setup' }}</b> + <h3 class="main-heading-element"><b>{{ browserLanguage === 'cs' ? 'NastavenĂ autentizace' : 'Authentication setup' }}</b> </h3> <div class="margin-bottom-large max-available-width"> <div class="margin-bottom" ng-show="browserLanguage === 'en'"> @@ -58,7 +58,7 @@ </div> <div ng-hide="form['2stepinit']" ng-class="$state.includes('token.wizard') == true && form['2stepinit'] == false ? 'col-sm-12' : 'col-sm-6'"> - <div class="col-sm-12 margin-bottom-large" ng-hide="$state.includes('token.wizard')"> + <div class="col-sm-12 margin-bottom-large"> <p translate>The QR Code contains the secret key of your token. You need to protect it. <b>If you are in doubt, that someone else saw it, please regenerate the QR Code, when no one else is watching.</b></p> diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index 6671f601e..f3280ac19 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -11,12 +11,8 @@ src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.1of2.html'"></ng-include> </div> - <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element" translate><b> + <h3 class="main-heading-element" translate><b> {{ browserLanguage == 'cs' ? 'VĂcefázovĂ© ověřenĂ' : 'Multi-factor authentication' }}</b></h3> - <!-- Configurable prolog --> - <div ng-if="$state.includes('token.wizard')" - ng-include="instanceUrl+'/'+piCustomization+ - '/views/includes/token.enroll.pre.top.html'"></div> <form name="formEnrollToken" role="form" validate ng-init="form.type = 'totp'"> <div class="form-group" ng-repeat="(type, desc) in formInit.tokenTypes"> @@ -222,10 +218,6 @@ src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.2of2.html'"></ng-include> </div> - <div ng-if="$state.includes('token.wizard')" - ng-include="instanceUrl+'/'+piCustomization+ - '/views/includes/token.enroll.post.top.html'"></div> - <!-- This is the token data section. It differs for every token type--> <ng-include src="instanceUrl + '/static/components/token/views/token.enrolled.' + form.type + '.html' + fileVersionSuffix"> @@ -273,14 +265,8 @@ <!-- 4/5 Show this after the initial TOTP token was registered --> <div ng-show="awaitingBackupcodeEnroll"> - <div ng-if="!hasUsableTokens"> - <ng-include - src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.4of5.html'"></ng-include> - </div> - - <div ng-if="$state.includes('token.wizard')" - ng-include="instanceUrl+'/'+piCustomization+ - '/views/includes/token.enroll.post.top.html'"></div> + <ng-include + src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.4of5.html'"></ng-include> <!-- This is the token data section. It differs for every token type--> <ng-include src="instanceUrl + @@ -303,7 +289,7 @@ </div> <div class="totp-verify-mobile"> - <h3 ng-if="$state.includes('token.enroll')" class="main-heading-element"><b> + <h3 class="main-heading-element"><b> {{ browserLanguage == 'cs' ? 'VĂcefázovĂ© ověřenĂ bylo ĂşspěšnÄ› nastaveno.' : 'Multi-factor authentication has been successfully set up!' }} </b></h3> @@ -350,11 +336,18 @@ </button> </div> <div class="text-center"> - <button ng-click="awaitingSetupCompletion=false;" + <button ng-click="awaitingSetupCompletion=false" ui-sref="token.list" + ng-hide="$state.includes('token.wizard')" class="btn btn-primary margin-bottom" translate> {{ browserLanguage == 'cs' ? 'DokonÄŤit' : 'Finish' }} </button> + <button ng-click="logout()" + ui-sref="token.list" + ng-hide="!$state.includes('token.wizard')" + class="btn btn-primary margin-bottom" translate> + {{ browserLanguage == 'cs' ? 'Odhlásit' : 'Log out' }} + </button> </div> </div> </div> -- GitLab From b6ed2a47ffbc58399bb758109eeede40dc273aab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ou=C5=A1ek?= <brousek@ics.muni.cz> Date: Thu, 15 Jun 2023 13:51:21 +0200 Subject: [PATCH 22/39] fix: local copy of qrcode library --- privacyidea/static/qrcode.min.js | 1 + privacyidea/static/templates/footer.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 privacyidea/static/qrcode.min.js diff --git a/privacyidea/static/qrcode.min.js b/privacyidea/static/qrcode.min.js new file mode 100644 index 000000000..993e88f39 --- /dev/null +++ b/privacyidea/static/qrcode.min.js @@ -0,0 +1 @@ +var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c<a.length&&0==a[c];)c++;this.num=new Array(a.length-c+b);for(var d=0;d<a.length-c;d++)this.num[d]=a[d+c]}function j(a,b){this.totalCount=a,this.dataCount=b}function k(){this.buffer=[],this.length=0}function m(){return"undefined"!=typeof CanvasRenderingContext2D}function n(){var a=!1,b=navigator.userAgent;return/android/i.test(b)&&(a=!0,aMat=b.toString().match(/android ([0-9]\.[0-9])/i),aMat&&aMat[1]&&(a=parseFloat(aMat[1]))),a}function r(a,b){for(var c=1,e=s(a),f=0,g=l.length;g>=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=new Array(this.moduleCount);for(var e=0;e<this.moduleCount;e++)this.modules[d][e]=null}this.setupPositionProbePattern(0,0),this.setupPositionProbePattern(this.moduleCount-7,0),this.setupPositionProbePattern(0,this.moduleCount-7),this.setupPositionAdjustPattern(),this.setupTimingPattern(),this.setupTypeInfo(a,c),this.typeNumber>=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f<this.modules.length;f++)for(var g=f*e,h=0;h<this.modules[f].length;h++){var i=h*e,j=this.modules[f][h];j&&(d.beginFill(0,100),d.moveTo(i,g),d.lineTo(i+e,g),d.lineTo(i+e,g+e),d.lineTo(i,g+e),d.endFill())}return d},setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=0==a%2);for(var b=8;b<this.moduleCount-8;b++)null==this.modules[6][b]&&(this.modules[6][b]=0==b%2)},setupPositionAdjustPattern:function(){for(var a=f.getPatternPosition(this.typeNumber),b=0;b<a.length;b++)for(var c=0;c<a.length;c++){var d=a[b],e=a[c];if(null==this.modules[d][e])for(var g=-2;2>=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g<a.length&&(j=1==(1&a[g]>>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h<d.length;h++){var i=d[h];g.put(i.mode,4),g.put(i.getLength(),f.getLengthInBits(i.mode,a)),i.write(g)}for(var l=0,h=0;h<e.length;h++)l+=e[h].dataCount;if(g.getLengthInBits()>8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j<b.length;j++){var k=b[j].dataCount,l=b[j].totalCount-k;d=Math.max(d,k),e=Math.max(e,l),g[j]=new Array(k);for(var m=0;m<g[j].length;m++)g[j][m]=255&a.buffer[m+c];c+=k;var n=f.getErrorCorrectPolynomial(l),o=new i(g[j],n.getLength()-1),p=o.mod(n);h[j]=new Array(n.getLength()-1);for(var m=0;m<h[j].length;m++){var q=m+p.getLength()-h[j].length;h[j][m]=q>=0?p.get(q):0}}for(var r=0,m=0;m<b.length;m++)r+=b[m].totalCount;for(var s=new Array(r),t=0,m=0;d>m;m++)for(var j=0;j<b.length;j++)m<g[j].length&&(s[t++]=g[j][m]);for(var m=0;e>m;m++)for(var j=0;j<b.length;j++)m<h[j].length&&(s[t++]=h[j][m]);return s};for(var c={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},d={L:1,M:0,Q:3,H:2},e={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},f={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(a){for(var b=a<<10;f.getBCHDigit(b)-f.getBCHDigit(f.G15)>=0;)b^=f.G15<<f.getBCHDigit(b)-f.getBCHDigit(f.G15);return(a<<10|b)^f.G15_MASK},getBCHTypeNumber:function(a){for(var b=a<<12;f.getBCHDigit(b)-f.getBCHDigit(f.G18)>=0;)b^=f.G18<<f.getBCHDigit(b)-f.getBCHDigit(f.G18);return a<<12|b},getBCHDigit:function(a){for(var b=0;0!=a;)b++,a>>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<<h;for(var h=8;256>h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;c<this.getLength();c++)for(var d=0;d<a.getLength();d++)b[c+d]^=g.gexp(g.glog(this.get(c))+g.glog(a.get(d)));return new i(b,0)},mod:function(a){if(this.getLength()-a.getLength()<0)return this;for(var b=g.glog(this.get(0))-g.glog(a.get(0)),c=new Array(this.getLength()),d=0;d<this.getLength();d++)c[d]=this.get(d);for(var d=0;d<a.getLength();d++)c[d]^=g.gexp(g.glog(a.get(d))+b);return new i(c,0).mod(a)}},j.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],j.getRSBlocks=function(a,b){var c=j.getRsBlockTable(a,b);if(void 0==c)throw new Error("bad rs block @ typeNumber:"+a+"/errorCorrectLevel:"+b);for(var d=c.length/3,e=[],f=0;d>f;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=['<table style="border:0;border-collapse:collapse;">'],h=0;d>h;h++){g.push("<tr>");for(var i=0;d>i;i++)g.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:'+e+"px;height:"+f+"px;background-color:"+(a.isDark(h,i)?b.colorDark:b.colorLight)+';"></td>');g.push("</tr>")}g.push("</table>"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/privacyidea/static/templates/footer.html b/privacyidea/static/templates/footer.html index ef31450b0..d9d2b00d8 100644 --- a/privacyidea/static/templates/footer.html +++ b/privacyidea/static/templates/footer.html @@ -90,6 +90,6 @@ <!-- autotable - Script for creating formatted tables compatible with jsPDF --> <script src="static/jspdf.plugin.autotable.min.js"></script> <!-- QRCode - Script for creating QR codes from URL (download links for TOTP apps) --> -<script src="https://cdn.jsdelivr.net/gh/davidshimjs/qrcodejs/qrcode.min.js"></script> +<script src="static/qrcode.min.js"></script> </body> </html> -- GitLab From 7b478971e741de67bd5fa322dcab6d5db13c1ad4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ou=C5=A1ek?= <brousek@ics.muni.cz> Date: Thu, 15 Jun 2023 13:57:08 +0200 Subject: [PATCH 23/39] fix: mention password managers with TOTP support --- .../token/views/token.modified.enroll.html | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index f3280ac19..cb868789c 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -171,21 +171,23 @@ </h3> <div class="margin-bottom-large"> <p ng-show="browserLanguage === 'cs'"> - Dalšà krok aktivace vyĹľaduje, aby jste na svĂ©m chytrĂ©m telefonu mÄ›li nainstalovanou aplikaci pro správu - ověřovacĂch kĂłdĹŻ. Pokud takovou aplikaci nemáte, mĹŻĹľete vyuĹľĂt ku pĹ™Ăkladu <a + Dalšà krok aktivace vyĹľaduje, abyste na svĂ©m chytrĂ©m telefonu mÄ›li nainstalovanou aplikaci pro správu + ověřovacĂch kĂłdĹŻ, nebo abyste mÄ›li správce hesel, kterĂ˝ generovánĂ TOTP kĂłdĹŻ podporuje. + Pokud takovou aplikaci nemáte, mĹŻĹľete vyuĹľĂt napĹ™Ăklad <a href="https://getaegis.app/" target="_blank" rel="noopener nofollow"><b>Aegis Authenticator</b></a> (pro Android) nebo <a href="https://raivo-otp.com/" target="_blank" - rel="noopener nofollow"><b>Raivo OTP</b></a> (pro iOS). + rel="noopener nofollow"><b>Raivo OTP</b></a> (pro iOS), + pĹ™ĂpadnÄ› <a href="https://keepassxc.org/download/" target="_blank" rel="noopener nofollow">KeePassXC</a> (Windows, macOS, Linux). </p> <p ng-show="browserLanguage !== 'cs'"> - The next step of activation requires that you have a TOTP app installed on your smartphone. If you don't + The next step of activation requires that you have a TOTP app installed in your smartphone, or that you have + a password manager with TOTP support. If you don't have such app already, you can use for example <a href="https://getaegis.app/" target="_blank" rel="noopener nofollow"><b>Aegis Authenticator</b></a> - (Android) or <a href="https://raivo-otp.com/" target="_blank" rel="noopener nofollow"><b>Raivo - OTP</b></a> - (iOS). + (Android), <a href="https://raivo-otp.com/" target="_blank" rel="noopener nofollow"><b>Raivo + OTP</b></a> (iOS), or <a href="https://keepassxc.org/download/" target="_blank" rel="noopener nofollow">KeePassXC</a> (Windows, macOS, Linux). </p> </div> -- GitLab From 7f9008197ae4309e825f387cdf8342499e13cad7 Mon Sep 17 00:00:00 2001 From: peterbolha <xbolha@fi.muni.cz> Date: Thu, 15 Jun 2023 17:43:33 +0200 Subject: [PATCH 24/39] fix: unify names of new config variables --- privacyidea/api/token.py | 15 +++++++-------- privacyidea/lib/auditmodules/customloggeraudit.py | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/privacyidea/api/token.py b/privacyidea/api/token.py index 77ecc7f4e..300b5fc50 100644 --- a/privacyidea/api/token.py +++ b/privacyidea/api/token.py @@ -185,15 +185,15 @@ def count_usable_api(): def perform_backchannel_logout(user): cfg = current_app.config - logout_endpoint_url = cfg.get("logout_endpoint_url") + logout_endpoint_url = cfg.get("PERUN_LOGOUT_ENDPOINT_URL") headers = { "Content-type": "application/x-www-form-urlencoded" } jti = str(uuid.uuid4()) token = { - "iss": cfg.get("issuer"), + "iss": cfg.get("PERUN_ISSUER"), "sub": f"{user.login}@{user.realm}", - "aud": cfg.get("audience"), + "aud": cfg.get("PERUN_AUDIENCE"), "iat": int(datetime.now().timestamp()), "jti": jti, "events": { @@ -201,8 +201,8 @@ def perform_backchannel_logout(user): } } encoded_token = jwt.encode(payload=token, - key=cfg.get("jwt_signkey"), - algorithm=cfg.get("signing_alg")) + key=cfg.get("PERUN_JWT_SIGNKEY"), + algorithm=cfg.get("PERUN_SIGNING_ALG")) response = requests.post(logout_endpoint_url, headers=headers, @@ -259,7 +259,7 @@ def set_perun_user_attributes(user, attrs_to_set, action_name): def enable_mfa_everywhere(user): cfg = current_app.config - mfa_enforce_attr_name = cfg.get("ENFORCE_MFA_ATTR_NAME") + mfa_enforce_attr_name = cfg.get("PERUN_ENFORCE_MFA_ATTR_NAME") mfa_enforce_attr_value = "{\"all\":true}" mfa_enforce_action_name = "MFA activation" @@ -267,13 +267,12 @@ def enable_mfa_everywhere(user): {mfa_enforce_attr_name: mfa_enforce_attr_value}, mfa_enforce_action_name) - def update_user_active_token_types(user, all_user_tokens=None): usable_tokens = get_usable_tokens(user, all_user_tokens) active_token_types = [token["tokentype"] for token in usable_tokens] cfg = current_app.config - mfa_active_tokens_attr_name = cfg.get("AVAILABLE_TOKEN_TYPES_ATTR_NAME") + mfa_active_tokens_attr_name = cfg.get("PERUN_AVAILABLE_TOKEN_TYPES_ATTR_NAME") mfa_active_tokens_attr_value = active_token_types mfa_enforce_action_name = "Update of user's active token types" diff --git a/privacyidea/lib/auditmodules/customloggeraudit.py b/privacyidea/lib/auditmodules/customloggeraudit.py index e96790ce3..fccbf0ab2 100644 --- a/privacyidea/lib/auditmodules/customloggeraudit.py +++ b/privacyidea/lib/auditmodules/customloggeraudit.py @@ -89,7 +89,7 @@ class Audit(AuditBase): self.qualname = self.config.get("PI_AUDIT_LOGGER_QUALNAME", __name__) self.logger = logging.getLogger(self.qualname) - self.custom_logger_qualname = self.config.get("CUSTOM_LOGGER_QUALNAME", + self.custom_logger_qualname = self.config.get("PERUN_CUSTOM_LOGGER_QUALNAME", "custom_logger") self.custom_logger = logging.getLogger(self.custom_logger_qualname) -- GitLab From d0564ea436436bc595d31d4bc0d67697ff7031e5 Mon Sep 17 00:00:00 2001 From: peterbolha <xbolha@fi.muni.cz> Date: Thu, 15 Jun 2023 17:49:34 +0200 Subject: [PATCH 25/39] feat: skip backchannel logout when missing endpoint --- privacyidea/api/token.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/privacyidea/api/token.py b/privacyidea/api/token.py index 300b5fc50..1ec1e4654 100644 --- a/privacyidea/api/token.py +++ b/privacyidea/api/token.py @@ -186,6 +186,12 @@ def count_usable_api(): def perform_backchannel_logout(user): cfg = current_app.config logout_endpoint_url = cfg.get("PERUN_LOGOUT_ENDPOINT_URL") + + if not logout_endpoint_url: + g.audit_object.log({'logout_result_msg': f"Backchannel logout skipped for user '{user.login}' " + f"because 'PERUN_LOGOUT_ENDPOINT_URL' was not configured in 'pi.cfg'"}) + return + headers = { "Content-type": "application/x-www-form-urlencoded" } -- GitLab From 3db9846cb4e3c08b5b5acaced2983e35ac244a0b Mon Sep 17 00:00:00 2001 From: peterbolha <xbolha@fi.muni.cz> Date: Thu, 15 Jun 2023 18:00:38 +0200 Subject: [PATCH 26/39] feat: skip mfa activation when missing attribute name --- privacyidea/api/token.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/privacyidea/api/token.py b/privacyidea/api/token.py index 1ec1e4654..02b8f3be6 100644 --- a/privacyidea/api/token.py +++ b/privacyidea/api/token.py @@ -269,6 +269,11 @@ def enable_mfa_everywhere(user): mfa_enforce_attr_value = "{\"all\":true}" mfa_enforce_action_name = "MFA activation" + if not mfa_enforce_attr_name: + g.audit_object.log({'mfa_activation_msg': f"MFA activation skipped for user '{user.login}' " + f"because 'PERUN_ENFORCE_MFA_ATTR_NAME' was not configured in 'pi.cfg'"}) + return + set_perun_user_attributes(user, {mfa_enforce_attr_name: mfa_enforce_attr_value}, mfa_enforce_action_name) -- GitLab From 31953c348e57f1576a53d91abffcac5c231c53d8 Mon Sep 17 00:00:00 2001 From: peterbolha <xbolha@fi.muni.cz> Date: Thu, 15 Jun 2023 18:49:49 +0200 Subject: [PATCH 27/39] fix: enable extra token enroll in first walkthrough --- .../static/components/token/views/token.modified.enroll.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index cb868789c..f64a3baa0 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -333,7 +333,7 @@ po ruce. </b></p> <button class="btn-default btn margin-bottom-large" - ng-click="calculateHasUsableTokens(); awaitingSetupCompletion = false; form.type='webauthn'; form.description=''"> + ng-click="calculateHasUsableTokens(); awaitingSetupCompletion = false; form.type='webauthn'; form.description=''; enrolling=false"> {{ browserLanguage == 'cs' ? 'PĹ™idat bezpeÄŤnostnĂ klĂÄŤ' : 'Set up a security key' }} </button> </div> -- GitLab From 7760bbc0122d9bdf6c8b63627b59c9b732ff6292 Mon Sep 17 00:00:00 2001 From: peterbolha <xbolha@fi.muni.cz> Date: Fri, 16 Jun 2023 10:49:10 +0200 Subject: [PATCH 28/39] fix: bold letters for keepass hyperlink --- .../static/components/token/views/token.modified.enroll.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index f64a3baa0..f27549539 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -179,7 +179,7 @@ rel="noopener nofollow"><b>Aegis Authenticator</b></a> (pro Android) nebo <a href="https://raivo-otp.com/" target="_blank" rel="noopener nofollow"><b>Raivo OTP</b></a> (pro iOS), - pĹ™ĂpadnÄ› <a href="https://keepassxc.org/download/" target="_blank" rel="noopener nofollow">KeePassXC</a> (Windows, macOS, Linux). + pĹ™ĂpadnÄ› <b><a href="https://keepassxc.org/download/" target="_blank" rel="noopener nofollow">KeePassXC</a></b> (Windows, macOS, Linux). </p> <p ng-show="browserLanguage !== 'cs'"> The next step of activation requires that you have a TOTP app installed in your smartphone, or that you have @@ -187,7 +187,7 @@ have such app already, you can use for example <a href="https://getaegis.app/" target="_blank" rel="noopener nofollow"><b>Aegis Authenticator</b></a> (Android), <a href="https://raivo-otp.com/" target="_blank" rel="noopener nofollow"><b>Raivo - OTP</b></a> (iOS), or <a href="https://keepassxc.org/download/" target="_blank" rel="noopener nofollow">KeePassXC</a> (Windows, macOS, Linux). + OTP</b></a> (iOS), or <b><a href="https://keepassxc.org/download/" target="_blank" rel="noopener nofollow">KeePassXC</a></b> (Windows, macOS, Linux). </p> </div> -- GitLab From 4b7502e189f4bf8be3749b41d72d4f028ada27e2 Mon Sep 17 00:00:00 2001 From: peterbolha <xbolha@fi.muni.cz> Date: Fri, 16 Jun 2023 11:30:57 +0200 Subject: [PATCH 29/39] fix: lower 'finish' button visual importance --- .../components/token/views/token.modified.enroll.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index f27549539..737efd3c4 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -259,8 +259,8 @@ <button ng-click="enrolledToken = null; enrolling = false;" ng-hide="!hasUsableTokens" ui-sref="token.list" - class="btn btn-primary margin-bottom" translate> - {{ browserLanguage == 'cs' ? 'DokonÄŤit' : 'Finish' }} + class="btn btn-outline-secondary margin-bottom" translate> + {{ browserLanguage == 'cs' ? 'ZavĹ™Ăt' : 'Close' }} </button> </div> </div> @@ -341,8 +341,8 @@ <button ng-click="awaitingSetupCompletion=false" ui-sref="token.list" ng-hide="$state.includes('token.wizard')" - class="btn btn-primary margin-bottom" translate> - {{ browserLanguage == 'cs' ? 'DokonÄŤit' : 'Finish' }} + class="btn btn-outline-secondary margin-bottom" translate> + {{ browserLanguage == 'cs' ? 'ZavĹ™Ăt' : 'Close' }} </button> <button ng-click="logout()" ui-sref="token.list" -- GitLab From 36ac05c60affb9d05669a657c32f9d3755702c67 Mon Sep 17 00:00:00 2001 From: peterbolha <xbolha@fi.muni.cz> Date: Fri, 16 Jun 2023 15:08:17 +0200 Subject: [PATCH 30/39] feat: make mfa management url configurable --- privacyidea/api/system.py | 19 +++++++++++++++++++ .../components/config/factories/config.js | 11 +++++++++++ .../token/controllers/tokenControllers.js | 19 +++++++++++++++++++ .../token/views/token.modified.enroll.html | 6 +++--- 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/privacyidea/api/system.py b/privacyidea/api/system.py index 49c03a845..fe32e00b2 100644 --- a/privacyidea/api/system.py +++ b/privacyidea/api/system.py @@ -83,6 +83,25 @@ log = logging.getLogger(__name__) system_blueprint = Blueprint('system_blueprint', __name__) +@system_blueprint.route('/mfa_management_url', methods=['GET']) +@log_with(log) +def mfa_management_url(): + """ + Get the url of site for user's MFA management or an empty string if such url is not configured. + + :return: Url of site that manages MFA or an empty string + :rtype: str + """ + + cfg = current_app.config + manage_mfa_url = cfg.get("PERUN_MANAGE_MFA_SERVICES_URL", "") + + if not manage_mfa_url: + g.audit_object.log({'mfa_management_url': f"Url for management of MFA services could not be provided" + f"because 'PERUN_MANAGE_MFA_SERVICES_URL' was not configured in 'pi.cfg'"}) + + return send_result(manage_mfa_url) + @system_blueprint.route('/documentation', methods=['GET']) @admin_required @prepolicy(check_base_action, request, ACTION.CONFIGDOCUMENTATION) diff --git a/privacyidea/static/components/config/factories/config.js b/privacyidea/static/components/config/factories/config.js index 75e8c16c4..b2beaed0d 100644 --- a/privacyidea/static/components/config/factories/config.js +++ b/privacyidea/static/components/config/factories/config.js @@ -435,6 +435,17 @@ myApp.factory("ConfigFactory", ["AuthFactory", "$http", "$state", "$rootScope", 'Content-Type': 'application/json'} }).then(function(response) { callback(response.data) }, function(error) { AuthFactory.authError(error.data) }); }, + getMfaManagementUrl: function() { + return new Promise(function(resolve, reject) { + $http.get(systemUrl + "/mfa_management_url", { + headers: {'PI-Authorization': AuthFactory.getAuthToken(), + 'Content-Type': 'application/json'} + }).then(function(response) { resolve(response.data) }).catch(function(error) { + AuthFactory.authError(error.data); + reject(error); + }); + }); + }, getRadius: function(callback, identifier) { if (!identifier) {identifier = "";} $http.get(radiusServerUrl + "/" + identifier, { diff --git a/privacyidea/static/components/token/controllers/tokenControllers.js b/privacyidea/static/components/token/controllers/tokenControllers.js index 3a7cb2902..258b9c84f 100644 --- a/privacyidea/static/components/token/controllers/tokenControllers.js +++ b/privacyidea/static/components/token/controllers/tokenControllers.js @@ -198,6 +198,7 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", $scope.hasDownloadedBackupcodes = false; $scope.isVisibleTOTPAppCode = false; $scope.initiallyAllowedTokenTypes = ['totp']; + $scope.mfaManagementUrl = ""; $scope.formInit = { tokenTypes: {"hotp": gettextCatalog.getString("HOTP: event based One Time Passwords"), @@ -545,6 +546,18 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", }); }; + $scope.redirectToMfaManagement = async function () { + // Check whether url is not loaded already to save an API call + if ($scope.mfaManagementUrl === "") { + await $scope.loadMfaManagementUrl(); + } + + // Url was correctly configured and returned by the endpoint + if ($scope.mfaManagementUrl !== "") { + window.open($scope.mfaManagementUrl, "_blank") + } + } + $scope.getQrCodeFromUrl = function(url, elementName) { return new QRCode(document.getElementById(elementName), { text: url, @@ -658,6 +671,12 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", $scope.click_wait = true; }; + // get the list of configured RADIUS server identifiers + $scope.loadMfaManagementUrl = async function() { + const data = await ConfigFactory.getMfaManagementUrl(); + $scope.mfaManagementUrl = data.result.value; + }; + // get the list of configured RADIUS server identifiers $scope.getRADIUSIdentifiers = function() { ConfigFactory.getRadiusNames(function(data){ diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index 737efd3c4..47a0b262d 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -310,10 +310,10 @@ </p> <!-- Open Perun settings in a new tab --> - <a class="btn-default btn margin-bottom-large" - href="https://account.muni.cz/profile/settings/auth" target="_blank"> + <button class="btn-default btn margin-bottom-large" + ng-click="redirectToMfaManagement();"> {{ browserLanguage == 'cs' ? 'NastavenĂ sluĹľeb' : 'Service settings' }} - </a> + </button> </div> <div class="totp-verify-mobile"> -- GitLab From 3f8187a6652ffa6ce2d6cbbdec1bf2b7569c3427 Mon Sep 17 00:00:00 2001 From: peterbolha <xbolha@fi.muni.cz> Date: Fri, 16 Jun 2023 15:12:26 +0200 Subject: [PATCH 31/39] chore: remove debug console logs --- .../static/components/token/controllers/tokenControllers.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/privacyidea/static/components/token/controllers/tokenControllers.js b/privacyidea/static/components/token/controllers/tokenControllers.js index 258b9c84f..ae2068175 100644 --- a/privacyidea/static/components/token/controllers/tokenControllers.js +++ b/privacyidea/static/components/token/controllers/tokenControllers.js @@ -500,7 +500,6 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", }; $scope.calculateHasUsableTokens = async function () { - console.log("Calculating usable tokens"); // Having usable tokens is a prerequisite for enrolling some token types. // Admin, however can enroll any token at any time for any user. if ($scope.loggedInUser.role === 'admin') { @@ -596,7 +595,6 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", $scope.toggleAwaitingTOTPAppDisclaimer = function () { $scope.awaitingTOTPAppDisclaimerConfirm = !$scope.awaitingTOTPAppDisclaimerConfirm; - console.log(`awaiting totp disclaimer: ${$scope.awaitingTOTPAppDisclaimerConfirm}, awaiting enroll: ${$scope.awaitingBackupcodeEnroll}, enrolling: ${$scope.enrolledToken}`) }; $scope.pollTokenInfo = function () { @@ -665,7 +663,6 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", token.subject = (response.detail.u2fRegisterResponse || response.detail.webAuthnRegisterResponse).subject; token.vendor = token.subject.split(" ")[0]; - console.log(token); }); }); $scope.click_wait = true; -- GitLab From ba3cd4f7028a83ca7fc8ad2a4d08c4f0fdfda8ee Mon Sep 17 00:00:00 2001 From: peterbolha <xbolha@fi.muni.cz> Date: Fri, 16 Jun 2023 15:21:11 +0200 Subject: [PATCH 32/39] fix: prevent loading of non-existent token info --- .../components/token/views/token.modified.enroll.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index 47a0b262d..6c7d784f7 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -32,8 +32,10 @@ }}</span> <span ng-hide="type === 'backupcode' || type === 'totp' || type === 'webauthn'">{{ desc }}</span> </label> - <ng-include ng-hide="!(hasUsableTokens || isAllowedInitially(type))" - src="instanceUrl + '/static/components/token/views/token.info.' + type + '.html'"></ng-include> + <div ng-if="type === 'backupcode' || type === 'totp' || type === 'webauthn'"> + <ng-include ng-hide="!(hasUsableTokens || isAllowedInitially(type))" + src="instanceUrl + '/static/components/token/views/token.info.' + type + '.html'"></ng-include> + </div> </div> <!-- The description input field for all token types --> -- GitLab From 1e4d93cfcbece154e00da5c3e8a2a1178a092dbf Mon Sep 17 00:00:00 2001 From: peterbolha <xbolha@fi.muni.cz> Date: Fri, 16 Jun 2023 15:53:45 +0200 Subject: [PATCH 33/39] refactor: load totp app qr codes from svg --- privacyidea/static/aegis.svg | 4377 +++++++++++++++++ .../token/controllers/tokenControllers.js | 28 - .../token/views/token.modified.enroll.html | 4 +- privacyidea/static/raivo.svg | 2942 +++++++++++ 4 files changed, 7322 insertions(+), 29 deletions(-) create mode 100644 privacyidea/static/aegis.svg create mode 100644 privacyidea/static/raivo.svg diff --git a/privacyidea/static/aegis.svg b/privacyidea/static/aegis.svg new file mode 100644 index 000000000..939bba9d5 --- /dev/null +++ b/privacyidea/static/aegis.svg @@ -0,0 +1,4377 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with qrencode 4.1.1 (https://fukuchi.org/works/qrencode/index.html) --> + +<svg + width="4.34cm" + height="4.34cm" + viewBox="0 0 41 41" + preserveAspectRatio="none" + version="1.1" + id="svg1175" + sodipodi:docname="aegis.svg" + xml:space="preserve" + inkscape:version="1.2.2 (732a01da63, 2022-12-09, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs1179" /><sodipodi:namedview + id="namedview1177" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:document-units="cm" + showgrid="false" + inkscape:zoom="3.5755327" + inkscape:cx="197.17342" + inkscape:cy="135.50428" + inkscape:window-width="2486" + inkscape:window-height="1376" + inkscape:window-x="74" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:current-layer="svg1175" /><g + id="QRcode"><rect + x="0" + y="0" + width="41" + height="41" + fill="#ffffff" + id="rect25" /><g + id="Pattern" + transform="translate(4,4)"><rect + x="0" + y="0" + width="1" + height="1" + fill="#000000" + id="rect27" /><rect + x="1" + y="0" + width="1" + height="1" + fill="#000000" + id="rect29" /><rect + x="2" + y="0" + width="1" + height="1" + fill="#000000" + id="rect31" /><rect + x="3" + y="0" + width="1" + height="1" + fill="#000000" + id="rect33" /><rect + x="4" + y="0" + width="1" + height="1" + fill="#000000" + id="rect35" /><rect + x="5" + y="0" + width="1" + height="1" + fill="#000000" + id="rect37" /><rect + x="6" + y="0" + width="1" + height="1" + fill="#000000" + id="rect39" /><rect + x="10" + y="0" + width="1" + height="1" + fill="#000000" + id="rect41" /><rect + x="12" + y="0" + width="1" + height="1" + fill="#000000" + id="rect43" /><rect + x="13" + y="0" + width="1" + height="1" + fill="#000000" + id="rect45" /><rect + x="16" + y="0" + width="1" + height="1" + fill="#000000" + id="rect47" /><rect + x="17" + y="0" + width="1" + height="1" + fill="#000000" + id="rect49" /><rect + x="18" + y="0" + width="1" + height="1" + fill="#000000" + id="rect51" /><rect + x="19" + y="0" + width="1" + height="1" + fill="#000000" + id="rect53" /><rect + x="20" + y="0" + width="1" + height="1" + fill="#000000" + id="rect55" /><rect + x="21" + y="0" + width="1" + height="1" + fill="#000000" + id="rect57" /><rect + x="22" + y="0" + width="1" + height="1" + fill="#000000" + id="rect59" /><rect + x="23" + y="0" + width="1" + height="1" + fill="#000000" + id="rect61" /><rect + x="26" + y="0" + width="1" + height="1" + fill="#000000" + id="rect63" /><rect + x="27" + y="0" + width="1" + height="1" + fill="#000000" + id="rect65" /><rect + x="28" + y="0" + width="1" + height="1" + fill="#000000" + id="rect67" /><rect + x="29" + y="0" + width="1" + height="1" + fill="#000000" + id="rect69" /><rect + x="30" + y="0" + width="1" + height="1" + fill="#000000" + id="rect71" /><rect + x="31" + y="0" + width="1" + height="1" + fill="#000000" + id="rect73" /><rect + x="32" + y="0" + width="1" + height="1" + fill="#000000" + id="rect75" /><rect + x="0" + y="1" + width="1" + height="1" + fill="#000000" + id="rect77" /><rect + x="6" + y="1" + width="1" + height="1" + fill="#000000" + id="rect79" /><rect + x="8" + y="1" + width="1" + height="1" + fill="#000000" + id="rect81" /><rect + x="10" + y="1" + width="1" + height="1" + fill="#000000" + id="rect83" /><rect + x="13" + y="1" + width="1" + height="1" + fill="#000000" + id="rect85" /><rect + x="14" + y="1" + width="1" + height="1" + fill="#000000" + id="rect87" /><rect + x="15" + y="1" + width="1" + height="1" + fill="#000000" + id="rect89" /><rect + x="18" + y="1" + width="1" + height="1" + fill="#000000" + id="rect91" /><rect + x="20" + y="1" + width="1" + height="1" + fill="#000000" + id="rect93" /><rect + x="26" + y="1" + width="1" + height="1" + fill="#000000" + id="rect95" /><rect + x="32" + y="1" + width="1" + height="1" + fill="#000000" + id="rect97" /><rect + x="0" + y="2" + width="1" + height="1" + fill="#000000" + id="rect99" /><rect + x="2" + y="2" + width="1" + height="1" + fill="#000000" + id="rect101" /><rect + x="3" + y="2" + width="1" + height="1" + fill="#000000" + id="rect103" /><rect + x="4" + y="2" + width="1" + height="1" + fill="#000000" + id="rect105" /><rect + x="6" + y="2" + width="1" + height="1" + fill="#000000" + id="rect107" /><rect + x="12" + y="2" + width="1" + height="1" + fill="#000000" + id="rect109" /><rect + x="14" + y="2" + width="1" + height="1" + fill="#000000" + id="rect111" /><rect + x="15" + y="2" + width="1" + height="1" + fill="#000000" + id="rect113" /><rect + x="16" + y="2" + width="1" + height="1" + fill="#000000" + id="rect115" /><rect + x="19" + y="2" + width="1" + height="1" + fill="#000000" + id="rect117" /><rect + x="20" + y="2" + width="1" + height="1" + fill="#000000" + id="rect119" /><rect + x="21" + y="2" + width="1" + height="1" + fill="#000000" + id="rect121" /><rect + x="23" + y="2" + width="1" + height="1" + fill="#000000" + id="rect123" /><rect + x="26" + y="2" + width="1" + height="1" + fill="#000000" + id="rect125" /><rect + x="28" + y="2" + width="1" + height="1" + fill="#000000" + id="rect127" /><rect + x="29" + y="2" + width="1" + height="1" + fill="#000000" + id="rect129" /><rect + x="30" + y="2" + width="1" + height="1" + fill="#000000" + id="rect131" /><rect + x="32" + y="2" + width="1" + height="1" + fill="#000000" + id="rect133" /><rect + x="0" + y="3" + width="1" + height="1" + fill="#000000" + id="rect135" /><rect + x="2" + y="3" + width="1" + height="1" + fill="#000000" + id="rect137" /><rect + x="3" + y="3" + width="1" + height="1" + fill="#000000" + id="rect139" /><rect + x="4" + y="3" + width="1" + height="1" + fill="#000000" + id="rect141" /><rect + x="6" + y="3" + width="1" + height="1" + fill="#000000" + id="rect143" /><rect + x="8" + y="3" + width="1" + height="1" + fill="#000000" + id="rect145" /><rect + x="9" + y="3" + width="1" + height="1" + fill="#000000" + id="rect147" /><rect + x="10" + y="3" + width="1" + height="1" + fill="#000000" + id="rect149" /><rect + x="12" + y="3" + width="1" + height="1" + fill="#000000" + id="rect151" /><rect + x="13" + y="3" + width="1" + height="1" + fill="#000000" + id="rect153" /><rect + x="14" + y="3" + width="1" + height="1" + fill="#000000" + id="rect155" /><rect + x="17" + y="3" + width="1" + height="1" + fill="#000000" + id="rect157" /><rect + x="19" + y="3" + width="1" + height="1" + fill="#000000" + id="rect159" /><rect + x="20" + y="3" + width="1" + height="1" + fill="#000000" + id="rect161" /><rect + x="22" + y="3" + width="1" + height="1" + fill="#000000" + id="rect163" /><rect + x="23" + y="3" + width="1" + height="1" + fill="#000000" + id="rect165" /><rect + x="24" + y="3" + width="1" + height="1" + fill="#000000" + id="rect167" /><rect + x="26" + y="3" + width="1" + height="1" + fill="#000000" + id="rect169" /><rect + x="28" + y="3" + width="1" + height="1" + fill="#000000" + id="rect171" /><rect + x="29" + y="3" + width="1" + height="1" + fill="#000000" + id="rect173" /><rect + x="30" + y="3" + width="1" + height="1" + fill="#000000" + id="rect175" /><rect + x="32" + y="3" + width="1" + height="1" + fill="#000000" + id="rect177" /><rect + x="0" + y="4" + width="1" + height="1" + fill="#000000" + id="rect179" /><rect + x="2" + y="4" + width="1" + height="1" + fill="#000000" + id="rect181" /><rect + x="3" + y="4" + width="1" + height="1" + fill="#000000" + id="rect183" /><rect + x="4" + y="4" + width="1" + height="1" + fill="#000000" + id="rect185" /><rect + x="6" + y="4" + width="1" + height="1" + fill="#000000" + id="rect187" /><rect + x="9" + y="4" + width="1" + height="1" + fill="#000000" + id="rect189" /><rect + x="14" + y="4" + width="1" + height="1" + fill="#000000" + id="rect191" /><rect + x="16" + y="4" + width="1" + height="1" + fill="#000000" + id="rect193" /><rect + x="18" + y="4" + width="1" + height="1" + fill="#000000" + id="rect195" /><rect + x="19" + y="4" + width="1" + height="1" + fill="#000000" + id="rect197" /><rect + x="21" + y="4" + width="1" + height="1" + fill="#000000" + id="rect199" /><rect + x="23" + y="4" + width="1" + height="1" + fill="#000000" + id="rect201" /><rect + x="26" + y="4" + width="1" + height="1" + fill="#000000" + id="rect203" /><rect + x="28" + y="4" + width="1" + height="1" + fill="#000000" + id="rect205" /><rect + x="29" + y="4" + width="1" + height="1" + fill="#000000" + id="rect207" /><rect + x="30" + y="4" + width="1" + height="1" + fill="#000000" + id="rect209" /><rect + x="32" + y="4" + width="1" + height="1" + fill="#000000" + id="rect211" /><rect + x="0" + y="5" + width="1" + height="1" + fill="#000000" + id="rect213" /><rect + x="6" + y="5" + width="1" + height="1" + fill="#000000" + id="rect215" /><rect + x="8" + y="5" + width="1" + height="1" + fill="#000000" + id="rect217" /><rect + x="9" + y="5" + width="1" + height="1" + fill="#000000" + id="rect219" /><rect + x="11" + y="5" + width="1" + height="1" + fill="#000000" + id="rect221" /><rect + x="12" + y="5" + width="1" + height="1" + fill="#000000" + id="rect223" /><rect + x="15" + y="5" + width="1" + height="1" + fill="#000000" + id="rect225" /><rect + x="16" + y="5" + width="1" + height="1" + fill="#000000" + id="rect227" /><rect + x="20" + y="5" + width="1" + height="1" + fill="#000000" + id="rect229" /><rect + x="21" + y="5" + width="1" + height="1" + fill="#000000" + id="rect231" /><rect + x="22" + y="5" + width="1" + height="1" + fill="#000000" + id="rect233" /><rect + x="24" + y="5" + width="1" + height="1" + fill="#000000" + id="rect235" /><rect + x="26" + y="5" + width="1" + height="1" + fill="#000000" + id="rect237" /><rect + x="32" + y="5" + width="1" + height="1" + fill="#000000" + id="rect239" /><rect + x="0" + y="6" + width="1" + height="1" + fill="#000000" + id="rect241" /><rect + x="1" + y="6" + width="1" + height="1" + fill="#000000" + id="rect243" /><rect + x="2" + y="6" + width="1" + height="1" + fill="#000000" + id="rect245" /><rect + x="3" + y="6" + width="1" + height="1" + fill="#000000" + id="rect247" /><rect + x="4" + y="6" + width="1" + height="1" + fill="#000000" + id="rect249" /><rect + x="5" + y="6" + width="1" + height="1" + fill="#000000" + id="rect251" /><rect + x="6" + y="6" + width="1" + height="1" + fill="#000000" + id="rect253" /><rect + x="8" + y="6" + width="1" + height="1" + fill="#000000" + id="rect255" /><rect + x="10" + y="6" + width="1" + height="1" + fill="#000000" + id="rect257" /><rect + x="12" + y="6" + width="1" + height="1" + fill="#000000" + id="rect259" /><rect + x="14" + y="6" + width="1" + height="1" + fill="#000000" + id="rect261" /><rect + x="16" + y="6" + width="1" + height="1" + fill="#000000" + id="rect263" /><rect + x="18" + y="6" + width="1" + height="1" + fill="#000000" + id="rect265" /><rect + x="20" + y="6" + width="1" + height="1" + fill="#000000" + id="rect267" /><rect + x="22" + y="6" + width="1" + height="1" + fill="#000000" + id="rect269" /><rect + x="24" + y="6" + width="1" + height="1" + fill="#000000" + id="rect271" /><rect + x="26" + y="6" + width="1" + height="1" + fill="#000000" + id="rect273" /><rect + x="27" + y="6" + width="1" + height="1" + fill="#000000" + id="rect275" /><rect + x="28" + y="6" + width="1" + height="1" + fill="#000000" + id="rect277" /><rect + x="29" + y="6" + width="1" + height="1" + fill="#000000" + id="rect279" /><rect + x="30" + y="6" + width="1" + height="1" + fill="#000000" + id="rect281" /><rect + x="31" + y="6" + width="1" + height="1" + fill="#000000" + id="rect283" /><rect + x="32" + y="6" + width="1" + height="1" + fill="#000000" + id="rect285" /><rect + x="9" + y="7" + width="1" + height="1" + fill="#000000" + id="rect287" /><rect + x="10" + y="7" + width="1" + height="1" + fill="#000000" + id="rect289" /><rect + x="11" + y="7" + width="1" + height="1" + fill="#000000" + id="rect291" /><rect + x="15" + y="7" + width="1" + height="1" + fill="#000000" + id="rect293" /><rect + x="16" + y="7" + width="1" + height="1" + fill="#000000" + id="rect295" /><rect + x="18" + y="7" + width="1" + height="1" + fill="#000000" + id="rect297" /><rect + x="19" + y="7" + width="1" + height="1" + fill="#000000" + id="rect299" /><rect + x="21" + y="7" + width="1" + height="1" + fill="#000000" + id="rect301" /><rect + x="22" + y="7" + width="1" + height="1" + fill="#000000" + id="rect303" /><rect + x="0" + y="8" + width="1" + height="1" + fill="#000000" + id="rect305" /><rect + x="1" + y="8" + width="1" + height="1" + fill="#000000" + id="rect307" /><rect + x="2" + y="8" + width="1" + height="1" + fill="#000000" + id="rect309" /><rect + x="3" + y="8" + width="1" + height="1" + fill="#000000" + id="rect311" /><rect + x="4" + y="8" + width="1" + height="1" + fill="#000000" + id="rect313" /><rect + x="6" + y="8" + width="1" + height="1" + fill="#000000" + id="rect315" /><rect + x="7" + y="8" + width="1" + height="1" + fill="#000000" + id="rect317" /><rect + x="8" + y="8" + width="1" + height="1" + fill="#000000" + id="rect319" /><rect + x="9" + y="8" + width="1" + height="1" + fill="#000000" + id="rect321" /><rect + x="11" + y="8" + width="1" + height="1" + fill="#000000" + id="rect323" /><rect + x="13" + y="8" + width="1" + height="1" + fill="#000000" + id="rect325" /><rect + x="14" + y="8" + width="1" + height="1" + fill="#000000" + id="rect327" /><rect + x="15" + y="8" + width="1" + height="1" + fill="#000000" + id="rect329" /><rect + x="17" + y="8" + width="1" + height="1" + fill="#000000" + id="rect331" /><rect + x="18" + y="8" + width="1" + height="1" + fill="#000000" + id="rect333" /><rect + x="20" + y="8" + width="1" + height="1" + fill="#000000" + id="rect335" /><rect + x="25" + y="8" + width="1" + height="1" + fill="#000000" + id="rect337" /><rect + x="27" + y="8" + width="1" + height="1" + fill="#000000" + id="rect339" /><rect + x="29" + y="8" + width="1" + height="1" + fill="#000000" + id="rect341" /><rect + x="31" + y="8" + width="1" + height="1" + fill="#000000" + id="rect343" /><rect + x="0" + y="9" + width="1" + height="1" + fill="#000000" + id="rect345" /><rect + x="1" + y="9" + width="1" + height="1" + fill="#000000" + id="rect347" /><rect + x="2" + y="9" + width="1" + height="1" + fill="#000000" + id="rect349" /><rect + x="3" + y="9" + width="1" + height="1" + fill="#000000" + id="rect351" /><rect + x="4" + y="9" + width="1" + height="1" + fill="#000000" + id="rect353" /><rect + x="7" + y="9" + width="1" + height="1" + fill="#000000" + id="rect355" /><rect + x="10" + y="9" + width="1" + height="1" + fill="#000000" + id="rect357" /><rect + x="12" + y="9" + width="1" + height="1" + fill="#000000" + id="rect359" /><rect + x="13" + y="9" + width="1" + height="1" + fill="#000000" + id="rect361" /><rect + x="16" + y="9" + width="1" + height="1" + fill="#000000" + id="rect363" /><rect + x="17" + y="9" + width="1" + height="1" + fill="#000000" + id="rect365" /><rect + x="19" + y="9" + width="1" + height="1" + fill="#000000" + id="rect367" /><rect + x="20" + y="9" + width="1" + height="1" + fill="#000000" + id="rect369" /><rect + x="23" + y="9" + width="1" + height="1" + fill="#000000" + id="rect371" /><rect + x="26" + y="9" + width="1" + height="1" + fill="#000000" + id="rect373" /><rect + x="30" + y="9" + width="1" + height="1" + fill="#000000" + id="rect375" /><rect + x="31" + y="9" + width="1" + height="1" + fill="#000000" + id="rect377" /><rect + x="32" + y="9" + width="1" + height="1" + fill="#000000" + id="rect379" /><rect + x="1" + y="10" + width="1" + height="1" + fill="#000000" + id="rect381" /><rect + x="2" + y="10" + width="1" + height="1" + fill="#000000" + id="rect383" /><rect + x="5" + y="10" + width="1" + height="1" + fill="#000000" + id="rect385" /><rect + x="6" + y="10" + width="1" + height="1" + fill="#000000" + id="rect387" /><rect + x="7" + y="10" + width="1" + height="1" + fill="#000000" + id="rect389" /><rect + x="8" + y="10" + width="1" + height="1" + fill="#000000" + id="rect391" /><rect + x="10" + y="10" + width="1" + height="1" + fill="#000000" + id="rect393" /><rect + x="14" + y="10" + width="1" + height="1" + fill="#000000" + id="rect395" /><rect + x="15" + y="10" + width="1" + height="1" + fill="#000000" + id="rect397" /><rect + x="22" + y="10" + width="1" + height="1" + fill="#000000" + id="rect399" /><rect + x="25" + y="10" + width="1" + height="1" + fill="#000000" + id="rect401" /><rect + x="26" + y="10" + width="1" + height="1" + fill="#000000" + id="rect403" /><rect + x="28" + y="10" + width="1" + height="1" + fill="#000000" + id="rect405" /><rect + x="29" + y="10" + width="1" + height="1" + fill="#000000" + id="rect407" /><rect + x="31" + y="10" + width="1" + height="1" + fill="#000000" + id="rect409" /><rect + x="1" + y="11" + width="1" + height="1" + fill="#000000" + id="rect411" /><rect + x="2" + y="11" + width="1" + height="1" + fill="#000000" + id="rect413" /><rect + x="3" + y="11" + width="1" + height="1" + fill="#000000" + id="rect415" /><rect + x="7" + y="11" + width="1" + height="1" + fill="#000000" + id="rect417" /><rect + x="12" + y="11" + width="1" + height="1" + fill="#000000" + id="rect419" /><rect + x="14" + y="11" + width="1" + height="1" + fill="#000000" + id="rect421" /><rect + x="16" + y="11" + width="1" + height="1" + fill="#000000" + id="rect423" /><rect + x="20" + y="11" + width="1" + height="1" + fill="#000000" + id="rect425" /><rect + x="21" + y="11" + width="1" + height="1" + fill="#000000" + id="rect427" /><rect + x="22" + y="11" + width="1" + height="1" + fill="#000000" + id="rect429" /><rect + x="23" + y="11" + width="1" + height="1" + fill="#000000" + id="rect431" /><rect + x="24" + y="11" + width="1" + height="1" + fill="#000000" + id="rect433" /><rect + x="25" + y="11" + width="1" + height="1" + fill="#000000" + id="rect435" /><rect + x="26" + y="11" + width="1" + height="1" + fill="#000000" + id="rect437" /><rect + x="28" + y="11" + width="1" + height="1" + fill="#000000" + id="rect439" /><rect + x="30" + y="11" + width="1" + height="1" + fill="#000000" + id="rect441" /><rect + x="0" + y="12" + width="1" + height="1" + fill="#000000" + id="rect443" /><rect + x="1" + y="12" + width="1" + height="1" + fill="#000000" + id="rect445" /><rect + x="2" + y="12" + width="1" + height="1" + fill="#000000" + id="rect447" /><rect + x="4" + y="12" + width="1" + height="1" + fill="#000000" + id="rect449" /><rect + x="5" + y="12" + width="1" + height="1" + fill="#000000" + id="rect451" /><rect + x="6" + y="12" + width="1" + height="1" + fill="#000000" + id="rect453" /><rect + x="7" + y="12" + width="1" + height="1" + fill="#000000" + id="rect455" /><rect + x="9" + y="12" + width="1" + height="1" + fill="#000000" + id="rect457" /><rect + x="10" + y="12" + width="1" + height="1" + fill="#000000" + id="rect459" /><rect + x="12" + y="12" + width="1" + height="1" + fill="#000000" + id="rect461" /><rect + x="13" + y="12" + width="1" + height="1" + fill="#000000" + id="rect463" /><rect + x="14" + y="12" + width="1" + height="1" + fill="#000000" + id="rect465" /><rect + x="15" + y="12" + width="1" + height="1" + fill="#000000" + id="rect467" /><rect + x="16" + y="12" + width="1" + height="1" + fill="#000000" + id="rect469" /><rect + x="17" + y="12" + width="1" + height="1" + fill="#000000" + id="rect471" /><rect + x="19" + y="12" + width="1" + height="1" + fill="#000000" + id="rect473" /><rect + x="22" + y="12" + width="1" + height="1" + fill="#000000" + id="rect475" /><rect + x="25" + y="12" + width="1" + height="1" + fill="#000000" + id="rect477" /><rect + x="27" + y="12" + width="1" + height="1" + fill="#000000" + id="rect479" /><rect + x="28" + y="12" + width="1" + height="1" + fill="#000000" + id="rect481" /><rect + x="29" + y="12" + width="1" + height="1" + fill="#000000" + id="rect483" /><rect + x="2" + y="13" + width="1" + height="1" + fill="#000000" + id="rect485" /><rect + x="5" + y="13" + width="1" + height="1" + fill="#000000" + id="rect487" /><rect + x="7" + y="13" + width="1" + height="1" + fill="#000000" + id="rect489" /><rect + x="9" + y="13" + width="1" + height="1" + fill="#000000" + id="rect491" /><rect + x="16" + y="13" + width="1" + height="1" + fill="#000000" + id="rect493" /><rect + x="18" + y="13" + width="1" + height="1" + fill="#000000" + id="rect495" /><rect + x="19" + y="13" + width="1" + height="1" + fill="#000000" + id="rect497" /><rect + x="20" + y="13" + width="1" + height="1" + fill="#000000" + id="rect499" /><rect + x="21" + y="13" + width="1" + height="1" + fill="#000000" + id="rect501" /><rect + x="23" + y="13" + width="1" + height="1" + fill="#000000" + id="rect503" /><rect + x="26" + y="13" + width="1" + height="1" + fill="#000000" + id="rect505" /><rect + x="31" + y="13" + width="1" + height="1" + fill="#000000" + id="rect507" /><rect + x="32" + y="13" + width="1" + height="1" + fill="#000000" + id="rect509" /><rect + x="1" + y="14" + width="1" + height="1" + fill="#000000" + id="rect511" /><rect + x="4" + y="14" + width="1" + height="1" + fill="#000000" + id="rect513" /><rect + x="6" + y="14" + width="1" + height="1" + fill="#000000" + id="rect515" /><rect + x="8" + y="14" + width="1" + height="1" + fill="#000000" + id="rect517" /><rect + x="9" + y="14" + width="1" + height="1" + fill="#000000" + id="rect519" /><rect + x="10" + y="14" + width="1" + height="1" + fill="#000000" + id="rect521" /><rect + x="11" + y="14" + width="1" + height="1" + fill="#000000" + id="rect523" /><rect + x="12" + y="14" + width="1" + height="1" + fill="#000000" + id="rect525" /><rect + x="14" + y="14" + width="1" + height="1" + fill="#000000" + id="rect527" /><rect + x="15" + y="14" + width="1" + height="1" + fill="#000000" + id="rect529" /><rect + x="16" + y="14" + width="1" + height="1" + fill="#000000" + id="rect531" /><rect + x="17" + y="14" + width="1" + height="1" + fill="#000000" + id="rect533" /><rect + x="18" + y="14" + width="1" + height="1" + fill="#000000" + id="rect535" /><rect + x="20" + y="14" + width="1" + height="1" + fill="#000000" + id="rect537" /><rect + x="21" + y="14" + width="1" + height="1" + fill="#000000" + id="rect539" /><rect + x="25" + y="14" + width="1" + height="1" + fill="#000000" + id="rect541" /><rect + x="28" + y="14" + width="1" + height="1" + fill="#000000" + id="rect543" /><rect + x="31" + y="14" + width="1" + height="1" + fill="#000000" + id="rect545" /><rect + x="1" + y="15" + width="1" + height="1" + fill="#000000" + id="rect547" /><rect + x="2" + y="15" + width="1" + height="1" + fill="#000000" + id="rect549" /><rect + x="3" + y="15" + width="1" + height="1" + fill="#000000" + id="rect551" /><rect + x="4" + y="15" + width="1" + height="1" + fill="#000000" + id="rect553" /><rect + x="8" + y="15" + width="1" + height="1" + fill="#000000" + id="rect555" /><rect + x="11" + y="15" + width="1" + height="1" + fill="#000000" + id="rect557" /><rect + x="14" + y="15" + width="1" + height="1" + fill="#000000" + id="rect559" /><rect + x="15" + y="15" + width="1" + height="1" + fill="#000000" + id="rect561" /><rect + x="16" + y="15" + width="1" + height="1" + fill="#000000" + id="rect563" /><rect + x="21" + y="15" + width="1" + height="1" + fill="#000000" + id="rect565" /><rect + x="22" + y="15" + width="1" + height="1" + fill="#000000" + id="rect567" /><rect + x="23" + y="15" + width="1" + height="1" + fill="#000000" + id="rect569" /><rect + x="25" + y="15" + width="1" + height="1" + fill="#000000" + id="rect571" /><rect + x="26" + y="15" + width="1" + height="1" + fill="#000000" + id="rect573" /><rect + x="30" + y="15" + width="1" + height="1" + fill="#000000" + id="rect575" /><rect + x="0" + y="16" + width="1" + height="1" + fill="#000000" + id="rect577" /><rect + x="2" + y="16" + width="1" + height="1" + fill="#000000" + id="rect579" /><rect + x="3" + y="16" + width="1" + height="1" + fill="#000000" + id="rect581" /><rect + x="6" + y="16" + width="1" + height="1" + fill="#000000" + id="rect583" /><rect + x="7" + y="16" + width="1" + height="1" + fill="#000000" + id="rect585" /><rect + x="8" + y="16" + width="1" + height="1" + fill="#000000" + id="rect587" /><rect + x="9" + y="16" + width="1" + height="1" + fill="#000000" + id="rect589" /><rect + x="10" + y="16" + width="1" + height="1" + fill="#000000" + id="rect591" /><rect + x="11" + y="16" + width="1" + height="1" + fill="#000000" + id="rect593" /><rect + x="12" + y="16" + width="1" + height="1" + fill="#000000" + id="rect595" /><rect + x="13" + y="16" + width="1" + height="1" + fill="#000000" + id="rect597" /><rect + x="14" + y="16" + width="1" + height="1" + fill="#000000" + id="rect599" /><rect + x="15" + y="16" + width="1" + height="1" + fill="#000000" + id="rect601" /><rect + x="17" + y="16" + width="1" + height="1" + fill="#000000" + id="rect603" /><rect + x="19" + y="16" + width="1" + height="1" + fill="#000000" + id="rect605" /><rect + x="22" + y="16" + width="1" + height="1" + fill="#000000" + id="rect607" /><rect + x="23" + y="16" + width="1" + height="1" + fill="#000000" + id="rect609" /><rect + x="24" + y="16" + width="1" + height="1" + fill="#000000" + id="rect611" /><rect + x="25" + y="16" + width="1" + height="1" + fill="#000000" + id="rect613" /><rect + x="27" + y="16" + width="1" + height="1" + fill="#000000" + id="rect615" /><rect + x="28" + y="16" + width="1" + height="1" + fill="#000000" + id="rect617" /><rect + x="31" + y="16" + width="1" + height="1" + fill="#000000" + id="rect619" /><rect + x="0" + y="17" + width="1" + height="1" + fill="#000000" + id="rect621" /><rect + x="1" + y="17" + width="1" + height="1" + fill="#000000" + id="rect623" /><rect + x="2" + y="17" + width="1" + height="1" + fill="#000000" + id="rect625" /><rect + x="3" + y="17" + width="1" + height="1" + fill="#000000" + id="rect627" /><rect + x="4" + y="17" + width="1" + height="1" + fill="#000000" + id="rect629" /><rect + x="5" + y="17" + width="1" + height="1" + fill="#000000" + id="rect631" /><rect + x="8" + y="17" + width="1" + height="1" + fill="#000000" + id="rect633" /><rect + x="10" + y="17" + width="1" + height="1" + fill="#000000" + id="rect635" /><rect + x="12" + y="17" + width="1" + height="1" + fill="#000000" + id="rect637" /><rect + x="13" + y="17" + width="1" + height="1" + fill="#000000" + id="rect639" /><rect + x="16" + y="17" + width="1" + height="1" + fill="#000000" + id="rect641" /><rect + x="17" + y="17" + width="1" + height="1" + fill="#000000" + id="rect643" /><rect + x="18" + y="17" + width="1" + height="1" + fill="#000000" + id="rect645" /><rect + x="19" + y="17" + width="1" + height="1" + fill="#000000" + id="rect647" /><rect + x="20" + y="17" + width="1" + height="1" + fill="#000000" + id="rect649" /><rect + x="21" + y="17" + width="1" + height="1" + fill="#000000" + id="rect651" /><rect + x="22" + y="17" + width="1" + height="1" + fill="#000000" + id="rect653" /><rect + x="23" + y="17" + width="1" + height="1" + fill="#000000" + id="rect655" /><rect + x="24" + y="17" + width="1" + height="1" + fill="#000000" + id="rect657" /><rect + x="26" + y="17" + width="1" + height="1" + fill="#000000" + id="rect659" /><rect + x="29" + y="17" + width="1" + height="1" + fill="#000000" + id="rect661" /><rect + x="31" + y="17" + width="1" + height="1" + fill="#000000" + id="rect663" /><rect + x="32" + y="17" + width="1" + height="1" + fill="#000000" + id="rect665" /><rect + x="0" + y="18" + width="1" + height="1" + fill="#000000" + id="rect667" /><rect + x="2" + y="18" + width="1" + height="1" + fill="#000000" + id="rect669" /><rect + x="4" + y="18" + width="1" + height="1" + fill="#000000" + id="rect671" /><rect + x="5" + y="18" + width="1" + height="1" + fill="#000000" + id="rect673" /><rect + x="6" + y="18" + width="1" + height="1" + fill="#000000" + id="rect675" /><rect + x="7" + y="18" + width="1" + height="1" + fill="#000000" + id="rect677" /><rect + x="8" + y="18" + width="1" + height="1" + fill="#000000" + id="rect679" /><rect + x="9" + y="18" + width="1" + height="1" + fill="#000000" + id="rect681" /><rect + x="10" + y="18" + width="1" + height="1" + fill="#000000" + id="rect683" /><rect + x="13" + y="18" + width="1" + height="1" + fill="#000000" + id="rect685" /><rect + x="14" + y="18" + width="1" + height="1" + fill="#000000" + id="rect687" /><rect + x="15" + y="18" + width="1" + height="1" + fill="#000000" + id="rect689" /><rect + x="17" + y="18" + width="1" + height="1" + fill="#000000" + id="rect691" /><rect + x="20" + y="18" + width="1" + height="1" + fill="#000000" + id="rect693" /><rect + x="21" + y="18" + width="1" + height="1" + fill="#000000" + id="rect695" /><rect + x="25" + y="18" + width="1" + height="1" + fill="#000000" + id="rect697" /><rect + x="26" + y="18" + width="1" + height="1" + fill="#000000" + id="rect699" /><rect + x="27" + y="18" + width="1" + height="1" + fill="#000000" + id="rect701" /><rect + x="28" + y="18" + width="1" + height="1" + fill="#000000" + id="rect703" /><rect + x="29" + y="18" + width="1" + height="1" + fill="#000000" + id="rect705" /><rect + x="31" + y="18" + width="1" + height="1" + fill="#000000" + id="rect707" /><rect + x="0" + y="19" + width="1" + height="1" + fill="#000000" + id="rect709" /><rect + x="1" + y="19" + width="1" + height="1" + fill="#000000" + id="rect711" /><rect + x="2" + y="19" + width="1" + height="1" + fill="#000000" + id="rect713" /><rect + x="3" + y="19" + width="1" + height="1" + fill="#000000" + id="rect715" /><rect + x="4" + y="19" + width="1" + height="1" + fill="#000000" + id="rect717" /><rect + x="5" + y="19" + width="1" + height="1" + fill="#000000" + id="rect719" /><rect + x="8" + y="19" + width="1" + height="1" + fill="#000000" + id="rect721" /><rect + x="11" + y="19" + width="1" + height="1" + fill="#000000" + id="rect723" /><rect + x="12" + y="19" + width="1" + height="1" + fill="#000000" + id="rect725" /><rect + x="15" + y="19" + width="1" + height="1" + fill="#000000" + id="rect727" /><rect + x="16" + y="19" + width="1" + height="1" + fill="#000000" + id="rect729" /><rect + x="21" + y="19" + width="1" + height="1" + fill="#000000" + id="rect731" /><rect + x="28" + y="19" + width="1" + height="1" + fill="#000000" + id="rect733" /><rect + x="30" + y="19" + width="1" + height="1" + fill="#000000" + id="rect735" /><rect + x="1" + y="20" + width="1" + height="1" + fill="#000000" + id="rect737" /><rect + x="2" + y="20" + width="1" + height="1" + fill="#000000" + id="rect739" /><rect + x="6" + y="20" + width="1" + height="1" + fill="#000000" + id="rect741" /><rect + x="8" + y="20" + width="1" + height="1" + fill="#000000" + id="rect743" /><rect + x="10" + y="20" + width="1" + height="1" + fill="#000000" + id="rect745" /><rect + x="13" + y="20" + width="1" + height="1" + fill="#000000" + id="rect747" /><rect + x="14" + y="20" + width="1" + height="1" + fill="#000000" + id="rect749" /><rect + x="15" + y="20" + width="1" + height="1" + fill="#000000" + id="rect751" /><rect + x="17" + y="20" + width="1" + height="1" + fill="#000000" + id="rect753" /><rect + x="22" + y="20" + width="1" + height="1" + fill="#000000" + id="rect755" /><rect + x="23" + y="20" + width="1" + height="1" + fill="#000000" + id="rect757" /><rect + x="24" + y="20" + width="1" + height="1" + fill="#000000" + id="rect759" /><rect + x="25" + y="20" + width="1" + height="1" + fill="#000000" + id="rect761" /><rect + x="27" + y="20" + width="1" + height="1" + fill="#000000" + id="rect763" /><rect + x="28" + y="20" + width="1" + height="1" + fill="#000000" + id="rect765" /><rect + x="31" + y="20" + width="1" + height="1" + fill="#000000" + id="rect767" /><rect + x="0" + y="21" + width="1" + height="1" + fill="#000000" + id="rect769" /><rect + x="4" + y="21" + width="1" + height="1" + fill="#000000" + id="rect771" /><rect + x="5" + y="21" + width="1" + height="1" + fill="#000000" + id="rect773" /><rect + x="10" + y="21" + width="1" + height="1" + fill="#000000" + id="rect775" /><rect + x="11" + y="21" + width="1" + height="1" + fill="#000000" + id="rect777" /><rect + x="14" + y="21" + width="1" + height="1" + fill="#000000" + id="rect779" /><rect + x="16" + y="21" + width="1" + height="1" + fill="#000000" + id="rect781" /><rect + x="17" + y="21" + width="1" + height="1" + fill="#000000" + id="rect783" /><rect + x="18" + y="21" + width="1" + height="1" + fill="#000000" + id="rect785" /><rect + x="19" + y="21" + width="1" + height="1" + fill="#000000" + id="rect787" /><rect + x="20" + y="21" + width="1" + height="1" + fill="#000000" + id="rect789" /><rect + x="21" + y="21" + width="1" + height="1" + fill="#000000" + id="rect791" /><rect + x="22" + y="21" + width="1" + height="1" + fill="#000000" + id="rect793" /><rect + x="23" + y="21" + width="1" + height="1" + fill="#000000" + id="rect795" /><rect + x="26" + y="21" + width="1" + height="1" + fill="#000000" + id="rect797" /><rect + x="27" + y="21" + width="1" + height="1" + fill="#000000" + id="rect799" /><rect + x="29" + y="21" + width="1" + height="1" + fill="#000000" + id="rect801" /><rect + x="31" + y="21" + width="1" + height="1" + fill="#000000" + id="rect803" /><rect + x="32" + y="21" + width="1" + height="1" + fill="#000000" + id="rect805" /><rect + x="0" + y="22" + width="1" + height="1" + fill="#000000" + id="rect807" /><rect + x="3" + y="22" + width="1" + height="1" + fill="#000000" + id="rect809" /><rect + x="6" + y="22" + width="1" + height="1" + fill="#000000" + id="rect811" /><rect + x="7" + y="22" + width="1" + height="1" + fill="#000000" + id="rect813" /><rect + x="9" + y="22" + width="1" + height="1" + fill="#000000" + id="rect815" /><rect + x="14" + y="22" + width="1" + height="1" + fill="#000000" + id="rect817" /><rect + x="15" + y="22" + width="1" + height="1" + fill="#000000" + id="rect819" /><rect + x="16" + y="22" + width="1" + height="1" + fill="#000000" + id="rect821" /><rect + x="21" + y="22" + width="1" + height="1" + fill="#000000" + id="rect823" /><rect + x="25" + y="22" + width="1" + height="1" + fill="#000000" + id="rect825" /><rect + x="29" + y="22" + width="1" + height="1" + fill="#000000" + id="rect827" /><rect + x="31" + y="22" + width="1" + height="1" + fill="#000000" + id="rect829" /><rect + x="0" + y="23" + width="1" + height="1" + fill="#000000" + id="rect831" /><rect + x="3" + y="23" + width="1" + height="1" + fill="#000000" + id="rect833" /><rect + x="4" + y="23" + width="1" + height="1" + fill="#000000" + id="rect835" /><rect + x="9" + y="23" + width="1" + height="1" + fill="#000000" + id="rect837" /><rect + x="12" + y="23" + width="1" + height="1" + fill="#000000" + id="rect839" /><rect + x="15" + y="23" + width="1" + height="1" + fill="#000000" + id="rect841" /><rect + x="16" + y="23" + width="1" + height="1" + fill="#000000" + id="rect843" /><rect + x="20" + y="23" + width="1" + height="1" + fill="#000000" + id="rect845" /><rect + x="21" + y="23" + width="1" + height="1" + fill="#000000" + id="rect847" /><rect + x="23" + y="23" + width="1" + height="1" + fill="#000000" + id="rect849" /><rect + x="25" + y="23" + width="1" + height="1" + fill="#000000" + id="rect851" /><rect + x="27" + y="23" + width="1" + height="1" + fill="#000000" + id="rect853" /><rect + x="28" + y="23" + width="1" + height="1" + fill="#000000" + id="rect855" /><rect + x="29" + y="23" + width="1" + height="1" + fill="#000000" + id="rect857" /><rect + x="30" + y="23" + width="1" + height="1" + fill="#000000" + id="rect859" /><rect + x="0" + y="24" + width="1" + height="1" + fill="#000000" + id="rect861" /><rect + x="2" + y="24" + width="1" + height="1" + fill="#000000" + id="rect863" /><rect + x="3" + y="24" + width="1" + height="1" + fill="#000000" + id="rect865" /><rect + x="4" + y="24" + width="1" + height="1" + fill="#000000" + id="rect867" /><rect + x="6" + y="24" + width="1" + height="1" + fill="#000000" + id="rect869" /><rect + x="8" + y="24" + width="1" + height="1" + fill="#000000" + id="rect871" /><rect + x="11" + y="24" + width="1" + height="1" + fill="#000000" + id="rect873" /><rect + x="12" + y="24" + width="1" + height="1" + fill="#000000" + id="rect875" /><rect + x="13" + y="24" + width="1" + height="1" + fill="#000000" + id="rect877" /><rect + x="17" + y="24" + width="1" + height="1" + fill="#000000" + id="rect879" /><rect + x="18" + y="24" + width="1" + height="1" + fill="#000000" + id="rect881" /><rect + x="20" + y="24" + width="1" + height="1" + fill="#000000" + id="rect883" /><rect + x="22" + y="24" + width="1" + height="1" + fill="#000000" + id="rect885" /><rect + x="23" + y="24" + width="1" + height="1" + fill="#000000" + id="rect887" /><rect + x="24" + y="24" + width="1" + height="1" + fill="#000000" + id="rect889" /><rect + x="25" + y="24" + width="1" + height="1" + fill="#000000" + id="rect891" /><rect + x="26" + y="24" + width="1" + height="1" + fill="#000000" + id="rect893" /><rect + x="27" + y="24" + width="1" + height="1" + fill="#000000" + id="rect895" /><rect + x="28" + y="24" + width="1" + height="1" + fill="#000000" + id="rect897" /><rect + x="29" + y="24" + width="1" + height="1" + fill="#000000" + id="rect899" /><rect + x="32" + y="24" + width="1" + height="1" + fill="#000000" + id="rect901" /><rect + x="8" + y="25" + width="1" + height="1" + fill="#000000" + id="rect903" /><rect + x="11" + y="25" + width="1" + height="1" + fill="#000000" + id="rect905" /><rect + x="13" + y="25" + width="1" + height="1" + fill="#000000" + id="rect907" /><rect + x="16" + y="25" + width="1" + height="1" + fill="#000000" + id="rect909" /><rect + x="17" + y="25" + width="1" + height="1" + fill="#000000" + id="rect911" /><rect + x="18" + y="25" + width="1" + height="1" + fill="#000000" + id="rect913" /><rect + x="19" + y="25" + width="1" + height="1" + fill="#000000" + id="rect915" /><rect + x="20" + y="25" + width="1" + height="1" + fill="#000000" + id="rect917" /><rect + x="21" + y="25" + width="1" + height="1" + fill="#000000" + id="rect919" /><rect + x="22" + y="25" + width="1" + height="1" + fill="#000000" + id="rect921" /><rect + x="24" + y="25" + width="1" + height="1" + fill="#000000" + id="rect923" /><rect + x="28" + y="25" + width="1" + height="1" + fill="#000000" + id="rect925" /><rect + x="30" + y="25" + width="1" + height="1" + fill="#000000" + id="rect927" /><rect + x="32" + y="25" + width="1" + height="1" + fill="#000000" + id="rect929" /><rect + x="0" + y="26" + width="1" + height="1" + fill="#000000" + id="rect931" /><rect + x="1" + y="26" + width="1" + height="1" + fill="#000000" + id="rect933" /><rect + x="2" + y="26" + width="1" + height="1" + fill="#000000" + id="rect935" /><rect + x="3" + y="26" + width="1" + height="1" + fill="#000000" + id="rect937" /><rect + x="4" + y="26" + width="1" + height="1" + fill="#000000" + id="rect939" /><rect + x="5" + y="26" + width="1" + height="1" + fill="#000000" + id="rect941" /><rect + x="6" + y="26" + width="1" + height="1" + fill="#000000" + id="rect943" /><rect + x="8" + y="26" + width="1" + height="1" + fill="#000000" + id="rect945" /><rect + x="10" + y="26" + width="1" + height="1" + fill="#000000" + id="rect947" /><rect + x="13" + y="26" + width="1" + height="1" + fill="#000000" + id="rect949" /><rect + x="14" + y="26" + width="1" + height="1" + fill="#000000" + id="rect951" /><rect + x="15" + y="26" + width="1" + height="1" + fill="#000000" + id="rect953" /><rect + x="16" + y="26" + width="1" + height="1" + fill="#000000" + id="rect955" /><rect + x="17" + y="26" + width="1" + height="1" + fill="#000000" + id="rect957" /><rect + x="20" + y="26" + width="1" + height="1" + fill="#000000" + id="rect959" /><rect + x="23" + y="26" + width="1" + height="1" + fill="#000000" + id="rect961" /><rect + x="24" + y="26" + width="1" + height="1" + fill="#000000" + id="rect963" /><rect + x="26" + y="26" + width="1" + height="1" + fill="#000000" + id="rect965" /><rect + x="28" + y="26" + width="1" + height="1" + fill="#000000" + id="rect967" /><rect + x="30" + y="26" + width="1" + height="1" + fill="#000000" + id="rect969" /><rect + x="31" + y="26" + width="1" + height="1" + fill="#000000" + id="rect971" /><rect + x="0" + y="27" + width="1" + height="1" + fill="#000000" + id="rect973" /><rect + x="6" + y="27" + width="1" + height="1" + fill="#000000" + id="rect975" /><rect + x="9" + y="27" + width="1" + height="1" + fill="#000000" + id="rect977" /><rect + x="10" + y="27" + width="1" + height="1" + fill="#000000" + id="rect979" /><rect + x="11" + y="27" + width="1" + height="1" + fill="#000000" + id="rect981" /><rect + x="15" + y="27" + width="1" + height="1" + fill="#000000" + id="rect983" /><rect + x="16" + y="27" + width="1" + height="1" + fill="#000000" + id="rect985" /><rect + x="18" + y="27" + width="1" + height="1" + fill="#000000" + id="rect987" /><rect + x="20" + y="27" + width="1" + height="1" + fill="#000000" + id="rect989" /><rect + x="21" + y="27" + width="1" + height="1" + fill="#000000" + id="rect991" /><rect + x="22" + y="27" + width="1" + height="1" + fill="#000000" + id="rect993" /><rect + x="23" + y="27" + width="1" + height="1" + fill="#000000" + id="rect995" /><rect + x="24" + y="27" + width="1" + height="1" + fill="#000000" + id="rect997" /><rect + x="28" + y="27" + width="1" + height="1" + fill="#000000" + id="rect999" /><rect + x="29" + y="27" + width="1" + height="1" + fill="#000000" + id="rect1001" /><rect + x="30" + y="27" + width="1" + height="1" + fill="#000000" + id="rect1003" /><rect + x="31" + y="27" + width="1" + height="1" + fill="#000000" + id="rect1005" /><rect + x="32" + y="27" + width="1" + height="1" + fill="#000000" + id="rect1007" /><rect + x="0" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1009" /><rect + x="2" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1011" /><rect + x="3" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1013" /><rect + x="4" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1015" /><rect + x="6" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1017" /><rect + x="8" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1019" /><rect + x="9" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1021" /><rect + x="12" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1023" /><rect + x="13" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1025" /><rect + x="14" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1027" /><rect + x="15" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1029" /><rect + x="17" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1031" /><rect + x="24" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1033" /><rect + x="25" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1035" /><rect + x="26" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1037" /><rect + x="27" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1039" /><rect + x="28" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1041" /><rect + x="31" + y="28" + width="1" + height="1" + fill="#000000" + id="rect1043" /><rect + x="0" + y="29" + width="1" + height="1" + fill="#000000" + id="rect1045" /><rect + x="2" + y="29" + width="1" + height="1" + fill="#000000" + id="rect1047" /><rect + x="3" + y="29" + width="1" + height="1" + fill="#000000" + id="rect1049" /><rect + x="4" + y="29" + width="1" + height="1" + fill="#000000" + id="rect1051" /><rect + x="6" + y="29" + width="1" + height="1" + fill="#000000" + id="rect1053" /><rect + x="8" + y="29" + width="1" + height="1" + fill="#000000" + id="rect1055" /><rect + x="11" + y="29" + width="1" + height="1" + fill="#000000" + id="rect1057" /><rect + x="16" + y="29" + width="1" + height="1" + fill="#000000" + id="rect1059" /><rect + x="18" + y="29" + width="1" + height="1" + fill="#000000" + id="rect1061" /><rect + x="19" + y="29" + width="1" + height="1" + fill="#000000" + id="rect1063" /><rect + x="20" + y="29" + width="1" + height="1" + fill="#000000" + id="rect1065" /><rect + x="23" + y="29" + width="1" + height="1" + fill="#000000" + id="rect1067" /><rect + x="28" + y="29" + width="1" + height="1" + fill="#000000" + id="rect1069" /><rect + x="29" + y="29" + width="1" + height="1" + fill="#000000" + id="rect1071" /><rect + x="0" + y="30" + width="1" + height="1" + fill="#000000" + id="rect1073" /><rect + x="2" + y="30" + width="1" + height="1" + fill="#000000" + id="rect1075" /><rect + x="3" + y="30" + width="1" + height="1" + fill="#000000" + id="rect1077" /><rect + x="4" + y="30" + width="1" + height="1" + fill="#000000" + id="rect1079" /><rect + x="6" + y="30" + width="1" + height="1" + fill="#000000" + id="rect1081" /><rect + x="8" + y="30" + width="1" + height="1" + fill="#000000" + id="rect1083" /><rect + x="15" + y="30" + width="1" + height="1" + fill="#000000" + id="rect1085" /><rect + x="16" + y="30" + width="1" + height="1" + fill="#000000" + id="rect1087" /><rect + x="17" + y="30" + width="1" + height="1" + fill="#000000" + id="rect1089" /><rect + x="18" + y="30" + width="1" + height="1" + fill="#000000" + id="rect1091" /><rect + x="22" + y="30" + width="1" + height="1" + fill="#000000" + id="rect1093" /><rect + x="24" + y="30" + width="1" + height="1" + fill="#000000" + id="rect1095" /><rect + x="26" + y="30" + width="1" + height="1" + fill="#000000" + id="rect1097" /><rect + x="30" + y="30" + width="1" + height="1" + fill="#000000" + id="rect1099" /><rect + x="31" + y="30" + width="1" + height="1" + fill="#000000" + id="rect1101" /><rect + x="0" + y="31" + width="1" + height="1" + fill="#000000" + id="rect1103" /><rect + x="6" + y="31" + width="1" + height="1" + fill="#000000" + id="rect1105" /><rect + x="8" + y="31" + width="1" + height="1" + fill="#000000" + id="rect1107" /><rect + x="9" + y="31" + width="1" + height="1" + fill="#000000" + id="rect1109" /><rect + x="10" + y="31" + width="1" + height="1" + fill="#000000" + id="rect1111" /><rect + x="14" + y="31" + width="1" + height="1" + fill="#000000" + id="rect1113" /><rect + x="15" + y="31" + width="1" + height="1" + fill="#000000" + id="rect1115" /><rect + x="16" + y="31" + width="1" + height="1" + fill="#000000" + id="rect1117" /><rect + x="18" + y="31" + width="1" + height="1" + fill="#000000" + id="rect1119" /><rect + x="20" + y="31" + width="1" + height="1" + fill="#000000" + id="rect1121" /><rect + x="21" + y="31" + width="1" + height="1" + fill="#000000" + id="rect1123" /><rect + x="22" + y="31" + width="1" + height="1" + fill="#000000" + id="rect1125" /><rect + x="25" + y="31" + width="1" + height="1" + fill="#000000" + id="rect1127" /><rect + x="26" + y="31" + width="1" + height="1" + fill="#000000" + id="rect1129" /><rect + x="29" + y="31" + width="1" + height="1" + fill="#000000" + id="rect1131" /><rect + x="30" + y="31" + width="1" + height="1" + fill="#000000" + id="rect1133" /><rect + x="0" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1135" /><rect + x="1" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1137" /><rect + x="2" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1139" /><rect + x="3" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1141" /><rect + x="4" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1143" /><rect + x="5" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1145" /><rect + x="6" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1147" /><rect + x="8" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1149" /><rect + x="12" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1151" /><rect + x="13" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1153" /><rect + x="14" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1155" /><rect + x="15" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1157" /><rect + x="17" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1159" /><rect + x="22" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1161" /><rect + x="23" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1163" /><rect + x="24" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1165" /><rect + x="26" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1167" /><rect + x="27" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1169" /><rect + x="31" + y="32" + width="1" + height="1" + fill="#000000" + id="rect1171" /></g></g><image + width="7.9309731" + height="7.9309731" + preserveAspectRatio="none" + xlink:href="data:image/png;base64,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 + +" + id="image1293" + x="16.534513" + y="16.534513" /></svg> diff --git a/privacyidea/static/components/token/controllers/tokenControllers.js b/privacyidea/static/components/token/controllers/tokenControllers.js index ae2068175..b65befcaf 100644 --- a/privacyidea/static/components/token/controllers/tokenControllers.js +++ b/privacyidea/static/components/token/controllers/tokenControllers.js @@ -557,33 +557,6 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", } } - $scope.getQrCodeFromUrl = function(url, elementName) { - return new QRCode(document.getElementById(elementName), { - text: url, - width: $scope.qrCodeWidth, - height: $scope.qrCodeWidth - }); - } - - $scope.getQrIosTotpApp = function() { - const appUrl = "https://apps.apple.com/app/raivo-otp/id1459042137?platform=iphone"; - const elementName = "iosAppQrCode"; - - const qrCode = $scope.getQrCodeFromUrl(appUrl, elementName); - } - - $scope.getQrAndroidTotpApp = function() { - const appUrl = "https://play.google.com/store/apps/details?id=com.beemdevelopment.aegis"; - const elementName = "androidAppQrCode"; - - const qrCode = $scope.getQrCodeFromUrl(appUrl, elementName); - } - - $scope.generateTotpAppsQrCodes = function () { - $scope.getQrIosTotpApp(); - $scope.getQrAndroidTotpApp(); - }; - $scope.isAllowedInitially = function (tokentype) { return $scope.initiallyAllowedTokenTypes.includes(tokentype); }; @@ -592,7 +565,6 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", $scope.isVisibleTOTPAppCode = !$scope.isVisibleTOTPAppCode; }; - $scope.toggleAwaitingTOTPAppDisclaimer = function () { $scope.awaitingTOTPAppDisclaimerConfirm = !$scope.awaitingTOTPAppDisclaimerConfirm; }; diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index 6c7d784f7..04341d400 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -146,7 +146,7 @@ ng-init="form.rollover = $state.includes('token.rollover')" ng-model="form.rollover"/> <div class="text-center"> - <button type="button" ng-click="enrollToken(); generateTotpAppsQrCodes()" + <button type="button" ng-click="enrollToken();" ng-disabled="!checkEnroll() || formEnrollToken.$invalid || enrolling" class="btn btn-primary margin-bottom"> <span ng-if="$state.includes('token.rollover') == false">{{ browserLanguage == 'cs' ? 'PokraÄŤovat' : 'Continue' @@ -196,9 +196,11 @@ <div class="qr-codes totp-verify-mobile"> <div id="androidAppQrCode" class="max-available-width margin-bottom-large"> <h5 class="margin-bottom"><b>Aegis Authenticator (Android)</b></h5> + <img src="static/aegis.svg" ng-style="{'width': qrCodeWidth + 'px', 'height': qrCodeWidth + 'px'}"> </div> <div id="iosAppQrCode" class="max-available-width margin-bottom-large"> <h5 class="margin-bottom"><b>Raivo OTP (iOS)</b></h5> + <img src="static/raivo.svg" ng-style="{'width': qrCodeWidth + 'px', 'height': qrCodeWidth + 'px'}"> </div> </div> diff --git a/privacyidea/static/raivo.svg b/privacyidea/static/raivo.svg new file mode 100644 index 000000000..910a816b1 --- /dev/null +++ b/privacyidea/static/raivo.svg @@ -0,0 +1,2942 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with qrencode 4.1.1 (https://fukuchi.org/works/qrencode/index.html) --> + +<svg + width="3.92cm" + height="3.92cm" + viewBox="0 0 37 37" + preserveAspectRatio="none" + version="1.1" + id="svg891" + sodipodi:docname="raivo.svg" + xml:space="preserve" + inkscape:version="1.2.2 (732a01da63, 2022-12-09, custom)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"><defs + id="defs895" /><sodipodi:namedview + id="namedview893" + pagecolor="#ffffff" + bordercolor="#000000" + borderopacity="0.25" + inkscape:showpageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" + inkscape:document-units="cm" + showgrid="false" + inkscape:zoom="1.9793128" + inkscape:cx="68.205491" + inkscape:cy="93.214171" + inkscape:window-width="2486" + inkscape:window-height="1376" + inkscape:window-x="74" + inkscape:window-y="27" + inkscape:window-maximized="1" + inkscape:current-layer="svg891" /><g + id="QRcode"><rect + x="0" + y="0" + width="37" + height="37" + fill="#ffffff" + id="rect25" /><g + id="Pattern" + transform="translate(4,4)"><rect + x="0" + y="0" + width="1" + height="1" + fill="#000000" + id="rect27" /><rect + x="1" + y="0" + width="1" + height="1" + fill="#000000" + id="rect29" /><rect + x="2" + y="0" + width="1" + height="1" + fill="#000000" + id="rect31" /><rect + x="3" + y="0" + width="1" + height="1" + fill="#000000" + id="rect33" /><rect + x="4" + y="0" + width="1" + height="1" + fill="#000000" + id="rect35" /><rect + x="5" + y="0" + width="1" + height="1" + fill="#000000" + id="rect37" /><rect + x="6" + y="0" + width="1" + height="1" + fill="#000000" + id="rect39" /><rect + x="10" + y="0" + width="1" + height="1" + fill="#000000" + id="rect41" /><rect + x="12" + y="0" + width="1" + height="1" + fill="#000000" + id="rect43" /><rect + x="13" + y="0" + width="1" + height="1" + fill="#000000" + id="rect45" /><rect + x="16" + y="0" + width="1" + height="1" + fill="#000000" + id="rect47" /><rect + x="17" + y="0" + width="1" + height="1" + fill="#000000" + id="rect49" /><rect + x="18" + y="0" + width="1" + height="1" + fill="#000000" + id="rect51" /><rect + x="19" + y="0" + width="1" + height="1" + fill="#000000" + id="rect53" /><rect + x="22" + y="0" + width="1" + height="1" + fill="#000000" + id="rect55" /><rect + x="23" + y="0" + width="1" + height="1" + fill="#000000" + id="rect57" /><rect + x="24" + y="0" + width="1" + height="1" + fill="#000000" + id="rect59" /><rect + x="25" + y="0" + width="1" + height="1" + fill="#000000" + id="rect61" /><rect + x="26" + y="0" + width="1" + height="1" + fill="#000000" + id="rect63" /><rect + x="27" + y="0" + width="1" + height="1" + fill="#000000" + id="rect65" /><rect + x="28" + y="0" + width="1" + height="1" + fill="#000000" + id="rect67" /><rect + x="0" + y="1" + width="1" + height="1" + fill="#000000" + id="rect69" /><rect + x="6" + y="1" + width="1" + height="1" + fill="#000000" + id="rect71" /><rect + x="8" + y="1" + width="1" + height="1" + fill="#000000" + id="rect73" /><rect + x="10" + y="1" + width="1" + height="1" + fill="#000000" + id="rect75" /><rect + x="13" + y="1" + width="1" + height="1" + fill="#000000" + id="rect77" /><rect + x="14" + y="1" + width="1" + height="1" + fill="#000000" + id="rect79" /><rect + x="15" + y="1" + width="1" + height="1" + fill="#000000" + id="rect81" /><rect + x="16" + y="1" + width="1" + height="1" + fill="#000000" + id="rect83" /><rect + x="17" + y="1" + width="1" + height="1" + fill="#000000" + id="rect85" /><rect + x="20" + y="1" + width="1" + height="1" + fill="#000000" + id="rect87" /><rect + x="22" + y="1" + width="1" + height="1" + fill="#000000" + id="rect89" /><rect + x="28" + y="1" + width="1" + height="1" + fill="#000000" + id="rect91" /><rect + x="0" + y="2" + width="1" + height="1" + fill="#000000" + id="rect93" /><rect + x="2" + y="2" + width="1" + height="1" + fill="#000000" + id="rect95" /><rect + x="3" + y="2" + width="1" + height="1" + fill="#000000" + id="rect97" /><rect + x="4" + y="2" + width="1" + height="1" + fill="#000000" + id="rect99" /><rect + x="6" + y="2" + width="1" + height="1" + fill="#000000" + id="rect101" /><rect + x="12" + y="2" + width="1" + height="1" + fill="#000000" + id="rect103" /><rect + x="14" + y="2" + width="1" + height="1" + fill="#000000" + id="rect105" /><rect + x="15" + y="2" + width="1" + height="1" + fill="#000000" + id="rect107" /><rect + x="16" + y="2" + width="1" + height="1" + fill="#000000" + id="rect109" /><rect + x="20" + y="2" + width="1" + height="1" + fill="#000000" + id="rect111" /><rect + x="22" + y="2" + width="1" + height="1" + fill="#000000" + id="rect113" /><rect + x="24" + y="2" + width="1" + height="1" + fill="#000000" + id="rect115" /><rect + x="25" + y="2" + width="1" + height="1" + fill="#000000" + id="rect117" /><rect + x="26" + y="2" + width="1" + height="1" + fill="#000000" + id="rect119" /><rect + x="28" + y="2" + width="1" + height="1" + fill="#000000" + id="rect121" /><rect + x="0" + y="3" + width="1" + height="1" + fill="#000000" + id="rect123" /><rect + x="2" + y="3" + width="1" + height="1" + fill="#000000" + id="rect125" /><rect + x="3" + y="3" + width="1" + height="1" + fill="#000000" + id="rect127" /><rect + x="4" + y="3" + width="1" + height="1" + fill="#000000" + id="rect129" /><rect + x="6" + y="3" + width="1" + height="1" + fill="#000000" + id="rect131" /><rect + x="8" + y="3" + width="1" + height="1" + fill="#000000" + id="rect133" /><rect + x="9" + y="3" + width="1" + height="1" + fill="#000000" + id="rect135" /><rect + x="10" + y="3" + width="1" + height="1" + fill="#000000" + id="rect137" /><rect + x="12" + y="3" + width="1" + height="1" + fill="#000000" + id="rect139" /><rect + x="13" + y="3" + width="1" + height="1" + fill="#000000" + id="rect141" /><rect + x="14" + y="3" + width="1" + height="1" + fill="#000000" + id="rect143" /><rect + x="17" + y="3" + width="1" + height="1" + fill="#000000" + id="rect145" /><rect + x="19" + y="3" + width="1" + height="1" + fill="#000000" + id="rect147" /><rect + x="22" + y="3" + width="1" + height="1" + fill="#000000" + id="rect149" /><rect + x="24" + y="3" + width="1" + height="1" + fill="#000000" + id="rect151" /><rect + x="25" + y="3" + width="1" + height="1" + fill="#000000" + id="rect153" /><rect + x="26" + y="3" + width="1" + height="1" + fill="#000000" + id="rect155" /><rect + x="28" + y="3" + width="1" + height="1" + fill="#000000" + id="rect157" /><rect + x="0" + y="4" + width="1" + height="1" + fill="#000000" + id="rect159" /><rect + x="2" + y="4" + width="1" + height="1" + fill="#000000" + id="rect161" /><rect + x="3" + y="4" + width="1" + height="1" + fill="#000000" + id="rect163" /><rect + x="4" + y="4" + width="1" + height="1" + fill="#000000" + id="rect165" /><rect + x="6" + y="4" + width="1" + height="1" + fill="#000000" + id="rect167" /><rect + x="9" + y="4" + width="1" + height="1" + fill="#000000" + id="rect169" /><rect + x="14" + y="4" + width="1" + height="1" + fill="#000000" + id="rect171" /><rect + x="19" + y="4" + width="1" + height="1" + fill="#000000" + id="rect173" /><rect + x="20" + y="4" + width="1" + height="1" + fill="#000000" + id="rect175" /><rect + x="22" + y="4" + width="1" + height="1" + fill="#000000" + id="rect177" /><rect + x="24" + y="4" + width="1" + height="1" + fill="#000000" + id="rect179" /><rect + x="25" + y="4" + width="1" + height="1" + fill="#000000" + id="rect181" /><rect + x="26" + y="4" + width="1" + height="1" + fill="#000000" + id="rect183" /><rect + x="28" + y="4" + width="1" + height="1" + fill="#000000" + id="rect185" /><rect + x="0" + y="5" + width="1" + height="1" + fill="#000000" + id="rect187" /><rect + x="6" + y="5" + width="1" + height="1" + fill="#000000" + id="rect189" /><rect + x="8" + y="5" + width="1" + height="1" + fill="#000000" + id="rect191" /><rect + x="9" + y="5" + width="1" + height="1" + fill="#000000" + id="rect193" /><rect + x="11" + y="5" + width="1" + height="1" + fill="#000000" + id="rect195" /><rect + x="12" + y="5" + width="1" + height="1" + fill="#000000" + id="rect197" /><rect + x="14" + y="5" + width="1" + height="1" + fill="#000000" + id="rect199" /><rect + x="15" + y="5" + width="1" + height="1" + fill="#000000" + id="rect201" /><rect + x="16" + y="5" + width="1" + height="1" + fill="#000000" + id="rect203" /><rect + x="20" + y="5" + width="1" + height="1" + fill="#000000" + id="rect205" /><rect + x="22" + y="5" + width="1" + height="1" + fill="#000000" + id="rect207" /><rect + x="28" + y="5" + width="1" + height="1" + fill="#000000" + id="rect209" /><rect + x="0" + y="6" + width="1" + height="1" + fill="#000000" + id="rect211" /><rect + x="1" + y="6" + width="1" + height="1" + fill="#000000" + id="rect213" /><rect + x="2" + y="6" + width="1" + height="1" + fill="#000000" + id="rect215" /><rect + x="3" + y="6" + width="1" + height="1" + fill="#000000" + id="rect217" /><rect + x="4" + y="6" + width="1" + height="1" + fill="#000000" + id="rect219" /><rect + x="5" + y="6" + width="1" + height="1" + fill="#000000" + id="rect221" /><rect + x="6" + y="6" + width="1" + height="1" + fill="#000000" + id="rect223" /><rect + x="8" + y="6" + width="1" + height="1" + fill="#000000" + id="rect225" /><rect + x="10" + y="6" + width="1" + height="1" + fill="#000000" + id="rect227" /><rect + x="12" + y="6" + width="1" + height="1" + fill="#000000" + id="rect229" /><rect + x="14" + y="6" + width="1" + height="1" + fill="#000000" + id="rect231" /><rect + x="16" + y="6" + width="1" + height="1" + fill="#000000" + id="rect233" /><rect + x="18" + y="6" + width="1" + height="1" + fill="#000000" + id="rect235" /><rect + x="20" + y="6" + width="1" + height="1" + fill="#000000" + id="rect237" /><rect + x="22" + y="6" + width="1" + height="1" + fill="#000000" + id="rect239" /><rect + x="23" + y="6" + width="1" + height="1" + fill="#000000" + id="rect241" /><rect + x="24" + y="6" + width="1" + height="1" + fill="#000000" + id="rect243" /><rect + x="25" + y="6" + width="1" + height="1" + fill="#000000" + id="rect245" /><rect + x="26" + y="6" + width="1" + height="1" + fill="#000000" + id="rect247" /><rect + x="27" + y="6" + width="1" + height="1" + fill="#000000" + id="rect249" /><rect + x="28" + y="6" + width="1" + height="1" + fill="#000000" + id="rect251" /><rect + x="9" + y="7" + width="1" + height="1" + fill="#000000" + id="rect253" /><rect + x="10" + y="7" + width="1" + height="1" + fill="#000000" + id="rect255" /><rect + x="11" + y="7" + width="1" + height="1" + fill="#000000" + id="rect257" /><rect + x="16" + y="7" + width="1" + height="1" + fill="#000000" + id="rect259" /><rect + x="19" + y="7" + width="1" + height="1" + fill="#000000" + id="rect261" /><rect + x="20" + y="7" + width="1" + height="1" + fill="#000000" + id="rect263" /><rect + x="0" + y="8" + width="1" + height="1" + fill="#000000" + id="rect265" /><rect + x="1" + y="8" + width="1" + height="1" + fill="#000000" + id="rect267" /><rect + x="2" + y="8" + width="1" + height="1" + fill="#000000" + id="rect269" /><rect + x="3" + y="8" + width="1" + height="1" + fill="#000000" + id="rect271" /><rect + x="4" + y="8" + width="1" + height="1" + fill="#000000" + id="rect273" /><rect + x="6" + y="8" + width="1" + height="1" + fill="#000000" + id="rect275" /><rect + x="7" + y="8" + width="1" + height="1" + fill="#000000" + id="rect277" /><rect + x="8" + y="8" + width="1" + height="1" + fill="#000000" + id="rect279" /><rect + x="9" + y="8" + width="1" + height="1" + fill="#000000" + id="rect281" /><rect + x="11" + y="8" + width="1" + height="1" + fill="#000000" + id="rect283" /><rect + x="12" + y="8" + width="1" + height="1" + fill="#000000" + id="rect285" /><rect + x="13" + y="8" + width="1" + height="1" + fill="#000000" + id="rect287" /><rect + x="14" + y="8" + width="1" + height="1" + fill="#000000" + id="rect289" /><rect + x="17" + y="8" + width="1" + height="1" + fill="#000000" + id="rect291" /><rect + x="19" + y="8" + width="1" + height="1" + fill="#000000" + id="rect293" /><rect + x="21" + y="8" + width="1" + height="1" + fill="#000000" + id="rect295" /><rect + x="23" + y="8" + width="1" + height="1" + fill="#000000" + id="rect297" /><rect + x="25" + y="8" + width="1" + height="1" + fill="#000000" + id="rect299" /><rect + x="27" + y="8" + width="1" + height="1" + fill="#000000" + id="rect301" /><rect + x="0" + y="9" + width="1" + height="1" + fill="#000000" + id="rect303" /><rect + x="1" + y="9" + width="1" + height="1" + fill="#000000" + id="rect305" /><rect + x="5" + y="9" + width="1" + height="1" + fill="#000000" + id="rect307" /><rect + x="7" + y="9" + width="1" + height="1" + fill="#000000" + id="rect309" /><rect + x="8" + y="9" + width="1" + height="1" + fill="#000000" + id="rect311" /><rect + x="10" + y="9" + width="1" + height="1" + fill="#000000" + id="rect313" /><rect + x="12" + y="9" + width="1" + height="1" + fill="#000000" + id="rect315" /><rect + x="14" + y="9" + width="1" + height="1" + fill="#000000" + id="rect317" /><rect + x="16" + y="9" + width="1" + height="1" + fill="#000000" + id="rect319" /><rect + x="19" + y="9" + width="1" + height="1" + fill="#000000" + id="rect321" /><rect + x="20" + y="9" + width="1" + height="1" + fill="#000000" + id="rect323" /><rect + x="21" + y="9" + width="1" + height="1" + fill="#000000" + id="rect325" /><rect + x="22" + y="9" + width="1" + height="1" + fill="#000000" + id="rect327" /><rect + x="24" + y="9" + width="1" + height="1" + fill="#000000" + id="rect329" /><rect + x="28" + y="9" + width="1" + height="1" + fill="#000000" + id="rect331" /><rect + x="1" + y="10" + width="1" + height="1" + fill="#000000" + id="rect333" /><rect + x="3" + y="10" + width="1" + height="1" + fill="#000000" + id="rect335" /><rect + x="5" + y="10" + width="1" + height="1" + fill="#000000" + id="rect337" /><rect + x="6" + y="10" + width="1" + height="1" + fill="#000000" + id="rect339" /><rect + x="7" + y="10" + width="1" + height="1" + fill="#000000" + id="rect341" /><rect + x="8" + y="10" + width="1" + height="1" + fill="#000000" + id="rect343" /><rect + x="10" + y="10" + width="1" + height="1" + fill="#000000" + id="rect345" /><rect + x="15" + y="10" + width="1" + height="1" + fill="#000000" + id="rect347" /><rect + x="17" + y="10" + width="1" + height="1" + fill="#000000" + id="rect349" /><rect + x="18" + y="10" + width="1" + height="1" + fill="#000000" + id="rect351" /><rect + x="20" + y="10" + width="1" + height="1" + fill="#000000" + id="rect353" /><rect + x="22" + y="10" + width="1" + height="1" + fill="#000000" + id="rect355" /><rect + x="23" + y="10" + width="1" + height="1" + fill="#000000" + id="rect357" /><rect + x="2" + y="11" + width="1" + height="1" + fill="#000000" + id="rect359" /><rect + x="3" + y="11" + width="1" + height="1" + fill="#000000" + id="rect361" /><rect + x="4" + y="11" + width="1" + height="1" + fill="#000000" + id="rect363" /><rect + x="5" + y="11" + width="1" + height="1" + fill="#000000" + id="rect365" /><rect + x="7" + y="11" + width="1" + height="1" + fill="#000000" + id="rect367" /><rect + x="8" + y="11" + width="1" + height="1" + fill="#000000" + id="rect369" /><rect + x="11" + y="11" + width="1" + height="1" + fill="#000000" + id="rect371" /><rect + x="16" + y="11" + width="1" + height="1" + fill="#000000" + id="rect373" /><rect + x="19" + y="11" + width="1" + height="1" + fill="#000000" + id="rect375" /><rect + x="21" + y="11" + width="1" + height="1" + fill="#000000" + id="rect377" /><rect + x="22" + y="11" + width="1" + height="1" + fill="#000000" + id="rect379" /><rect + x="24" + y="11" + width="1" + height="1" + fill="#000000" + id="rect381" /><rect + x="25" + y="11" + width="1" + height="1" + fill="#000000" + id="rect383" /><rect + x="27" + y="11" + width="1" + height="1" + fill="#000000" + id="rect385" /><rect + x="2" + y="12" + width="1" + height="1" + fill="#000000" + id="rect387" /><rect + x="3" + y="12" + width="1" + height="1" + fill="#000000" + id="rect389" /><rect + x="5" + y="12" + width="1" + height="1" + fill="#000000" + id="rect391" /><rect + x="6" + y="12" + width="1" + height="1" + fill="#000000" + id="rect393" /><rect + x="7" + y="12" + width="1" + height="1" + fill="#000000" + id="rect395" /><rect + x="8" + y="12" + width="1" + height="1" + fill="#000000" + id="rect397" /><rect + x="9" + y="12" + width="1" + height="1" + fill="#000000" + id="rect399" /><rect + x="10" + y="12" + width="1" + height="1" + fill="#000000" + id="rect401" /><rect + x="13" + y="12" + width="1" + height="1" + fill="#000000" + id="rect403" /><rect + x="15" + y="12" + width="1" + height="1" + fill="#000000" + id="rect405" /><rect + x="16" + y="12" + width="1" + height="1" + fill="#000000" + id="rect407" /><rect + x="17" + y="12" + width="1" + height="1" + fill="#000000" + id="rect409" /><rect + x="18" + y="12" + width="1" + height="1" + fill="#000000" + id="rect411" /><rect + x="23" + y="12" + width="1" + height="1" + fill="#000000" + id="rect413" /><rect + x="25" + y="12" + width="1" + height="1" + fill="#000000" + id="rect415" /><rect + x="26" + y="12" + width="1" + height="1" + fill="#000000" + id="rect417" /><rect + x="0" + y="13" + width="1" + height="1" + fill="#000000" + id="rect419" /><rect + x="4" + y="13" + width="1" + height="1" + fill="#000000" + id="rect421" /><rect + x="7" + y="13" + width="1" + height="1" + fill="#000000" + id="rect423" /><rect + x="8" + y="13" + width="1" + height="1" + fill="#000000" + id="rect425" /><rect + x="9" + y="13" + width="1" + height="1" + fill="#000000" + id="rect427" /><rect + x="13" + y="13" + width="1" + height="1" + fill="#000000" + id="rect429" /><rect + x="16" + y="13" + width="1" + height="1" + fill="#000000" + id="rect431" /><rect + x="17" + y="13" + width="1" + height="1" + fill="#000000" + id="rect433" /><rect + x="18" + y="13" + width="1" + height="1" + fill="#000000" + id="rect435" /><rect + x="19" + y="13" + width="1" + height="1" + fill="#000000" + id="rect437" /><rect + x="20" + y="13" + width="1" + height="1" + fill="#000000" + id="rect439" /><rect + x="21" + y="13" + width="1" + height="1" + fill="#000000" + id="rect441" /><rect + x="22" + y="13" + width="1" + height="1" + fill="#000000" + id="rect443" /><rect + x="23" + y="13" + width="1" + height="1" + fill="#000000" + id="rect445" /><rect + x="24" + y="13" + width="1" + height="1" + fill="#000000" + id="rect447" /><rect + x="28" + y="13" + width="1" + height="1" + fill="#000000" + id="rect449" /><rect + x="0" + y="14" + width="1" + height="1" + fill="#000000" + id="rect451" /><rect + x="1" + y="14" + width="1" + height="1" + fill="#000000" + id="rect453" /><rect + x="6" + y="14" + width="1" + height="1" + fill="#000000" + id="rect455" /><rect + x="8" + y="14" + width="1" + height="1" + fill="#000000" + id="rect457" /><rect + x="9" + y="14" + width="1" + height="1" + fill="#000000" + id="rect459" /><rect + x="10" + y="14" + width="1" + height="1" + fill="#000000" + id="rect461" /><rect + x="13" + y="14" + width="1" + height="1" + fill="#000000" + id="rect463" /><rect + x="14" + y="14" + width="1" + height="1" + fill="#000000" + id="rect465" /><rect + x="15" + y="14" + width="1" + height="1" + fill="#000000" + id="rect467" /><rect + x="16" + y="14" + width="1" + height="1" + fill="#000000" + id="rect469" /><rect + x="17" + y="14" + width="1" + height="1" + fill="#000000" + id="rect471" /><rect + x="21" + y="14" + width="1" + height="1" + fill="#000000" + id="rect473" /><rect + x="24" + y="14" + width="1" + height="1" + fill="#000000" + id="rect475" /><rect + x="25" + y="14" + width="1" + height="1" + fill="#000000" + id="rect477" /><rect + x="26" + y="14" + width="1" + height="1" + fill="#000000" + id="rect479" /><rect + x="0" + y="15" + width="1" + height="1" + fill="#000000" + id="rect481" /><rect + x="2" + y="15" + width="1" + height="1" + fill="#000000" + id="rect483" /><rect + x="7" + y="15" + width="1" + height="1" + fill="#000000" + id="rect485" /><rect + x="14" + y="15" + width="1" + height="1" + fill="#000000" + id="rect487" /><rect + x="15" + y="15" + width="1" + height="1" + fill="#000000" + id="rect489" /><rect + x="19" + y="15" + width="1" + height="1" + fill="#000000" + id="rect491" /><rect + x="20" + y="15" + width="1" + height="1" + fill="#000000" + id="rect493" /><rect + x="24" + y="15" + width="1" + height="1" + fill="#000000" + id="rect495" /><rect + x="27" + y="15" + width="1" + height="1" + fill="#000000" + id="rect497" /><rect + x="0" + y="16" + width="1" + height="1" + fill="#000000" + id="rect499" /><rect + x="1" + y="16" + width="1" + height="1" + fill="#000000" + id="rect501" /><rect + x="3" + y="16" + width="1" + height="1" + fill="#000000" + id="rect503" /><rect + x="5" + y="16" + width="1" + height="1" + fill="#000000" + id="rect505" /><rect + x="6" + y="16" + width="1" + height="1" + fill="#000000" + id="rect507" /><rect + x="10" + y="16" + width="1" + height="1" + fill="#000000" + id="rect509" /><rect + x="11" + y="16" + width="1" + height="1" + fill="#000000" + id="rect511" /><rect + x="12" + y="16" + width="1" + height="1" + fill="#000000" + id="rect513" /><rect + x="13" + y="16" + width="1" + height="1" + fill="#000000" + id="rect515" /><rect + x="14" + y="16" + width="1" + height="1" + fill="#000000" + id="rect517" /><rect + x="17" + y="16" + width="1" + height="1" + fill="#000000" + id="rect519" /><rect + x="19" + y="16" + width="1" + height="1" + fill="#000000" + id="rect521" /><rect + x="23" + y="16" + width="1" + height="1" + fill="#000000" + id="rect523" /><rect + x="25" + y="16" + width="1" + height="1" + fill="#000000" + id="rect525" /><rect + x="26" + y="16" + width="1" + height="1" + fill="#000000" + id="rect527" /><rect + x="0" + y="17" + width="1" + height="1" + fill="#000000" + id="rect529" /><rect + x="1" + y="17" + width="1" + height="1" + fill="#000000" + id="rect531" /><rect + x="2" + y="17" + width="1" + height="1" + fill="#000000" + id="rect533" /><rect + x="3" + y="17" + width="1" + height="1" + fill="#000000" + id="rect535" /><rect + x="4" + y="17" + width="1" + height="1" + fill="#000000" + id="rect537" /><rect + x="8" + y="17" + width="1" + height="1" + fill="#000000" + id="rect539" /><rect + x="12" + y="17" + width="1" + height="1" + fill="#000000" + id="rect541" /><rect + x="13" + y="17" + width="1" + height="1" + fill="#000000" + id="rect543" /><rect + x="16" + y="17" + width="1" + height="1" + fill="#000000" + id="rect545" /><rect + x="18" + y="17" + width="1" + height="1" + fill="#000000" + id="rect547" /><rect + x="19" + y="17" + width="1" + height="1" + fill="#000000" + id="rect549" /><rect + x="22" + y="17" + width="1" + height="1" + fill="#000000" + id="rect551" /><rect + x="23" + y="17" + width="1" + height="1" + fill="#000000" + id="rect553" /><rect + x="24" + y="17" + width="1" + height="1" + fill="#000000" + id="rect555" /><rect + x="26" + y="17" + width="1" + height="1" + fill="#000000" + id="rect557" /><rect + x="28" + y="17" + width="1" + height="1" + fill="#000000" + id="rect559" /><rect + x="0" + y="18" + width="1" + height="1" + fill="#000000" + id="rect561" /><rect + x="2" + y="18" + width="1" + height="1" + fill="#000000" + id="rect563" /><rect + x="3" + y="18" + width="1" + height="1" + fill="#000000" + id="rect565" /><rect + x="4" + y="18" + width="1" + height="1" + fill="#000000" + id="rect567" /><rect + x="5" + y="18" + width="1" + height="1" + fill="#000000" + id="rect569" /><rect + x="6" + y="18" + width="1" + height="1" + fill="#000000" + id="rect571" /><rect + x="8" + y="18" + width="1" + height="1" + fill="#000000" + id="rect573" /><rect + x="10" + y="18" + width="1" + height="1" + fill="#000000" + id="rect575" /><rect + x="12" + y="18" + width="1" + height="1" + fill="#000000" + id="rect577" /><rect + x="15" + y="18" + width="1" + height="1" + fill="#000000" + id="rect579" /><rect + x="16" + y="18" + width="1" + height="1" + fill="#000000" + id="rect581" /><rect + x="18" + y="18" + width="1" + height="1" + fill="#000000" + id="rect583" /><rect + x="20" + y="18" + width="1" + height="1" + fill="#000000" + id="rect585" /><rect + x="21" + y="18" + width="1" + height="1" + fill="#000000" + id="rect587" /><rect + x="24" + y="18" + width="1" + height="1" + fill="#000000" + id="rect589" /><rect + x="26" + y="18" + width="1" + height="1" + fill="#000000" + id="rect591" /><rect + x="0" + y="19" + width="1" + height="1" + fill="#000000" + id="rect593" /><rect + x="3" + y="19" + width="1" + height="1" + fill="#000000" + id="rect595" /><rect + x="9" + y="19" + width="1" + height="1" + fill="#000000" + id="rect597" /><rect + x="11" + y="19" + width="1" + height="1" + fill="#000000" + id="rect599" /><rect + x="12" + y="19" + width="1" + height="1" + fill="#000000" + id="rect601" /><rect + x="14" + y="19" + width="1" + height="1" + fill="#000000" + id="rect603" /><rect + x="15" + y="19" + width="1" + height="1" + fill="#000000" + id="rect605" /><rect + x="20" + y="19" + width="1" + height="1" + fill="#000000" + id="rect607" /><rect + x="21" + y="19" + width="1" + height="1" + fill="#000000" + id="rect609" /><rect + x="24" + y="19" + width="1" + height="1" + fill="#000000" + id="rect611" /><rect + x="27" + y="19" + width="1" + height="1" + fill="#000000" + id="rect613" /><rect + x="0" + y="20" + width="1" + height="1" + fill="#000000" + id="rect615" /><rect + x="5" + y="20" + width="1" + height="1" + fill="#000000" + id="rect617" /><rect + x="6" + y="20" + width="1" + height="1" + fill="#000000" + id="rect619" /><rect + x="10" + y="20" + width="1" + height="1" + fill="#000000" + id="rect621" /><rect + x="12" + y="20" + width="1" + height="1" + fill="#000000" + id="rect623" /><rect + x="13" + y="20" + width="1" + height="1" + fill="#000000" + id="rect625" /><rect + x="14" + y="20" + width="1" + height="1" + fill="#000000" + id="rect627" /><rect + x="15" + y="20" + width="1" + height="1" + fill="#000000" + id="rect629" /><rect + x="17" + y="20" + width="1" + height="1" + fill="#000000" + id="rect631" /><rect + x="20" + y="20" + width="1" + height="1" + fill="#000000" + id="rect633" /><rect + x="21" + y="20" + width="1" + height="1" + fill="#000000" + id="rect635" /><rect + x="22" + y="20" + width="1" + height="1" + fill="#000000" + id="rect637" /><rect + x="23" + y="20" + width="1" + height="1" + fill="#000000" + id="rect639" /><rect + x="24" + y="20" + width="1" + height="1" + fill="#000000" + id="rect641" /><rect + x="26" + y="20" + width="1" + height="1" + fill="#000000" + id="rect643" /><rect + x="27" + y="20" + width="1" + height="1" + fill="#000000" + id="rect645" /><rect + x="28" + y="20" + width="1" + height="1" + fill="#000000" + id="rect647" /><rect + x="8" + y="21" + width="1" + height="1" + fill="#000000" + id="rect649" /><rect + x="9" + y="21" + width="1" + height="1" + fill="#000000" + id="rect651" /><rect + x="11" + y="21" + width="1" + height="1" + fill="#000000" + id="rect653" /><rect + x="16" + y="21" + width="1" + height="1" + fill="#000000" + id="rect655" /><rect + x="20" + y="21" + width="1" + height="1" + fill="#000000" + id="rect657" /><rect + x="24" + y="21" + width="1" + height="1" + fill="#000000" + id="rect659" /><rect + x="25" + y="21" + width="1" + height="1" + fill="#000000" + id="rect661" /><rect + x="26" + y="21" + width="1" + height="1" + fill="#000000" + id="rect663" /><rect + x="27" + y="21" + width="1" + height="1" + fill="#000000" + id="rect665" /><rect + x="28" + y="21" + width="1" + height="1" + fill="#000000" + id="rect667" /><rect + x="0" + y="22" + width="1" + height="1" + fill="#000000" + id="rect669" /><rect + x="1" + y="22" + width="1" + height="1" + fill="#000000" + id="rect671" /><rect + x="2" + y="22" + width="1" + height="1" + fill="#000000" + id="rect673" /><rect + x="3" + y="22" + width="1" + height="1" + fill="#000000" + id="rect675" /><rect + x="4" + y="22" + width="1" + height="1" + fill="#000000" + id="rect677" /><rect + x="5" + y="22" + width="1" + height="1" + fill="#000000" + id="rect679" /><rect + x="6" + y="22" + width="1" + height="1" + fill="#000000" + id="rect681" /><rect + x="8" + y="22" + width="1" + height="1" + fill="#000000" + id="rect683" /><rect + x="10" + y="22" + width="1" + height="1" + fill="#000000" + id="rect685" /><rect + x="11" + y="22" + width="1" + height="1" + fill="#000000" + id="rect687" /><rect + x="14" + y="22" + width="1" + height="1" + fill="#000000" + id="rect689" /><rect + x="15" + y="22" + width="1" + height="1" + fill="#000000" + id="rect691" /><rect + x="18" + y="22" + width="1" + height="1" + fill="#000000" + id="rect693" /><rect + x="19" + y="22" + width="1" + height="1" + fill="#000000" + id="rect695" /><rect + x="20" + y="22" + width="1" + height="1" + fill="#000000" + id="rect697" /><rect + x="22" + y="22" + width="1" + height="1" + fill="#000000" + id="rect699" /><rect + x="24" + y="22" + width="1" + height="1" + fill="#000000" + id="rect701" /><rect + x="25" + y="22" + width="1" + height="1" + fill="#000000" + id="rect703" /><rect + x="26" + y="22" + width="1" + height="1" + fill="#000000" + id="rect705" /><rect + x="0" + y="23" + width="1" + height="1" + fill="#000000" + id="rect707" /><rect + x="6" + y="23" + width="1" + height="1" + fill="#000000" + id="rect709" /><rect + x="10" + y="23" + width="1" + height="1" + fill="#000000" + id="rect711" /><rect + x="12" + y="23" + width="1" + height="1" + fill="#000000" + id="rect713" /><rect + x="18" + y="23" + width="1" + height="1" + fill="#000000" + id="rect715" /><rect + x="19" + y="23" + width="1" + height="1" + fill="#000000" + id="rect717" /><rect + x="20" + y="23" + width="1" + height="1" + fill="#000000" + id="rect719" /><rect + x="24" + y="23" + width="1" + height="1" + fill="#000000" + id="rect721" /><rect + x="27" + y="23" + width="1" + height="1" + fill="#000000" + id="rect723" /><rect + x="28" + y="23" + width="1" + height="1" + fill="#000000" + id="rect725" /><rect + x="0" + y="24" + width="1" + height="1" + fill="#000000" + id="rect727" /><rect + x="2" + y="24" + width="1" + height="1" + fill="#000000" + id="rect729" /><rect + x="3" + y="24" + width="1" + height="1" + fill="#000000" + id="rect731" /><rect + x="4" + y="24" + width="1" + height="1" + fill="#000000" + id="rect733" /><rect + x="6" + y="24" + width="1" + height="1" + fill="#000000" + id="rect735" /><rect + x="8" + y="24" + width="1" + height="1" + fill="#000000" + id="rect737" /><rect + x="15" + y="24" + width="1" + height="1" + fill="#000000" + id="rect739" /><rect + x="16" + y="24" + width="1" + height="1" + fill="#000000" + id="rect741" /><rect + x="17" + y="24" + width="1" + height="1" + fill="#000000" + id="rect743" /><rect + x="20" + y="24" + width="1" + height="1" + fill="#000000" + id="rect745" /><rect + x="21" + y="24" + width="1" + height="1" + fill="#000000" + id="rect747" /><rect + x="22" + y="24" + width="1" + height="1" + fill="#000000" + id="rect749" /><rect + x="23" + y="24" + width="1" + height="1" + fill="#000000" + id="rect751" /><rect + x="24" + y="24" + width="1" + height="1" + fill="#000000" + id="rect753" /><rect + x="26" + y="24" + width="1" + height="1" + fill="#000000" + id="rect755" /><rect + x="27" + y="24" + width="1" + height="1" + fill="#000000" + id="rect757" /><rect + x="28" + y="24" + width="1" + height="1" + fill="#000000" + id="rect759" /><rect + x="0" + y="25" + width="1" + height="1" + fill="#000000" + id="rect761" /><rect + x="2" + y="25" + width="1" + height="1" + fill="#000000" + id="rect763" /><rect + x="3" + y="25" + width="1" + height="1" + fill="#000000" + id="rect765" /><rect + x="4" + y="25" + width="1" + height="1" + fill="#000000" + id="rect767" /><rect + x="6" + y="25" + width="1" + height="1" + fill="#000000" + id="rect769" /><rect + x="8" + y="25" + width="1" + height="1" + fill="#000000" + id="rect771" /><rect + x="12" + y="25" + width="1" + height="1" + fill="#000000" + id="rect773" /><rect + x="14" + y="25" + width="1" + height="1" + fill="#000000" + id="rect775" /><rect + x="16" + y="25" + width="1" + height="1" + fill="#000000" + id="rect777" /><rect + x="23" + y="25" + width="1" + height="1" + fill="#000000" + id="rect779" /><rect + x="25" + y="25" + width="1" + height="1" + fill="#000000" + id="rect781" /><rect + x="26" + y="25" + width="1" + height="1" + fill="#000000" + id="rect783" /><rect + x="27" + y="25" + width="1" + height="1" + fill="#000000" + id="rect785" /><rect + x="28" + y="25" + width="1" + height="1" + fill="#000000" + id="rect787" /><rect + x="0" + y="26" + width="1" + height="1" + fill="#000000" + id="rect789" /><rect + x="2" + y="26" + width="1" + height="1" + fill="#000000" + id="rect791" /><rect + x="3" + y="26" + width="1" + height="1" + fill="#000000" + id="rect793" /><rect + x="4" + y="26" + width="1" + height="1" + fill="#000000" + id="rect795" /><rect + x="6" + y="26" + width="1" + height="1" + fill="#000000" + id="rect797" /><rect + x="8" + y="26" + width="1" + height="1" + fill="#000000" + id="rect799" /><rect + x="9" + y="26" + width="1" + height="1" + fill="#000000" + id="rect801" /><rect + x="11" + y="26" + width="1" + height="1" + fill="#000000" + id="rect803" /><rect + x="12" + y="26" + width="1" + height="1" + fill="#000000" + id="rect805" /><rect + x="15" + y="26" + width="1" + height="1" + fill="#000000" + id="rect807" /><rect + x="16" + y="26" + width="1" + height="1" + fill="#000000" + id="rect809" /><rect + x="18" + y="26" + width="1" + height="1" + fill="#000000" + id="rect811" /><rect + x="19" + y="26" + width="1" + height="1" + fill="#000000" + id="rect813" /><rect + x="20" + y="26" + width="1" + height="1" + fill="#000000" + id="rect815" /><rect + x="22" + y="26" + width="1" + height="1" + fill="#000000" + id="rect817" /><rect + x="23" + y="26" + width="1" + height="1" + fill="#000000" + id="rect819" /><rect + x="24" + y="26" + width="1" + height="1" + fill="#000000" + id="rect821" /><rect + x="25" + y="26" + width="1" + height="1" + fill="#000000" + id="rect823" /><rect + x="26" + y="26" + width="1" + height="1" + fill="#000000" + id="rect825" /><rect + x="27" + y="26" + width="1" + height="1" + fill="#000000" + id="rect827" /><rect + x="0" + y="27" + width="1" + height="1" + fill="#000000" + id="rect829" /><rect + x="6" + y="27" + width="1" + height="1" + fill="#000000" + id="rect831" /><rect + x="8" + y="27" + width="1" + height="1" + fill="#000000" + id="rect833" /><rect + x="12" + y="27" + width="1" + height="1" + fill="#000000" + id="rect835" /><rect + x="16" + y="27" + width="1" + height="1" + fill="#000000" + id="rect837" /><rect + x="18" + y="27" + width="1" + height="1" + fill="#000000" + id="rect839" /><rect + x="20" + y="27" + width="1" + height="1" + fill="#000000" + id="rect841" /><rect + x="21" + y="27" + width="1" + height="1" + fill="#000000" + id="rect843" /><rect + x="23" + y="27" + width="1" + height="1" + fill="#000000" + id="rect845" /><rect + x="24" + y="27" + width="1" + height="1" + fill="#000000" + id="rect847" /><rect + x="25" + y="27" + width="1" + height="1" + fill="#000000" + id="rect849" /><rect + x="27" + y="27" + width="1" + height="1" + fill="#000000" + id="rect851" /><rect + x="0" + y="28" + width="1" + height="1" + fill="#000000" + id="rect853" /><rect + x="1" + y="28" + width="1" + height="1" + fill="#000000" + id="rect855" /><rect + x="2" + y="28" + width="1" + height="1" + fill="#000000" + id="rect857" /><rect + x="3" + y="28" + width="1" + height="1" + fill="#000000" + id="rect859" /><rect + x="4" + y="28" + width="1" + height="1" + fill="#000000" + id="rect861" /><rect + x="5" + y="28" + width="1" + height="1" + fill="#000000" + id="rect863" /><rect + x="6" + y="28" + width="1" + height="1" + fill="#000000" + id="rect865" /><rect + x="8" + y="28" + width="1" + height="1" + fill="#000000" + id="rect867" /><rect + x="9" + y="28" + width="1" + height="1" + fill="#000000" + id="rect869" /><rect + x="11" + y="28" + width="1" + height="1" + fill="#000000" + id="rect871" /><rect + x="12" + y="28" + width="1" + height="1" + fill="#000000" + id="rect873" /><rect + x="13" + y="28" + width="1" + height="1" + fill="#000000" + id="rect875" /><rect + x="17" + y="28" + width="1" + height="1" + fill="#000000" + id="rect877" /><rect + x="18" + y="28" + width="1" + height="1" + fill="#000000" + id="rect879" /><rect + x="19" + y="28" + width="1" + height="1" + fill="#000000" + id="rect881" /><rect + x="21" + y="28" + width="1" + height="1" + fill="#000000" + id="rect883" /><rect + x="24" + y="28" + width="1" + height="1" + fill="#000000" + id="rect885" /><rect + x="26" + y="28" + width="1" + height="1" + fill="#000000" + id="rect887" /></g></g><image + width="5.604825" + height="5.2599125" + preserveAspectRatio="none" + xlink:href="data:image/png;base64,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 +OEQrTZQXAAAAAElFTkSuQmCC +" + id="image1009" + x="15.697587" + y="15.870044" /></svg> -- GitLab From d4da5fef10eb542838c861e12c6b5d34ff19fec0 Mon Sep 17 00:00:00 2001 From: peterbolha <xbolha@fi.muni.cz> Date: Fri, 16 Jun 2023 16:01:49 +0200 Subject: [PATCH 34/39] fix: lower 'logout' button visual importance --- .../static/components/token/views/token.modified.enroll.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index 04341d400..4181e4f0d 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -351,7 +351,7 @@ <button ng-click="logout()" ui-sref="token.list" ng-hide="!$state.includes('token.wizard')" - class="btn btn-primary margin-bottom" translate> + class="btn btn-outline-secondary margin-bottom" translate> {{ browserLanguage == 'cs' ? 'Odhlásit' : 'Log out' }} </button> </div> -- GitLab From 0a03d867dc6c4f90662238f2bc250adb761fd2fb Mon Sep 17 00:00:00 2001 From: peterbolha <xbolha@fi.muni.cz> Date: Mon, 19 Jun 2023 09:29:32 +0200 Subject: [PATCH 35/39] feat: hide mfa settings button when not configured --- .../token/controllers/tokenControllers.js | 5 ---- .../token/views/token.modified.enroll.html | 29 ++++++++++--------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/privacyidea/static/components/token/controllers/tokenControllers.js b/privacyidea/static/components/token/controllers/tokenControllers.js index b65befcaf..0afe40bb8 100644 --- a/privacyidea/static/components/token/controllers/tokenControllers.js +++ b/privacyidea/static/components/token/controllers/tokenControllers.js @@ -546,11 +546,6 @@ myApp.controller("tokenEnrollController", ["$scope", "TokenFactory", "$timeout", }; $scope.redirectToMfaManagement = async function () { - // Check whether url is not loaded already to save an API call - if ($scope.mfaManagementUrl === "") { - await $scope.loadMfaManagementUrl(); - } - // Url was correctly configured and returned by the endpoint if ($scope.mfaManagementUrl !== "") { window.open($scope.mfaManagementUrl, "_blank") diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index 4181e4f0d..de0abe22a 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -25,11 +25,11 @@ <label class="form-check-label custom-form-check-label" for="radio{{ type }}" ng-hide="!(hasUsableTokens || isAllowedInitially(type))"> <span ng-show="type === 'backupcode' && hasUsableTokens">{{ browserLanguage == 'cs' ? 'záloĹľnĂ kĂłdy' : 'backup codes' - }}</span> + }}</span> <span ng-show="type === 'totp'">{{ browserLanguage == 'cs' ? 'ověřovacĂ kĂłdy' : 'verification codes' - }}</span> + }}</span> <span ng-show="type === 'webauthn' && hasUsableTokens">{{ browserLanguage == 'cs' ? 'bezpeÄŤnostnĂ klĂÄŤ' : 'security key' - }}</span> + }}</span> <span ng-hide="type === 'backupcode' || type === 'totp' || type === 'webauthn'">{{ desc }}</span> </label> <div ng-if="type === 'backupcode' || type === 'totp' || type === 'webauthn'"> @@ -150,7 +150,7 @@ ng-disabled="!checkEnroll() || formEnrollToken.$invalid || enrolling" class="btn btn-primary margin-bottom"> <span ng-if="$state.includes('token.rollover') == false">{{ browserLanguage == 'cs' ? 'PokraÄŤovat' : 'Continue' - }}</span> + }}</span> <span ng-if="$state.includes('token.rollover')" translate>Rollover Token</span> </button> </div> @@ -169,7 +169,7 @@ src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.2of5.html'"></ng-include> <h3 class="main-heading-element" translate><b> {{ browserLanguage == 'cs' ? 'Máte aplikaci pro ukládánĂ ověřovacĂch kĂłdĹŻ?' : 'Do you have a TOTP application?' - }}</b> + }}</b> </h3> <div class="margin-bottom-large"> <p ng-show="browserLanguage === 'cs'"> @@ -181,15 +181,18 @@ rel="noopener nofollow"><b>Aegis Authenticator</b></a> (pro Android) nebo <a href="https://raivo-otp.com/" target="_blank" rel="noopener nofollow"><b>Raivo OTP</b></a> (pro iOS), - pĹ™ĂpadnÄ› <b><a href="https://keepassxc.org/download/" target="_blank" rel="noopener nofollow">KeePassXC</a></b> (Windows, macOS, Linux). + pĹ™ĂpadnÄ› <b><a href="https://keepassxc.org/download/" target="_blank" + rel="noopener nofollow">KeePassXC</a></b> (Windows, macOS, Linux). </p> <p ng-show="browserLanguage !== 'cs'"> - The next step of activation requires that you have a TOTP app installed in your smartphone, or that you have + The next step of activation requires that you have a TOTP app installed in your smartphone, or that you + have a password manager with TOTP support. If you don't have such app already, you can use for example <a href="https://getaegis.app/" target="_blank" rel="noopener nofollow"><b>Aegis Authenticator</b></a> (Android), <a href="https://raivo-otp.com/" target="_blank" rel="noopener nofollow"><b>Raivo - OTP</b></a> (iOS), or <b><a href="https://keepassxc.org/download/" target="_blank" rel="noopener nofollow">KeePassXC</a></b> (Windows, macOS, Linux). + OTP</b></a> (iOS), or <b><a href="https://keepassxc.org/download/" target="_blank" + rel="noopener nofollow">KeePassXC</a></b> (Windows, macOS, Linux). </p> </div> @@ -279,7 +282,7 @@ '/static/components/token/views/token.enrolled.' + form.type + '.html' + fileVersionSuffix"> </ng-include> <div class="text-center"> - <button ng-click="awaitingBackupcodeEnroll = false; awaitingSetupCompletion = true; enrolledToken = null;" + <button ng-click="awaitingBackupcodeEnroll = false; awaitingSetupCompletion = true; enrolledToken = null; loadMfaManagementUrl()" ng-disabled="!hasDownloadedBackupcodes" class="btn btn-primary margin-bottom"> {{ browserLanguage == 'cs' ? 'ZáloĹľnĂ kĂłdy mám' : 'I have my backup codes' }} @@ -297,7 +300,7 @@ <div class="totp-verify-mobile"> <h3 class="main-heading-element"><b> {{ browserLanguage == 'cs' ? 'VĂcefázovĂ© ověřenĂ bylo ĂşspěšnÄ› nastaveno.' : 'Multi-factor authentication has been successfully set up!' - }} + }} </b></h3> <p ng-show="browserLanguage === 'en'"><b>Which services will now require multi-factor @@ -306,16 +309,16 @@ ověřenĂ?</b></p> <p ng-show="browserLanguage === 'en'"> Multi-factor authentication is currently activated for all services. - To manage your settings, click the Service settings button below. + <span ng-hide="mfaManagementUrl === ''">To manage your settings, click the Service settings button below.</span> </p> <p ng-show="browserLanguage === 'cs'"> VĂcefázovĂ© ověřenĂ je nynĂ aktivnĂ pro všechny sluĹľby. - Chcete-li upravit toto nastavenĂ, pouĹľijte tlaÄŤĂtko NastavenĂ sluĹľeb nĂĹľe. + <span ng-hide="mfaManagementUrl === ''">Chcete-li upravit toto nastavenĂ, pouĹľijte tlaÄŤĂtko NastavenĂ sluĹľeb nĂĹľe. </span> </p> <!-- Open Perun settings in a new tab --> <button class="btn-default btn margin-bottom-large" - ng-click="redirectToMfaManagement();"> + ng-hide="mfaManagementUrl === ''" ng-click="redirectToMfaManagement();"> {{ browserLanguage == 'cs' ? 'NastavenĂ sluĹľeb' : 'Service settings' }} </button> </div> -- GitLab From 78a0d10d2397e2c669aca0892242692473375e3f Mon Sep 17 00:00:00 2001 From: peterbolha <xbolha@fi.muni.cz> Date: Mon, 19 Jun 2023 09:30:45 +0200 Subject: [PATCH 36/39] chore: remove unused js qrcode library --- privacyidea/static/qrcode.min.js | 1 - privacyidea/static/templates/footer.html | 2 -- 2 files changed, 3 deletions(-) delete mode 100644 privacyidea/static/qrcode.min.js diff --git a/privacyidea/static/qrcode.min.js b/privacyidea/static/qrcode.min.js deleted file mode 100644 index 993e88f39..000000000 --- a/privacyidea/static/qrcode.min.js +++ /dev/null @@ -1 +0,0 @@ -var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c<a.length&&0==a[c];)c++;this.num=new Array(a.length-c+b);for(var d=0;d<a.length-c;d++)this.num[d]=a[d+c]}function j(a,b){this.totalCount=a,this.dataCount=b}function k(){this.buffer=[],this.length=0}function m(){return"undefined"!=typeof CanvasRenderingContext2D}function n(){var a=!1,b=navigator.userAgent;return/android/i.test(b)&&(a=!0,aMat=b.toString().match(/android ([0-9]\.[0-9])/i),aMat&&aMat[1]&&(a=parseFloat(aMat[1]))),a}function r(a,b){for(var c=1,e=s(a),f=0,g=l.length;g>=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d<this.moduleCount;d++){this.modules[d]=new Array(this.moduleCount);for(var e=0;e<this.moduleCount;e++)this.modules[d][e]=null}this.setupPositionProbePattern(0,0),this.setupPositionProbePattern(this.moduleCount-7,0),this.setupPositionProbePattern(0,this.moduleCount-7),this.setupPositionAdjustPattern(),this.setupTimingPattern(),this.setupTypeInfo(a,c),this.typeNumber>=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f<this.modules.length;f++)for(var g=f*e,h=0;h<this.modules[f].length;h++){var i=h*e,j=this.modules[f][h];j&&(d.beginFill(0,100),d.moveTo(i,g),d.lineTo(i+e,g),d.lineTo(i+e,g+e),d.lineTo(i,g+e),d.endFill())}return d},setupTimingPattern:function(){for(var a=8;a<this.moduleCount-8;a++)null==this.modules[a][6]&&(this.modules[a][6]=0==a%2);for(var b=8;b<this.moduleCount-8;b++)null==this.modules[6][b]&&(this.modules[6][b]=0==b%2)},setupPositionAdjustPattern:function(){for(var a=f.getPatternPosition(this.typeNumber),b=0;b<a.length;b++)for(var c=0;c<a.length;c++){var d=a[b],e=a[c];if(null==this.modules[d][e])for(var g=-2;2>=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g<a.length&&(j=1==(1&a[g]>>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h<d.length;h++){var i=d[h];g.put(i.mode,4),g.put(i.getLength(),f.getLengthInBits(i.mode,a)),i.write(g)}for(var l=0,h=0;h<e.length;h++)l+=e[h].dataCount;if(g.getLengthInBits()>8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j<b.length;j++){var k=b[j].dataCount,l=b[j].totalCount-k;d=Math.max(d,k),e=Math.max(e,l),g[j]=new Array(k);for(var m=0;m<g[j].length;m++)g[j][m]=255&a.buffer[m+c];c+=k;var n=f.getErrorCorrectPolynomial(l),o=new i(g[j],n.getLength()-1),p=o.mod(n);h[j]=new Array(n.getLength()-1);for(var m=0;m<h[j].length;m++){var q=m+p.getLength()-h[j].length;h[j][m]=q>=0?p.get(q):0}}for(var r=0,m=0;m<b.length;m++)r+=b[m].totalCount;for(var s=new Array(r),t=0,m=0;d>m;m++)for(var j=0;j<b.length;j++)m<g[j].length&&(s[t++]=g[j][m]);for(var m=0;e>m;m++)for(var j=0;j<b.length;j++)m<h[j].length&&(s[t++]=h[j][m]);return s};for(var c={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},d={L:1,M:0,Q:3,H:2},e={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},f={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(a){for(var b=a<<10;f.getBCHDigit(b)-f.getBCHDigit(f.G15)>=0;)b^=f.G15<<f.getBCHDigit(b)-f.getBCHDigit(f.G15);return(a<<10|b)^f.G15_MASK},getBCHTypeNumber:function(a){for(var b=a<<12;f.getBCHDigit(b)-f.getBCHDigit(f.G18)>=0;)b^=f.G18<<f.getBCHDigit(b)-f.getBCHDigit(f.G18);return a<<12|b},getBCHDigit:function(a){for(var b=0;0!=a;)b++,a>>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<<h;for(var h=8;256>h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;c<this.getLength();c++)for(var d=0;d<a.getLength();d++)b[c+d]^=g.gexp(g.glog(this.get(c))+g.glog(a.get(d)));return new i(b,0)},mod:function(a){if(this.getLength()-a.getLength()<0)return this;for(var b=g.glog(this.get(0))-g.glog(a.get(0)),c=new Array(this.getLength()),d=0;d<this.getLength();d++)c[d]=this.get(d);for(var d=0;d<a.getLength();d++)c[d]^=g.gexp(g.glog(a.get(d))+b);return new i(c,0).mod(a)}},j.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],j.getRSBlocks=function(a,b){var c=j.getRsBlockTable(a,b);if(void 0==c)throw new Error("bad rs block @ typeNumber:"+a+"/errorCorrectLevel:"+b);for(var d=c.length/3,e=[],f=0;d>f;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=['<table style="border:0;border-collapse:collapse;">'],h=0;d>h;h++){g.push("<tr>");for(var i=0;d>i;i++)g.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:'+e+"px;height:"+f+"px;background-color:"+(a.isDark(h,i)?b.colorDark:b.colorLight)+';"></td>');g.push("</tr>")}g.push("</table>"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/privacyidea/static/templates/footer.html b/privacyidea/static/templates/footer.html index d9d2b00d8..878d6d211 100644 --- a/privacyidea/static/templates/footer.html +++ b/privacyidea/static/templates/footer.html @@ -89,7 +89,5 @@ <script src="static/jspdf.umd.min.js"></script> <!-- autotable - Script for creating formatted tables compatible with jsPDF --> <script src="static/jspdf.plugin.autotable.min.js"></script> -<!-- QRCode - Script for creating QR codes from URL (download links for TOTP apps) --> -<script src="static/qrcode.min.js"></script> </body> </html> -- GitLab From 11e65e583aac77c9b904d8d5f3aaa06746f91292 Mon Sep 17 00:00:00 2001 From: peterbolha <xbolha@fi.muni.cz> Date: Wed, 21 Jun 2023 12:29:44 +0200 Subject: [PATCH 37/39] fix: display last component of progress bar --- .../components/token/views/token.modified.enroll.html | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/privacyidea/static/components/token/views/token.modified.enroll.html b/privacyidea/static/components/token/views/token.modified.enroll.html index de0abe22a..58b30fefa 100644 --- a/privacyidea/static/components/token/views/token.modified.enroll.html +++ b/privacyidea/static/components/token/views/token.modified.enroll.html @@ -292,10 +292,8 @@ <!-- 5/5 Show this after the initial TOTP token and the initial backupcodes have been registered --> <div ng-show="awaitingSetupCompletion"> - <div ng-if="!hasUsableTokens"> - <ng-include - src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.5of5.html'"></ng-include> - </div> + <ng-include + src="instanceUrl + '/static/components/token/views/progress_bars/progress.bar.5of5.html'"></ng-include> <div class="totp-verify-mobile"> <h3 class="main-heading-element"><b> -- GitLab From eb2236ee0de84e4318af60154fcd12e953a9ef9b Mon Sep 17 00:00:00 2001 From: peterbolha <xbolha@fi.muni.cz> Date: Wed, 12 Jul 2023 09:26:41 +0200 Subject: [PATCH 38/39] fix: send only unique active token types --- privacyidea/api/token.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/privacyidea/api/token.py b/privacyidea/api/token.py index 02b8f3be6..8160ba100 100644 --- a/privacyidea/api/token.py +++ b/privacyidea/api/token.py @@ -281,10 +281,12 @@ def enable_mfa_everywhere(user): def update_user_active_token_types(user, all_user_tokens=None): usable_tokens = get_usable_tokens(user, all_user_tokens) active_token_types = [token["tokentype"] for token in usable_tokens] + unique_active_token_types = list(set(active_token_types)) + unique_active_token_types.sort() cfg = current_app.config mfa_active_tokens_attr_name = cfg.get("PERUN_AVAILABLE_TOKEN_TYPES_ATTR_NAME") - mfa_active_tokens_attr_value = active_token_types + mfa_active_tokens_attr_value = unique_active_token_types mfa_enforce_action_name = "Update of user's active token types" set_perun_user_attributes(user, -- GitLab From bafe02b31dcd9d45a1f2cfd54756e55110ea2f49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Prokop?= <jprokop.ofc@gmail.com> Date: Wed, 8 Nov 2023 13:22:33 +0100 Subject: [PATCH 39/39] feat: change error msg when enrolling webauth token multiple times --- privacyidea/static/components/login/factories/webauthn.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/privacyidea/static/components/login/factories/webauthn.js b/privacyidea/static/components/login/factories/webauthn.js index e1fa79193..92f5e42ae 100644 --- a/privacyidea/static/components/login/factories/webauthn.js +++ b/privacyidea/static/components/login/factories/webauthn.js @@ -55,7 +55,10 @@ angular .then(callback) .catch(function(e) { inform.add( - domExceptionErrorMessage[e.name] + " / " + e.message, + domExceptionErrorMessage[e.name] + " / " + + gettextCatalog.getString( + "Error when enrolling - you are probably trying to enroll the same token twice!" + ), { type: "danger", ttl: 10000 -- GitLab