From 77bdee94433dde48e6d164b05bec281323c3e200 Mon Sep 17 00:00:00 2001 From: Jeff Vandrew Jr Date: Mon, 25 Mar 2019 11:08:52 -0400 Subject: [PATCH] add backup --- backup.sh | 26 + dropbox-script/LICENSE | 23 + dropbox-script/certifi/__init__.py | 3 + dropbox-script/certifi/__main__.py | 2 + dropbox-script/certifi/cacert.pem | 4658 ++ dropbox-script/certifi/core.py | 15 + dropbox-script/chardet/__init__.py | 39 + dropbox-script/chardet/big5freq.py | 386 + dropbox-script/chardet/big5prober.py | 47 + dropbox-script/chardet/chardistribution.py | 233 + dropbox-script/chardet/charsetgroupprober.py | 106 + dropbox-script/chardet/charsetprober.py | 145 + dropbox-script/chardet/cli/__init__.py | 1 + dropbox-script/chardet/cli/chardetect.py | 85 + dropbox-script/chardet/codingstatemachine.py | 88 + dropbox-script/chardet/compat.py | 34 + dropbox-script/chardet/cp949prober.py | 49 + dropbox-script/chardet/enums.py | 76 + dropbox-script/chardet/escprober.py | 101 + dropbox-script/chardet/escsm.py | 246 + dropbox-script/chardet/eucjpprober.py | 92 + dropbox-script/chardet/euckrfreq.py | 195 + dropbox-script/chardet/euckrprober.py | 47 + dropbox-script/chardet/euctwfreq.py | 387 + dropbox-script/chardet/euctwprober.py | 46 + dropbox-script/chardet/gb2312freq.py | 283 + dropbox-script/chardet/gb2312prober.py | 46 + dropbox-script/chardet/hebrewprober.py | 292 + dropbox-script/chardet/jisfreq.py | 325 + dropbox-script/chardet/jpcntx.py | 233 + dropbox-script/chardet/langbulgarianmodel.py | 228 + dropbox-script/chardet/langcyrillicmodel.py | 333 + dropbox-script/chardet/langgreekmodel.py | 225 + dropbox-script/chardet/langhebrewmodel.py | 200 + dropbox-script/chardet/langhungarianmodel.py | 225 + dropbox-script/chardet/langthaimodel.py | 199 + dropbox-script/chardet/langturkishmodel.py | 193 + dropbox-script/chardet/latin1prober.py | 145 + dropbox-script/chardet/mbcharsetprober.py | 91 + dropbox-script/chardet/mbcsgroupprober.py | 54 + dropbox-script/chardet/mbcssm.py | 572 + dropbox-script/chardet/sbcharsetprober.py | 132 + dropbox-script/chardet/sbcsgroupprober.py | 73 + dropbox-script/chardet/sjisprober.py | 92 + dropbox-script/chardet/universaldetector.py | 286 + dropbox-script/chardet/utf8prober.py | 82 + dropbox-script/chardet/version.py | 9 + dropbox-script/dropbox-script | 64 + dropbox-script/dropbox/__init__.py | 4 + dropbox-script/dropbox/async.py | 7 + dropbox-script/dropbox/async_.py | 329 + dropbox-script/dropbox/auth.py | 767 + dropbox-script/dropbox/base.py | 4361 + dropbox-script/dropbox/base_team.py | 1999 + dropbox-script/dropbox/common.py | 455 + dropbox-script/dropbox/contacts.py | 175 + dropbox-script/dropbox/dropbox.py | 609 + dropbox-script/dropbox/exceptions.py | 100 + dropbox-script/dropbox/file_properties.py | 3396 + dropbox-script/dropbox/file_requests.py | 1483 + dropbox-script/dropbox/files.py | 13709 +++ dropbox-script/dropbox/oauth.py | 515 + dropbox-script/dropbox/paper.py | 4528 + dropbox-script/dropbox/seen_state.py | 110 + dropbox-script/dropbox/session.py | 51 + dropbox-script/dropbox/sharing.py | 19227 +++++ dropbox-script/dropbox/stone_base.py | 152 + dropbox-script/dropbox/stone_serializers.py | 1075 + dropbox-script/dropbox/stone_validators.py | 673 + dropbox-script/dropbox/team.py | 19382 +++++ dropbox-script/dropbox/team_common.py | 562 + dropbox-script/dropbox/team_log.py | 69421 ++++++++++++++++ dropbox-script/dropbox/team_policies.py | 1447 + dropbox-script/dropbox/trusted-certs.crt | 1396 + dropbox-script/dropbox/users.py | 1872 + dropbox-script/dropbox/users_common.py | 88 + dropbox-script/idna/__init__.py | 2 + dropbox-script/idna/codec.py | 118 + dropbox-script/idna/compat.py | 12 + dropbox-script/idna/core.py | 396 + dropbox-script/idna/idnadata.py | 1979 + dropbox-script/idna/intranges.py | 53 + dropbox-script/idna/package_data.py | 2 + dropbox-script/idna/uts46data.py | 8205 ++ dropbox-script/requests/__init__.py | 131 + dropbox-script/requests/__version__.py | 14 + dropbox-script/requests/_internal_utils.py | 42 + dropbox-script/requests/adapters.py | 533 + dropbox-script/requests/api.py | 158 + dropbox-script/requests/auth.py | 305 + dropbox-script/requests/certs.py | 18 + dropbox-script/requests/compat.py | 70 + dropbox-script/requests/cookies.py | 549 + dropbox-script/requests/exceptions.py | 126 + dropbox-script/requests/help.py | 119 + dropbox-script/requests/hooks.py | 34 + dropbox-script/requests/models.py | 953 + dropbox-script/requests/packages.py | 14 + dropbox-script/requests/sessions.py | 770 + dropbox-script/requests/status_codes.py | 120 + dropbox-script/requests/structures.py | 103 + dropbox-script/requests/utils.py | 977 + dropbox-script/six.py | 952 + dropbox-script/urllib3/__init__.py | 92 + dropbox-script/urllib3/_collections.py | 329 + dropbox-script/urllib3/connection.py | 391 + dropbox-script/urllib3/connectionpool.py | 896 + dropbox-script/urllib3/contrib/__init__.py | 0 .../urllib3/contrib/_appengine_environ.py | 30 + .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 593 + .../contrib/_securetransport/low_level.py | 346 + dropbox-script/urllib3/contrib/appengine.py | 289 + dropbox-script/urllib3/contrib/ntlmpool.py | 111 + dropbox-script/urllib3/contrib/pyopenssl.py | 466 + .../urllib3/contrib/securetransport.py | 804 + dropbox-script/urllib3/contrib/socks.py | 192 + dropbox-script/urllib3/exceptions.py | 246 + dropbox-script/urllib3/fields.py | 178 + dropbox-script/urllib3/filepost.py | 98 + dropbox-script/urllib3/poolmanager.py | 450 + dropbox-script/urllib3/request.py | 150 + dropbox-script/urllib3/response.py | 705 + dropbox-script/urllib3/util/__init__.py | 54 + dropbox-script/urllib3/util/connection.py | 134 + dropbox-script/urllib3/util/queue.py | 21 + dropbox-script/urllib3/util/request.py | 118 + dropbox-script/urllib3/util/response.py | 87 + dropbox-script/urllib3/util/retry.py | 411 + dropbox-script/urllib3/util/ssl_.py | 381 + dropbox-script/urllib3/util/timeout.py | 242 + dropbox-script/urllib3/util/url.py | 230 + dropbox-script/urllib3/util/wait.py | 150 + 133 files changed, 184354 insertions(+) create mode 100755 backup.sh create mode 100644 dropbox-script/LICENSE create mode 100644 dropbox-script/certifi/__init__.py create mode 100644 dropbox-script/certifi/__main__.py create mode 100644 dropbox-script/certifi/cacert.pem create mode 100644 dropbox-script/certifi/core.py create mode 100644 dropbox-script/chardet/__init__.py create mode 100644 dropbox-script/chardet/big5freq.py create mode 100644 dropbox-script/chardet/big5prober.py create mode 100644 dropbox-script/chardet/chardistribution.py create mode 100644 dropbox-script/chardet/charsetgroupprober.py create mode 100644 dropbox-script/chardet/charsetprober.py create mode 100644 dropbox-script/chardet/cli/__init__.py create mode 100644 dropbox-script/chardet/cli/chardetect.py create mode 100644 dropbox-script/chardet/codingstatemachine.py create mode 100644 dropbox-script/chardet/compat.py create mode 100644 dropbox-script/chardet/cp949prober.py create mode 100644 dropbox-script/chardet/enums.py create mode 100644 dropbox-script/chardet/escprober.py create mode 100644 dropbox-script/chardet/escsm.py create mode 100644 dropbox-script/chardet/eucjpprober.py create mode 100644 dropbox-script/chardet/euckrfreq.py create mode 100644 dropbox-script/chardet/euckrprober.py create mode 100644 dropbox-script/chardet/euctwfreq.py create mode 100644 dropbox-script/chardet/euctwprober.py create mode 100644 dropbox-script/chardet/gb2312freq.py create mode 100644 dropbox-script/chardet/gb2312prober.py create mode 100644 dropbox-script/chardet/hebrewprober.py create mode 100644 dropbox-script/chardet/jisfreq.py create mode 100644 dropbox-script/chardet/jpcntx.py create mode 100644 dropbox-script/chardet/langbulgarianmodel.py create mode 100644 dropbox-script/chardet/langcyrillicmodel.py create mode 100644 dropbox-script/chardet/langgreekmodel.py create mode 100644 dropbox-script/chardet/langhebrewmodel.py create mode 100644 dropbox-script/chardet/langhungarianmodel.py create mode 100644 dropbox-script/chardet/langthaimodel.py create mode 100644 dropbox-script/chardet/langturkishmodel.py create mode 100644 dropbox-script/chardet/latin1prober.py create mode 100644 dropbox-script/chardet/mbcharsetprober.py create mode 100644 dropbox-script/chardet/mbcsgroupprober.py create mode 100644 dropbox-script/chardet/mbcssm.py create mode 100644 dropbox-script/chardet/sbcharsetprober.py create mode 100644 dropbox-script/chardet/sbcsgroupprober.py create mode 100644 dropbox-script/chardet/sjisprober.py create mode 100644 dropbox-script/chardet/universaldetector.py create mode 100644 dropbox-script/chardet/utf8prober.py create mode 100644 dropbox-script/chardet/version.py create mode 100755 dropbox-script/dropbox-script create mode 100644 dropbox-script/dropbox/__init__.py create mode 100644 dropbox-script/dropbox/async.py create mode 100644 dropbox-script/dropbox/async_.py create mode 100644 dropbox-script/dropbox/auth.py create mode 100644 dropbox-script/dropbox/base.py create mode 100644 dropbox-script/dropbox/base_team.py create mode 100644 dropbox-script/dropbox/common.py create mode 100644 dropbox-script/dropbox/contacts.py create mode 100644 dropbox-script/dropbox/dropbox.py create mode 100644 dropbox-script/dropbox/exceptions.py create mode 100644 dropbox-script/dropbox/file_properties.py create mode 100644 dropbox-script/dropbox/file_requests.py create mode 100644 dropbox-script/dropbox/files.py create mode 100644 dropbox-script/dropbox/oauth.py create mode 100644 dropbox-script/dropbox/paper.py create mode 100644 dropbox-script/dropbox/seen_state.py create mode 100644 dropbox-script/dropbox/session.py create mode 100644 dropbox-script/dropbox/sharing.py create mode 100644 dropbox-script/dropbox/stone_base.py create mode 100644 dropbox-script/dropbox/stone_serializers.py create mode 100644 dropbox-script/dropbox/stone_validators.py create mode 100644 dropbox-script/dropbox/team.py create mode 100644 dropbox-script/dropbox/team_common.py create mode 100644 dropbox-script/dropbox/team_log.py create mode 100644 dropbox-script/dropbox/team_policies.py create mode 100644 dropbox-script/dropbox/trusted-certs.crt create mode 100644 dropbox-script/dropbox/users.py create mode 100644 dropbox-script/dropbox/users_common.py create mode 100644 dropbox-script/idna/__init__.py create mode 100644 dropbox-script/idna/codec.py create mode 100644 dropbox-script/idna/compat.py create mode 100644 dropbox-script/idna/core.py create mode 100644 dropbox-script/idna/idnadata.py create mode 100644 dropbox-script/idna/intranges.py create mode 100644 dropbox-script/idna/package_data.py create mode 100644 dropbox-script/idna/uts46data.py create mode 100644 dropbox-script/requests/__init__.py create mode 100644 dropbox-script/requests/__version__.py create mode 100644 dropbox-script/requests/_internal_utils.py create mode 100644 dropbox-script/requests/adapters.py create mode 100644 dropbox-script/requests/api.py create mode 100644 dropbox-script/requests/auth.py create mode 100644 dropbox-script/requests/certs.py create mode 100644 dropbox-script/requests/compat.py create mode 100644 dropbox-script/requests/cookies.py create mode 100644 dropbox-script/requests/exceptions.py create mode 100644 dropbox-script/requests/help.py create mode 100644 dropbox-script/requests/hooks.py create mode 100644 dropbox-script/requests/models.py create mode 100644 dropbox-script/requests/packages.py create mode 100644 dropbox-script/requests/sessions.py create mode 100644 dropbox-script/requests/status_codes.py create mode 100644 dropbox-script/requests/structures.py create mode 100644 dropbox-script/requests/utils.py create mode 100644 dropbox-script/six.py create mode 100644 dropbox-script/urllib3/__init__.py create mode 100644 dropbox-script/urllib3/_collections.py create mode 100644 dropbox-script/urllib3/connection.py create mode 100644 dropbox-script/urllib3/connectionpool.py create mode 100644 dropbox-script/urllib3/contrib/__init__.py create mode 100644 dropbox-script/urllib3/contrib/_appengine_environ.py create mode 100644 dropbox-script/urllib3/contrib/_securetransport/__init__.py create mode 100644 dropbox-script/urllib3/contrib/_securetransport/bindings.py create mode 100644 dropbox-script/urllib3/contrib/_securetransport/low_level.py create mode 100644 dropbox-script/urllib3/contrib/appengine.py create mode 100644 dropbox-script/urllib3/contrib/ntlmpool.py create mode 100644 dropbox-script/urllib3/contrib/pyopenssl.py create mode 100644 dropbox-script/urllib3/contrib/securetransport.py create mode 100644 dropbox-script/urllib3/contrib/socks.py create mode 100644 dropbox-script/urllib3/exceptions.py create mode 100644 dropbox-script/urllib3/fields.py create mode 100644 dropbox-script/urllib3/filepost.py create mode 100644 dropbox-script/urllib3/poolmanager.py create mode 100644 dropbox-script/urllib3/request.py create mode 100644 dropbox-script/urllib3/response.py create mode 100644 dropbox-script/urllib3/util/__init__.py create mode 100644 dropbox-script/urllib3/util/connection.py create mode 100644 dropbox-script/urllib3/util/queue.py create mode 100644 dropbox-script/urllib3/util/request.py create mode 100644 dropbox-script/urllib3/util/response.py create mode 100644 dropbox-script/urllib3/util/retry.py create mode 100644 dropbox-script/urllib3/util/ssl_.py create mode 100644 dropbox-script/urllib3/util/timeout.py create mode 100644 dropbox-script/urllib3/util/url.py create mode 100644 dropbox-script/urllib3/util/wait.py diff --git a/backup.sh b/backup.sh new file mode 100755 index 0000000..86b7030 --- /dev/null +++ b/backup.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +if [ "$(id -u)" != "0" ]; then + echo "This script must be run as root." + echo "Use the command 'sudo su -' (include the trailing hypen) and try again" + exit 1 +fi + +(return 2>/dev/null) && sourced=1 || sourced=0 + +if [ $sourced != 1 ]; then + echo "You forgot the leading '.' followed by a space!" + echo "Try this format: . ./backup.sh" + exit 1 +fi + +if [ -z ${BACKUP_PROVIDER+x} ]; then + echo "Set BACKUP_PROVIDER environmental variable and try again." + exit 1 +elif [ ${BACKUP_PROVIDER="Dropbox"} ]; then + btcpay-down.sh + tar -cvzf $PWD/dropbox-script/backup.tar.gz --exclude='/var/lib/docker/volumes/generated_bitcoin_datadir/*' /var/lib/docker + btcpay-up.sh + cd dropbox-script + ./dropbox-script && rm backup.tar.gz +fi diff --git a/dropbox-script/LICENSE b/dropbox-script/LICENSE new file mode 100644 index 0000000..5c757e0 --- /dev/null +++ b/dropbox-script/LICENSE @@ -0,0 +1,23 @@ +MIT License + +Copyright (c) 2019 Jeff Vandrew Jr + +All subdirectories are dependencies and covered by the licenses of their various projects. + +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. diff --git a/dropbox-script/certifi/__init__.py b/dropbox-script/certifi/__init__.py new file mode 100644 index 0000000..632db8e --- /dev/null +++ b/dropbox-script/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import where + +__version__ = "2019.03.09" diff --git a/dropbox-script/certifi/__main__.py b/dropbox-script/certifi/__main__.py new file mode 100644 index 0000000..5f1da0d --- /dev/null +++ b/dropbox-script/certifi/__main__.py @@ -0,0 +1,2 @@ +from certifi import where +print(where()) diff --git a/dropbox-script/certifi/cacert.pem b/dropbox-script/certifi/cacert.pem new file mode 100644 index 0000000..84636dd --- /dev/null +++ b/dropbox-script/certifi/cacert.pem @@ -0,0 +1,4658 @@ + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Label: "QuoVadis Root CA" +# Serial: 985026699 +# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 +# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 +# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=Sonera Class2 CA O=Sonera +# Subject: CN=Sonera Class2 CA O=Sonera +# Label: "Sonera Class 2 Root CA" +# Serial: 29 +# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb +# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 +# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: O=Government Root Certification Authority +# Subject: O=Government Root Certification Authority +# Label: "Taiwan GRCA" +# Serial: 42023070807708724159991140556527066870 +# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=Class 2 Primary CA O=Certplus +# Subject: CN=Class 2 Primary CA O=Certplus +# Label: "Certplus Class 2 Primary CA" +# Serial: 177770208045934040241468760488327595043 +# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b +# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb +# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Label: "DST Root CA X3" +# Serial: 91299735575339953335919266965803778155 +# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln +biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF +MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT +d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC +CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 +76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ +bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c +6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE +emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd +MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt +MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y +MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y +FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi +aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM +gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB +qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 +lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn +8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 +45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO +UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 +O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC +bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv +GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a +77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC +hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 +92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp +Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w +ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt +Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE +BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu +IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow +RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY +U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv +Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br +YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF +nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH +6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt +eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ +c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ +MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH +HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf +jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 +5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB +rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c +wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB +AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp +WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 +xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ +2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ +IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 +aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X +em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR +dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ +OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ +hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy +tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Label: "Deutsche Telekom Root CA 2" +# Serial: 38 +# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 +# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf +# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G2" +# Serial: 10000012 +# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a +# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 +# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 +MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 +ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD +VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j +b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq +scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO +xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H +LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX +uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD +yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ +JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q +rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN +BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L +hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB +QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ +HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu +Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg +QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB +BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA +A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb +laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 +awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo +JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw +LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT +VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk +LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb +UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ +QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ +naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls +QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Label: "Chambers of Commerce Root - 2008" +# Serial: 11806822484801597146 +# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 +# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c +# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Label: "Global Chambersign Root - 2008" +# Serial: 14541511773111788494 +# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 +# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c +# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: O=Trustis Limited OU=Trustis FPS Root CA +# Subject: O=Trustis Limited OU=Trustis FPS Root CA +# Label: "Trustis FPS Root CA" +# Serial: 36053640375399034304724988975563710553 +# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d +# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 +# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Label: "EE Certification Centre Root CA" +# Serial: 112324828676200291871926431888494945866 +# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 14367148294922964480859022125800977897474 +# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e +# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb +# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ +FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F +uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX +kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs +ewv4n4Q= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G3" +# Serial: 10003001 +# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 +# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc +# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX +DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP +cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW +IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX +xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy +KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR +9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az +5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 +6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 +Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP +bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt +BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt +XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd +INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp +LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 +Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp +gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh +/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw +0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A +fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq +4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR +1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ +QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM +94B7IWcnMFk= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden EV Root CA" +# Serial: 10000013 +# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +7uzXLg== +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Root CA" +# Serial: 1 +# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f +# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 +# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb +BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz +MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx +FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g +Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 +fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl +LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV +WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF +TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb +5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc +CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri +wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ +wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG +m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 +F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng +WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 +2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ +0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw +F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS +g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj +qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN +h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ +ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V +btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj +Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ +8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW +gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Label: "LuxTrust Global Root 2" +# Serial: 59914338225734147123941058376788110305822489521 +# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c +# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f +# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 +-----BEGIN CERTIFICATE----- +MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL +BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV +BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw +MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B +LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F +ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem +hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1 +EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn +Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4 +zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ +96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m +j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g +DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+ +8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j +X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH +hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB +KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0 +Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT ++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL +BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9 +BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO +jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9 +loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c +qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+ +2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/ +JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre +zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf +LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+ +x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6 +oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-1" +# Serial: 15752444095811006489 +# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 +# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a +# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y +IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB +pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h +IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG +A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU +cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid +RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V +seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme +9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV +EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW +hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ +DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD +ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I +/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ +yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts +L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN +zl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-2" +# Serial: 2711694510199101698 +# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 +# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 +# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 +-----BEGIN CERTIFICATE----- +MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig +Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk +MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg +Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD +VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy +dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ +QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq +1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp +2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK +DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape +az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF +3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 +oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM +g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 +mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh +8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd +BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U +nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw +DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX +dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ +MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL +/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX +CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa +ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW +2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 +N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 +Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB +As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp +5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu +1uwJ +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor ECA-1" +# Serial: 9548242946988625984 +# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c +# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd +# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y +IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig +RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb +3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA +BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 +3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou +owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ +wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF +ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf +BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv +civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 +AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 +soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI +WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi +tJ/X5g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 146587175971765017618439757810265552097 +# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 +# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 +# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX +mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 +zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P +fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc +vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 +Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp +zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO +Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW +k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ +DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF +lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW +Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 +d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z +XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR +gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 +d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv +J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg +DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM ++SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy +F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 +SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws +E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 146587176055767053814479386953112547951 +# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b +# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d +# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg +GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu +XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd +re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu +PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 +mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K +8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj +x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR +nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 +kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok +twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp +8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT +vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT +z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA +pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb +pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB +R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R +RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk +0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC +5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF +izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn +yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 146587176140553309517047991083707763997 +# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 +# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 +# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 +-----BEGIN CERTIFICATE----- +MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A +DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk +fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA +njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 146587176229350439916519468929765261721 +# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 +# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb +# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd +-----BEGIN CERTIFICATE----- +MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l +xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 +CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx +sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign Root CA - G1" +# Serial: 235931866688319308814040 +# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac +# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c +# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD +VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU +ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH +MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO +MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv +Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz +f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO +8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq +d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM +tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt +Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB +o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD +AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x +PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM +wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d +GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH +6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby +RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI +# Label: "emSign ECC Root CA - G3" +# Serial: 287880440101571086945156 +# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 +# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 +# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG +EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo +bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ +TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s +b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw +djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 +WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS +fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB +zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq +hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB +CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD ++JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI +# Label: "emSign Root CA - C1" +# Serial: 825510296613316004955058 +# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 +# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 +# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG +A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg +SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v +dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ +BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ +HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH +3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH +GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c +xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 +aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq +TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 +/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 +kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG +YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT ++xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo +WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI +# Label: "emSign ECC Root CA - C3" +# Serial: 582948710642506000014504 +# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 +# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 +# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG +EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx +IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw +MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln +biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND +IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci +MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti +sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O +BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB +Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c +3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J +0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post +# Label: "Hongkong Post Root CA 3" +# Serial: 46170865288971385588281144162979347873371282084 +# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 +# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 +# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 +-----BEGIN CERTIFICATE----- +MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQEL +BQAwbzELMAkGA1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJ +SG9uZyBLb25nMRYwFAYDVQQKEw1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25n +a29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2MDMwMjI5NDZaFw00MjA2MDMwMjI5 +NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtvbmcxEjAQBgNVBAcT +CUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMXSG9u +Z2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCziNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFO +dem1p+/l6TWZ5Mwc50tfjTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mI +VoBc+L0sPOFMV4i707mV78vH9toxdCim5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV +9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOesL4jpNrcyCse2m5FHomY +2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj0mRiikKY +vLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+Tt +bNe/JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZb +x39ri1UbSsUgYT2uy1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+ +l2oBlKN8W4UdKjk60FSh0Tlxnf0h+bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YK +TE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsGxVd7GYYKecsAyVKvQv83j+Gj +Hno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwIDAQABo2MwYTAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e +i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEw +DQYJKoZIhvcNAQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG +7BJ8dNVI0lkUmcDrudHr9EgwW62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCk +MpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWldy8joRTnU+kLBEUx3XZL7av9YROXr +gZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov+BS5gLNdTaqX4fnk +GMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDceqFS +3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJm +Ozj/2ZQw9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+ +l6mc1X5VTMbeRRAc6uk7nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6c +JfTzPV4e0hz5sy229zdcxsshTrD3mUcYhcErulWuBurQB7Lcq9CClnXO0lD+mefP +L5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB60PZ2Pierc+xYw5F9KBa +LJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fqdBb9HxEG +mpv0 +-----END CERTIFICATE----- diff --git a/dropbox-script/certifi/core.py b/dropbox-script/certifi/core.py new file mode 100644 index 0000000..7271acf --- /dev/null +++ b/dropbox-script/certifi/core.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem. +""" +import os + + +def where(): + f = os.path.dirname(__file__) + + return os.path.join(f, 'cacert.pem') diff --git a/dropbox-script/chardet/__init__.py b/dropbox-script/chardet/__init__.py new file mode 100644 index 0000000..0f9f820 --- /dev/null +++ b/dropbox-script/chardet/__init__.py @@ -0,0 +1,39 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +from .compat import PY2, PY3 +from .universaldetector import UniversalDetector +from .version import __version__, VERSION + + +def detect(byte_str): + """ + Detect the encoding of the given byte string. + + :param byte_str: The byte sequence to examine. + :type byte_str: ``bytes`` or ``bytearray`` + """ + if not isinstance(byte_str, bytearray): + if not isinstance(byte_str, bytes): + raise TypeError('Expected object of type bytes or bytearray, got: ' + '{0}'.format(type(byte_str))) + else: + byte_str = bytearray(byte_str) + detector = UniversalDetector() + detector.feed(byte_str) + return detector.close() diff --git a/dropbox-script/chardet/big5freq.py b/dropbox-script/chardet/big5freq.py new file mode 100644 index 0000000..38f3251 --- /dev/null +++ b/dropbox-script/chardet/big5freq.py @@ -0,0 +1,386 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +BIG5_CHAR_TO_FREQ_ORDER = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) + diff --git a/dropbox-script/chardet/big5prober.py b/dropbox-script/chardet/big5prober.py new file mode 100644 index 0000000..98f9970 --- /dev/null +++ b/dropbox-script/chardet/big5prober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import Big5DistributionAnalysis +from .mbcssm import BIG5_SM_MODEL + + +class Big5Prober(MultiByteCharSetProber): + def __init__(self): + super(Big5Prober, self).__init__() + self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) + self.distribution_analyzer = Big5DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "Big5" + + @property + def language(self): + return "Chinese" diff --git a/dropbox-script/chardet/chardistribution.py b/dropbox-script/chardet/chardistribution.py new file mode 100644 index 0000000..c0395f4 --- /dev/null +++ b/dropbox-script/chardet/chardistribution.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, + EUCTW_TYPICAL_DISTRIBUTION_RATIO) +from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, + EUCKR_TYPICAL_DISTRIBUTION_RATIO) +from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, + GB2312_TYPICAL_DISTRIBUTION_RATIO) +from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, + BIG5_TYPICAL_DISTRIBUTION_RATIO) +from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, + JIS_TYPICAL_DISTRIBUTION_RATIO) + + +class CharDistributionAnalysis(object): + ENOUGH_DATA_THRESHOLD = 1024 + SURE_YES = 0.99 + SURE_NO = 0.01 + MINIMUM_DATA_THRESHOLD = 3 + + def __init__(self): + # Mapping table to get frequency order from char order (get from + # GetOrder()) + self._char_to_freq_order = None + self._table_size = None # Size of above table + # This is a constant value which varies from language to language, + # used in calculating confidence. See + # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html + # for further detail. + self.typical_distribution_ratio = None + self._done = None + self._total_chars = None + self._freq_chars = None + self.reset() + + def reset(self): + """reset analyser, clear any state""" + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + self._total_chars = 0 # Total characters encountered + # The number of characters whose frequency order is less than 512 + self._freq_chars = 0 + + def feed(self, char, char_len): + """feed a character with known length""" + if char_len == 2: + # we only care about 2-bytes character in our distribution analysis + order = self.get_order(char) + else: + order = -1 + if order >= 0: + self._total_chars += 1 + # order is valid + if order < self._table_size: + if 512 > self._char_to_freq_order[order]: + self._freq_chars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: + return self.SURE_NO + + if self._total_chars != self._freq_chars: + r = (self._freq_chars / ((self._total_chars - self._freq_chars) + * self.typical_distribution_ratio)) + if r < self.SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return self.SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._total_chars > self.ENOUGH_DATA_THRESHOLD + + def get_order(self, byte_str): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCTWDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER + self._table_size = EUCTW_TABLE_SIZE + self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCKRDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(GB2312DistributionAnalysis, self).__init__() + self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER + self._table_size = GB2312_TABLE_SIZE + self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(Big5DistributionAnalysis, self).__init__() + self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER + self._table_size = BIG5_TABLE_SIZE + self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(SJISDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCJPDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = byte_str[0] + if char >= 0xA0: + return 94 * (char - 0xA1) + byte_str[1] - 0xa1 + else: + return -1 diff --git a/dropbox-script/chardet/charsetgroupprober.py b/dropbox-script/chardet/charsetgroupprober.py new file mode 100644 index 0000000..8b3738e --- /dev/null +++ b/dropbox-script/chardet/charsetgroupprober.py @@ -0,0 +1,106 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState +from .charsetprober import CharSetProber + + +class CharSetGroupProber(CharSetProber): + def __init__(self, lang_filter=None): + super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) + self._active_num = 0 + self.probers = [] + self._best_guess_prober = None + + def reset(self): + super(CharSetGroupProber, self).reset() + self._active_num = 0 + for prober in self.probers: + if prober: + prober.reset() + prober.active = True + self._active_num += 1 + self._best_guess_prober = None + + @property + def charset_name(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.charset_name + + @property + def language(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.language + + def feed(self, byte_str): + for prober in self.probers: + if not prober: + continue + if not prober.active: + continue + state = prober.feed(byte_str) + if not state: + continue + if state == ProbingState.FOUND_IT: + self._best_guess_prober = prober + return self.state + elif state == ProbingState.NOT_ME: + prober.active = False + self._active_num -= 1 + if self._active_num <= 0: + self._state = ProbingState.NOT_ME + return self.state + return self.state + + def get_confidence(self): + state = self.state + if state == ProbingState.FOUND_IT: + return 0.99 + elif state == ProbingState.NOT_ME: + return 0.01 + best_conf = 0.0 + self._best_guess_prober = None + for prober in self.probers: + if not prober: + continue + if not prober.active: + self.logger.debug('%s not active', prober.charset_name) + continue + conf = prober.get_confidence() + self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) + if best_conf < conf: + best_conf = conf + self._best_guess_prober = prober + if not self._best_guess_prober: + return 0.0 + return best_conf diff --git a/dropbox-script/chardet/charsetprober.py b/dropbox-script/chardet/charsetprober.py new file mode 100644 index 0000000..eac4e59 --- /dev/null +++ b/dropbox-script/chardet/charsetprober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging +import re + +from .enums import ProbingState + + +class CharSetProber(object): + + SHORTCUT_THRESHOLD = 0.95 + + def __init__(self, lang_filter=None): + self._state = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + + def reset(self): + self._state = ProbingState.DETECTING + + @property + def charset_name(self): + return None + + def feed(self, buf): + pass + + @property + def state(self): + return self._state + + def get_confidence(self): + return 0.0 + + @staticmethod + def filter_high_byte_only(buf): + buf = re.sub(b'([\x00-\x7F])+', b' ', buf) + return buf + + @staticmethod + def filter_international_words(buf): + """ + We define three types of bytes: + alphabet: english alphabets [a-zA-Z] + international: international characters [\x80-\xFF] + marker: everything else [^a-zA-Z\x80-\xFF] + + The input buffer can be thought to contain a series of words delimited + by markers. This function works to filter all words that contain at + least one international character. All contiguous sequences of markers + are replaced by a single space ascii character. + + This filter applies to all scripts which do not use English characters. + """ + filtered = bytearray() + + # This regex expression filters out only words that have at-least one + # international character. The word may include one marker character at + # the end. + words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', + buf) + + for word in words: + filtered.extend(word[:-1]) + + # If the last character in the word is a marker, replace it with a + # space as markers shouldn't affect our analysis (they are used + # similarly across all languages and may thus have similar + # frequencies). + last_char = word[-1:] + if not last_char.isalpha() and last_char < b'\x80': + last_char = b' ' + filtered.extend(last_char) + + return filtered + + @staticmethod + def filter_with_english_letters(buf): + """ + Returns a copy of ``buf`` that retains only the sequences of English + alphabet and high byte characters that are not between <> characters. + Also retains English alphabet and high byte characters immediately + before occurrences of >. + + This filter can be applied to all scripts which contain both English + characters and extended ASCII characters, but is currently only used by + ``Latin1Prober``. + """ + filtered = bytearray() + in_tag = False + prev = 0 + + for curr in range(len(buf)): + # Slice here to get bytes instead of an int with Python 3 + buf_char = buf[curr:curr + 1] + # Check if we're coming out of or entering an HTML tag + if buf_char == b'>': + in_tag = False + elif buf_char == b'<': + in_tag = True + + # If current character is not extended-ASCII and not alphabetic... + if buf_char < b'\x80' and not buf_char.isalpha(): + # ...and we're not in a tag + if curr > prev and not in_tag: + # Keep everything after last non-extended-ASCII, + # non-alphabetic character + filtered.extend(buf[prev:curr]) + # Output a space to delimit stretch we kept + filtered.extend(b' ') + prev = curr + 1 + + # If we're not in a tag... + if not in_tag: + # Keep everything after last non-extended-ASCII, non-alphabetic + # character + filtered.extend(buf[prev:]) + + return filtered diff --git a/dropbox-script/chardet/cli/__init__.py b/dropbox-script/chardet/cli/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/dropbox-script/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/dropbox-script/chardet/cli/chardetect.py b/dropbox-script/chardet/cli/chardetect.py new file mode 100644 index 0000000..f0a4cc5 --- /dev/null +++ b/dropbox-script/chardet/cli/chardetect.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +""" +Script which takes one or more file paths and reports on their detected +encodings + +Example:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +If no paths are provided, it takes its input from stdin. + +""" + +from __future__ import absolute_import, print_function, unicode_literals + +import argparse +import sys + +from chardet import __version__ +from chardet.compat import PY2 +from chardet.universaldetector import UniversalDetector + + +def description_of(lines, name='stdin'): + """ + Return a string describing the probable encoding of a file or + list of strings. + + :param lines: The lines to get the encoding of. + :type lines: Iterable of bytes + :param name: Name of file or collection of lines + :type name: str + """ + u = UniversalDetector() + for line in lines: + line = bytearray(line) + u.feed(line) + # shortcut out of the loop to save reading further - particularly useful if we read a BOM. + if u.done: + break + u.close() + result = u.result + if PY2: + name = name.decode(sys.getfilesystemencoding(), 'ignore') + if result['encoding']: + return '{0}: {1} with confidence {2}'.format(name, result['encoding'], + result['confidence']) + else: + return '{0}: no result'.format(name) + + +def main(argv=None): + """ + Handles command line arguments and gets things started. + + :param argv: List of arguments, as if specified on the command-line. + If None, ``sys.argv[1:]`` is used instead. + :type argv: list of str + """ + # Get command line arguments + parser = argparse.ArgumentParser( + description="Takes one or more file paths and reports their detected \ + encodings") + parser.add_argument('input', + help='File whose encoding we would like to determine. \ + (default: stdin)', + type=argparse.FileType('rb'), nargs='*', + default=[sys.stdin if PY2 else sys.stdin.buffer]) + parser.add_argument('--version', action='version', + version='%(prog)s {0}'.format(__version__)) + args = parser.parse_args(argv) + + for f in args.input: + if f.isatty(): + print("You are running chardetect interactively. Press " + + "CTRL-D twice at the start of a blank line to signal the " + + "end of your input. If you want help, run chardetect " + + "--help\n", file=sys.stderr) + print(description_of(f, f.name)) + + +if __name__ == '__main__': + main() diff --git a/dropbox-script/chardet/codingstatemachine.py b/dropbox-script/chardet/codingstatemachine.py new file mode 100644 index 0000000..68fba44 --- /dev/null +++ b/dropbox-script/chardet/codingstatemachine.py @@ -0,0 +1,88 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging + +from .enums import MachineState + + +class CodingStateMachine(object): + """ + A state machine to verify a byte sequence for a particular encoding. For + each byte the detector receives, it will feed that byte to every active + state machine available, one byte at a time. The state machine changes its + state based on its previous state and the byte it receives. There are 3 + states in a state machine that are of interest to an auto-detector: + + START state: This is the state to start with, or a legal byte sequence + (i.e. a valid code point) for character has been identified. + + ME state: This indicates that the state machine identified a byte sequence + that is specific to the charset it is designed for and that + there is no other possible encoding which can contain this byte + sequence. This will to lead to an immediate positive answer for + the detector. + + ERROR state: This indicates the state machine identified an illegal byte + sequence for that encoding. This will lead to an immediate + negative answer for this encoding. Detector will exclude this + encoding from consideration from here on. + """ + def __init__(self, sm): + self._model = sm + self._curr_byte_pos = 0 + self._curr_char_len = 0 + self._curr_state = None + self.logger = logging.getLogger(__name__) + self.reset() + + def reset(self): + self._curr_state = MachineState.START + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + byte_class = self._model['class_table'][c] + if self._curr_state == MachineState.START: + self._curr_byte_pos = 0 + self._curr_char_len = self._model['char_len_table'][byte_class] + # from byte's class and state_table, we get its next state + curr_state = (self._curr_state * self._model['class_factor'] + + byte_class) + self._curr_state = self._model['state_table'][curr_state] + self._curr_byte_pos += 1 + return self._curr_state + + def get_current_charlen(self): + return self._curr_char_len + + def get_coding_state_machine(self): + return self._model['name'] + + @property + def language(self): + return self._model['language'] diff --git a/dropbox-script/chardet/compat.py b/dropbox-script/chardet/compat.py new file mode 100644 index 0000000..ddd7468 --- /dev/null +++ b/dropbox-script/chardet/compat.py @@ -0,0 +1,34 @@ +######################## BEGIN LICENSE BLOCK ######################## +# Contributor(s): +# Dan Blanchard +# Ian Cordasco +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys + + +if sys.version_info < (3, 0): + PY2 = True + PY3 = False + base_str = (str, unicode) + text_type = unicode +else: + PY2 = False + PY3 = True + base_str = (bytes, str) + text_type = str diff --git a/dropbox-script/chardet/cp949prober.py b/dropbox-script/chardet/cp949prober.py new file mode 100644 index 0000000..efd793a --- /dev/null +++ b/dropbox-script/chardet/cp949prober.py @@ -0,0 +1,49 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import EUCKRDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import CP949_SM_MODEL + + +class CP949Prober(MultiByteCharSetProber): + def __init__(self): + super(CP949Prober, self).__init__() + self.coding_sm = CodingStateMachine(CP949_SM_MODEL) + # NOTE: CP949 is a superset of EUC-KR, so the distribution should be + # not different. + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "CP949" + + @property + def language(self): + return "Korean" diff --git a/dropbox-script/chardet/enums.py b/dropbox-script/chardet/enums.py new file mode 100644 index 0000000..0451207 --- /dev/null +++ b/dropbox-script/chardet/enums.py @@ -0,0 +1,76 @@ +""" +All of the Enums that are used throughout the chardet package. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + + +class InputState(object): + """ + This enum represents the different states a universal detector can be in. + """ + PURE_ASCII = 0 + ESC_ASCII = 1 + HIGH_BYTE = 2 + + +class LanguageFilter(object): + """ + This enum represents the different language filters we can apply to a + ``UniversalDetector``. + """ + CHINESE_SIMPLIFIED = 0x01 + CHINESE_TRADITIONAL = 0x02 + JAPANESE = 0x04 + KOREAN = 0x08 + NON_CJK = 0x10 + ALL = 0x1F + CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL + CJK = CHINESE | JAPANESE | KOREAN + + +class ProbingState(object): + """ + This enum represents the different states a prober can be in. + """ + DETECTING = 0 + FOUND_IT = 1 + NOT_ME = 2 + + +class MachineState(object): + """ + This enum represents the different states a state machine can be in. + """ + START = 0 + ERROR = 1 + ITS_ME = 2 + + +class SequenceLikelihood(object): + """ + This enum represents the likelihood of a character following the previous one. + """ + NEGATIVE = 0 + UNLIKELY = 1 + LIKELY = 2 + POSITIVE = 3 + + @classmethod + def get_num_categories(cls): + """:returns: The number of likelihood categories in the enum.""" + return 4 + + +class CharacterCategory(object): + """ + This enum represents the different categories language models for + ``SingleByteCharsetProber`` put characters into. + + Anything less than CONTROL is considered a letter. + """ + UNDEFINED = 255 + LINE_BREAK = 254 + SYMBOL = 253 + DIGIT = 252 + CONTROL = 251 diff --git a/dropbox-script/chardet/escprober.py b/dropbox-script/chardet/escprober.py new file mode 100644 index 0000000..c70493f --- /dev/null +++ b/dropbox-script/chardet/escprober.py @@ -0,0 +1,101 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .enums import LanguageFilter, ProbingState, MachineState +from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, + ISO2022KR_SM_MODEL) + + +class EscCharSetProber(CharSetProber): + """ + This CharSetProber uses a "code scheme" approach for detecting encodings, + whereby easily recognizable escape or shift sequences are relied on to + identify these encodings. + """ + + def __init__(self, lang_filter=None): + super(EscCharSetProber, self).__init__(lang_filter=lang_filter) + self.coding_sm = [] + if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: + self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) + self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) + if self.lang_filter & LanguageFilter.JAPANESE: + self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) + if self.lang_filter & LanguageFilter.KOREAN: + self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) + self.active_sm_count = None + self._detected_charset = None + self._detected_language = None + self._state = None + self.reset() + + def reset(self): + super(EscCharSetProber, self).reset() + for coding_sm in self.coding_sm: + if not coding_sm: + continue + coding_sm.active = True + coding_sm.reset() + self.active_sm_count = len(self.coding_sm) + self._detected_charset = None + self._detected_language = None + + @property + def charset_name(self): + return self._detected_charset + + @property + def language(self): + return self._detected_language + + def get_confidence(self): + if self._detected_charset: + return 0.99 + else: + return 0.00 + + def feed(self, byte_str): + for c in byte_str: + for coding_sm in self.coding_sm: + if not coding_sm or not coding_sm.active: + continue + coding_state = coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + coding_sm.active = False + self.active_sm_count -= 1 + if self.active_sm_count <= 0: + self._state = ProbingState.NOT_ME + return self.state + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + self._detected_charset = coding_sm.get_coding_state_machine() + self._detected_language = coding_sm.language + return self.state + + return self.state diff --git a/dropbox-script/chardet/escsm.py b/dropbox-script/chardet/escsm.py new file mode 100644 index 0000000..0069523 --- /dev/null +++ b/dropbox-script/chardet/escsm.py @@ -0,0 +1,246 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +HZ_CLS = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_ST = ( +MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 + 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f + 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 + 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f +) + +HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +HZ_SM_MODEL = {'class_table': HZ_CLS, + 'class_factor': 6, + 'state_table': HZ_ST, + 'char_len_table': HZ_CHAR_LEN_TABLE, + 'name': "HZ-GB-2312", + 'language': 'Chinese'} + +ISO2022CN_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 + 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f +) + +ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, + 'class_factor': 9, + 'state_table': ISO2022CN_ST, + 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, + 'name': "ISO-2022-CN", + 'language': 'Chinese'} + +ISO2022JP_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 +) + +ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, + 'class_factor': 10, + 'state_table': ISO2022JP_ST, + 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, + 'name': "ISO-2022-JP", + 'language': 'Japanese'} + +ISO2022KR_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 +) + +ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, + 'class_factor': 6, + 'state_table': ISO2022KR_ST, + 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, + 'name': "ISO-2022-KR", + 'language': 'Korean'} + + diff --git a/dropbox-script/chardet/eucjpprober.py b/dropbox-script/chardet/eucjpprober.py new file mode 100644 index 0000000..20ce8f7 --- /dev/null +++ b/dropbox-script/chardet/eucjpprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState, MachineState +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCJPDistributionAnalysis +from .jpcntx import EUCJPContextAnalysis +from .mbcssm import EUCJP_SM_MODEL + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + super(EUCJPProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) + self.distribution_analyzer = EUCJPDistributionAnalysis() + self.context_analyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + super(EUCJPProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return "EUC-JP" + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char, char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/dropbox-script/chardet/euckrfreq.py b/dropbox-script/chardet/euckrfreq.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/dropbox-script/chardet/euckrfreq.py @@ -0,0 +1,195 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKR_CHAR_TO_FREQ_ORDER = ( + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +) + diff --git a/dropbox-script/chardet/euckrprober.py b/dropbox-script/chardet/euckrprober.py new file mode 100644 index 0000000..345a060 --- /dev/null +++ b/dropbox-script/chardet/euckrprober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCKRDistributionAnalysis +from .mbcssm import EUCKR_SM_MODEL + + +class EUCKRProber(MultiByteCharSetProber): + def __init__(self): + super(EUCKRProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-KR" + + @property + def language(self): + return "Korean" diff --git a/dropbox-script/chardet/euctwfreq.py b/dropbox-script/chardet/euctwfreq.py new file mode 100644 index 0000000..ed7a995 --- /dev/null +++ b/dropbox-script/chardet/euctwfreq.py @@ -0,0 +1,387 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 5376 + +EUCTW_CHAR_TO_FREQ_ORDER = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +) + diff --git a/dropbox-script/chardet/euctwprober.py b/dropbox-script/chardet/euctwprober.py new file mode 100644 index 0000000..35669cc --- /dev/null +++ b/dropbox-script/chardet/euctwprober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTW_SM_MODEL + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + super(EUCTWProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) + self.distribution_analyzer = EUCTWDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-TW" + + @property + def language(self): + return "Taiwan" diff --git a/dropbox-script/chardet/gb2312freq.py b/dropbox-script/chardet/gb2312freq.py new file mode 100644 index 0000000..697837b --- /dev/null +++ b/dropbox-script/chardet/gb2312freq.py @@ -0,0 +1,283 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312_CHAR_TO_FREQ_ORDER = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +) + diff --git a/dropbox-script/chardet/gb2312prober.py b/dropbox-script/chardet/gb2312prober.py new file mode 100644 index 0000000..8446d2d --- /dev/null +++ b/dropbox-script/chardet/gb2312prober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import GB2312DistributionAnalysis +from .mbcssm import GB2312_SM_MODEL + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + super(GB2312Prober, self).__init__() + self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) + self.distribution_analyzer = GB2312DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "GB2312" + + @property + def language(self): + return "Chinese" diff --git a/dropbox-script/chardet/hebrewprober.py b/dropbox-script/chardet/hebrewprober.py new file mode 100644 index 0000000..b0e1bf4 --- /dev/null +++ b/dropbox-script/chardet/hebrewprober.py @@ -0,0 +1,292 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +class HebrewProber(CharSetProber): + # windows-1255 / ISO-8859-8 code points of interest + FINAL_KAF = 0xea + NORMAL_KAF = 0xeb + FINAL_MEM = 0xed + NORMAL_MEM = 0xee + FINAL_NUN = 0xef + NORMAL_NUN = 0xf0 + FINAL_PE = 0xf3 + NORMAL_PE = 0xf4 + FINAL_TSADI = 0xf5 + NORMAL_TSADI = 0xf6 + + # Minimum Visual vs Logical final letter score difference. + # If the difference is below this, don't rely solely on the final letter score + # distance. + MIN_FINAL_CHAR_DISTANCE = 5 + + # Minimum Visual vs Logical model score difference. + # If the difference is below this, don't rely at all on the model score + # distance. + MIN_MODEL_DISTANCE = 0.01 + + VISUAL_HEBREW_NAME = "ISO-8859-8" + LOGICAL_HEBREW_NAME = "windows-1255" + + def __init__(self): + super(HebrewProber, self).__init__() + self._final_char_logical_score = None + self._final_char_visual_score = None + self._prev = None + self._before_prev = None + self._logical_prober = None + self._visual_prober = None + self.reset() + + def reset(self): + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._prev = ' ' + self._before_prev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._logical_prober = logicalProber + self._visual_prober = visualProber + + def is_final(self, c): + return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, + self.FINAL_PE, self.FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return c in [self.NORMAL_KAF, self.NORMAL_MEM, + self.NORMAL_NUN, self.NORMAL_PE] + + def feed(self, byte_str): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.state == ProbingState.NOT_ME: + # Both model probers say it's not them. No reason to continue. + return ProbingState.NOT_ME + + byte_str = self.filter_high_byte_only(byte_str) + + for cur in byte_str: + if cur == ' ': + # We stand on a space - a word just ended + if self._before_prev != ' ': + # next-to-last char was not a space so self._prev is not a + # 1 letter word + if self.is_final(self._prev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._final_char_logical_score += 1 + elif self.is_non_final(self._prev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._final_char_visual_score += 1 + else: + # Not standing on a space + if ((self._before_prev == ' ') and + (self.is_final(self._prev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._final_char_visual_score += 1 + self._before_prev = self._prev + self._prev = cur + + # Forever detecting, till the end or until both model probers return + # ProbingState.NOT_ME (handled above) + return ProbingState.DETECTING + + @property + def charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._final_char_logical_score - self._final_char_visual_score + if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._logical_prober.get_confidence() + - self._visual_prober.get_confidence()) + if modelsub > self.MIN_MODEL_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if modelsub < -self.MIN_MODEL_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return self.VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return self.LOGICAL_HEBREW_NAME + + @property + def language(self): + return 'Hebrew' + + @property + def state(self): + # Remain active as long as any of the model probers are active. + if (self._logical_prober.state == ProbingState.NOT_ME) and \ + (self._visual_prober.state == ProbingState.NOT_ME): + return ProbingState.NOT_ME + return ProbingState.DETECTING diff --git a/dropbox-script/chardet/jisfreq.py b/dropbox-script/chardet/jisfreq.py new file mode 100644 index 0000000..83fc082 --- /dev/null +++ b/dropbox-script/chardet/jisfreq.py @@ -0,0 +1,325 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JIS_CHAR_TO_FREQ_ORDER = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +) + + diff --git a/dropbox-script/chardet/jpcntx.py b/dropbox-script/chardet/jpcntx.py new file mode 100644 index 0000000..20044e4 --- /dev/null +++ b/dropbox-script/chardet/jpcntx.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis(object): + NUM_OF_CATEGORY = 6 + DONT_KNOW = -1 + ENOUGH_REL_THRESHOLD = 100 + MAX_REL_THRESHOLD = 1000 + MINIMUM_DATA_THRESHOLD = 4 + + def __init__(self): + self._total_rel = None + self._rel_sample = None + self._need_to_skip_char_num = None + self._last_char_order = None + self._done = None + self.reset() + + def reset(self): + self._total_rel = 0 # total sequence received + # category counters, each integer counts sequence in its category + self._rel_sample = [0] * self.NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._need_to_skip_char_num = 0 + self._last_char_order = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + + def feed(self, byte_str, num_bytes): + if self._done: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._need_to_skip_char_num + while i < num_bytes: + order, char_len = self.get_order(byte_str[i:i + 2]) + i += char_len + if i > num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 + else: + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True + break + self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._last_char_order = order + + def got_enough_data(self): + return self._total_rel > self.ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel + else: + return self.DONT_KNOW + + def get_order(self, byte_str): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + super(SJISContextAnalysis, self).__init__() + self._charset_name = "SHIFT_JIS" + + @property + def charset_name(self): + return self._charset_name + + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self._charset_name = "CP932" + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, char_len + + return -1, char_len + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + char_len = 2 + elif first_char == 0x8F: + char_len = 3 + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, char_len + + return -1, char_len + + diff --git a/dropbox-script/chardet/langbulgarianmodel.py b/dropbox-script/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..2aa4fb2 --- /dev/null +++ b/dropbox-script/chardet/langbulgarianmodel.py @@ -0,0 +1,228 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +# this table is modified base on win1251BulgarianCharToOrderMap, so +# only number <64 is sure valid + +Latin5_BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +) + +win1251BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 96.9392% +# first 1024 sequences:3.0618% +# rest sequences: 0.2992% +# negative sequences: 0.0020% +BulgarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +) + +Latin5BulgarianModel = { + 'char_to_order_map': Latin5_BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Bulgairan', +} + +Win1251BulgarianModel = { + 'char_to_order_map': win1251BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Bulgarian', +} diff --git a/dropbox-script/chardet/langcyrillicmodel.py b/dropbox-script/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..e5f9a1f --- /dev/null +++ b/dropbox-script/chardet/langcyrillicmodel.py @@ -0,0 +1,333 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# KOI8-R language model +# Character Mapping Table: +KOI8R_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'char_to_order_map': KOI8R_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "KOI8-R", + 'language': 'Russian', +} + +Win1251CyrillicModel = { + 'char_to_order_map': win1251_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Russian', +} + +Latin5CyrillicModel = { + 'char_to_order_map': latin5_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Russian', +} + +MacCyrillicModel = { + 'char_to_order_map': macCyrillic_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "MacCyrillic", + 'language': 'Russian', +} + +Ibm866Model = { + 'char_to_order_map': IBM866_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM866", + 'language': 'Russian', +} + +Ibm855Model = { + 'char_to_order_map': IBM855_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM855", + 'language': 'Russian', +} diff --git a/dropbox-script/chardet/langgreekmodel.py b/dropbox-script/chardet/langgreekmodel.py new file mode 100644 index 0000000..5332221 --- /dev/null +++ b/dropbox-script/chardet/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'char_to_order_map': Latin7_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-7", + 'language': 'Greek', +} + +Win1253GreekModel = { + 'char_to_order_map': win1253_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "windows-1253", + 'language': 'Greek', +} diff --git a/dropbox-script/chardet/langhebrewmodel.py b/dropbox-script/chardet/langhebrewmodel.py new file mode 100644 index 0000000..58f4c87 --- /dev/null +++ b/dropbox-script/chardet/langhebrewmodel.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +WIN1255_CHAR_TO_ORDER_MAP = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HEBREW_LANG_MODEL = ( +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { + 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, + 'precedence_matrix': HEBREW_LANG_MODEL, + 'typical_positive_ratio': 0.984004, + 'keep_english_letter': False, + 'charset_name': "windows-1255", + 'language': 'Hebrew', +} diff --git a/dropbox-script/chardet/langhungarianmodel.py b/dropbox-script/chardet/langhungarianmodel.py new file mode 100644 index 0000000..bb7c095 --- /dev/null +++ b/dropbox-script/chardet/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { + 'char_to_order_map': Latin2_HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-2", + 'language': 'Hungarian', +} + +Win1250HungarianModel = { + 'char_to_order_map': win1250HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "windows-1250", + 'language': 'Hungarian', +} diff --git a/dropbox-script/chardet/langthaimodel.py b/dropbox-script/chardet/langthaimodel.py new file mode 100644 index 0000000..15f94c2 --- /dev/null +++ b/dropbox-script/chardet/langthaimodel.py @@ -0,0 +1,199 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { + 'char_to_order_map': TIS620CharToOrderMap, + 'precedence_matrix': ThaiLangModel, + 'typical_positive_ratio': 0.926386, + 'keep_english_letter': False, + 'charset_name': "TIS-620", + 'language': 'Thai', +} diff --git a/dropbox-script/chardet/langturkishmodel.py b/dropbox-script/chardet/langturkishmodel.py new file mode 100644 index 0000000..a427a45 --- /dev/null +++ b/dropbox-script/chardet/langturkishmodel.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Özgür Baskın - Turkish Language Model +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin5_TurkishCharToOrderMap = ( +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, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, + 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, +255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, + 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, +180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, +164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, +150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, + 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, +124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, + 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, + 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, + 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, +) + +TurkishLangModel = ( +3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, +3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, +3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, +3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, +3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, +3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, +2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, +3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, +1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, +3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, +3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, +2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, +2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, +3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, +0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, +3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, +3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, +0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, +1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, +3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, +1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, +3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, +0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, +3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, +1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, +1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, +2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, +2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, +3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, +1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, +0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, +3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, +0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, +3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, +1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, +2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, +0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, +3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, +0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, +0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, +3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, +0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, +0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, +3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, +0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, +3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, +0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, +0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, +3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, +0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, +3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, +0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, +0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, +0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, +0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, +0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, +0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, +1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, +0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, +0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, +3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, +0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, +2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, +2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, +0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, +0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin5TurkishModel = { + 'char_to_order_map': Latin5_TurkishCharToOrderMap, + 'precedence_matrix': TurkishLangModel, + 'typical_positive_ratio': 0.970290, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-9", + 'language': 'Turkish', +} diff --git a/dropbox-script/chardet/latin1prober.py b/dropbox-script/chardet/latin1prober.py new file mode 100644 index 0000000..7d1e8c2 --- /dev/null +++ b/dropbox-script/chardet/latin1prober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( +# UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + + +class Latin1Prober(CharSetProber): + def __init__(self): + super(Latin1Prober, self).__init__() + self._last_char_class = None + self._freq_counter = None + self.reset() + + def reset(self): + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + @property + def charset_name(self): + return "ISO-8859-1" + + @property + def language(self): + return "" + + def feed(self, byte_str): + byte_str = self.filter_with_english_letters(byte_str) + for c in byte_str: + char_class = Latin1_CharToClass[c] + freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + + char_class] + if freq == 0: + self._state = ProbingState.NOT_ME + break + self._freq_counter[freq] += 1 + self._last_char_class = char_class + + return self.state + + def get_confidence(self): + if self.state == ProbingState.NOT_ME: + return 0.01 + + total = sum(self._freq_counter) + if total < 0.01: + confidence = 0.0 + else: + confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) + / total) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence = confidence * 0.73 + return confidence diff --git a/dropbox-script/chardet/mbcharsetprober.py b/dropbox-script/chardet/mbcharsetprober.py new file mode 100644 index 0000000..6256ecf --- /dev/null +++ b/dropbox-script/chardet/mbcharsetprober.py @@ -0,0 +1,91 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState + + +class MultiByteCharSetProber(CharSetProber): + """ + MultiByteCharSetProber + """ + + def __init__(self, lang_filter=None): + super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) + self.distribution_analyzer = None + self.coding_sm = None + self._last_char = [0, 0] + + def reset(self): + super(MultiByteCharSetProber, self).reset() + if self.coding_sm: + self.coding_sm.reset() + if self.distribution_analyzer: + self.distribution_analyzer.reset() + self._last_char = [0, 0] + + @property + def charset_name(self): + raise NotImplementedError + + @property + def language(self): + raise NotImplementedError + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.distribution_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + return self.distribution_analyzer.get_confidence() diff --git a/dropbox-script/chardet/mbcsgroupprober.py b/dropbox-script/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..530abe7 --- /dev/null +++ b/dropbox-script/chardet/mbcsgroupprober.py @@ -0,0 +1,54 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .utf8prober import UTF8Prober +from .sjisprober import SJISProber +from .eucjpprober import EUCJPProber +from .gb2312prober import GB2312Prober +from .euckrprober import EUCKRProber +from .cp949prober import CP949Prober +from .big5prober import Big5Prober +from .euctwprober import EUCTWProber + + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self, lang_filter=None): + super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) + self.probers = [ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + CP949Prober(), + Big5Prober(), + EUCTWProber() + ] + self.reset() diff --git a/dropbox-script/chardet/mbcssm.py b/dropbox-script/chardet/mbcssm.py new file mode 100644 index 0000000..8360d0f --- /dev/null +++ b/dropbox-script/chardet/mbcssm.py @@ -0,0 +1,572 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +# BIG5 + +BIG5_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +BIG5_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 +) + +BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) + +BIG5_SM_MODEL = {'class_table': BIG5_CLS, + 'class_factor': 5, + 'state_table': BIG5_ST, + 'char_len_table': BIG5_CHAR_LEN_TABLE, + 'name': 'Big5'} + +# CP949 + +CP949_CLS = ( + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f + 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f + 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f + 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f + 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f + 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f + 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f + 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f + 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af + 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf + 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff +) + +CP949_ST = ( +#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 +) + +CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) + +CP949_SM_MODEL = {'class_table': CP949_CLS, + 'class_factor': 10, + 'state_table': CP949_ST, + 'char_len_table': CP949_CHAR_LEN_TABLE, + 'name': 'CP949'} + +# EUC-JP + +EUCJP_CLS = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5 # f8 - ff +) + +EUCJP_ST = ( + 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f + 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 +) + +EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) + +EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, + 'class_factor': 6, + 'state_table': EUCJP_ST, + 'char_len_table': EUCJP_CHAR_LEN_TABLE, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0 # f8 - ff +) + +EUCKR_ST = ( + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f +) + +EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) + +EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, + 'class_factor': 4, + 'state_table': EUCKR_ST, + 'char_len_table': EUCKR_CHAR_LEN_TABLE, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_CLS = ( + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +EUCTW_ST = ( + MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 + MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 + MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) + +EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, + 'class_factor': 7, + 'state_table': EUCTW_ST, + 'char_len_table': EUCTW_CHAR_LEN_TABLE, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0 # f8 - ff +) + +GB2312_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 + 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validating +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) + +GB2312_SM_MODEL = {'class_table': GB2312_CLS, + 'class_factor': 7, + 'state_table': GB2312_ST, + 'char_len_table': GB2312_CHAR_LEN_TABLE, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,2,2,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,0,0,0) # f8 - ff + + +SJIS_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 +) + +SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) + +SJIS_SM_MODEL = {'class_table': SJIS_CLS, + 'class_factor': 6, + 'state_table': SJIS_ST, + 'char_len_table': SJIS_CHAR_LEN_TABLE, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2BE_ST = ( + 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 + 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 + 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f + 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) + +UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, + 'class_factor': 6, + 'state_table': UCS2BE_ST, + 'char_len_table': UCS2BE_CHAR_LEN_TABLE, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2LE_ST = ( + 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 + 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) + +UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, + 'class_factor': 6, + 'state_table': UCS2LE_ST, + 'char_len_table': UCS2LE_CHAR_LEN_TABLE, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0 # f8 - ff +) + +UTF8_ST = ( + MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f + MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f + MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f + MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f + MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af + MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf +) + +UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8_SM_MODEL = {'class_table': UTF8_CLS, + 'class_factor': 16, + 'state_table': UTF8_ST, + 'char_len_table': UTF8_CHAR_LEN_TABLE, + 'name': 'UTF-8'} diff --git a/dropbox-script/chardet/sbcharsetprober.py b/dropbox-script/chardet/sbcharsetprober.py new file mode 100644 index 0000000..0adb51d --- /dev/null +++ b/dropbox-script/chardet/sbcharsetprober.py @@ -0,0 +1,132 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import CharacterCategory, ProbingState, SequenceLikelihood + + +class SingleByteCharSetProber(CharSetProber): + SAMPLE_SIZE = 64 + SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 + POSITIVE_SHORTCUT_THRESHOLD = 0.95 + NEGATIVE_SHORTCUT_THRESHOLD = 0.05 + + def __init__(self, model, reversed=False, name_prober=None): + super(SingleByteCharSetProber, self).__init__() + self._model = model + # TRUE if we need to reverse every pair in the model lookup + self._reversed = reversed + # Optional auxiliary prober for name decision + self._name_prober = name_prober + self._last_order = None + self._seq_counters = None + self._total_seqs = None + self._total_char = None + self._freq_char = None + self.reset() + + def reset(self): + super(SingleByteCharSetProber, self).reset() + # char order of last character + self._last_order = 255 + self._seq_counters = [0] * SequenceLikelihood.get_num_categories() + self._total_seqs = 0 + self._total_char = 0 + # characters that fall in our sampling range + self._freq_char = 0 + + @property + def charset_name(self): + if self._name_prober: + return self._name_prober.charset_name + else: + return self._model['charset_name'] + + @property + def language(self): + if self._name_prober: + return self._name_prober.language + else: + return self._model.get('language') + + def feed(self, byte_str): + if not self._model['keep_english_letter']: + byte_str = self.filter_international_words(byte_str) + if not byte_str: + return self.state + char_to_order_map = self._model['char_to_order_map'] + for i, c in enumerate(byte_str): + # XXX: Order is in range 1-64, so one would think we want 0-63 here, + # but that leads to 27 more test failures than before. + order = char_to_order_map[c] + # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but + # CharacterCategory.SYMBOL is actually 253, so we use CONTROL + # to make it closer to the original intent. The only difference + # is whether or not we count digits and control characters for + # _total_char purposes. + if order < CharacterCategory.CONTROL: + self._total_char += 1 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + i = (self._last_order * self.SAMPLE_SIZE) + order + model = self._model['precedence_matrix'][i] + else: # reverse the order of the letters in the lookup + i = (order * self.SAMPLE_SIZE) + self._last_order + model = self._model['precedence_matrix'][i] + self._seq_counters[model] += 1 + self._last_order = order + + charset_name = self._model['charset_name'] + if self.state == ProbingState.DETECTING: + if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: + confidence = self.get_confidence() + if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, we have a winner', + charset_name, confidence) + self._state = ProbingState.FOUND_IT + elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, below negative ' + 'shortcut threshhold %s', charset_name, + confidence, + self.NEGATIVE_SHORTCUT_THRESHOLD) + self._state = ProbingState.NOT_ME + + return self.state + + def get_confidence(self): + r = 0.01 + if self._total_seqs > 0: + r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / + self._total_seqs / self._model['typical_positive_ratio']) + r = r * self._freq_char / self._total_char + if r >= 1.0: + r = 0.99 + return r diff --git a/dropbox-script/chardet/sbcsgroupprober.py b/dropbox-script/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..98e95dc --- /dev/null +++ b/dropbox-script/chardet/sbcsgroupprober.py @@ -0,0 +1,73 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .sbcharsetprober import SingleByteCharSetProber +from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, + Latin5CyrillicModel, MacCyrillicModel, + Ibm866Model, Ibm855Model) +from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from .langthaimodel import TIS620ThaiModel +from .langhebrewmodel import Win1255HebrewModel +from .hebrewprober import HebrewProber +from .langturkishmodel import Latin5TurkishModel + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + super(SBCSGroupProber, self).__init__() + self.probers = [ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) + # after we retrain model. + # SingleByteCharSetProber(Latin2HungarianModel), + # SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + SingleByteCharSetProber(Latin5TurkishModel), + ] + hebrew_prober = HebrewProber() + logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrew_prober) + visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrew_prober) + hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) + self.probers.extend([hebrew_prober, logical_hebrew_prober, + visual_hebrew_prober]) + + self.reset() diff --git a/dropbox-script/chardet/sjisprober.py b/dropbox-script/chardet/sjisprober.py new file mode 100644 index 0000000..9e29623 --- /dev/null +++ b/dropbox-script/chardet/sjisprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import SJISDistributionAnalysis +from .jpcntx import SJISContextAnalysis +from .mbcssm import SJIS_SM_MODEL +from .enums import ProbingState, MachineState + + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + super(SJISProber, self).__init__() + self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) + self.distribution_analyzer = SJISDistributionAnalysis() + self.context_analyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + super(SJISProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return self.context_analyzer.charset_name + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char[2 - char_len:], + char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 + - char_len], char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/dropbox-script/chardet/universaldetector.py b/dropbox-script/chardet/universaldetector.py new file mode 100644 index 0000000..7b4e92d --- /dev/null +++ b/dropbox-script/chardet/universaldetector.py @@ -0,0 +1,286 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### +""" +Module containing the UniversalDetector detector class, which is the primary +class a user of ``chardet`` should use. + +:author: Mark Pilgrim (initial port to Python) +:author: Shy Shalom (original C code) +:author: Dan Blanchard (major refactoring for 3.0) +:author: Ian Cordasco +""" + + +import codecs +import logging +import re + +from .charsetgroupprober import CharSetGroupProber +from .enums import InputState, LanguageFilter, ProbingState +from .escprober import EscCharSetProber +from .latin1prober import Latin1Prober +from .mbcsgroupprober import MBCSGroupProber +from .sbcsgroupprober import SBCSGroupProber + + +class UniversalDetector(object): + """ + The ``UniversalDetector`` class underlies the ``chardet.detect`` function + and coordinates all of the different charset probers. + + To get a ``dict`` containing an encoding and its confidence, you can simply + run: + + .. code:: + + u = UniversalDetector() + u.feed(some_bytes) + u.close() + detected = u.result + + """ + + MINIMUM_THRESHOLD = 0.20 + HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') + ESC_DETECTOR = re.compile(b'(\033|~{)') + WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') + ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', + 'iso-8859-2': 'Windows-1250', + 'iso-8859-5': 'Windows-1251', + 'iso-8859-6': 'Windows-1256', + 'iso-8859-7': 'Windows-1253', + 'iso-8859-8': 'Windows-1255', + 'iso-8859-9': 'Windows-1254', + 'iso-8859-13': 'Windows-1257'} + + def __init__(self, lang_filter=LanguageFilter.ALL): + self._esc_charset_prober = None + self._charset_probers = [] + self.result = None + self.done = None + self._got_data = None + self._input_state = None + self._last_char = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + self._has_win_bytes = None + self.reset() + + def reset(self): + """ + Reset the UniversalDetector and all of its probers back to their + initial states. This is called by ``__init__``, so you only need to + call this directly in between analyses of different documents. + """ + self.result = {'encoding': None, 'confidence': 0.0, 'language': None} + self.done = False + self._got_data = False + self._has_win_bytes = False + self._input_state = InputState.PURE_ASCII + self._last_char = b'' + if self._esc_charset_prober: + self._esc_charset_prober.reset() + for prober in self._charset_probers: + prober.reset() + + def feed(self, byte_str): + """ + Takes a chunk of a document and feeds it through all of the relevant + charset probers. + + After calling ``feed``, you can check the value of the ``done`` + attribute to see if you need to continue feeding the + ``UniversalDetector`` more data, or if it has made a prediction + (in the ``result`` attribute). + + .. note:: + You should always call ``close`` when you're done feeding in your + document if ``done`` is not already ``True``. + """ + if self.done: + return + + if not len(byte_str): + return + + if not isinstance(byte_str, bytearray): + byte_str = bytearray(byte_str) + + # First check for known BOMs, since these are guaranteed to be correct + if not self._got_data: + # If the data starts with BOM, we know it is UTF + if byte_str.startswith(codecs.BOM_UTF8): + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8-SIG", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_UTF32_LE, + codecs.BOM_UTF32_BE)): + # FF FE 00 00 UTF-32, little-endian BOM + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\xFE\xFF\x00\x00'): + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = {'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\x00\x00\xFF\xFE'): + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = {'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): + # FF FE UTF-16, little endian BOM + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16", + 'confidence': 1.0, + 'language': ''} + + self._got_data = True + if self.result['encoding'] is not None: + self.done = True + return + + # If none of those matched and we've only see ASCII so far, check + # for high bytes and escape sequences + if self._input_state == InputState.PURE_ASCII: + if self.HIGH_BYTE_DETECTOR.search(byte_str): + self._input_state = InputState.HIGH_BYTE + elif self._input_state == InputState.PURE_ASCII and \ + self.ESC_DETECTOR.search(self._last_char + byte_str): + self._input_state = InputState.ESC_ASCII + + self._last_char = byte_str[-1:] + + # If we've seen escape sequences, use the EscCharSetProber, which + # uses a simple state machine to check for known escape sequences in + # HZ and ISO-2022 encodings, since those are the only encodings that + # use such sequences. + if self._input_state == InputState.ESC_ASCII: + if not self._esc_charset_prober: + self._esc_charset_prober = EscCharSetProber(self.lang_filter) + if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': + self._esc_charset_prober.charset_name, + 'confidence': + self._esc_charset_prober.get_confidence(), + 'language': + self._esc_charset_prober.language} + self.done = True + # If we've seen high bytes (i.e., those with values greater than 127), + # we need to do more complicated checks using all our multi-byte and + # single-byte probers that are left. The single-byte probers + # use character bigram distributions to determine the encoding, whereas + # the multi-byte probers use a combination of character unigram and + # bigram distributions. + elif self._input_state == InputState.HIGH_BYTE: + if not self._charset_probers: + self._charset_probers = [MBCSGroupProber(self.lang_filter)] + # If we're checking non-CJK encodings, use single-byte prober + if self.lang_filter & LanguageFilter.NON_CJK: + self._charset_probers.append(SBCSGroupProber()) + self._charset_probers.append(Latin1Prober()) + for prober in self._charset_probers: + if prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': prober.charset_name, + 'confidence': prober.get_confidence(), + 'language': prober.language} + self.done = True + break + if self.WIN_BYTE_DETECTOR.search(byte_str): + self._has_win_bytes = True + + def close(self): + """ + Stop analyzing the current document and come up with a final + prediction. + + :returns: The ``result`` attribute, a ``dict`` with the keys + `encoding`, `confidence`, and `language`. + """ + # Don't bother with checks if we're already done + if self.done: + return self.result + self.done = True + + if not self._got_data: + self.logger.debug('no data received!') + + # Default to ASCII if it is all we've seen so far + elif self._input_state == InputState.PURE_ASCII: + self.result = {'encoding': 'ascii', + 'confidence': 1.0, + 'language': ''} + + # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD + elif self._input_state == InputState.HIGH_BYTE: + prober_confidence = None + max_prober_confidence = 0.0 + max_prober = None + for prober in self._charset_probers: + if not prober: + continue + prober_confidence = prober.get_confidence() + if prober_confidence > max_prober_confidence: + max_prober_confidence = prober_confidence + max_prober = prober + if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): + charset_name = max_prober.charset_name + lower_charset_name = max_prober.charset_name.lower() + confidence = max_prober.get_confidence() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith('iso-8859'): + if self._has_win_bytes: + charset_name = self.ISO_WIN_MAP.get(lower_charset_name, + charset_name) + self.result = {'encoding': charset_name, + 'confidence': confidence, + 'language': max_prober.language} + + # Log all prober confidences if none met MINIMUM_THRESHOLD + if self.logger.getEffectiveLevel() == logging.DEBUG: + if self.result['encoding'] is None: + self.logger.debug('no probers hit minimum threshold') + for group_prober in self._charset_probers: + if not group_prober: + continue + if isinstance(group_prober, CharSetGroupProber): + for prober in group_prober.probers: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + else: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + return self.result diff --git a/dropbox-script/chardet/utf8prober.py b/dropbox-script/chardet/utf8prober.py new file mode 100644 index 0000000..6c3196c --- /dev/null +++ b/dropbox-script/chardet/utf8prober.py @@ -0,0 +1,82 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8_SM_MODEL + + + +class UTF8Prober(CharSetProber): + ONE_CHAR_PROB = 0.5 + + def __init__(self): + super(UTF8Prober, self).__init__() + self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) + self._num_mb_chars = None + self.reset() + + def reset(self): + super(UTF8Prober, self).reset() + self.coding_sm.reset() + self._num_mb_chars = 0 + + @property + def charset_name(self): + return "utf-8" + + @property + def language(self): + return "" + + def feed(self, byte_str): + for c in byte_str: + coding_state = self.coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + if self.coding_sm.get_current_charlen() >= 2: + self._num_mb_chars += 1 + + if self.state == ProbingState.DETECTING: + if self.get_confidence() > self.SHORTCUT_THRESHOLD: + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + unlike = 0.99 + if self._num_mb_chars < 6: + unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars + return 1.0 - unlike + else: + return unlike diff --git a/dropbox-script/chardet/version.py b/dropbox-script/chardet/version.py new file mode 100644 index 0000000..bb2a34a --- /dev/null +++ b/dropbox-script/chardet/version.py @@ -0,0 +1,9 @@ +""" +This module exists only to simplify retrieving the version number of chardet +from within setup.py and from chardet subpackages. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + +__version__ = "3.0.4" +VERSION = __version__.split('.') diff --git a/dropbox-script/dropbox-script b/dropbox-script/dropbox-script new file mode 100755 index 0000000..b871497 --- /dev/null +++ b/dropbox-script/dropbox-script @@ -0,0 +1,64 @@ +#! /usr/bin/python3 + +import sys +import os +import dropbox +from dropbox.exceptions import ApiError, AuthError + +# Add OAuth2 access token here. +# You can generate one for yourself in the App Console. +# TOKEN = os.environ.get('DROPBOX_TOKEN') +TOKEN = os.environ.get('DROPBOX_TOKEN') + +LOCALFILE = 'backup.tar.gz' + +file_size = file_size = os.path.getsize(LOCALFILE) + +CHUNK_SIZE = 4 * 1024 * 1024 + +# Check for an access token +if (len(TOKEN) == 0): + sys.exit("ERROR: Looks like you didn't add your access token.") +print("Creating a Dropbox object...") +dbx = dropbox.Dropbox(TOKEN) +# Check that the access token is valid +try: + dbx.users_get_current_account() +except AuthError: + sys.exit("ERROR: Invalid access token; try re-generating an \ + access token from the app console on the web.") +with open(LOCALFILE, 'rb') as f: + # We use WriteMode=overwrite to make sure that the settings in the file + # are changed on upload + print("Uploading " + LOCALFILE + " to Dropbox ...") + if file_size <= CHUNK_SIZE: + print(dbx.files_upload(f.read(), '/backup.tar.gz')) + try: + upload_session_start_result = \ + dbx.files_upload_session_start(f.read(CHUNK_SIZE)) + cursor = dropbox.files.UploadSessionCursor( + session_id=upload_session_start_result.session_id, + offset=f.tell()) + commit = dropbox.files.CommitInfo(path='/backup.tar.gz') + + while f.tell() < file_size: + if ((file_size - f.tell()) <= CHUNK_SIZE): + print(dbx.files_upload_session_finish( + f.read(CHUNK_SIZE), cursor, commit)) + else: + dbx.files_upload_session_append(f.read(CHUNK_SIZE), + cursor.session_id, + cursor.offset) + cursor.offset = f.tell() + except ApiError as err: + # This checks for the specific error where a user doesn't have + # enough Dropbox space quota to upload this file + if (err.error.is_path() and + err.error.get_path().reason.is_insufficient_space()): + sys.exit("ERROR: Cannot back up; insufficient space.") + elif err.user_message_text: + print(err.user_message_text) + sys.exit() + else: + print(err) + sys.exit() diff --git a/dropbox-script/dropbox/__init__.py b/dropbox-script/dropbox/__init__.py new file mode 100644 index 0000000..c830bc3 --- /dev/null +++ b/dropbox-script/dropbox/__init__.py @@ -0,0 +1,4 @@ +from __future__ import absolute_import + +from .dropbox import __version__, Dropbox, DropboxTeam, create_session # noqa: F401 +from .oauth import DropboxOAuth2Flow, DropboxOAuth2FlowNoRedirect # noqa: F401 diff --git a/dropbox-script/dropbox/async.py b/dropbox-script/dropbox/async.py new file mode 100644 index 0000000..a8c5728 --- /dev/null +++ b/dropbox-script/dropbox/async.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# @generated +# flake8: noqa +# pylint: skip-file +# If you have issues importing this module because Python recognizes it as a keyword, use async_ instead. +from async_ import * diff --git a/dropbox-script/dropbox/async_.py b/dropbox-script/dropbox/async_.py new file mode 100644 index 0000000..96449d4 --- /dev/null +++ b/dropbox-script/dropbox/async_.py @@ -0,0 +1,329 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# @generated +# flake8: noqa +# pylint: skip-file +try: + from . import stone_validators as bv + from . import stone_base as bb +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bv + import stone_base as bb + +class LaunchResultBase(bb.Union): + """ + Result returned by methods that launch an asynchronous job. A method who may + either launch an asynchronous job, or complete the request synchronously, + can use this union by extending it, and adding a 'complete' field with the + type of the synchronous response. See :class:`LaunchEmptyResult` for an + example. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar str async_job_id: This response indicates that the processing is + asynchronous. The string is an id that can be used to obtain the status + of the asynchronous job. + """ + + _catch_all = None + + @classmethod + def async_job_id(cls, val): + """ + Create an instance of this class set to the ``async_job_id`` tag with + value ``val``. + + :param str val: + :rtype: LaunchResultBase + """ + return cls('async_job_id', val) + + def is_async_job_id(self): + """ + Check if the union tag is ``async_job_id``. + + :rtype: bool + """ + return self._tag == 'async_job_id' + + def get_async_job_id(self): + """ + This response indicates that the processing is asynchronous. The string + is an id that can be used to obtain the status of the asynchronous job. + + Only call this if :meth:`is_async_job_id` is true. + + :rtype: str + """ + if not self.is_async_job_id(): + raise AttributeError("tag 'async_job_id' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(LaunchResultBase, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LaunchResultBase(%r, %r)' % (self._tag, self._value) + +LaunchResultBase_validator = bv.Union(LaunchResultBase) + +class LaunchEmptyResult(LaunchResultBase): + """ + Result returned by methods that may either launch an asynchronous job or + complete synchronously. Upon synchronous completion of the job, no + additional information is returned. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar complete: The job finished synchronously and successfully. + """ + + # Attribute is overwritten below the class definition + complete = None + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def _process_custom_annotations(self, annotation_type, processor): + super(LaunchEmptyResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LaunchEmptyResult(%r, %r)' % (self._tag, self._value) + +LaunchEmptyResult_validator = bv.Union(LaunchEmptyResult) + +class PollArg(bb.Struct): + """ + Arguments for methods that poll the status of an asynchronous job. + + :ivar async_job_id: Id of the asynchronous job. This is the value of a + response returned from the method that launched the job. + """ + + __slots__ = [ + '_async_job_id_value', + '_async_job_id_present', + ] + + _has_required_fields = True + + def __init__(self, + async_job_id=None): + self._async_job_id_value = None + self._async_job_id_present = False + if async_job_id is not None: + self.async_job_id = async_job_id + + @property + def async_job_id(self): + """ + Id of the asynchronous job. This is the value of a response returned + from the method that launched the job. + + :rtype: str + """ + if self._async_job_id_present: + return self._async_job_id_value + else: + raise AttributeError("missing required field 'async_job_id'") + + @async_job_id.setter + def async_job_id(self, val): + val = self._async_job_id_validator.validate(val) + self._async_job_id_value = val + self._async_job_id_present = True + + @async_job_id.deleter + def async_job_id(self): + self._async_job_id_value = None + self._async_job_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PollArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PollArg(async_job_id={!r})'.format( + self._async_job_id_value, + ) + +PollArg_validator = bv.Struct(PollArg) + +class PollResultBase(bb.Union): + """ + Result returned by methods that poll for the status of an asynchronous job. + Unions that extend this union should add a 'complete' field with a type of + the information returned upon job completion. See :class:`PollEmptyResult` + for an example. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar in_progress: The asynchronous job is still in progress. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + in_progress = None + + def is_in_progress(self): + """ + Check if the union tag is ``in_progress``. + + :rtype: bool + """ + return self._tag == 'in_progress' + + def _process_custom_annotations(self, annotation_type, processor): + super(PollResultBase, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PollResultBase(%r, %r)' % (self._tag, self._value) + +PollResultBase_validator = bv.Union(PollResultBase) + +class PollEmptyResult(PollResultBase): + """ + Result returned by methods that poll for the status of an asynchronous job. + Upon completion of the job, no additional information is returned. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar complete: The asynchronous job has completed successfully. + """ + + # Attribute is overwritten below the class definition + complete = None + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def _process_custom_annotations(self, annotation_type, processor): + super(PollEmptyResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PollEmptyResult(%r, %r)' % (self._tag, self._value) + +PollEmptyResult_validator = bv.Union(PollEmptyResult) + +class PollError(bb.Union): + """ + Error returned by methods for polling the status of asynchronous job. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_async_job_id: The job ID is invalid. + :ivar internal_error: Something went wrong with the job on Dropbox's end. + You'll need to verify that the action you were taking succeeded, and if + not, try again. This should happen very rarely. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_async_job_id = None + # Attribute is overwritten below the class definition + internal_error = None + # Attribute is overwritten below the class definition + other = None + + def is_invalid_async_job_id(self): + """ + Check if the union tag is ``invalid_async_job_id``. + + :rtype: bool + """ + return self._tag == 'invalid_async_job_id' + + def is_internal_error(self): + """ + Check if the union tag is ``internal_error``. + + :rtype: bool + """ + return self._tag == 'internal_error' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(PollError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PollError(%r, %r)' % (self._tag, self._value) + +PollError_validator = bv.Union(PollError) + +AsyncJobId_validator = bv.String(min_length=1) +LaunchResultBase._async_job_id_validator = AsyncJobId_validator +LaunchResultBase._tagmap = { + 'async_job_id': LaunchResultBase._async_job_id_validator, +} + +LaunchEmptyResult._complete_validator = bv.Void() +LaunchEmptyResult._tagmap = { + 'complete': LaunchEmptyResult._complete_validator, +} +LaunchEmptyResult._tagmap.update(LaunchResultBase._tagmap) + +LaunchEmptyResult.complete = LaunchEmptyResult('complete') + +PollArg._async_job_id_validator = AsyncJobId_validator +PollArg._all_field_names_ = set(['async_job_id']) +PollArg._all_fields_ = [('async_job_id', PollArg._async_job_id_validator)] + +PollResultBase._in_progress_validator = bv.Void() +PollResultBase._tagmap = { + 'in_progress': PollResultBase._in_progress_validator, +} + +PollResultBase.in_progress = PollResultBase('in_progress') + +PollEmptyResult._complete_validator = bv.Void() +PollEmptyResult._tagmap = { + 'complete': PollEmptyResult._complete_validator, +} +PollEmptyResult._tagmap.update(PollResultBase._tagmap) + +PollEmptyResult.complete = PollEmptyResult('complete') + +PollError._invalid_async_job_id_validator = bv.Void() +PollError._internal_error_validator = bv.Void() +PollError._other_validator = bv.Void() +PollError._tagmap = { + 'invalid_async_job_id': PollError._invalid_async_job_id_validator, + 'internal_error': PollError._internal_error_validator, + 'other': PollError._other_validator, +} + +PollError.invalid_async_job_id = PollError('invalid_async_job_id') +PollError.internal_error = PollError('internal_error') +PollError.other = PollError('other') + +ROUTES = { +} + diff --git a/dropbox-script/dropbox/auth.py b/dropbox-script/dropbox/auth.py new file mode 100644 index 0000000..5a558a1 --- /dev/null +++ b/dropbox-script/dropbox/auth.py @@ -0,0 +1,767 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# @generated +# flake8: noqa +# pylint: skip-file +try: + from . import stone_validators as bv + from . import stone_base as bb +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bv + import stone_base as bb + +class AccessError(bb.Union): + """ + Error occurred because the account doesn't have permission to access the + resource. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar InvalidAccountTypeError invalid_account_type: Current account type + cannot access the resource. + :ivar PaperAccessError paper_access_denied: Current account cannot access + Paper. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def invalid_account_type(cls, val): + """ + Create an instance of this class set to the ``invalid_account_type`` tag + with value ``val``. + + :param InvalidAccountTypeError val: + :rtype: AccessError + """ + return cls('invalid_account_type', val) + + @classmethod + def paper_access_denied(cls, val): + """ + Create an instance of this class set to the ``paper_access_denied`` tag + with value ``val``. + + :param PaperAccessError val: + :rtype: AccessError + """ + return cls('paper_access_denied', val) + + def is_invalid_account_type(self): + """ + Check if the union tag is ``invalid_account_type``. + + :rtype: bool + """ + return self._tag == 'invalid_account_type' + + def is_paper_access_denied(self): + """ + Check if the union tag is ``paper_access_denied``. + + :rtype: bool + """ + return self._tag == 'paper_access_denied' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_invalid_account_type(self): + """ + Current account type cannot access the resource. + + Only call this if :meth:`is_invalid_account_type` is true. + + :rtype: InvalidAccountTypeError + """ + if not self.is_invalid_account_type(): + raise AttributeError("tag 'invalid_account_type' not set") + return self._value + + def get_paper_access_denied(self): + """ + Current account cannot access Paper. + + Only call this if :meth:`is_paper_access_denied` is true. + + :rtype: PaperAccessError + """ + if not self.is_paper_access_denied(): + raise AttributeError("tag 'paper_access_denied' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(AccessError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AccessError(%r, %r)' % (self._tag, self._value) + +AccessError_validator = bv.Union(AccessError) + +class AuthError(bb.Union): + """ + Errors occurred during authentication. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_access_token: The access token is invalid. + :ivar invalid_select_user: The user specified in 'Dropbox-API-Select-User' + is no longer on the team. + :ivar invalid_select_admin: The user specified in 'Dropbox-API-Select-Admin' + is not a Dropbox Business team admin. + :ivar user_suspended: The user has been suspended. + :ivar expired_access_token: The access token has expired. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_access_token = None + # Attribute is overwritten below the class definition + invalid_select_user = None + # Attribute is overwritten below the class definition + invalid_select_admin = None + # Attribute is overwritten below the class definition + user_suspended = None + # Attribute is overwritten below the class definition + expired_access_token = None + # Attribute is overwritten below the class definition + other = None + + def is_invalid_access_token(self): + """ + Check if the union tag is ``invalid_access_token``. + + :rtype: bool + """ + return self._tag == 'invalid_access_token' + + def is_invalid_select_user(self): + """ + Check if the union tag is ``invalid_select_user``. + + :rtype: bool + """ + return self._tag == 'invalid_select_user' + + def is_invalid_select_admin(self): + """ + Check if the union tag is ``invalid_select_admin``. + + :rtype: bool + """ + return self._tag == 'invalid_select_admin' + + def is_user_suspended(self): + """ + Check if the union tag is ``user_suspended``. + + :rtype: bool + """ + return self._tag == 'user_suspended' + + def is_expired_access_token(self): + """ + Check if the union tag is ``expired_access_token``. + + :rtype: bool + """ + return self._tag == 'expired_access_token' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(AuthError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AuthError(%r, %r)' % (self._tag, self._value) + +AuthError_validator = bv.Union(AuthError) + +class InvalidAccountTypeError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar endpoint: Current account type doesn't have permission to access this + route endpoint. + :ivar feature: Current account type doesn't have permission to access this + feature. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + endpoint = None + # Attribute is overwritten below the class definition + feature = None + # Attribute is overwritten below the class definition + other = None + + def is_endpoint(self): + """ + Check if the union tag is ``endpoint``. + + :rtype: bool + """ + return self._tag == 'endpoint' + + def is_feature(self): + """ + Check if the union tag is ``feature``. + + :rtype: bool + """ + return self._tag == 'feature' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(InvalidAccountTypeError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'InvalidAccountTypeError(%r, %r)' % (self._tag, self._value) + +InvalidAccountTypeError_validator = bv.Union(InvalidAccountTypeError) + +class PaperAccessError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar paper_disabled: Paper is disabled. + :ivar not_paper_user: The provided user has not used Paper yet. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + paper_disabled = None + # Attribute is overwritten below the class definition + not_paper_user = None + # Attribute is overwritten below the class definition + other = None + + def is_paper_disabled(self): + """ + Check if the union tag is ``paper_disabled``. + + :rtype: bool + """ + return self._tag == 'paper_disabled' + + def is_not_paper_user(self): + """ + Check if the union tag is ``not_paper_user``. + + :rtype: bool + """ + return self._tag == 'not_paper_user' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperAccessError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperAccessError(%r, %r)' % (self._tag, self._value) + +PaperAccessError_validator = bv.Union(PaperAccessError) + +class RateLimitError(bb.Struct): + """ + Error occurred because the app is being rate limited. + + :ivar reason: The reason why the app is being rate limited. + :ivar retry_after: The number of seconds that the app should wait before + making another request. + """ + + __slots__ = [ + '_reason_value', + '_reason_present', + '_retry_after_value', + '_retry_after_present', + ] + + _has_required_fields = True + + def __init__(self, + reason=None, + retry_after=None): + self._reason_value = None + self._reason_present = False + self._retry_after_value = None + self._retry_after_present = False + if reason is not None: + self.reason = reason + if retry_after is not None: + self.retry_after = retry_after + + @property + def reason(self): + """ + The reason why the app is being rate limited. + + :rtype: RateLimitReason + """ + if self._reason_present: + return self._reason_value + else: + raise AttributeError("missing required field 'reason'") + + @reason.setter + def reason(self, val): + self._reason_validator.validate_type_only(val) + self._reason_value = val + self._reason_present = True + + @reason.deleter + def reason(self): + self._reason_value = None + self._reason_present = False + + @property + def retry_after(self): + """ + The number of seconds that the app should wait before making another + request. + + :rtype: int + """ + if self._retry_after_present: + return self._retry_after_value + else: + return 1 + + @retry_after.setter + def retry_after(self, val): + val = self._retry_after_validator.validate(val) + self._retry_after_value = val + self._retry_after_present = True + + @retry_after.deleter + def retry_after(self): + self._retry_after_value = None + self._retry_after_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RateLimitError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RateLimitError(reason={!r}, retry_after={!r})'.format( + self._reason_value, + self._retry_after_value, + ) + +RateLimitError_validator = bv.Struct(RateLimitError) + +class RateLimitReason(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar too_many_requests: You are making too many requests in the past few + minutes. + :ivar too_many_write_operations: There are currently too many write + operations happening in the user's Dropbox. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + too_many_requests = None + # Attribute is overwritten below the class definition + too_many_write_operations = None + # Attribute is overwritten below the class definition + other = None + + def is_too_many_requests(self): + """ + Check if the union tag is ``too_many_requests``. + + :rtype: bool + """ + return self._tag == 'too_many_requests' + + def is_too_many_write_operations(self): + """ + Check if the union tag is ``too_many_write_operations``. + + :rtype: bool + """ + return self._tag == 'too_many_write_operations' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(RateLimitReason, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RateLimitReason(%r, %r)' % (self._tag, self._value) + +RateLimitReason_validator = bv.Union(RateLimitReason) + +class TokenFromOAuth1Arg(bb.Struct): + """ + :ivar oauth1_token: The supplied OAuth 1.0 access token. + :ivar oauth1_token_secret: The token secret associated with the supplied + access token. + """ + + __slots__ = [ + '_oauth1_token_value', + '_oauth1_token_present', + '_oauth1_token_secret_value', + '_oauth1_token_secret_present', + ] + + _has_required_fields = True + + def __init__(self, + oauth1_token=None, + oauth1_token_secret=None): + self._oauth1_token_value = None + self._oauth1_token_present = False + self._oauth1_token_secret_value = None + self._oauth1_token_secret_present = False + if oauth1_token is not None: + self.oauth1_token = oauth1_token + if oauth1_token_secret is not None: + self.oauth1_token_secret = oauth1_token_secret + + @property + def oauth1_token(self): + """ + The supplied OAuth 1.0 access token. + + :rtype: str + """ + if self._oauth1_token_present: + return self._oauth1_token_value + else: + raise AttributeError("missing required field 'oauth1_token'") + + @oauth1_token.setter + def oauth1_token(self, val): + val = self._oauth1_token_validator.validate(val) + self._oauth1_token_value = val + self._oauth1_token_present = True + + @oauth1_token.deleter + def oauth1_token(self): + self._oauth1_token_value = None + self._oauth1_token_present = False + + @property + def oauth1_token_secret(self): + """ + The token secret associated with the supplied access token. + + :rtype: str + """ + if self._oauth1_token_secret_present: + return self._oauth1_token_secret_value + else: + raise AttributeError("missing required field 'oauth1_token_secret'") + + @oauth1_token_secret.setter + def oauth1_token_secret(self, val): + val = self._oauth1_token_secret_validator.validate(val) + self._oauth1_token_secret_value = val + self._oauth1_token_secret_present = True + + @oauth1_token_secret.deleter + def oauth1_token_secret(self): + self._oauth1_token_secret_value = None + self._oauth1_token_secret_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TokenFromOAuth1Arg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TokenFromOAuth1Arg(oauth1_token={!r}, oauth1_token_secret={!r})'.format( + self._oauth1_token_value, + self._oauth1_token_secret_value, + ) + +TokenFromOAuth1Arg_validator = bv.Struct(TokenFromOAuth1Arg) + +class TokenFromOAuth1Error(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_oauth1_token_info: Part or all of the OAuth 1.0 access token + info is invalid. + :ivar app_id_mismatch: The authorized app does not match the app associated + with the supplied access token. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_oauth1_token_info = None + # Attribute is overwritten below the class definition + app_id_mismatch = None + # Attribute is overwritten below the class definition + other = None + + def is_invalid_oauth1_token_info(self): + """ + Check if the union tag is ``invalid_oauth1_token_info``. + + :rtype: bool + """ + return self._tag == 'invalid_oauth1_token_info' + + def is_app_id_mismatch(self): + """ + Check if the union tag is ``app_id_mismatch``. + + :rtype: bool + """ + return self._tag == 'app_id_mismatch' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(TokenFromOAuth1Error, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TokenFromOAuth1Error(%r, %r)' % (self._tag, self._value) + +TokenFromOAuth1Error_validator = bv.Union(TokenFromOAuth1Error) + +class TokenFromOAuth1Result(bb.Struct): + """ + :ivar oauth2_token: The OAuth 2.0 token generated from the supplied OAuth + 1.0 token. + """ + + __slots__ = [ + '_oauth2_token_value', + '_oauth2_token_present', + ] + + _has_required_fields = True + + def __init__(self, + oauth2_token=None): + self._oauth2_token_value = None + self._oauth2_token_present = False + if oauth2_token is not None: + self.oauth2_token = oauth2_token + + @property + def oauth2_token(self): + """ + The OAuth 2.0 token generated from the supplied OAuth 1.0 token. + + :rtype: str + """ + if self._oauth2_token_present: + return self._oauth2_token_value + else: + raise AttributeError("missing required field 'oauth2_token'") + + @oauth2_token.setter + def oauth2_token(self, val): + val = self._oauth2_token_validator.validate(val) + self._oauth2_token_value = val + self._oauth2_token_present = True + + @oauth2_token.deleter + def oauth2_token(self): + self._oauth2_token_value = None + self._oauth2_token_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TokenFromOAuth1Result, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TokenFromOAuth1Result(oauth2_token={!r})'.format( + self._oauth2_token_value, + ) + +TokenFromOAuth1Result_validator = bv.Struct(TokenFromOAuth1Result) + +AccessError._invalid_account_type_validator = InvalidAccountTypeError_validator +AccessError._paper_access_denied_validator = PaperAccessError_validator +AccessError._other_validator = bv.Void() +AccessError._tagmap = { + 'invalid_account_type': AccessError._invalid_account_type_validator, + 'paper_access_denied': AccessError._paper_access_denied_validator, + 'other': AccessError._other_validator, +} + +AccessError.other = AccessError('other') + +AuthError._invalid_access_token_validator = bv.Void() +AuthError._invalid_select_user_validator = bv.Void() +AuthError._invalid_select_admin_validator = bv.Void() +AuthError._user_suspended_validator = bv.Void() +AuthError._expired_access_token_validator = bv.Void() +AuthError._other_validator = bv.Void() +AuthError._tagmap = { + 'invalid_access_token': AuthError._invalid_access_token_validator, + 'invalid_select_user': AuthError._invalid_select_user_validator, + 'invalid_select_admin': AuthError._invalid_select_admin_validator, + 'user_suspended': AuthError._user_suspended_validator, + 'expired_access_token': AuthError._expired_access_token_validator, + 'other': AuthError._other_validator, +} + +AuthError.invalid_access_token = AuthError('invalid_access_token') +AuthError.invalid_select_user = AuthError('invalid_select_user') +AuthError.invalid_select_admin = AuthError('invalid_select_admin') +AuthError.user_suspended = AuthError('user_suspended') +AuthError.expired_access_token = AuthError('expired_access_token') +AuthError.other = AuthError('other') + +InvalidAccountTypeError._endpoint_validator = bv.Void() +InvalidAccountTypeError._feature_validator = bv.Void() +InvalidAccountTypeError._other_validator = bv.Void() +InvalidAccountTypeError._tagmap = { + 'endpoint': InvalidAccountTypeError._endpoint_validator, + 'feature': InvalidAccountTypeError._feature_validator, + 'other': InvalidAccountTypeError._other_validator, +} + +InvalidAccountTypeError.endpoint = InvalidAccountTypeError('endpoint') +InvalidAccountTypeError.feature = InvalidAccountTypeError('feature') +InvalidAccountTypeError.other = InvalidAccountTypeError('other') + +PaperAccessError._paper_disabled_validator = bv.Void() +PaperAccessError._not_paper_user_validator = bv.Void() +PaperAccessError._other_validator = bv.Void() +PaperAccessError._tagmap = { + 'paper_disabled': PaperAccessError._paper_disabled_validator, + 'not_paper_user': PaperAccessError._not_paper_user_validator, + 'other': PaperAccessError._other_validator, +} + +PaperAccessError.paper_disabled = PaperAccessError('paper_disabled') +PaperAccessError.not_paper_user = PaperAccessError('not_paper_user') +PaperAccessError.other = PaperAccessError('other') + +RateLimitError._reason_validator = RateLimitReason_validator +RateLimitError._retry_after_validator = bv.UInt64() +RateLimitError._all_field_names_ = set([ + 'reason', + 'retry_after', +]) +RateLimitError._all_fields_ = [ + ('reason', RateLimitError._reason_validator), + ('retry_after', RateLimitError._retry_after_validator), +] + +RateLimitReason._too_many_requests_validator = bv.Void() +RateLimitReason._too_many_write_operations_validator = bv.Void() +RateLimitReason._other_validator = bv.Void() +RateLimitReason._tagmap = { + 'too_many_requests': RateLimitReason._too_many_requests_validator, + 'too_many_write_operations': RateLimitReason._too_many_write_operations_validator, + 'other': RateLimitReason._other_validator, +} + +RateLimitReason.too_many_requests = RateLimitReason('too_many_requests') +RateLimitReason.too_many_write_operations = RateLimitReason('too_many_write_operations') +RateLimitReason.other = RateLimitReason('other') + +TokenFromOAuth1Arg._oauth1_token_validator = bv.String(min_length=1) +TokenFromOAuth1Arg._oauth1_token_secret_validator = bv.String(min_length=1) +TokenFromOAuth1Arg._all_field_names_ = set([ + 'oauth1_token', + 'oauth1_token_secret', +]) +TokenFromOAuth1Arg._all_fields_ = [ + ('oauth1_token', TokenFromOAuth1Arg._oauth1_token_validator), + ('oauth1_token_secret', TokenFromOAuth1Arg._oauth1_token_secret_validator), +] + +TokenFromOAuth1Error._invalid_oauth1_token_info_validator = bv.Void() +TokenFromOAuth1Error._app_id_mismatch_validator = bv.Void() +TokenFromOAuth1Error._other_validator = bv.Void() +TokenFromOAuth1Error._tagmap = { + 'invalid_oauth1_token_info': TokenFromOAuth1Error._invalid_oauth1_token_info_validator, + 'app_id_mismatch': TokenFromOAuth1Error._app_id_mismatch_validator, + 'other': TokenFromOAuth1Error._other_validator, +} + +TokenFromOAuth1Error.invalid_oauth1_token_info = TokenFromOAuth1Error('invalid_oauth1_token_info') +TokenFromOAuth1Error.app_id_mismatch = TokenFromOAuth1Error('app_id_mismatch') +TokenFromOAuth1Error.other = TokenFromOAuth1Error('other') + +TokenFromOAuth1Result._oauth2_token_validator = bv.String(min_length=1) +TokenFromOAuth1Result._all_field_names_ = set(['oauth2_token']) +TokenFromOAuth1Result._all_fields_ = [('oauth2_token', TokenFromOAuth1Result._oauth2_token_validator)] + +token_from_oauth1 = bb.Route( + 'token/from_oauth1', + 1, + False, + TokenFromOAuth1Arg_validator, + TokenFromOAuth1Result_validator, + TokenFromOAuth1Error_validator, + {'host': u'api', + 'style': u'rpc'}, +) +token_revoke = bb.Route( + 'token/revoke', + 1, + False, + bv.Void(), + bv.Void(), + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) + +ROUTES = { + 'token/from_oauth1': token_from_oauth1, + 'token/revoke': token_revoke, +} + diff --git a/dropbox-script/dropbox/base.py b/dropbox-script/dropbox/base.py new file mode 100644 index 0000000..9fe3655 --- /dev/null +++ b/dropbox-script/dropbox/base.py @@ -0,0 +1,4361 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# flake8: noqa +# pylint: skip-file + +from abc import ABCMeta, abstractmethod +import warnings + +from . import ( + async_, + auth, + common, + contacts, + file_properties, + file_requests, + files, + paper, + seen_state, + sharing, + team, + team_common, + team_log, + team_policies, + users, + users_common, +) + + +class DropboxBase(object): + __metaclass__ = ABCMeta + + @abstractmethod + def request(self, route, namespace, arg, arg_binary=None): + pass + + # ------------------------------------------ + # Routes in auth namespace + + def auth_token_from_oauth1(self, + oauth1_token, + oauth1_token_secret): + """ + Creates an OAuth 2.0 access token from the supplied OAuth 1.0 access + token. + + :param str oauth1_token: The supplied OAuth 1.0 access token. + :param str oauth1_token_secret: The token secret associated with the + supplied access token. + :rtype: :class:`dropbox.auth.TokenFromOAuth1Result` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.auth.TokenFromOAuth1Error` + """ + arg = auth.TokenFromOAuth1Arg(oauth1_token, + oauth1_token_secret) + r = self.request( + auth.token_from_oauth1, + 'auth', + arg, + None, + ) + return r + + def auth_token_revoke(self): + """ + Disables the access token used to authenticate the call. + + :rtype: None + """ + arg = None + r = self.request( + auth.token_revoke, + 'auth', + arg, + None, + ) + return None + + # ------------------------------------------ + # Routes in contacts namespace + + def contacts_delete_manual_contacts(self): + """ + Removes all manually added contacts. You'll still keep contacts who are + on your team or who you imported. New contacts will be added when you + share. + + :rtype: None + """ + arg = None + r = self.request( + contacts.delete_manual_contacts, + 'contacts', + arg, + None, + ) + return None + + def contacts_delete_manual_contacts_batch(self, + email_addresses): + """ + Removes manually added contacts from the given list. + + :param list email_addresses: List of manually added contacts to be + deleted. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.contacts.DeleteManualContactsError` + """ + arg = contacts.DeleteManualContactsArg(email_addresses) + r = self.request( + contacts.delete_manual_contacts_batch, + 'contacts', + arg, + None, + ) + return None + + # ------------------------------------------ + # Routes in file_properties namespace + + def file_properties_properties_add(self, + path, + property_groups): + """ + Add property groups to a Dropbox file. See + :meth:`file_properties_templates_add_for_user` or + :meth:`file_properties_templates_add_for_team` to create new templates. + + :param str path: A unique identifier for the file or folder. + :param list property_groups: The property groups which are to be added + to a Dropbox file. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.file_properties.AddPropertiesError` + """ + arg = file_properties.AddPropertiesArg(path, + property_groups) + r = self.request( + file_properties.properties_add, + 'file_properties', + arg, + None, + ) + return None + + def file_properties_properties_overwrite(self, + path, + property_groups): + """ + Overwrite property groups associated with a file. This endpoint should + be used instead of :meth:`file_properties_properties_update` when + property groups are being updated via a "snapshot" instead of via a + "delta". In other words, this endpoint will delete all omitted fields + from a property group, whereas :meth:`file_properties_properties_update` + will only delete fields that are explicitly marked for deletion. + + :param str path: A unique identifier for the file or folder. + :param list property_groups: The property groups "snapshot" updates to + force apply. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.file_properties.InvalidPropertyGroupError` + """ + arg = file_properties.OverwritePropertyGroupArg(path, + property_groups) + r = self.request( + file_properties.properties_overwrite, + 'file_properties', + arg, + None, + ) + return None + + def file_properties_properties_remove(self, + path, + property_template_ids): + """ + Permanently removes the specified property group from the file. To + remove specific property field key value pairs, see + :meth:`file_properties_properties_update`. To update a template, see + :meth:`file_properties_templates_update_for_user` or + :meth:`file_properties_templates_update_for_team`. To remove a template, + see :meth:`file_properties_templates_remove_for_user` or + :meth:`file_properties_templates_remove_for_team`. + + :param str path: A unique identifier for the file or folder. + :param list property_template_ids: A list of identifiers for a template + created by :meth:`file_properties_templates_add_for_user` or + :meth:`file_properties_templates_add_for_team`. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.file_properties.RemovePropertiesError` + """ + arg = file_properties.RemovePropertiesArg(path, + property_template_ids) + r = self.request( + file_properties.properties_remove, + 'file_properties', + arg, + None, + ) + return None + + def file_properties_properties_search(self, + queries, + template_filter=file_properties.TemplateFilter.filter_none): + """ + Search across property templates for particular property field values. + + :param list queries: Queries to search. + :param template_filter: Filter results to contain only properties + associated with these template IDs. + :type template_filter: :class:`dropbox.file_properties.TemplateFilter` + :rtype: :class:`dropbox.file_properties.PropertiesSearchResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.file_properties.PropertiesSearchError` + """ + arg = file_properties.PropertiesSearchArg(queries, + template_filter) + r = self.request( + file_properties.properties_search, + 'file_properties', + arg, + None, + ) + return r + + def file_properties_properties_search_continue(self, + cursor): + """ + Once a cursor has been retrieved from + :meth:`file_properties_properties_search`, use this to paginate through + all search results. + + :param str cursor: The cursor returned by your last call to + :meth:`file_properties_properties_search` or + :meth:`file_properties_properties_search_continue`. + :rtype: :class:`dropbox.file_properties.PropertiesSearchResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.file_properties.PropertiesSearchContinueError` + """ + arg = file_properties.PropertiesSearchContinueArg(cursor) + r = self.request( + file_properties.properties_search_continue, + 'file_properties', + arg, + None, + ) + return r + + def file_properties_properties_update(self, + path, + update_property_groups): + """ + Add, update or remove properties associated with the supplied file and + templates. This endpoint should be used instead of + :meth:`file_properties_properties_overwrite` when property groups are + being updated via a "delta" instead of via a "snapshot" . In other + words, this endpoint will not delete any omitted fields from a property + group, whereas :meth:`file_properties_properties_overwrite` will delete + any fields that are omitted from a property group. + + :param str path: A unique identifier for the file or folder. + :param list update_property_groups: The property groups "delta" updates + to apply. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.file_properties.UpdatePropertiesError` + """ + arg = file_properties.UpdatePropertiesArg(path, + update_property_groups) + r = self.request( + file_properties.properties_update, + 'file_properties', + arg, + None, + ) + return None + + def file_properties_templates_add_for_user(self, + name, + description, + fields): + """ + Add a template associated with a user. See + :meth:`file_properties_properties_add` to add properties to a file. This + endpoint can't be called on a team member or admin's behalf. + + :rtype: :class:`dropbox.file_properties.AddTemplateResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.file_properties.ModifyTemplateError` + """ + arg = file_properties.AddTemplateArg(name, + description, + fields) + r = self.request( + file_properties.templates_add_for_user, + 'file_properties', + arg, + None, + ) + return r + + def file_properties_templates_get_for_user(self, + template_id): + """ + Get the schema for a specified template. This endpoint can't be called + on a team member or admin's behalf. + + :param str template_id: An identifier for template added by route See + :meth:`file_properties_templates_add_for_user` or + :meth:`file_properties_templates_add_for_team`. + :rtype: :class:`dropbox.file_properties.GetTemplateResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.file_properties.TemplateError` + """ + arg = file_properties.GetTemplateArg(template_id) + r = self.request( + file_properties.templates_get_for_user, + 'file_properties', + arg, + None, + ) + return r + + def file_properties_templates_list_for_user(self): + """ + Get the template identifiers for a team. To get the schema of each + template use :meth:`file_properties_templates_get_for_user`. This + endpoint can't be called on a team member or admin's behalf. + + :rtype: :class:`dropbox.file_properties.ListTemplateResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.file_properties.TemplateError` + """ + arg = None + r = self.request( + file_properties.templates_list_for_user, + 'file_properties', + arg, + None, + ) + return r + + def file_properties_templates_remove_for_user(self, + template_id): + """ + Permanently removes the specified template created from + :meth:`file_properties_templates_add_for_user`. All properties + associated with the template will also be removed. This action cannot be + undone. + + :param str template_id: An identifier for a template created by + :meth:`file_properties_templates_add_for_user` or + :meth:`file_properties_templates_add_for_team`. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.file_properties.TemplateError` + """ + arg = file_properties.RemoveTemplateArg(template_id) + r = self.request( + file_properties.templates_remove_for_user, + 'file_properties', + arg, + None, + ) + return None + + def file_properties_templates_update_for_user(self, + template_id, + name=None, + description=None, + add_fields=None): + """ + Update a template associated with a user. This route can update the + template name, the template description and add optional properties to + templates. This endpoint can't be called on a team member or admin's + behalf. + + :param str template_id: An identifier for template added by See + :meth:`file_properties_templates_add_for_user` or + :meth:`file_properties_templates_add_for_team`. + :param Nullable name: A display name for the template. template names + can be up to 256 bytes. + :param Nullable description: Description for the new template. Template + descriptions can be up to 1024 bytes. + :param Nullable add_fields: Property field templates to be added to the + group template. There can be up to 32 properties in a single + template. + :rtype: :class:`dropbox.file_properties.UpdateTemplateResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.file_properties.ModifyTemplateError` + """ + arg = file_properties.UpdateTemplateArg(template_id, + name, + description, + add_fields) + r = self.request( + file_properties.templates_update_for_user, + 'file_properties', + arg, + None, + ) + return r + + # ------------------------------------------ + # Routes in file_requests namespace + + def file_requests_create(self, + title, + destination, + deadline=None, + open=True): + """ + Creates a file request for this user. + + :param str title: The title of the file request. Must not be empty. + :param str destination: The path of the folder in the Dropbox where + uploaded files will be sent. For apps with the app folder + permission, this will be relative to the app folder. + :param Nullable deadline: The deadline for the file request. Deadlines + can only be set by Professional and Business accounts. + :param bool open: Whether or not the file request should be open. If the + file request is closed, it will not accept any file submissions, but + it can be opened later. + :rtype: :class:`dropbox.file_requests.FileRequest` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.file_requests.CreateFileRequestError` + """ + arg = file_requests.CreateFileRequestArgs(title, + destination, + deadline, + open) + r = self.request( + file_requests.create, + 'file_requests', + arg, + None, + ) + return r + + def file_requests_get(self, + id): + """ + Returns the specified file request. + + :param str id: The ID of the file request to retrieve. + :rtype: :class:`dropbox.file_requests.FileRequest` + """ + arg = file_requests.GetFileRequestArgs(id) + r = self.request( + file_requests.get, + 'file_requests', + arg, + None, + ) + return r + + def file_requests_list(self): + """ + Returns a list of file requests owned by this user. For apps with the + app folder permission, this will only return file requests with + destinations in the app folder. + + :rtype: :class:`dropbox.file_requests.ListFileRequestsResult` + """ + arg = None + r = self.request( + file_requests.list, + 'file_requests', + arg, + None, + ) + return r + + def file_requests_update(self, + id, + title=None, + destination=None, + deadline=file_requests.UpdateFileRequestDeadline.no_update, + open=None): + """ + Update a file request. + + :param str id: The ID of the file request to update. + :param Nullable title: The new title of the file request. Must not be + empty. + :param Nullable destination: The new path of the folder in the Dropbox + where uploaded files will be sent. For apps with the app folder + permission, this will be relative to the app folder. + :param deadline: The new deadline for the file request. Deadlines can + only be set by Professional and Business accounts. + :type deadline: :class:`dropbox.file_requests.UpdateFileRequestDeadline` + :param Nullable open: Whether to set this file request as open or + closed. + :rtype: :class:`dropbox.file_requests.FileRequest` + """ + arg = file_requests.UpdateFileRequestArgs(id, + title, + destination, + deadline, + open) + r = self.request( + file_requests.update, + 'file_requests', + arg, + None, + ) + return r + + # ------------------------------------------ + # Routes in files namespace + + def files_alpha_get_metadata(self, + path, + include_media_info=False, + include_deleted=False, + include_has_explicit_shared_members=False, + include_property_groups=None, + include_property_templates=None): + """ + Returns the metadata for a file or folder. This is an alpha endpoint + compatible with the properties API. Note: Metadata for the root folder + is unsupported. + + :param Nullable include_property_templates: If set to a valid list of + template IDs, ``FileMetadata.property_groups`` is set for files with + custom properties. + :rtype: :class:`dropbox.files.Metadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.AlphaGetMetadataError` + """ + warnings.warn( + 'alpha/get_metadata is deprecated. Use get_metadata.', + DeprecationWarning, + ) + arg = files.AlphaGetMetadataArg(path, + include_media_info, + include_deleted, + include_has_explicit_shared_members, + include_property_groups, + include_property_templates) + r = self.request( + files.alpha_get_metadata, + 'files', + arg, + None, + ) + return r + + def files_alpha_upload(self, + f, + path, + mode=files.WriteMode.add, + autorename=False, + client_modified=None, + mute=False, + property_groups=None, + strict_conflict=False): + """ + Create a new file with the contents provided in the request. Note that + this endpoint is part of the properties API alpha and is slightly + different from :meth:`files_upload`. Do not use this to upload a file + larger than 150 MB. Instead, create an upload session with + :meth:`files_upload_session_start`. + + :param bytes f: Contents to upload. + :rtype: :class:`dropbox.files.FileMetadata` + """ + warnings.warn( + 'alpha/upload is deprecated. Use alpha/upload.', + DeprecationWarning, + ) + arg = files.CommitInfoWithProperties(path, + mode, + autorename, + client_modified, + mute, + property_groups, + strict_conflict) + r = self.request( + files.alpha_upload, + 'files', + arg, + f, + ) + return r + + def files_copy_v2(self, + from_path, + to_path, + allow_shared_folder=False, + autorename=False, + allow_ownership_transfer=False): + """ + Copy a file or folder to a different location in the user's Dropbox. If + the source path is a folder all its contents will be copied. + + :param bool allow_shared_folder: If true, :meth:`files_copy` will copy + contents in shared folder, otherwise + ``RelocationError.cant_copy_shared_folder`` will be returned if + ``from_path`` contains shared folder. This field is always true for + :meth:`files_move`. + :param bool autorename: If there's a conflict, have the Dropbox server + try to autorename the file to avoid the conflict. + :param bool allow_ownership_transfer: Allow moves by owner even if it + would result in an ownership transfer for the content being moved. + This does not apply to copies. + :rtype: :class:`dropbox.files.RelocationResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.RelocationError` + """ + arg = files.RelocationArg(from_path, + to_path, + allow_shared_folder, + autorename, + allow_ownership_transfer) + r = self.request( + files.copy_v2, + 'files', + arg, + None, + ) + return r + + def files_copy(self, + from_path, + to_path, + allow_shared_folder=False, + autorename=False, + allow_ownership_transfer=False): + """ + Copy a file or folder to a different location in the user's Dropbox. If + the source path is a folder all its contents will be copied. + + :param bool allow_shared_folder: If true, :meth:`files_copy` will copy + contents in shared folder, otherwise + ``RelocationError.cant_copy_shared_folder`` will be returned if + ``from_path`` contains shared folder. This field is always true for + :meth:`files_move`. + :param bool autorename: If there's a conflict, have the Dropbox server + try to autorename the file to avoid the conflict. + :param bool allow_ownership_transfer: Allow moves by owner even if it + would result in an ownership transfer for the content being moved. + This does not apply to copies. + :rtype: :class:`dropbox.files.Metadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.RelocationError` + """ + warnings.warn( + 'copy is deprecated. Use copy.', + DeprecationWarning, + ) + arg = files.RelocationArg(from_path, + to_path, + allow_shared_folder, + autorename, + allow_ownership_transfer) + r = self.request( + files.copy, + 'files', + arg, + None, + ) + return r + + def files_copy_batch_v2(self, + entries, + autorename=False): + """ + Copy multiple files or folders to different locations at once in the + user's Dropbox. This route will replace :meth:`files_copy_batch`. The + main difference is this route will return stutus for each entry, while + :meth:`files_copy_batch` raises failure if any entry fails. This route + will either finish synchronously, or return a job ID and do the async + copy job in background. Please use :meth:`files_copy_batch_check_v2` to + check the job status. + + :param list entries: List of entries to be moved or copied. Each entry + is :class:`dropbox.files.RelocationPath`. + :param bool autorename: If there's a conflict with any file, have the + Dropbox server try to autorename that file to avoid the conflict. + :rtype: :class:`dropbox.files.RelocationBatchV2Launch` + """ + arg = files.RelocationBatchArgBase(entries, + autorename) + r = self.request( + files.copy_batch_v2, + 'files', + arg, + None, + ) + return r + + def files_copy_batch(self, + entries, + autorename=False, + allow_shared_folder=False, + allow_ownership_transfer=False): + """ + Copy multiple files or folders to different locations at once in the + user's Dropbox. If ``RelocationBatchArg.allow_shared_folder`` is false, + this route is atomic. If one entry fails, the whole transaction will + abort. If ``RelocationBatchArg.allow_shared_folder`` is true, atomicity + is not guaranteed, but it allows you to copy the contents of shared + folders to new locations. This route will return job ID immediately and + do the async copy job in background. Please use + :meth:`files_copy_batch_check` to check the job status. + + :param bool allow_shared_folder: If true, :meth:`files_copy_batch` will + copy contents in shared folder, otherwise + ``RelocationError.cant_copy_shared_folder`` will be returned if + ``RelocationPath.from_path`` contains shared folder. This field is + always true for :meth:`files_move_batch`. + :param bool allow_ownership_transfer: Allow moves by owner even if it + would result in an ownership transfer for the content being moved. + This does not apply to copies. + :rtype: :class:`dropbox.files.RelocationBatchLaunch` + """ + warnings.warn( + 'copy_batch is deprecated. Use copy_batch.', + DeprecationWarning, + ) + arg = files.RelocationBatchArg(entries, + autorename, + allow_shared_folder, + allow_ownership_transfer) + r = self.request( + files.copy_batch, + 'files', + arg, + None, + ) + return r + + def files_copy_batch_check_v2(self, + async_job_id): + """ + Returns the status of an asynchronous job for + :meth:`files_copy_batch_v2`. It returns list of results for each entry. + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.files.RelocationBatchV2JobStatus` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.PollError` + """ + arg = async_.PollArg(async_job_id) + r = self.request( + files.copy_batch_check_v2, + 'files', + arg, + None, + ) + return r + + def files_copy_batch_check(self, + async_job_id): + """ + Returns the status of an asynchronous job for :meth:`files_copy_batch`. + If success, it returns list of results for each entry. + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.files.RelocationBatchJobStatus` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.PollError` + """ + warnings.warn( + 'copy_batch/check is deprecated. Use copy_batch/check.', + DeprecationWarning, + ) + arg = async_.PollArg(async_job_id) + r = self.request( + files.copy_batch_check, + 'files', + arg, + None, + ) + return r + + def files_copy_reference_get(self, + path): + """ + Get a copy reference to a file or folder. This reference string can be + used to save that file or folder to another user's Dropbox by passing it + to :meth:`files_copy_reference_save`. + + :param str path: The path to the file or folder you want to get a copy + reference to. + :rtype: :class:`dropbox.files.GetCopyReferenceResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.GetCopyReferenceError` + """ + arg = files.GetCopyReferenceArg(path) + r = self.request( + files.copy_reference_get, + 'files', + arg, + None, + ) + return r + + def files_copy_reference_save(self, + copy_reference, + path): + """ + Save a copy reference returned by :meth:`files_copy_reference_get` to + the user's Dropbox. + + :param str copy_reference: A copy reference returned by + :meth:`files_copy_reference_get`. + :param str path: Path in the user's Dropbox that is the destination. + :rtype: :class:`dropbox.files.SaveCopyReferenceResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.SaveCopyReferenceError` + """ + arg = files.SaveCopyReferenceArg(copy_reference, + path) + r = self.request( + files.copy_reference_save, + 'files', + arg, + None, + ) + return r + + def files_create_folder_v2(self, + path, + autorename=False): + """ + Create a folder at a given path. + + :param str path: Path in the user's Dropbox to create. + :param bool autorename: If there's a conflict, have the Dropbox server + try to autorename the folder to avoid the conflict. + :rtype: :class:`dropbox.files.CreateFolderResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.CreateFolderError` + """ + arg = files.CreateFolderArg(path, + autorename) + r = self.request( + files.create_folder_v2, + 'files', + arg, + None, + ) + return r + + def files_create_folder(self, + path, + autorename=False): + """ + Create a folder at a given path. + + :param str path: Path in the user's Dropbox to create. + :param bool autorename: If there's a conflict, have the Dropbox server + try to autorename the folder to avoid the conflict. + :rtype: :class:`dropbox.files.FolderMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.CreateFolderError` + """ + warnings.warn( + 'create_folder is deprecated. Use create_folder.', + DeprecationWarning, + ) + arg = files.CreateFolderArg(path, + autorename) + r = self.request( + files.create_folder, + 'files', + arg, + None, + ) + return r + + def files_create_folder_batch(self, + paths, + autorename=False, + force_async=False): + """ + Create multiple folders at once. This route is asynchronous for large + batches, which returns a job ID immediately and runs the create folder + batch asynchronously. Otherwise, creates the folders and returns the + result synchronously for smaller inputs. You can force asynchronous + behaviour by using the ``CreateFolderBatchArg.force_async`` flag. Use + :meth:`files_create_folder_batch_check` to check the job status. + + :param list paths: List of paths to be created in the user's Dropbox. + Duplicate path arguments in the batch are considered only once. + :param bool autorename: If there's a conflict, have the Dropbox server + try to autorename the folder to avoid the conflict. + :param bool force_async: Whether to force the create to happen + asynchronously. + :rtype: :class:`dropbox.files.CreateFolderBatchLaunch` + """ + arg = files.CreateFolderBatchArg(paths, + autorename, + force_async) + r = self.request( + files.create_folder_batch, + 'files', + arg, + None, + ) + return r + + def files_create_folder_batch_check(self, + async_job_id): + """ + Returns the status of an asynchronous job for + :meth:`files_create_folder_batch`. If success, it returns list of result + for each entry. + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.files.CreateFolderBatchJobStatus` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.PollError` + """ + arg = async_.PollArg(async_job_id) + r = self.request( + files.create_folder_batch_check, + 'files', + arg, + None, + ) + return r + + def files_delete_v2(self, + path, + parent_rev=None): + """ + Delete the file or folder at a given path. If the path is a folder, all + its contents will be deleted too. A successful response indicates that + the file or folder was deleted. The returned metadata will be the + corresponding :class:`dropbox.files.FileMetadata` or + :class:`dropbox.files.FolderMetadata` for the item at time of deletion, + and not a :class:`dropbox.files.DeletedMetadata` object. + + :param str path: Path in the user's Dropbox to delete. + :param Nullable parent_rev: Perform delete if given "rev" matches the + existing file's latest "rev". This field does not support deleting a + folder. + :rtype: :class:`dropbox.files.DeleteResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.DeleteError` + """ + arg = files.DeleteArg(path, + parent_rev) + r = self.request( + files.delete_v2, + 'files', + arg, + None, + ) + return r + + def files_delete(self, + path, + parent_rev=None): + """ + Delete the file or folder at a given path. If the path is a folder, all + its contents will be deleted too. A successful response indicates that + the file or folder was deleted. The returned metadata will be the + corresponding :class:`dropbox.files.FileMetadata` or + :class:`dropbox.files.FolderMetadata` for the item at time of deletion, + and not a :class:`dropbox.files.DeletedMetadata` object. + + :param str path: Path in the user's Dropbox to delete. + :param Nullable parent_rev: Perform delete if given "rev" matches the + existing file's latest "rev". This field does not support deleting a + folder. + :rtype: :class:`dropbox.files.Metadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.DeleteError` + """ + warnings.warn( + 'delete is deprecated. Use delete.', + DeprecationWarning, + ) + arg = files.DeleteArg(path, + parent_rev) + r = self.request( + files.delete, + 'files', + arg, + None, + ) + return r + + def files_delete_batch(self, + entries): + """ + Delete multiple files/folders at once. This route is asynchronous, which + returns a job ID immediately and runs the delete batch asynchronously. + Use :meth:`files_delete_batch_check` to check the job status. + + :type entries: list + :rtype: :class:`dropbox.files.DeleteBatchLaunch` + """ + arg = files.DeleteBatchArg(entries) + r = self.request( + files.delete_batch, + 'files', + arg, + None, + ) + return r + + def files_delete_batch_check(self, + async_job_id): + """ + Returns the status of an asynchronous job for + :meth:`files_delete_batch`. If success, it returns list of result for + each entry. + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.files.DeleteBatchJobStatus` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.PollError` + """ + arg = async_.PollArg(async_job_id) + r = self.request( + files.delete_batch_check, + 'files', + arg, + None, + ) + return r + + def files_download(self, + path, + rev=None): + """ + Download a file from a user's Dropbox. + + :param str path: The path of the file to download. + :param Nullable rev: Please specify revision in ``path`` instead. + :rtype: (:class:`dropbox.files.FileMetadata`, + :class:`requests.models.Response`) + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.DownloadError` + + If you do not consume the entire response body, then you must call close + on the response object, otherwise you will max out your available + connections. We recommend using the `contextlib.closing + `_ + context manager to ensure this. + """ + arg = files.DownloadArg(path, + rev) + r = self.request( + files.download, + 'files', + arg, + None, + ) + return r + + def files_download_to_file(self, + download_path, + path, + rev=None): + """ + Download a file from a user's Dropbox. + + :param str download_path: Path on local machine to save file. + :param str path: The path of the file to download. + :param Nullable rev: Please specify revision in ``path`` instead. + :rtype: :class:`dropbox.files.FileMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.DownloadError` + """ + arg = files.DownloadArg(path, + rev) + r = self.request( + files.download, + 'files', + arg, + None, + ) + self._save_body_to_file(download_path, r[1]) + return r[0] + + def files_download_zip(self, + path): + """ + Download a folder from the user's Dropbox, as a zip file. The folder + must be less than 20 GB in size and have fewer than 10,000 total files. + The input cannot be a single file. Any single file must be less than 4GB + in size. + + :param str path: The path of the folder to download. + :rtype: (:class:`dropbox.files.DownloadZipResult`, + :class:`requests.models.Response`) + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.DownloadZipError` + + If you do not consume the entire response body, then you must call close + on the response object, otherwise you will max out your available + connections. We recommend using the `contextlib.closing + `_ + context manager to ensure this. + """ + arg = files.DownloadZipArg(path) + r = self.request( + files.download_zip, + 'files', + arg, + None, + ) + return r + + def files_download_zip_to_file(self, + download_path, + path): + """ + Download a folder from the user's Dropbox, as a zip file. The folder + must be less than 20 GB in size and have fewer than 10,000 total files. + The input cannot be a single file. Any single file must be less than 4GB + in size. + + :param str download_path: Path on local machine to save file. + :param str path: The path of the folder to download. + :rtype: :class:`dropbox.files.DownloadZipResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.DownloadZipError` + """ + arg = files.DownloadZipArg(path) + r = self.request( + files.download_zip, + 'files', + arg, + None, + ) + self._save_body_to_file(download_path, r[1]) + return r[0] + + def files_get_metadata(self, + path, + include_media_info=False, + include_deleted=False, + include_has_explicit_shared_members=False, + include_property_groups=None): + """ + Returns the metadata for a file or folder. Note: Metadata for the root + folder is unsupported. + + :param str path: The path of a file or folder on Dropbox. + :param bool include_media_info: If true, ``FileMetadata.media_info`` is + set for photo and video. + :param bool include_deleted: If true, + :class:`dropbox.files.DeletedMetadata` will be returned for deleted + file or folder, otherwise ``LookupError.not_found`` will be + returned. + :param bool include_has_explicit_shared_members: If true, the results + will include a flag for each file indicating whether or not that + file has any explicit members. + :param Nullable include_property_groups: If set to a valid list of + template IDs, ``FileMetadata.property_groups`` is set if there + exists property data associated with the file and each of the listed + templates. + :rtype: :class:`dropbox.files.Metadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.GetMetadataError` + """ + arg = files.GetMetadataArg(path, + include_media_info, + include_deleted, + include_has_explicit_shared_members, + include_property_groups) + r = self.request( + files.get_metadata, + 'files', + arg, + None, + ) + return r + + def files_get_preview(self, + path, + rev=None): + """ + Get a preview for a file. Currently, PDF previews are generated for + files with the following extensions: .ai, .doc, .docm, .docx, .eps, + .odp, .odt, .pps, .ppsm, .ppsx, .ppt, .pptm, .pptx, .rtf. HTML previews + are generated for files with the following extensions: .csv, .ods, .xls, + .xlsm, .xlsx. Other formats will return an unsupported extension error. + + :param str path: The path of the file to preview. + :param Nullable rev: Please specify revision in ``path`` instead. + :rtype: (:class:`dropbox.files.FileMetadata`, + :class:`requests.models.Response`) + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.PreviewError` + + If you do not consume the entire response body, then you must call close + on the response object, otherwise you will max out your available + connections. We recommend using the `contextlib.closing + `_ + context manager to ensure this. + """ + arg = files.PreviewArg(path, + rev) + r = self.request( + files.get_preview, + 'files', + arg, + None, + ) + return r + + def files_get_preview_to_file(self, + download_path, + path, + rev=None): + """ + Get a preview for a file. Currently, PDF previews are generated for + files with the following extensions: .ai, .doc, .docm, .docx, .eps, + .odp, .odt, .pps, .ppsm, .ppsx, .ppt, .pptm, .pptx, .rtf. HTML previews + are generated for files with the following extensions: .csv, .ods, .xls, + .xlsm, .xlsx. Other formats will return an unsupported extension error. + + :param str download_path: Path on local machine to save file. + :param str path: The path of the file to preview. + :param Nullable rev: Please specify revision in ``path`` instead. + :rtype: :class:`dropbox.files.FileMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.PreviewError` + """ + arg = files.PreviewArg(path, + rev) + r = self.request( + files.get_preview, + 'files', + arg, + None, + ) + self._save_body_to_file(download_path, r[1]) + return r[0] + + def files_get_temporary_link(self, + path): + """ + Get a temporary link to stream content of a file. This link will expire + in four hours and afterwards you will get 410 Gone. So this URL should + not be used to display content directly in the browser. Content-Type of + the link is determined automatically by the file's mime type. + + :param str path: The path to the file you want a temporary link to. + :rtype: :class:`dropbox.files.GetTemporaryLinkResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.GetTemporaryLinkError` + """ + arg = files.GetTemporaryLinkArg(path) + r = self.request( + files.get_temporary_link, + 'files', + arg, + None, + ) + return r + + def files_get_temporary_upload_link(self, + commit_info, + duration=14400.0): + """ + Get a one-time use temporary upload link to upload a file to a Dropbox + location. This endpoint acts as a delayed :meth:`files_upload`. The + returned temporary upload link may be used to make a POST request with + the data to be uploaded. The upload will then be perfomed with the + :class:`dropbox.files.CommitInfo` previously provided to + :meth:`files_get_temporary_upload_link` but evaluated only upon + consumption. Hence, errors stemming from invalid + :class:`dropbox.files.CommitInfo` with respect to the state of the + user's Dropbox will only be communicated at consumption time. + Additionally, these errors are surfaced as generic HTTP 409 Conflict + responses, potentially hiding issue details. The maximum temporary + upload link duration is 4 hours. Upon consumption or expiration, a new + link will have to be generated. Multiple links may exist for a specific + upload path at any given time. The POST request on the temporary upload + link must have its Content-Type set to "application/octet-stream". + Example temporary upload link consumption request: curl -X POST + https://dl.dropboxusercontent.com/apitul/1/bNi2uIYF51cVBND --header + "Content-Type: application/octet-stream" --data-binary @local_file.txt + A successful temporary upload link consumption request returns the + content hash of the uploaded data in JSON format. Example succesful + temporary upload link consumption response: {"content-hash": + "599d71033d700ac892a0e48fa61b125d2f5994"} An unsuccessful temporary + upload link consumption request returns any of the following status + codes: HTTP 400 Bad Request: Content-Type is not one of + application/octet-stream and text/plain or request is invalid. HTTP 409 + Conflict: The temporary upload link does not exist or is currently + unavailable, the upload failed, or another error happened. HTTP 410 + Gone: The temporary upload link is expired or consumed. Example + unsuccessful temporary upload link consumption response: Temporary + upload link has been recently consumed. + + :param commit_info: Contains the path and other optional modifiers for + the future upload commit. Equivalent to the parameters provided to + :meth:`files_upload`. + :type commit_info: :class:`dropbox.files.CommitInfo` + :param float duration: How long before this link expires, in seconds. + Attempting to start an upload with this link longer than this period + of time after link creation will result in an error. + :rtype: :class:`dropbox.files.GetTemporaryUploadLinkResult` + """ + arg = files.GetTemporaryUploadLinkArg(commit_info, + duration) + r = self.request( + files.get_temporary_upload_link, + 'files', + arg, + None, + ) + return r + + def files_get_thumbnail(self, + path, + format=files.ThumbnailFormat.jpeg, + size=files.ThumbnailSize.w64h64, + mode=files.ThumbnailMode.strict): + """ + Get a thumbnail for an image. This method currently supports files with + the following file extensions: jpg, jpeg, png, tiff, tif, gif and bmp. + Photos that are larger than 20MB in size won't be converted to a + thumbnail. + + :param str path: The path to the image file you want to thumbnail. + :param format: The format for the thumbnail image, jpeg (default) or + png. For images that are photos, jpeg should be preferred, while + png is better for screenshots and digital arts. + :type format: :class:`dropbox.files.ThumbnailFormat` + :param size: The size for the thumbnail image. + :type size: :class:`dropbox.files.ThumbnailSize` + :param mode: How to resize and crop the image to achieve the desired + size. + :type mode: :class:`dropbox.files.ThumbnailMode` + :rtype: (:class:`dropbox.files.FileMetadata`, + :class:`requests.models.Response`) + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.ThumbnailError` + + If you do not consume the entire response body, then you must call close + on the response object, otherwise you will max out your available + connections. We recommend using the `contextlib.closing + `_ + context manager to ensure this. + """ + arg = files.ThumbnailArg(path, + format, + size, + mode) + r = self.request( + files.get_thumbnail, + 'files', + arg, + None, + ) + return r + + def files_get_thumbnail_to_file(self, + download_path, + path, + format=files.ThumbnailFormat.jpeg, + size=files.ThumbnailSize.w64h64, + mode=files.ThumbnailMode.strict): + """ + Get a thumbnail for an image. This method currently supports files with + the following file extensions: jpg, jpeg, png, tiff, tif, gif and bmp. + Photos that are larger than 20MB in size won't be converted to a + thumbnail. + + :param str download_path: Path on local machine to save file. + :param str path: The path to the image file you want to thumbnail. + :param format: The format for the thumbnail image, jpeg (default) or + png. For images that are photos, jpeg should be preferred, while + png is better for screenshots and digital arts. + :type format: :class:`dropbox.files.ThumbnailFormat` + :param size: The size for the thumbnail image. + :type size: :class:`dropbox.files.ThumbnailSize` + :param mode: How to resize and crop the image to achieve the desired + size. + :type mode: :class:`dropbox.files.ThumbnailMode` + :rtype: :class:`dropbox.files.FileMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.ThumbnailError` + """ + arg = files.ThumbnailArg(path, + format, + size, + mode) + r = self.request( + files.get_thumbnail, + 'files', + arg, + None, + ) + self._save_body_to_file(download_path, r[1]) + return r[0] + + def files_get_thumbnail_batch(self, + entries): + """ + Get thumbnails for a list of images. We allow up to 25 thumbnails in a + single batch. This method currently supports files with the following + file extensions: jpg, jpeg, png, tiff, tif, gif and bmp. Photos that are + larger than 20MB in size won't be converted to a thumbnail. + + :param list entries: List of files to get thumbnails. + :rtype: :class:`dropbox.files.GetThumbnailBatchResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.GetThumbnailBatchError` + """ + arg = files.GetThumbnailBatchArg(entries) + r = self.request( + files.get_thumbnail_batch, + 'files', + arg, + None, + ) + return r + + def files_list_folder(self, + path, + recursive=False, + include_media_info=False, + include_deleted=False, + include_has_explicit_shared_members=False, + include_mounted_folders=True, + limit=None, + shared_link=None, + include_property_groups=None): + """ + Starts returning the contents of a folder. If the result's + ``ListFolderResult.has_more`` field is ``True``, call + :meth:`files_list_folder_continue` with the returned + ``ListFolderResult.cursor`` to retrieve more entries. If you're using + ``ListFolderArg.recursive`` set to ``True`` to keep a local cache of the + contents of a Dropbox account, iterate through each entry in order and + process them as follows to keep your local state in sync: For each + :class:`dropbox.files.FileMetadata`, store the new entry at the given + path in your local state. If the required parent folders don't exist + yet, create them. If there's already something else at the given path, + replace it and remove all its children. For each + :class:`dropbox.files.FolderMetadata`, store the new entry at the given + path in your local state. If the required parent folders don't exist + yet, create them. If there's already something else at the given path, + replace it but leave the children as they are. Check the new entry's + ``FolderSharingInfo.read_only`` and set all its children's read-only + statuses to match. For each :class:`dropbox.files.DeletedMetadata`, if + your local state has something at the given path, remove it and all its + children. If there's nothing at the given path, ignore this entry. Note: + :class:`dropbox.auth.RateLimitError` may be returned if multiple + :meth:`files_list_folder` or :meth:`files_list_folder_continue` calls + with same parameters are made simultaneously by same API app for same + user. If your app implements retry logic, please hold off the retry + until the previous request finishes. + + :param str path: A unique identifier for the file. + :param bool recursive: If true, the list folder operation will be + applied recursively to all subfolders and the response will contain + contents of all subfolders. + :param bool include_media_info: If true, ``FileMetadata.media_info`` is + set for photo and video. + :param bool include_deleted: If true, the results will include entries + for files and folders that used to exist but were deleted. + :param bool include_has_explicit_shared_members: If true, the results + will include a flag for each file indicating whether or not that + file has any explicit members. + :param bool include_mounted_folders: If true, the results will include + entries under mounted folders which includes app folder, shared + folder and team folder. + :param Nullable limit: The maximum number of results to return per + request. Note: This is an approximate number and there can be + slightly more entries returned in some cases. + :param Nullable shared_link: A shared link to list the contents of. If + the link is password-protected, the password must be provided. If + this field is present, ``ListFolderArg.path`` will be relative to + root of the shared link. Only non-recursive mode is supported for + shared link. + :param Nullable include_property_groups: If set to a valid list of + template IDs, ``FileMetadata.property_groups`` is set if there + exists property data associated with the file and each of the listed + templates. + :rtype: :class:`dropbox.files.ListFolderResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.ListFolderError` + """ + arg = files.ListFolderArg(path, + recursive, + include_media_info, + include_deleted, + include_has_explicit_shared_members, + include_mounted_folders, + limit, + shared_link, + include_property_groups) + r = self.request( + files.list_folder, + 'files', + arg, + None, + ) + return r + + def files_list_folder_continue(self, + cursor): + """ + Once a cursor has been retrieved from :meth:`files_list_folder`, use + this to paginate through all files and retrieve updates to the folder, + following the same rules as documented for :meth:`files_list_folder`. + + :param str cursor: The cursor returned by your last call to + :meth:`files_list_folder` or :meth:`files_list_folder_continue`. + :rtype: :class:`dropbox.files.ListFolderResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.ListFolderContinueError` + """ + arg = files.ListFolderContinueArg(cursor) + r = self.request( + files.list_folder_continue, + 'files', + arg, + None, + ) + return r + + def files_list_folder_get_latest_cursor(self, + path, + recursive=False, + include_media_info=False, + include_deleted=False, + include_has_explicit_shared_members=False, + include_mounted_folders=True, + limit=None, + shared_link=None, + include_property_groups=None): + """ + A way to quickly get a cursor for the folder's state. Unlike + :meth:`files_list_folder`, :meth:`files_list_folder_get_latest_cursor` + doesn't return any entries. This endpoint is for app which only needs to + know about new files and modifications and doesn't need to know about + files that already exist in Dropbox. + + :param str path: A unique identifier for the file. + :param bool recursive: If true, the list folder operation will be + applied recursively to all subfolders and the response will contain + contents of all subfolders. + :param bool include_media_info: If true, ``FileMetadata.media_info`` is + set for photo and video. + :param bool include_deleted: If true, the results will include entries + for files and folders that used to exist but were deleted. + :param bool include_has_explicit_shared_members: If true, the results + will include a flag for each file indicating whether or not that + file has any explicit members. + :param bool include_mounted_folders: If true, the results will include + entries under mounted folders which includes app folder, shared + folder and team folder. + :param Nullable limit: The maximum number of results to return per + request. Note: This is an approximate number and there can be + slightly more entries returned in some cases. + :param Nullable shared_link: A shared link to list the contents of. If + the link is password-protected, the password must be provided. If + this field is present, ``ListFolderArg.path`` will be relative to + root of the shared link. Only non-recursive mode is supported for + shared link. + :param Nullable include_property_groups: If set to a valid list of + template IDs, ``FileMetadata.property_groups`` is set if there + exists property data associated with the file and each of the listed + templates. + :rtype: :class:`dropbox.files.ListFolderGetLatestCursorResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.ListFolderError` + """ + arg = files.ListFolderArg(path, + recursive, + include_media_info, + include_deleted, + include_has_explicit_shared_members, + include_mounted_folders, + limit, + shared_link, + include_property_groups) + r = self.request( + files.list_folder_get_latest_cursor, + 'files', + arg, + None, + ) + return r + + def files_list_folder_longpoll(self, + cursor, + timeout=30): + """ + A longpoll endpoint to wait for changes on an account. In conjunction + with :meth:`files_list_folder_continue`, this call gives you a + low-latency way to monitor an account for file changes. The connection + will block until there are changes available or a timeout occurs. This + endpoint is useful mostly for client-side apps. If you're looking for + server-side notifications, check out our `webhooks documentation + `_. + + :param str cursor: A cursor as returned by :meth:`files_list_folder` or + :meth:`files_list_folder_continue`. Cursors retrieved by setting + ``ListFolderArg.include_media_info`` to ``True`` are not supported. + :param int timeout: A timeout in seconds. The request will block for at + most this length of time, plus up to 90 seconds of random jitter + added to avoid the thundering herd problem. Care should be taken + when using this parameter, as some network infrastructure does not + support long timeouts. + :rtype: :class:`dropbox.files.ListFolderLongpollResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.ListFolderLongpollError` + """ + arg = files.ListFolderLongpollArg(cursor, + timeout) + r = self.request( + files.list_folder_longpoll, + 'files', + arg, + None, + ) + return r + + def files_list_revisions(self, + path, + mode=files.ListRevisionsMode.path, + limit=10): + """ + Returns revisions for files based on a file path or a file id. The file + path or file id is identified from the latest file entry at the given + file path or id. This end point allows your app to query either by file + path or file id by setting the mode parameter appropriately. In the + ``ListRevisionsMode.path`` (default) mode, all revisions at the same + file path as the latest file entry are returned. If revisions with the + same file id are desired, then mode must be set to + ``ListRevisionsMode.id``. The ``ListRevisionsMode.id`` mode is useful to + retrieve revisions for a given file across moves or renames. + + :param str path: The path to the file you want to see the revisions of. + :param mode: Determines the behavior of the API in listing the revisions + for a given file path or id. + :type mode: :class:`dropbox.files.ListRevisionsMode` + :param int limit: The maximum number of revision entries returned. + :rtype: :class:`dropbox.files.ListRevisionsResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.ListRevisionsError` + """ + arg = files.ListRevisionsArg(path, + mode, + limit) + r = self.request( + files.list_revisions, + 'files', + arg, + None, + ) + return r + + def files_move_v2(self, + from_path, + to_path, + allow_shared_folder=False, + autorename=False, + allow_ownership_transfer=False): + """ + Move a file or folder to a different location in the user's Dropbox. If + the source path is a folder all its contents will be moved. + + :param bool allow_shared_folder: If true, :meth:`files_copy` will copy + contents in shared folder, otherwise + ``RelocationError.cant_copy_shared_folder`` will be returned if + ``from_path`` contains shared folder. This field is always true for + :meth:`files_move`. + :param bool autorename: If there's a conflict, have the Dropbox server + try to autorename the file to avoid the conflict. + :param bool allow_ownership_transfer: Allow moves by owner even if it + would result in an ownership transfer for the content being moved. + This does not apply to copies. + :rtype: :class:`dropbox.files.RelocationResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.RelocationError` + """ + arg = files.RelocationArg(from_path, + to_path, + allow_shared_folder, + autorename, + allow_ownership_transfer) + r = self.request( + files.move_v2, + 'files', + arg, + None, + ) + return r + + def files_move(self, + from_path, + to_path, + allow_shared_folder=False, + autorename=False, + allow_ownership_transfer=False): + """ + Move a file or folder to a different location in the user's Dropbox. If + the source path is a folder all its contents will be moved. + + :param bool allow_shared_folder: If true, :meth:`files_copy` will copy + contents in shared folder, otherwise + ``RelocationError.cant_copy_shared_folder`` will be returned if + ``from_path`` contains shared folder. This field is always true for + :meth:`files_move`. + :param bool autorename: If there's a conflict, have the Dropbox server + try to autorename the file to avoid the conflict. + :param bool allow_ownership_transfer: Allow moves by owner even if it + would result in an ownership transfer for the content being moved. + This does not apply to copies. + :rtype: :class:`dropbox.files.Metadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.RelocationError` + """ + warnings.warn( + 'move is deprecated. Use move.', + DeprecationWarning, + ) + arg = files.RelocationArg(from_path, + to_path, + allow_shared_folder, + autorename, + allow_ownership_transfer) + r = self.request( + files.move, + 'files', + arg, + None, + ) + return r + + def files_move_batch_v2(self, + entries, + autorename=False, + allow_ownership_transfer=False): + """ + Move multiple files or folders to different locations at once in the + user's Dropbox. This route will replace :meth:`files_move_batch_v2`. The + main difference is this route will return stutus for each entry, while + :meth:`files_move_batch` raises failure if any entry fails. This route + will either finish synchronously, or return a job ID and do the async + move job in background. Please use :meth:`files_move_batch_check_v2` to + check the job status. + + :param bool allow_ownership_transfer: Allow moves by owner even if it + would result in an ownership transfer for the content being moved. + This does not apply to copies. + :rtype: :class:`dropbox.files.RelocationBatchV2Launch` + """ + arg = files.MoveBatchArg(entries, + autorename, + allow_ownership_transfer) + r = self.request( + files.move_batch_v2, + 'files', + arg, + None, + ) + return r + + def files_move_batch(self, + entries, + autorename=False, + allow_shared_folder=False, + allow_ownership_transfer=False): + """ + Move multiple files or folders to different locations at once in the + user's Dropbox. This route is 'all or nothing', which means if one entry + fails, the whole transaction will abort. This route will return job ID + immediately and do the async moving job in background. Please use + :meth:`files_move_batch_check` to check the job status. + + :param bool allow_shared_folder: If true, :meth:`files_copy_batch` will + copy contents in shared folder, otherwise + ``RelocationError.cant_copy_shared_folder`` will be returned if + ``RelocationPath.from_path`` contains shared folder. This field is + always true for :meth:`files_move_batch`. + :param bool allow_ownership_transfer: Allow moves by owner even if it + would result in an ownership transfer for the content being moved. + This does not apply to copies. + :rtype: :class:`dropbox.files.RelocationBatchLaunch` + """ + arg = files.RelocationBatchArg(entries, + autorename, + allow_shared_folder, + allow_ownership_transfer) + r = self.request( + files.move_batch, + 'files', + arg, + None, + ) + return r + + def files_move_batch_check_v2(self, + async_job_id): + """ + Returns the status of an asynchronous job for + :meth:`files_move_batch_v2`. It returns list of results for each entry. + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.files.RelocationBatchV2JobStatus` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.PollError` + """ + arg = async_.PollArg(async_job_id) + r = self.request( + files.move_batch_check_v2, + 'files', + arg, + None, + ) + return r + + def files_move_batch_check(self, + async_job_id): + """ + Returns the status of an asynchronous job for :meth:`files_move_batch`. + If success, it returns list of results for each entry. + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.files.RelocationBatchJobStatus` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.PollError` + """ + arg = async_.PollArg(async_job_id) + r = self.request( + files.move_batch_check, + 'files', + arg, + None, + ) + return r + + def files_permanently_delete(self, + path, + parent_rev=None): + """ + Permanently delete the file or folder at a given path (see + https://www.dropbox.com/en/help/40). Note: This endpoint is only + available for Dropbox Business apps. + + :param str path: Path in the user's Dropbox to delete. + :param Nullable parent_rev: Perform delete if given "rev" matches the + existing file's latest "rev". This field does not support deleting a + folder. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.DeleteError` + """ + arg = files.DeleteArg(path, + parent_rev) + r = self.request( + files.permanently_delete, + 'files', + arg, + None, + ) + return None + + def files_properties_add(self, + path, + property_groups): + """ + :param str path: A unique identifier for the file or folder. + :param list property_groups: The property groups which are to be added + to a Dropbox file. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.AddPropertiesError` + """ + warnings.warn( + 'properties/add is deprecated.', + DeprecationWarning, + ) + arg = file_properties.AddPropertiesArg(path, + property_groups) + r = self.request( + files.properties_add, + 'files', + arg, + None, + ) + return None + + def files_properties_overwrite(self, + path, + property_groups): + """ + :param str path: A unique identifier for the file or folder. + :param list property_groups: The property groups "snapshot" updates to + force apply. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.InvalidPropertyGroupError` + """ + warnings.warn( + 'properties/overwrite is deprecated.', + DeprecationWarning, + ) + arg = file_properties.OverwritePropertyGroupArg(path, + property_groups) + r = self.request( + files.properties_overwrite, + 'files', + arg, + None, + ) + return None + + def files_properties_remove(self, + path, + property_template_ids): + """ + :param str path: A unique identifier for the file or folder. + :param list property_template_ids: A list of identifiers for a template + created by :meth:`files_templates_add_for_user` or + :meth:`files_templates_add_for_team`. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.RemovePropertiesError` + """ + warnings.warn( + 'properties/remove is deprecated.', + DeprecationWarning, + ) + arg = file_properties.RemovePropertiesArg(path, + property_template_ids) + r = self.request( + files.properties_remove, + 'files', + arg, + None, + ) + return None + + def files_properties_template_get(self, + template_id): + """ + :param str template_id: An identifier for template added by route See + :meth:`files_templates_add_for_user` or + :meth:`files_templates_add_for_team`. + :rtype: :class:`dropbox.files.GetTemplateResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.TemplateError` + """ + warnings.warn( + 'properties/template/get is deprecated.', + DeprecationWarning, + ) + arg = file_properties.GetTemplateArg(template_id) + r = self.request( + files.properties_template_get, + 'files', + arg, + None, + ) + return r + + def files_properties_template_list(self): + warnings.warn( + 'properties/template/list is deprecated.', + DeprecationWarning, + ) + arg = None + r = self.request( + files.properties_template_list, + 'files', + arg, + None, + ) + return r + + def files_properties_update(self, + path, + update_property_groups): + """ + :param str path: A unique identifier for the file or folder. + :param list update_property_groups: The property groups "delta" updates + to apply. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.UpdatePropertiesError` + """ + warnings.warn( + 'properties/update is deprecated.', + DeprecationWarning, + ) + arg = file_properties.UpdatePropertiesArg(path, + update_property_groups) + r = self.request( + files.properties_update, + 'files', + arg, + None, + ) + return None + + def files_restore(self, + path, + rev): + """ + Restore a specific revision of a file to the given path. + + :param str path: The path to save the restored file. + :param str rev: The revision to restore. + :rtype: :class:`dropbox.files.FileMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.RestoreError` + """ + arg = files.RestoreArg(path, + rev) + r = self.request( + files.restore, + 'files', + arg, + None, + ) + return r + + def files_save_url(self, + path, + url): + """ + Save the data from a specified URL into a file in user's Dropbox. Note + that the transfer from the URL must complete within 5 minutes, or the + operation will time out and the job will fail. If the given path already + exists, the file will be renamed to avoid the conflict (e.g. myfile + (1).txt). + + :param str path: The path in Dropbox where the URL will be saved to. + :param str url: The URL to be saved. + :rtype: :class:`dropbox.files.SaveUrlResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.SaveUrlError` + """ + arg = files.SaveUrlArg(path, + url) + r = self.request( + files.save_url, + 'files', + arg, + None, + ) + return r + + def files_save_url_check_job_status(self, + async_job_id): + """ + Check the status of a :meth:`files_save_url` job. + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.files.SaveUrlJobStatus` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.PollError` + """ + arg = async_.PollArg(async_job_id) + r = self.request( + files.save_url_check_job_status, + 'files', + arg, + None, + ) + return r + + def files_search(self, + path, + query, + start=0, + max_results=100, + mode=files.SearchMode.filename): + """ + Searches for files and folders. Note: Recent changes may not immediately + be reflected in search results due to a short delay in indexing. + + :param str path: The path in the user's Dropbox to search. Should + probably be a folder. + :param str query: The string to search for. The search string is split + on spaces into multiple tokens. For file name searching, the last + token is used for prefix matching (i.e. "bat c" matches "bat cave" + but not "batman car"). + :param int start: The starting index within the search results (used for + paging). + :param int max_results: The maximum number of search results to return. + :param mode: The search mode (filename, filename_and_content, or + deleted_filename). Note that searching file content is only + available for Dropbox Business accounts. + :type mode: :class:`dropbox.files.SearchMode` + :rtype: :class:`dropbox.files.SearchResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.SearchError` + """ + arg = files.SearchArg(path, + query, + start, + max_results, + mode) + r = self.request( + files.search, + 'files', + arg, + None, + ) + return r + + def files_upload(self, + f, + path, + mode=files.WriteMode.add, + autorename=False, + client_modified=None, + mute=False, + property_groups=None, + strict_conflict=False): + """ + Create a new file with the contents provided in the request. Do not use + this to upload a file larger than 150 MB. Instead, create an upload + session with :meth:`files_upload_session_start`. Calls to this endpoint + will count as data transport calls for any Dropbox Business teams with a + limit on the number of data transport calls allowed per month. For more + information, see the `Data transport limit page + `_. + + :param bytes f: Contents to upload. + :param str path: Path in the user's Dropbox to save the file. + :param mode: Selects what to do if the file already exists. + :type mode: :class:`dropbox.files.WriteMode` + :param bool autorename: If there's a conflict, as determined by + ``mode``, have the Dropbox server try to autorename the file to + avoid conflict. + :param Nullable client_modified: The value to store as the + ``client_modified`` timestamp. Dropbox automatically records the + time at which the file was written to the Dropbox servers. It can + also record an additional timestamp, provided by Dropbox desktop + clients, mobile clients, and API apps of when the file was actually + created or modified. + :param bool mute: Normally, users are made aware of any file + modifications in their Dropbox account via notifications in the + client software. If ``True``, this tells the clients that this + modification shouldn't result in a user notification. + :param Nullable property_groups: List of custom properties to add to + file. + :param bool strict_conflict: Be more strict about how each + :class:`dropbox.files.WriteMode` detects conflict. For example, + always return a conflict error when ``mode`` = ``WriteMode.update`` + and the given "rev" doesn't match the existing file's "rev", even if + the existing file has been deleted. + :rtype: :class:`dropbox.files.FileMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.UploadError` + """ + arg = files.CommitInfo(path, + mode, + autorename, + client_modified, + mute, + property_groups, + strict_conflict) + r = self.request( + files.upload, + 'files', + arg, + f, + ) + return r + + def files_upload_session_append_v2(self, + f, + cursor, + close=False): + """ + Append more data to an upload session. When the parameter close is set, + this call will close the session. A single request should not upload + more than 150 MB. The maximum size of a file one can upload to an upload + session is 350 GB. Calls to this endpoint will count as data transport + calls for any Dropbox Business teams with a limit on the number of data + transport calls allowed per month. For more information, see the `Data + transport limit page + `_. + + :param bytes f: Contents to upload. + :param cursor: Contains the upload session ID and the offset. + :type cursor: :class:`dropbox.files.UploadSessionCursor` + :param bool close: If true, the current session will be closed, at which + point you won't be able to call + :meth:`files_upload_session_append_v2` anymore with the current + session. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.UploadSessionLookupError` + """ + arg = files.UploadSessionAppendArg(cursor, + close) + r = self.request( + files.upload_session_append_v2, + 'files', + arg, + f, + ) + return None + + def files_upload_session_append(self, + f, + session_id, + offset): + """ + Append more data to an upload session. A single request should not + upload more than 150 MB. The maximum size of a file one can upload to an + upload session is 350 GB. Calls to this endpoint will count as data + transport calls for any Dropbox Business teams with a limit on the + number of data transport calls allowed per month. For more information, + see the `Data transport limit page + `_. + + :param bytes f: Contents to upload. + :param str session_id: The upload session ID (returned by + :meth:`files_upload_session_start`). + :param int offset: The amount of data that has been uploaded so far. We + use this to make sure upload data isn't lost or duplicated in the + event of a network error. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.UploadSessionLookupError` + """ + warnings.warn( + 'upload_session/append is deprecated. Use upload_session/append.', + DeprecationWarning, + ) + arg = files.UploadSessionCursor(session_id, + offset) + r = self.request( + files.upload_session_append, + 'files', + arg, + f, + ) + return None + + def files_upload_session_finish(self, + f, + cursor, + commit): + """ + Finish an upload session and save the uploaded data to the given file + path. A single request should not upload more than 150 MB. The maximum + size of a file one can upload to an upload session is 350 GB. Calls to + this endpoint will count as data transport calls for any Dropbox + Business teams with a limit on the number of data transport calls + allowed per month. For more information, see the `Data transport limit + page + `_. + + :param bytes f: Contents to upload. + :param cursor: Contains the upload session ID and the offset. + :type cursor: :class:`dropbox.files.UploadSessionCursor` + :param commit: Contains the path and other optional modifiers for the + commit. + :type commit: :class:`dropbox.files.CommitInfo` + :rtype: :class:`dropbox.files.FileMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.UploadSessionFinishError` + """ + arg = files.UploadSessionFinishArg(cursor, + commit) + r = self.request( + files.upload_session_finish, + 'files', + arg, + f, + ) + return r + + def files_upload_session_finish_batch(self, + entries): + """ + This route helps you commit many files at once into a user's Dropbox. + Use :meth:`files_upload_session_start` and + :meth:`files_upload_session_append_v2` to upload file contents. We + recommend uploading many files in parallel to increase throughput. Once + the file contents have been uploaded, rather than calling + :meth:`files_upload_session_finish`, use this route to finish all your + upload sessions in a single request. ``UploadSessionStartArg.close`` or + ``UploadSessionAppendArg.close`` needs to be true for the last + :meth:`files_upload_session_start` or + :meth:`files_upload_session_append_v2` call. The maximum size of a file + one can upload to an upload session is 350 GB. This route will return a + job_id immediately and do the async commit job in background. Use + :meth:`files_upload_session_finish_batch_check` to check the job status. + For the same account, this route should be executed serially. That means + you should not start the next job before current job finishes. We allow + up to 1000 entries in a single request. Calls to this endpoint will + count as data transport calls for any Dropbox Business teams with a + limit on the number of data transport calls allowed per month. For more + information, see the `Data transport limit page + `_. + + :param list entries: Commit information for each file in the batch. + :rtype: :class:`dropbox.files.UploadSessionFinishBatchLaunch` + """ + arg = files.UploadSessionFinishBatchArg(entries) + r = self.request( + files.upload_session_finish_batch, + 'files', + arg, + None, + ) + return r + + def files_upload_session_finish_batch_check(self, + async_job_id): + """ + Returns the status of an asynchronous job for + :meth:`files_upload_session_finish_batch`. If success, it returns list + of result for each entry. + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.files.UploadSessionFinishBatchJobStatus` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.files.PollError` + """ + arg = async_.PollArg(async_job_id) + r = self.request( + files.upload_session_finish_batch_check, + 'files', + arg, + None, + ) + return r + + def files_upload_session_start(self, + f, + close=False): + """ + Upload sessions allow you to upload a single file in one or more + requests, for example where the size of the file is greater than 150 MB. + This call starts a new upload session with the given data. You can then + use :meth:`files_upload_session_append_v2` to add more data and + :meth:`files_upload_session_finish` to save all the data to a file in + Dropbox. A single request should not upload more than 150 MB. The + maximum size of a file one can upload to an upload session is 350 GB. An + upload session can be used for a maximum of 48 hours. Attempting to use + an ``UploadSessionStartResult.session_id`` with + :meth:`files_upload_session_append_v2` or + :meth:`files_upload_session_finish` more than 48 hours after its + creation will return a ``UploadSessionLookupError.not_found``. Calls to + this endpoint will count as data transport calls for any Dropbox + Business teams with a limit on the number of data transport calls + allowed per month. For more information, see the `Data transport limit + page + `_. + + :param bytes f: Contents to upload. + :param bool close: If true, the current session will be closed, at which + point you won't be able to call + :meth:`files_upload_session_append_v2` anymore with the current + session. + :rtype: :class:`dropbox.files.UploadSessionStartResult` + """ + arg = files.UploadSessionStartArg(close) + r = self.request( + files.upload_session_start, + 'files', + arg, + f, + ) + return r + + # ------------------------------------------ + # Routes in paper namespace + + def paper_docs_archive(self, + doc_id): + """ + Marks the given Paper doc as archived. Note: This action can be + performed or undone by anyone with edit permissions to the doc. + + :param str doc_id: The Paper doc ID. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.paper.DocLookupError` + """ + arg = paper.RefPaperDoc(doc_id) + r = self.request( + paper.docs_archive, + 'paper', + arg, + None, + ) + return None + + def paper_docs_create(self, + f, + import_format, + parent_folder_id=None): + """ + Creates a new Paper doc with the provided content. + + :param bytes f: Contents to upload. + :param Nullable parent_folder_id: The Paper folder ID where the Paper + document should be created. The API user has to have write access to + this folder or error is thrown. + :param import_format: The format of provided data. + :type import_format: :class:`dropbox.paper.ImportFormat` + :rtype: :class:`dropbox.paper.PaperDocCreateUpdateResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.paper.PaperDocCreateError` + """ + arg = paper.PaperDocCreateArgs(import_format, + parent_folder_id) + r = self.request( + paper.docs_create, + 'paper', + arg, + f, + ) + return r + + def paper_docs_download(self, + doc_id, + export_format): + """ + Exports and downloads Paper doc either as HTML or markdown. + + :type export_format: :class:`dropbox.paper.ExportFormat` + :rtype: (:class:`dropbox.paper.PaperDocExportResult`, + :class:`requests.models.Response`) + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.paper.DocLookupError` + + If you do not consume the entire response body, then you must call close + on the response object, otherwise you will max out your available + connections. We recommend using the `contextlib.closing + `_ + context manager to ensure this. + """ + arg = paper.PaperDocExport(doc_id, + export_format) + r = self.request( + paper.docs_download, + 'paper', + arg, + None, + ) + return r + + def paper_docs_download_to_file(self, + download_path, + doc_id, + export_format): + """ + Exports and downloads Paper doc either as HTML or markdown. + + :param str download_path: Path on local machine to save file. + :type export_format: :class:`dropbox.paper.ExportFormat` + :rtype: :class:`dropbox.paper.PaperDocExportResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.paper.DocLookupError` + """ + arg = paper.PaperDocExport(doc_id, + export_format) + r = self.request( + paper.docs_download, + 'paper', + arg, + None, + ) + self._save_body_to_file(download_path, r[1]) + return r[0] + + def paper_docs_folder_users_list(self, + doc_id, + limit=1000): + """ + Lists the users who are explicitly invited to the Paper folder in which + the Paper doc is contained. For private folders all users (including + owner) shared on the folder are listed and for team folders all non-team + users shared on the folder are returned. + + :param int limit: Size limit per batch. The maximum number of users that + can be retrieved per batch is 1000. Higher value results in invalid + arguments error. + :rtype: :class:`dropbox.paper.ListUsersOnFolderResponse` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.paper.DocLookupError` + """ + arg = paper.ListUsersOnFolderArgs(doc_id, + limit) + r = self.request( + paper.docs_folder_users_list, + 'paper', + arg, + None, + ) + return r + + def paper_docs_folder_users_list_continue(self, + doc_id, + cursor): + """ + Once a cursor has been retrieved from + :meth:`paper_docs_folder_users_list`, use this to paginate through all + users on the Paper folder. + + :param str cursor: The cursor obtained from + :meth:`paper_docs_folder_users_list` or + :meth:`paper_docs_folder_users_list_continue`. Allows for + pagination. + :rtype: :class:`dropbox.paper.ListUsersOnFolderResponse` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.paper.ListUsersCursorError` + """ + arg = paper.ListUsersOnFolderContinueArgs(doc_id, + cursor) + r = self.request( + paper.docs_folder_users_list_continue, + 'paper', + arg, + None, + ) + return r + + def paper_docs_get_folder_info(self, + doc_id): + """ + Retrieves folder information for the given Paper doc. This includes: - + folder sharing policy; permissions for subfolders are set by the + top-level folder. - full 'filepath', i.e. the list of folders (both + folderId and folderName) from the root folder to the folder directly + containing the Paper doc. Note: If the Paper doc is not in any folder + (aka unfiled) the response will be empty. + + :param str doc_id: The Paper doc ID. + :rtype: :class:`dropbox.paper.FoldersContainingPaperDoc` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.paper.DocLookupError` + """ + arg = paper.RefPaperDoc(doc_id) + r = self.request( + paper.docs_get_folder_info, + 'paper', + arg, + None, + ) + return r + + def paper_docs_list(self, + filter_by=paper.ListPaperDocsFilterBy.docs_accessed, + sort_by=paper.ListPaperDocsSortBy.accessed, + sort_order=paper.ListPaperDocsSortOrder.ascending, + limit=1000): + """ + Return the list of all Paper docs according to the argument + specifications. To iterate over through the full pagination, pass the + cursor to :meth:`paper_docs_list_continue`. + + :param filter_by: Allows user to specify how the Paper docs should be + filtered. + :type filter_by: :class:`dropbox.paper.ListPaperDocsFilterBy` + :param sort_by: Allows user to specify how the Paper docs should be + sorted. + :type sort_by: :class:`dropbox.paper.ListPaperDocsSortBy` + :param sort_order: Allows user to specify the sort order of the result. + :type sort_order: :class:`dropbox.paper.ListPaperDocsSortOrder` + :param int limit: Size limit per batch. The maximum number of docs that + can be retrieved per batch is 1000. Higher value results in invalid + arguments error. + :rtype: :class:`dropbox.paper.ListPaperDocsResponse` + """ + arg = paper.ListPaperDocsArgs(filter_by, + sort_by, + sort_order, + limit) + r = self.request( + paper.docs_list, + 'paper', + arg, + None, + ) + return r + + def paper_docs_list_continue(self, + cursor): + """ + Once a cursor has been retrieved from :meth:`paper_docs_list`, use this + to paginate through all Paper doc. + + :param str cursor: The cursor obtained from :meth:`paper_docs_list` or + :meth:`paper_docs_list_continue`. Allows for pagination. + :rtype: :class:`dropbox.paper.ListPaperDocsResponse` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.paper.ListDocsCursorError` + """ + arg = paper.ListPaperDocsContinueArgs(cursor) + r = self.request( + paper.docs_list_continue, + 'paper', + arg, + None, + ) + return r + + def paper_docs_permanently_delete(self, + doc_id): + """ + Permanently deletes the given Paper doc. This operation is final as the + doc cannot be recovered. Note: This action can be performed only by the + doc owner. + + :param str doc_id: The Paper doc ID. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.paper.DocLookupError` + """ + arg = paper.RefPaperDoc(doc_id) + r = self.request( + paper.docs_permanently_delete, + 'paper', + arg, + None, + ) + return None + + def paper_docs_sharing_policy_get(self, + doc_id): + """ + Gets the default sharing policy for the given Paper doc. + + :param str doc_id: The Paper doc ID. + :rtype: :class:`dropbox.paper.SharingPolicy` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.paper.DocLookupError` + """ + arg = paper.RefPaperDoc(doc_id) + r = self.request( + paper.docs_sharing_policy_get, + 'paper', + arg, + None, + ) + return r + + def paper_docs_sharing_policy_set(self, + doc_id, + sharing_policy): + """ + Sets the default sharing policy for the given Paper doc. The default + 'team_sharing_policy' can be changed only by teams, omit this field for + personal accounts. Note: 'public_sharing_policy' cannot be set to the + value 'disabled' because this setting can be changed only via the team + admin console. + + :param sharing_policy: The default sharing policy to be set for the + Paper doc. + :type sharing_policy: :class:`dropbox.paper.SharingPolicy` + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.paper.DocLookupError` + """ + arg = paper.PaperDocSharingPolicy(doc_id, + sharing_policy) + r = self.request( + paper.docs_sharing_policy_set, + 'paper', + arg, + None, + ) + return None + + def paper_docs_update(self, + f, + doc_id, + doc_update_policy, + revision, + import_format): + """ + Updates an existing Paper doc with the provided content. + + :param bytes f: Contents to upload. + :param doc_update_policy: The policy used for the current update call. + :type doc_update_policy: :class:`dropbox.paper.PaperDocUpdatePolicy` + :param int revision: The latest doc revision. This value must match the + head revision or an error code will be returned. This is to prevent + colliding writes. + :param import_format: The format of provided data. + :type import_format: :class:`dropbox.paper.ImportFormat` + :rtype: :class:`dropbox.paper.PaperDocCreateUpdateResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.paper.PaperDocUpdateError` + """ + arg = paper.PaperDocUpdateArgs(doc_id, + doc_update_policy, + revision, + import_format) + r = self.request( + paper.docs_update, + 'paper', + arg, + f, + ) + return r + + def paper_docs_users_add(self, + doc_id, + members, + custom_message=None, + quiet=False): + """ + Allows an owner or editor to add users to a Paper doc or change their + permissions using their email address or Dropbox account ID. Note: The + Doc owner's permissions cannot be changed. + + :param list members: User which should be added to the Paper doc. + Specify only email address or Dropbox account ID. + :param Nullable custom_message: A personal message that will be emailed + to each successfully added member. + :param bool quiet: Clients should set this to true if no email message + shall be sent to added users. + :rtype: list + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.paper.DocLookupError` + """ + arg = paper.AddPaperDocUser(doc_id, + members, + custom_message, + quiet) + r = self.request( + paper.docs_users_add, + 'paper', + arg, + None, + ) + return r + + def paper_docs_users_list(self, + doc_id, + limit=1000, + filter_by=paper.UserOnPaperDocFilter.shared): + """ + Lists all users who visited the Paper doc or users with explicit access. + This call excludes users who have been removed. The list is sorted by + the date of the visit or the share date. The list will include both + users, the explicitly shared ones as well as those who came in using the + Paper url link. + + :param int limit: Size limit per batch. The maximum number of users that + can be retrieved per batch is 1000. Higher value results in invalid + arguments error. + :param filter_by: Specify this attribute if you want to obtain users + that have already accessed the Paper doc. + :type filter_by: :class:`dropbox.paper.UserOnPaperDocFilter` + :rtype: :class:`dropbox.paper.ListUsersOnPaperDocResponse` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.paper.DocLookupError` + """ + arg = paper.ListUsersOnPaperDocArgs(doc_id, + limit, + filter_by) + r = self.request( + paper.docs_users_list, + 'paper', + arg, + None, + ) + return r + + def paper_docs_users_list_continue(self, + doc_id, + cursor): + """ + Once a cursor has been retrieved from :meth:`paper_docs_users_list`, use + this to paginate through all users on the Paper doc. + + :param str cursor: The cursor obtained from + :meth:`paper_docs_users_list` or + :meth:`paper_docs_users_list_continue`. Allows for pagination. + :rtype: :class:`dropbox.paper.ListUsersOnPaperDocResponse` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.paper.ListUsersCursorError` + """ + arg = paper.ListUsersOnPaperDocContinueArgs(doc_id, + cursor) + r = self.request( + paper.docs_users_list_continue, + 'paper', + arg, + None, + ) + return r + + def paper_docs_users_remove(self, + doc_id, + member): + """ + Allows an owner or editor to remove users from a Paper doc using their + email address or Dropbox account ID. Note: Doc owner cannot be removed. + + :param member: User which should be removed from the Paper doc. Specify + only email address or Dropbox account ID. + :type member: :class:`dropbox.paper.MemberSelector` + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.paper.DocLookupError` + """ + arg = paper.RemovePaperDocUser(doc_id, + member) + r = self.request( + paper.docs_users_remove, + 'paper', + arg, + None, + ) + return None + + # ------------------------------------------ + # Routes in sharing namespace + + def sharing_add_file_member(self, + file, + members, + custom_message=None, + quiet=False, + access_level=sharing.AccessLevel.viewer, + add_message_as_comment=False): + """ + Adds specified members to a file. + + :param str file: File to which to add members. + :param list members: Members to add. Note that even an email address is + given, this may result in a user being directy added to the + membership if that email is the user's main account email. + :param Nullable custom_message: Message to send to added members in + their invitation. + :param bool quiet: Whether added members should be notified via device + notifications of their invitation. + :param access_level: AccessLevel union object, describing what access + level we want to give new members. + :type access_level: :class:`dropbox.sharing.AccessLevel` + :param bool add_message_as_comment: If the custom message should be + added as a comment on the file. + :rtype: list + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.AddFileMemberError` + """ + arg = sharing.AddFileMemberArgs(file, + members, + custom_message, + quiet, + access_level, + add_message_as_comment) + r = self.request( + sharing.add_file_member, + 'sharing', + arg, + None, + ) + return r + + def sharing_add_folder_member(self, + shared_folder_id, + members, + quiet=False, + custom_message=None): + """ + Allows an owner or editor (if the ACL update policy allows) of a shared + folder to add another member. For the new member to get access to all + the functionality for this folder, you will need to call + :meth:`sharing_mount_folder` on their behalf. + + :param str shared_folder_id: The ID for the shared folder. + :param list members: The intended list of members to add. Added members + will receive invites to join the shared folder. + :param bool quiet: Whether added members should be notified via email + and device notifications of their invite. + :param Nullable custom_message: Optional message to display to added + members in their invitation. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.AddFolderMemberError` + """ + arg = sharing.AddFolderMemberArg(shared_folder_id, + members, + quiet, + custom_message) + r = self.request( + sharing.add_folder_member, + 'sharing', + arg, + None, + ) + return None + + def sharing_change_file_member_access(self, + file, + member, + access_level): + """ + Identical to update_file_member but with less information returned. + + :param str file: File for which we are changing a member's access. + :param member: The member whose access we are changing. + :type member: :class:`dropbox.sharing.MemberSelector` + :param access_level: The new access level for the member. + :type access_level: :class:`dropbox.sharing.AccessLevel` + :rtype: :class:`dropbox.sharing.FileMemberActionResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.FileMemberActionError` + """ + warnings.warn( + 'change_file_member_access is deprecated. Use update_file_member.', + DeprecationWarning, + ) + arg = sharing.ChangeFileMemberAccessArgs(file, + member, + access_level) + r = self.request( + sharing.change_file_member_access, + 'sharing', + arg, + None, + ) + return r + + def sharing_check_job_status(self, + async_job_id): + """ + Returns the status of an asynchronous job. + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.sharing.JobStatus` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.PollError` + """ + arg = async_.PollArg(async_job_id) + r = self.request( + sharing.check_job_status, + 'sharing', + arg, + None, + ) + return r + + def sharing_check_remove_member_job_status(self, + async_job_id): + """ + Returns the status of an asynchronous job for sharing a folder. + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.sharing.RemoveMemberJobStatus` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.PollError` + """ + arg = async_.PollArg(async_job_id) + r = self.request( + sharing.check_remove_member_job_status, + 'sharing', + arg, + None, + ) + return r + + def sharing_check_share_job_status(self, + async_job_id): + """ + Returns the status of an asynchronous job for sharing a folder. + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.sharing.ShareFolderJobStatus` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.PollError` + """ + arg = async_.PollArg(async_job_id) + r = self.request( + sharing.check_share_job_status, + 'sharing', + arg, + None, + ) + return r + + def sharing_create_shared_link(self, + path, + short_url=False, + pending_upload=None): + """ + Create a shared link. If a shared link already exists for the given + path, that link is returned. Note that in the returned + :class:`dropbox.sharing.PathLinkMetadata`, the ``PathLinkMetadata.url`` + field is the shortened URL if ``CreateSharedLinkArg.short_url`` argument + is set to ``True``. Previously, it was technically possible to break a + shared link by moving or renaming the corresponding file or folder. In + the future, this will no longer be the case, so your app shouldn't rely + on this behavior. Instead, if your app needs to revoke a shared link, + use :meth:`sharing_revoke_shared_link`. + + :param str path: The path to share. + :param bool short_url: Whether to return a shortened URL. + :param Nullable pending_upload: If it's okay to share a path that does + not yet exist, set this to either ``PendingUploadMode.file`` or + ``PendingUploadMode.folder`` to indicate whether to assume it's a + file or folder. + :rtype: :class:`dropbox.sharing.PathLinkMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.CreateSharedLinkError` + """ + warnings.warn( + 'create_shared_link is deprecated. Use create_shared_link_with_settings.', + DeprecationWarning, + ) + arg = sharing.CreateSharedLinkArg(path, + short_url, + pending_upload) + r = self.request( + sharing.create_shared_link, + 'sharing', + arg, + None, + ) + return r + + def sharing_create_shared_link_with_settings(self, + path, + settings=None): + """ + Create a shared link with custom settings. If no settings are given then + the default visibility is ``RequestedVisibility.public`` (The resolved + visibility, though, may depend on other aspects such as team and shared + folder settings). + + :param str path: The path to be shared by the shared link. + :param Nullable settings: The requested settings for the newly created + shared link. + :rtype: :class:`dropbox.sharing.SharedLinkMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.CreateSharedLinkWithSettingsError` + """ + arg = sharing.CreateSharedLinkWithSettingsArg(path, + settings) + r = self.request( + sharing.create_shared_link_with_settings, + 'sharing', + arg, + None, + ) + return r + + def sharing_get_file_metadata(self, + file, + actions=None): + """ + Returns shared file metadata. + + :param str file: The file to query. + :param Nullable actions: A list of `FileAction`s corresponding to + `FilePermission`s that should appear in the response's + ``SharedFileMetadata.permissions`` field describing the actions the + authenticated user can perform on the file. + :rtype: :class:`dropbox.sharing.SharedFileMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.GetFileMetadataError` + """ + arg = sharing.GetFileMetadataArg(file, + actions) + r = self.request( + sharing.get_file_metadata, + 'sharing', + arg, + None, + ) + return r + + def sharing_get_file_metadata_batch(self, + files, + actions=None): + """ + Returns shared file metadata. + + :param list files: The files to query. + :param Nullable actions: A list of `FileAction`s corresponding to + `FilePermission`s that should appear in the response's + ``SharedFileMetadata.permissions`` field describing the actions the + authenticated user can perform on the file. + :rtype: list + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.SharingUserError` + """ + arg = sharing.GetFileMetadataBatchArg(files, + actions) + r = self.request( + sharing.get_file_metadata_batch, + 'sharing', + arg, + None, + ) + return r + + def sharing_get_folder_metadata(self, + shared_folder_id, + actions=None): + """ + Returns shared folder metadata by its folder ID. + + :param str shared_folder_id: The ID for the shared folder. + :param Nullable actions: A list of `FolderAction`s corresponding to + `FolderPermission`s that should appear in the response's + ``SharedFolderMetadata.permissions`` field describing the actions + the authenticated user can perform on the folder. + :rtype: :class:`dropbox.sharing.SharedFolderMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.SharedFolderAccessError` + """ + arg = sharing.GetMetadataArgs(shared_folder_id, + actions) + r = self.request( + sharing.get_folder_metadata, + 'sharing', + arg, + None, + ) + return r + + def sharing_get_shared_link_file(self, + url, + path=None, + link_password=None): + """ + Download the shared link's file from a user's Dropbox. + + :param str url: URL of the shared link. + :param Nullable path: If the shared link is to a folder, this parameter + can be used to retrieve the metadata for a specific file or + sub-folder in this folder. A relative path should be used. + :param Nullable link_password: If the shared link has a password, this + parameter can be used. + :rtype: (:class:`dropbox.sharing.SharedLinkMetadata`, + :class:`requests.models.Response`) + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.GetSharedLinkFileError` + + If you do not consume the entire response body, then you must call close + on the response object, otherwise you will max out your available + connections. We recommend using the `contextlib.closing + `_ + context manager to ensure this. + """ + arg = sharing.GetSharedLinkMetadataArg(url, + path, + link_password) + r = self.request( + sharing.get_shared_link_file, + 'sharing', + arg, + None, + ) + return r + + def sharing_get_shared_link_file_to_file(self, + download_path, + url, + path=None, + link_password=None): + """ + Download the shared link's file from a user's Dropbox. + + :param str download_path: Path on local machine to save file. + :param str url: URL of the shared link. + :param Nullable path: If the shared link is to a folder, this parameter + can be used to retrieve the metadata for a specific file or + sub-folder in this folder. A relative path should be used. + :param Nullable link_password: If the shared link has a password, this + parameter can be used. + :rtype: :class:`dropbox.sharing.SharedLinkMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.GetSharedLinkFileError` + """ + arg = sharing.GetSharedLinkMetadataArg(url, + path, + link_password) + r = self.request( + sharing.get_shared_link_file, + 'sharing', + arg, + None, + ) + self._save_body_to_file(download_path, r[1]) + return r[0] + + def sharing_get_shared_link_metadata(self, + url, + path=None, + link_password=None): + """ + Get the shared link's metadata. + + :param str url: URL of the shared link. + :param Nullable path: If the shared link is to a folder, this parameter + can be used to retrieve the metadata for a specific file or + sub-folder in this folder. A relative path should be used. + :param Nullable link_password: If the shared link has a password, this + parameter can be used. + :rtype: :class:`dropbox.sharing.SharedLinkMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.SharedLinkError` + """ + arg = sharing.GetSharedLinkMetadataArg(url, + path, + link_password) + r = self.request( + sharing.get_shared_link_metadata, + 'sharing', + arg, + None, + ) + return r + + def sharing_get_shared_links(self, + path=None): + """ + Returns a list of :class:`dropbox.sharing.LinkMetadata` objects for this + user, including collection links. If no path is given, returns a list of + all shared links for the current user, including collection links, up to + a maximum of 1000 links. If a non-empty path is given, returns a list of + all shared links that allow access to the given path. Collection links + are never returned in this case. Note that the url field in the response + is never the shortened URL. + + :param Nullable path: See :meth:`sharing_get_shared_links` description. + :rtype: :class:`dropbox.sharing.GetSharedLinksResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.GetSharedLinksError` + """ + warnings.warn( + 'get_shared_links is deprecated. Use list_shared_links.', + DeprecationWarning, + ) + arg = sharing.GetSharedLinksArg(path) + r = self.request( + sharing.get_shared_links, + 'sharing', + arg, + None, + ) + return r + + def sharing_list_file_members(self, + file, + actions=None, + include_inherited=True, + limit=100): + """ + Use to obtain the members who have been invited to a file, both + inherited and uninherited members. + + :param str file: The file for which you want to see members. + :param Nullable actions: The actions for which to return permissions on + a member. + :param bool include_inherited: Whether to include members who only have + access from a parent shared folder. + :param int limit: Number of members to return max per query. Defaults to + 100 if no limit is specified. + :rtype: :class:`dropbox.sharing.SharedFileMembers` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.ListFileMembersError` + """ + arg = sharing.ListFileMembersArg(file, + actions, + include_inherited, + limit) + r = self.request( + sharing.list_file_members, + 'sharing', + arg, + None, + ) + return r + + def sharing_list_file_members_batch(self, + files, + limit=10): + """ + Get members of multiple files at once. The arguments to this route are + more limited, and the limit on query result size per file is more + strict. To customize the results more, use the individual file endpoint. + Inherited users and groups are not included in the result, and + permissions are not returned for this endpoint. + + :param list files: Files for which to return members. + :param int limit: Number of members to return max per query. Defaults to + 10 if no limit is specified. + :rtype: list + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.SharingUserError` + """ + arg = sharing.ListFileMembersBatchArg(files, + limit) + r = self.request( + sharing.list_file_members_batch, + 'sharing', + arg, + None, + ) + return r + + def sharing_list_file_members_continue(self, + cursor): + """ + Once a cursor has been retrieved from :meth:`sharing_list_file_members` + or :meth:`sharing_list_file_members_batch`, use this to paginate through + all shared file members. + + :param str cursor: The cursor returned by your last call to + :meth:`sharing_list_file_members`, + :meth:`sharing_list_file_members_continue`, or + :meth:`sharing_list_file_members_batch`. + :rtype: :class:`dropbox.sharing.SharedFileMembers` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.ListFileMembersContinueError` + """ + arg = sharing.ListFileMembersContinueArg(cursor) + r = self.request( + sharing.list_file_members_continue, + 'sharing', + arg, + None, + ) + return r + + def sharing_list_folder_members(self, + shared_folder_id, + actions=None, + limit=1000): + """ + Returns shared folder membership by its folder ID. + + :param str shared_folder_id: The ID for the shared folder. + :rtype: :class:`dropbox.sharing.SharedFolderMembers` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.SharedFolderAccessError` + """ + arg = sharing.ListFolderMembersArgs(shared_folder_id, + actions, + limit) + r = self.request( + sharing.list_folder_members, + 'sharing', + arg, + None, + ) + return r + + def sharing_list_folder_members_continue(self, + cursor): + """ + Once a cursor has been retrieved from + :meth:`sharing_list_folder_members`, use this to paginate through all + shared folder members. + + :param str cursor: The cursor returned by your last call to + :meth:`sharing_list_folder_members` or + :meth:`sharing_list_folder_members_continue`. + :rtype: :class:`dropbox.sharing.SharedFolderMembers` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.ListFolderMembersContinueError` + """ + arg = sharing.ListFolderMembersContinueArg(cursor) + r = self.request( + sharing.list_folder_members_continue, + 'sharing', + arg, + None, + ) + return r + + def sharing_list_folders(self, + limit=1000, + actions=None): + """ + Return the list of all shared folders the current user has access to. + + :param int limit: The maximum number of results to return per request. + :param Nullable actions: A list of `FolderAction`s corresponding to + `FolderPermission`s that should appear in the response's + ``SharedFolderMetadata.permissions`` field describing the actions + the authenticated user can perform on the folder. + :rtype: :class:`dropbox.sharing.ListFoldersResult` + """ + arg = sharing.ListFoldersArgs(limit, + actions) + r = self.request( + sharing.list_folders, + 'sharing', + arg, + None, + ) + return r + + def sharing_list_folders_continue(self, + cursor): + """ + Once a cursor has been retrieved from :meth:`sharing_list_folders`, use + this to paginate through all shared folders. The cursor must come from a + previous call to :meth:`sharing_list_folders` or + :meth:`sharing_list_folders_continue`. + + :param str cursor: The cursor returned by the previous API call + specified in the endpoint description. + :rtype: :class:`dropbox.sharing.ListFoldersResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.ListFoldersContinueError` + """ + arg = sharing.ListFoldersContinueArg(cursor) + r = self.request( + sharing.list_folders_continue, + 'sharing', + arg, + None, + ) + return r + + def sharing_list_mountable_folders(self, + limit=1000, + actions=None): + """ + Return the list of all shared folders the current user can mount or + unmount. + + :param int limit: The maximum number of results to return per request. + :param Nullable actions: A list of `FolderAction`s corresponding to + `FolderPermission`s that should appear in the response's + ``SharedFolderMetadata.permissions`` field describing the actions + the authenticated user can perform on the folder. + :rtype: :class:`dropbox.sharing.ListFoldersResult` + """ + arg = sharing.ListFoldersArgs(limit, + actions) + r = self.request( + sharing.list_mountable_folders, + 'sharing', + arg, + None, + ) + return r + + def sharing_list_mountable_folders_continue(self, + cursor): + """ + Once a cursor has been retrieved from + :meth:`sharing_list_mountable_folders`, use this to paginate through all + mountable shared folders. The cursor must come from a previous call to + :meth:`sharing_list_mountable_folders` or + :meth:`sharing_list_mountable_folders_continue`. + + :param str cursor: The cursor returned by the previous API call + specified in the endpoint description. + :rtype: :class:`dropbox.sharing.ListFoldersResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.ListFoldersContinueError` + """ + arg = sharing.ListFoldersContinueArg(cursor) + r = self.request( + sharing.list_mountable_folders_continue, + 'sharing', + arg, + None, + ) + return r + + def sharing_list_received_files(self, + limit=100, + actions=None): + """ + Returns a list of all files shared with current user. Does not include + files the user has received via shared folders, and does not include + unclaimed invitations. + + :param int limit: Number of files to return max per query. Defaults to + 100 if no limit is specified. + :param Nullable actions: A list of `FileAction`s corresponding to + `FilePermission`s that should appear in the response's + ``SharedFileMetadata.permissions`` field describing the actions the + authenticated user can perform on the file. + :rtype: :class:`dropbox.sharing.ListFilesResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.SharingUserError` + """ + arg = sharing.ListFilesArg(limit, + actions) + r = self.request( + sharing.list_received_files, + 'sharing', + arg, + None, + ) + return r + + def sharing_list_received_files_continue(self, + cursor): + """ + Get more results with a cursor from :meth:`sharing_list_received_files`. + + :param str cursor: Cursor in ``ListFilesResult.cursor``. + :rtype: :class:`dropbox.sharing.ListFilesResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.ListFilesContinueError` + """ + arg = sharing.ListFilesContinueArg(cursor) + r = self.request( + sharing.list_received_files_continue, + 'sharing', + arg, + None, + ) + return r + + def sharing_list_shared_links(self, + path=None, + cursor=None, + direct_only=None): + """ + List shared links of this user. If no path is given, returns a list of + all shared links for the current user. If a non-empty path is given, + returns a list of all shared links that allow access to the given path - + direct links to the given path and links to parent folders of the given + path. Links to parent folders can be suppressed by setting direct_only + to true. + + :param Nullable path: See :meth:`sharing_list_shared_links` description. + :param Nullable cursor: The cursor returned by your last call to + :meth:`sharing_list_shared_links`. + :param Nullable direct_only: See :meth:`sharing_list_shared_links` + description. + :rtype: :class:`dropbox.sharing.ListSharedLinksResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.ListSharedLinksError` + """ + arg = sharing.ListSharedLinksArg(path, + cursor, + direct_only) + r = self.request( + sharing.list_shared_links, + 'sharing', + arg, + None, + ) + return r + + def sharing_modify_shared_link_settings(self, + url, + settings, + remove_expiration=False): + """ + Modify the shared link's settings. If the requested visibility conflict + with the shared links policy of the team or the shared folder (in case + the linked file is part of a shared folder) then the + ``LinkPermissions.resolved_visibility`` of the returned + :class:`dropbox.sharing.SharedLinkMetadata` will reflect the actual + visibility of the shared link and the + ``LinkPermissions.requested_visibility`` will reflect the requested + visibility. + + :param str url: URL of the shared link to change its settings. + :param settings: Set of settings for the shared link. + :type settings: :class:`dropbox.sharing.SharedLinkSettings` + :param bool remove_expiration: If set to true, removes the expiration of + the shared link. + :rtype: :class:`dropbox.sharing.SharedLinkMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.ModifySharedLinkSettingsError` + """ + arg = sharing.ModifySharedLinkSettingsArgs(url, + settings, + remove_expiration) + r = self.request( + sharing.modify_shared_link_settings, + 'sharing', + arg, + None, + ) + return r + + def sharing_mount_folder(self, + shared_folder_id): + """ + The current user mounts the designated folder. Mount a shared folder for + a user after they have been added as a member. Once mounted, the shared + folder will appear in their Dropbox. + + :param str shared_folder_id: The ID of the shared folder to mount. + :rtype: :class:`dropbox.sharing.SharedFolderMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.MountFolderError` + """ + arg = sharing.MountFolderArg(shared_folder_id) + r = self.request( + sharing.mount_folder, + 'sharing', + arg, + None, + ) + return r + + def sharing_relinquish_file_membership(self, + file): + """ + The current user relinquishes their membership in the designated file. + Note that the current user may still have inherited access to this file + through the parent folder. + + :param str file: The path or id for the file. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.RelinquishFileMembershipError` + """ + arg = sharing.RelinquishFileMembershipArg(file) + r = self.request( + sharing.relinquish_file_membership, + 'sharing', + arg, + None, + ) + return None + + def sharing_relinquish_folder_membership(self, + shared_folder_id, + leave_a_copy=False): + """ + The current user relinquishes their membership in the designated shared + folder and will no longer have access to the folder. A folder owner + cannot relinquish membership in their own folder. This will run + synchronously if leave_a_copy is false, and asynchronously if + leave_a_copy is true. + + :param str shared_folder_id: The ID for the shared folder. + :param bool leave_a_copy: Keep a copy of the folder's contents upon + relinquishing membership. + :rtype: :class:`dropbox.sharing.LaunchEmptyResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.RelinquishFolderMembershipError` + """ + arg = sharing.RelinquishFolderMembershipArg(shared_folder_id, + leave_a_copy) + r = self.request( + sharing.relinquish_folder_membership, + 'sharing', + arg, + None, + ) + return r + + def sharing_remove_file_member(self, + file, + member): + """ + Identical to remove_file_member_2 but with less information returned. + + :param str file: File from which to remove members. + :param member: Member to remove from this file. Note that even if an + email is specified, it may result in the removal of a user (not an + invitee) if the user's main account corresponds to that email + address. + :type member: :class:`dropbox.sharing.MemberSelector` + :rtype: :class:`dropbox.sharing.FileMemberActionIndividualResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.RemoveFileMemberError` + """ + warnings.warn( + 'remove_file_member is deprecated. Use remove_file_member_2.', + DeprecationWarning, + ) + arg = sharing.RemoveFileMemberArg(file, + member) + r = self.request( + sharing.remove_file_member, + 'sharing', + arg, + None, + ) + return r + + def sharing_remove_file_member_2(self, + file, + member): + """ + Removes a specified member from the file. + + :param str file: File from which to remove members. + :param member: Member to remove from this file. Note that even if an + email is specified, it may result in the removal of a user (not an + invitee) if the user's main account corresponds to that email + address. + :type member: :class:`dropbox.sharing.MemberSelector` + :rtype: :class:`dropbox.sharing.FileMemberRemoveActionResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.RemoveFileMemberError` + """ + arg = sharing.RemoveFileMemberArg(file, + member) + r = self.request( + sharing.remove_file_member_2, + 'sharing', + arg, + None, + ) + return r + + def sharing_remove_folder_member(self, + shared_folder_id, + member, + leave_a_copy): + """ + Allows an owner or editor (if the ACL update policy allows) of a shared + folder to remove another member. + + :param str shared_folder_id: The ID for the shared folder. + :param member: The member to remove from the folder. + :type member: :class:`dropbox.sharing.MemberSelector` + :param bool leave_a_copy: If true, the removed user will keep their copy + of the folder after it's unshared, assuming it was mounted. + Otherwise, it will be removed from their Dropbox. Also, this must be + set to false when kicking a group. + :rtype: :class:`dropbox.sharing.LaunchResultBase` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.RemoveFolderMemberError` + """ + arg = sharing.RemoveFolderMemberArg(shared_folder_id, + member, + leave_a_copy) + r = self.request( + sharing.remove_folder_member, + 'sharing', + arg, + None, + ) + return r + + def sharing_revoke_shared_link(self, + url): + """ + Revoke a shared link. Note that even after revoking a shared link to a + file, the file may be accessible if there are shared links leading to + any of the file parent folders. To list all shared links that enable + access to a specific file, you can use the + :meth:`sharing_list_shared_links` with the file as the + ``ListSharedLinksArg.path`` argument. + + :param str url: URL of the shared link. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.RevokeSharedLinkError` + """ + arg = sharing.RevokeSharedLinkArg(url) + r = self.request( + sharing.revoke_shared_link, + 'sharing', + arg, + None, + ) + return None + + def sharing_set_access_inheritance(self, + shared_folder_id, + access_inheritance=sharing.AccessInheritance.inherit): + """ + Change the inheritance policy of an existing Shared Folder. Only + permitted for shared folders in a shared team root. If a + ``ShareFolderLaunch.async_job_id`` is returned, you'll need to call + :meth:`sharing_check_share_job_status` until the action completes to get + the metadata for the folder. + + :param access_inheritance: The access inheritance settings for the + folder. + :type access_inheritance: :class:`dropbox.sharing.AccessInheritance` + :param str shared_folder_id: The ID for the shared folder. + :rtype: :class:`dropbox.sharing.ShareFolderLaunch` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.SetAccessInheritanceError` + """ + arg = sharing.SetAccessInheritanceArg(shared_folder_id, + access_inheritance) + r = self.request( + sharing.set_access_inheritance, + 'sharing', + arg, + None, + ) + return r + + def sharing_share_folder(self, + path, + acl_update_policy=None, + force_async=False, + member_policy=None, + shared_link_policy=None, + viewer_info_policy=None, + access_inheritance=sharing.AccessInheritance.inherit, + actions=None, + link_settings=None): + """ + Share a folder with collaborators. Most sharing will be completed + synchronously. Large folders will be completed asynchronously. To make + testing the async case repeatable, set `ShareFolderArg.force_async`. If + a ``ShareFolderLaunch.async_job_id`` is returned, you'll need to call + :meth:`sharing_check_share_job_status` until the action completes to get + the metadata for the folder. + + :param Nullable actions: A list of `FolderAction`s corresponding to + `FolderPermission`s that should appear in the response's + ``SharedFolderMetadata.permissions`` field describing the actions + the authenticated user can perform on the folder. + :param Nullable link_settings: Settings on the link for this folder. + :rtype: :class:`dropbox.sharing.ShareFolderLaunch` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.ShareFolderError` + """ + arg = sharing.ShareFolderArg(path, + acl_update_policy, + force_async, + member_policy, + shared_link_policy, + viewer_info_policy, + access_inheritance, + actions, + link_settings) + r = self.request( + sharing.share_folder, + 'sharing', + arg, + None, + ) + return r + + def sharing_transfer_folder(self, + shared_folder_id, + to_dropbox_id): + """ + Transfer ownership of a shared folder to a member of the shared folder. + User must have ``AccessLevel.owner`` access to the shared folder to + perform a transfer. + + :param str shared_folder_id: The ID for the shared folder. + :param str to_dropbox_id: A account or team member ID to transfer + ownership to. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.TransferFolderError` + """ + arg = sharing.TransferFolderArg(shared_folder_id, + to_dropbox_id) + r = self.request( + sharing.transfer_folder, + 'sharing', + arg, + None, + ) + return None + + def sharing_unmount_folder(self, + shared_folder_id): + """ + The current user unmounts the designated folder. They can re-mount the + folder at a later time using :meth:`sharing_mount_folder`. + + :param str shared_folder_id: The ID for the shared folder. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.UnmountFolderError` + """ + arg = sharing.UnmountFolderArg(shared_folder_id) + r = self.request( + sharing.unmount_folder, + 'sharing', + arg, + None, + ) + return None + + def sharing_unshare_file(self, + file): + """ + Remove all members from this file. Does not remove inherited members. + + :param str file: The file to unshare. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.UnshareFileError` + """ + arg = sharing.UnshareFileArg(file) + r = self.request( + sharing.unshare_file, + 'sharing', + arg, + None, + ) + return None + + def sharing_unshare_folder(self, + shared_folder_id, + leave_a_copy=False): + """ + Allows a shared folder owner to unshare the folder. You'll need to call + :meth:`sharing_check_job_status` to determine if the action has + completed successfully. + + :param str shared_folder_id: The ID for the shared folder. + :param bool leave_a_copy: If true, members of this shared folder will + get a copy of this folder after it's unshared. Otherwise, it will be + removed from their Dropbox. The current user, who is an owner, will + always retain their copy. + :rtype: :class:`dropbox.sharing.LaunchEmptyResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.UnshareFolderError` + """ + arg = sharing.UnshareFolderArg(shared_folder_id, + leave_a_copy) + r = self.request( + sharing.unshare_folder, + 'sharing', + arg, + None, + ) + return r + + def sharing_update_file_member(self, + file, + member, + access_level): + """ + Changes a member's access on a shared file. + + :rtype: :class:`dropbox.sharing.MemberAccessLevelResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.FileMemberActionError` + """ + arg = sharing.UpdateFileMemberArgs(file, + member, + access_level) + r = self.request( + sharing.update_file_member, + 'sharing', + arg, + None, + ) + return r + + def sharing_update_folder_member(self, + shared_folder_id, + member, + access_level): + """ + Allows an owner or editor of a shared folder to update another member's + permissions. + + :param str shared_folder_id: The ID for the shared folder. + :param member: The member of the shared folder to update. Only the + ``MemberSelector.dropbox_id`` may be set at this time. + :type member: :class:`dropbox.sharing.MemberSelector` + :param access_level: The new access level for ``member``. + ``AccessLevel.owner`` is disallowed. + :type access_level: :class:`dropbox.sharing.AccessLevel` + :rtype: :class:`dropbox.sharing.MemberAccessLevelResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.UpdateFolderMemberError` + """ + arg = sharing.UpdateFolderMemberArg(shared_folder_id, + member, + access_level) + r = self.request( + sharing.update_folder_member, + 'sharing', + arg, + None, + ) + return r + + def sharing_update_folder_policy(self, + shared_folder_id, + member_policy=None, + acl_update_policy=None, + viewer_info_policy=None, + shared_link_policy=None, + link_settings=None, + actions=None): + """ + Update the sharing policies for a shared folder. User must have + ``AccessLevel.owner`` access to the shared folder to update its + policies. + + :param str shared_folder_id: The ID for the shared folder. + :param Nullable member_policy: Who can be a member of this shared + folder. Only applicable if the current user is on a team. + :param Nullable acl_update_policy: Who can add and remove members of + this shared folder. + :param Nullable viewer_info_policy: Who can enable/disable viewer info + for this shared folder. + :param Nullable shared_link_policy: The policy to apply to shared links + created for content inside this shared folder. The current user must + be on a team to set this policy to ``SharedLinkPolicy.members``. + :param Nullable link_settings: Settings on the link for this folder. + :param Nullable actions: A list of `FolderAction`s corresponding to + `FolderPermission`s that should appear in the response's + ``SharedFolderMetadata.permissions`` field describing the actions + the authenticated user can perform on the folder. + :rtype: :class:`dropbox.sharing.SharedFolderMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.sharing.UpdateFolderPolicyError` + """ + arg = sharing.UpdateFolderPolicyArg(shared_folder_id, + member_policy, + acl_update_policy, + viewer_info_policy, + shared_link_policy, + link_settings, + actions) + r = self.request( + sharing.update_folder_policy, + 'sharing', + arg, + None, + ) + return r + + # ------------------------------------------ + # Routes in team namespace + + # ------------------------------------------ + # Routes in team_log namespace + + # ------------------------------------------ + # Routes in users namespace + + def users_get_account(self, + account_id): + """ + Get information about a user's account. + + :param str account_id: A user's account identifier. + :rtype: :class:`dropbox.users.BasicAccount` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.users.GetAccountError` + """ + arg = users.GetAccountArg(account_id) + r = self.request( + users.get_account, + 'users', + arg, + None, + ) + return r + + def users_get_account_batch(self, + account_ids): + """ + Get information about multiple user accounts. At most 300 accounts may + be queried per request. + + :param list account_ids: List of user account identifiers. Should not + contain any duplicate account IDs. + :rtype: list + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.users.GetAccountBatchError` + """ + arg = users.GetAccountBatchArg(account_ids) + r = self.request( + users.get_account_batch, + 'users', + arg, + None, + ) + return r + + def users_get_current_account(self): + """ + Get information about the current user's account. + + :rtype: :class:`dropbox.users.FullAccount` + """ + arg = None + r = self.request( + users.get_current_account, + 'users', + arg, + None, + ) + return r + + def users_get_space_usage(self): + """ + Get the space usage information for the current user's account. + + :rtype: :class:`dropbox.users.SpaceUsage` + """ + arg = None + r = self.request( + users.get_space_usage, + 'users', + arg, + None, + ) + return r + diff --git a/dropbox-script/dropbox/base_team.py b/dropbox-script/dropbox/base_team.py new file mode 100644 index 0000000..cb01060 --- /dev/null +++ b/dropbox-script/dropbox/base_team.py @@ -0,0 +1,1999 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# flake8: noqa +# pylint: skip-file + +from abc import ABCMeta, abstractmethod +import warnings + +from . import ( + async_, + auth, + common, + contacts, + file_properties, + file_requests, + files, + paper, + seen_state, + sharing, + team, + team_common, + team_log, + team_policies, + users, + users_common, +) + + +class DropboxTeamBase(object): + __metaclass__ = ABCMeta + + @abstractmethod + def request(self, route, namespace, arg, arg_binary=None): + pass + + # ------------------------------------------ + # Routes in auth namespace + + # ------------------------------------------ + # Routes in contacts namespace + + # ------------------------------------------ + # Routes in file_properties namespace + + def file_properties_templates_add_for_team(self, + name, + description, + fields): + """ + Add a template associated with a team. See + :meth:`file_properties_properties_add` to add properties to a file or + folder. Note: this endpoint will create team-owned templates. + + :rtype: :class:`dropbox.file_properties.AddTemplateResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.file_properties.ModifyTemplateError` + """ + arg = file_properties.AddTemplateArg(name, + description, + fields) + r = self.request( + file_properties.templates_add_for_team, + 'file_properties', + arg, + None, + ) + return r + + def file_properties_templates_get_for_team(self, + template_id): + """ + Get the schema for a specified template. + + :param str template_id: An identifier for template added by route See + :meth:`file_properties_templates_add_for_user` or + :meth:`file_properties_templates_add_for_team`. + :rtype: :class:`dropbox.file_properties.GetTemplateResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.file_properties.TemplateError` + """ + arg = file_properties.GetTemplateArg(template_id) + r = self.request( + file_properties.templates_get_for_team, + 'file_properties', + arg, + None, + ) + return r + + def file_properties_templates_list_for_team(self): + """ + Get the template identifiers for a team. To get the schema of each + template use :meth:`file_properties_templates_get_for_team`. + + :rtype: :class:`dropbox.file_properties.ListTemplateResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.file_properties.TemplateError` + """ + arg = None + r = self.request( + file_properties.templates_list_for_team, + 'file_properties', + arg, + None, + ) + return r + + def file_properties_templates_remove_for_team(self, + template_id): + """ + Permanently removes the specified template created from + :meth:`file_properties_templates_add_for_user`. All properties + associated with the template will also be removed. This action cannot be + undone. + + :param str template_id: An identifier for a template created by + :meth:`file_properties_templates_add_for_user` or + :meth:`file_properties_templates_add_for_team`. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.file_properties.TemplateError` + """ + arg = file_properties.RemoveTemplateArg(template_id) + r = self.request( + file_properties.templates_remove_for_team, + 'file_properties', + arg, + None, + ) + return None + + def file_properties_templates_update_for_team(self, + template_id, + name=None, + description=None, + add_fields=None): + """ + Update a template associated with a team. This route can update the + template name, the template description and add optional properties to + templates. + + :param str template_id: An identifier for template added by See + :meth:`file_properties_templates_add_for_user` or + :meth:`file_properties_templates_add_for_team`. + :param Nullable name: A display name for the template. template names + can be up to 256 bytes. + :param Nullable description: Description for the new template. Template + descriptions can be up to 1024 bytes. + :param Nullable add_fields: Property field templates to be added to the + group template. There can be up to 32 properties in a single + template. + :rtype: :class:`dropbox.file_properties.UpdateTemplateResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.file_properties.ModifyTemplateError` + """ + arg = file_properties.UpdateTemplateArg(template_id, + name, + description, + add_fields) + r = self.request( + file_properties.templates_update_for_team, + 'file_properties', + arg, + None, + ) + return r + + # ------------------------------------------ + # Routes in file_requests namespace + + # ------------------------------------------ + # Routes in files namespace + + # ------------------------------------------ + # Routes in paper namespace + + # ------------------------------------------ + # Routes in sharing namespace + + # ------------------------------------------ + # Routes in team namespace + + def team_devices_list_member_devices(self, + team_member_id, + include_web_sessions=True, + include_desktop_clients=True, + include_mobile_clients=True): + """ + List all device sessions of a team's member. + + :param str team_member_id: The team's member id. + :param bool include_web_sessions: Whether to list web sessions of the + team's member. + :param bool include_desktop_clients: Whether to list linked desktop + devices of the team's member. + :param bool include_mobile_clients: Whether to list linked mobile + devices of the team's member. + :rtype: :class:`dropbox.team.ListMemberDevicesResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.ListMemberDevicesError` + """ + arg = team.ListMemberDevicesArg(team_member_id, + include_web_sessions, + include_desktop_clients, + include_mobile_clients) + r = self.request( + team.devices_list_member_devices, + 'team', + arg, + None, + ) + return r + + def team_devices_list_members_devices(self, + cursor=None, + include_web_sessions=True, + include_desktop_clients=True, + include_mobile_clients=True): + """ + List all device sessions of a team. Permission : Team member file + access. + + :param Nullable cursor: At the first call to the + :meth:`team_devices_list_members_devices` the cursor shouldn't be + passed. Then, if the result of the call includes a cursor, the + following requests should include the received cursors in order to + receive the next sub list of team devices. + :param bool include_web_sessions: Whether to list web sessions of the + team members. + :param bool include_desktop_clients: Whether to list desktop clients of + the team members. + :param bool include_mobile_clients: Whether to list mobile clients of + the team members. + :rtype: :class:`dropbox.team.ListMembersDevicesResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.ListMembersDevicesError` + """ + arg = team.ListMembersDevicesArg(cursor, + include_web_sessions, + include_desktop_clients, + include_mobile_clients) + r = self.request( + team.devices_list_members_devices, + 'team', + arg, + None, + ) + return r + + def team_devices_list_team_devices(self, + cursor=None, + include_web_sessions=True, + include_desktop_clients=True, + include_mobile_clients=True): + """ + List all device sessions of a team. Permission : Team member file + access. + + :param Nullable cursor: At the first call to the + :meth:`team_devices_list_team_devices` the cursor shouldn't be + passed. Then, if the result of the call includes a cursor, the + following requests should include the received cursors in order to + receive the next sub list of team devices. + :param bool include_web_sessions: Whether to list web sessions of the + team members. + :param bool include_desktop_clients: Whether to list desktop clients of + the team members. + :param bool include_mobile_clients: Whether to list mobile clients of + the team members. + :rtype: :class:`dropbox.team.ListTeamDevicesResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.ListTeamDevicesError` + """ + warnings.warn( + 'devices/list_team_devices is deprecated. Use devices/list_members_devices.', + DeprecationWarning, + ) + arg = team.ListTeamDevicesArg(cursor, + include_web_sessions, + include_desktop_clients, + include_mobile_clients) + r = self.request( + team.devices_list_team_devices, + 'team', + arg, + None, + ) + return r + + def team_devices_revoke_device_session(self, + arg): + """ + Revoke a device session of a team's member. + + :type arg: :class:`dropbox.team.RevokeDeviceSessionArg` + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.RevokeDeviceSessionError` + """ + r = self.request( + team.devices_revoke_device_session, + 'team', + arg, + None, + ) + return None + + def team_devices_revoke_device_session_batch(self, + revoke_devices): + """ + Revoke a list of device sessions of team members. + + :type revoke_devices: list + :rtype: :class:`dropbox.team.RevokeDeviceSessionBatchResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.RevokeDeviceSessionBatchError` + """ + arg = team.RevokeDeviceSessionBatchArg(revoke_devices) + r = self.request( + team.devices_revoke_device_session_batch, + 'team', + arg, + None, + ) + return r + + def team_features_get_values(self, + features): + """ + Get the values for one or more featues. This route allows you to check + your account's capability for what feature you can access or what value + you have for certain features. Permission : Team information. + + :param list features: A list of features in + :class:`dropbox.team.Feature`. If the list is empty, this route will + return :class:`dropbox.team.FeaturesGetValuesBatchError`. + :rtype: :class:`dropbox.team.FeaturesGetValuesBatchResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.FeaturesGetValuesBatchError` + """ + arg = team.FeaturesGetValuesBatchArg(features) + r = self.request( + team.features_get_values, + 'team', + arg, + None, + ) + return r + + def team_get_info(self): + """ + Retrieves information about a team. + + :rtype: :class:`dropbox.team.TeamGetInfoResult` + """ + arg = None + r = self.request( + team.get_info, + 'team', + arg, + None, + ) + return r + + def team_groups_create(self, + group_name, + group_external_id=None, + group_management_type=None): + """ + Creates a new, empty group, with a requested name. Permission : Team + member management. + + :param str group_name: Group name. + :param Nullable group_external_id: The creator of a team can associate + an arbitrary external ID to the group. + :param Nullable group_management_type: Whether the team can be managed + by selected users, or only by team admins. + :rtype: :class:`dropbox.team.GroupFullInfo` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.GroupCreateError` + """ + arg = team.GroupCreateArg(group_name, + group_external_id, + group_management_type) + r = self.request( + team.groups_create, + 'team', + arg, + None, + ) + return r + + def team_groups_delete(self, + arg): + """ + Deletes a group. The group is deleted immediately. However the revoking + of group-owned resources may take additional time. Use the + :meth:`team_groups_job_status_get` to determine whether this process has + completed. Permission : Team member management. + + :param arg: Argument for selecting a single group, either by group_id or + by external group ID. + :type arg: :class:`dropbox.team.GroupSelector` + :rtype: :class:`dropbox.team.LaunchEmptyResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.GroupDeleteError` + """ + r = self.request( + team.groups_delete, + 'team', + arg, + None, + ) + return r + + def team_groups_get_info(self, + arg): + """ + Retrieves information about one or more groups. Note that the optional + field ``GroupFullInfo.members`` is not returned for system-managed + groups. Permission : Team Information. + + :param arg: Argument for selecting a list of groups, either by + group_ids, or external group IDs. + :type arg: :class:`dropbox.team.GroupsSelector` + :rtype: list + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.GroupsGetInfoError` + """ + r = self.request( + team.groups_get_info, + 'team', + arg, + None, + ) + return r + + def team_groups_job_status_get(self, + async_job_id): + """ + Once an async_job_id is returned from :meth:`team_groups_delete`, + :meth:`team_groups_members_add` , or :meth:`team_groups_members_remove` + use this method to poll the status of granting/revoking group members' + access to group-owned resources. Permission : Team member management. + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.team.PollEmptyResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.GroupsPollError` + """ + arg = async_.PollArg(async_job_id) + r = self.request( + team.groups_job_status_get, + 'team', + arg, + None, + ) + return r + + def team_groups_list(self, + limit=1000): + """ + Lists groups on a team. Permission : Team Information. + + :param int limit: Number of results to return per call. + :rtype: :class:`dropbox.team.GroupsListResult` + """ + arg = team.GroupsListArg(limit) + r = self.request( + team.groups_list, + 'team', + arg, + None, + ) + return r + + def team_groups_list_continue(self, + cursor): + """ + Once a cursor has been retrieved from :meth:`team_groups_list`, use this + to paginate through all groups. Permission : Team Information. + + :param str cursor: Indicates from what point to get the next set of + groups. + :rtype: :class:`dropbox.team.GroupsListResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.GroupsListContinueError` + """ + arg = team.GroupsListContinueArg(cursor) + r = self.request( + team.groups_list_continue, + 'team', + arg, + None, + ) + return r + + def team_groups_members_add(self, + group, + members, + return_members=True): + """ + Adds members to a group. The members are added immediately. However the + granting of group-owned resources may take additional time. Use the + :meth:`team_groups_job_status_get` to determine whether this process has + completed. Permission : Team member management. + + :param group: Group to which users will be added. + :type group: :class:`dropbox.team.GroupSelector` + :param list members: List of users to be added to the group. + :rtype: :class:`dropbox.team.GroupMembersChangeResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.GroupMembersAddError` + """ + arg = team.GroupMembersAddArg(group, + members, + return_members) + r = self.request( + team.groups_members_add, + 'team', + arg, + None, + ) + return r + + def team_groups_members_list(self, + group, + limit=1000): + """ + Lists members of a group. Permission : Team Information. + + :param group: The group whose members are to be listed. + :type group: :class:`dropbox.team.GroupSelector` + :param int limit: Number of results to return per call. + :rtype: :class:`dropbox.team.GroupsMembersListResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.GroupSelectorError` + """ + arg = team.GroupsMembersListArg(group, + limit) + r = self.request( + team.groups_members_list, + 'team', + arg, + None, + ) + return r + + def team_groups_members_list_continue(self, + cursor): + """ + Once a cursor has been retrieved from :meth:`team_groups_members_list`, + use this to paginate through all members of the group. Permission : Team + information. + + :param str cursor: Indicates from what point to get the next set of + groups. + :rtype: :class:`dropbox.team.GroupsMembersListResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.GroupsMembersListContinueError` + """ + arg = team.GroupsMembersListContinueArg(cursor) + r = self.request( + team.groups_members_list_continue, + 'team', + arg, + None, + ) + return r + + def team_groups_members_remove(self, + group, + users, + return_members=True): + """ + Removes members from a group. The members are removed immediately. + However the revoking of group-owned resources may take additional time. + Use the :meth:`team_groups_job_status_get` to determine whether this + process has completed. This method permits removing the only owner of a + group, even in cases where this is not possible via the web client. + Permission : Team member management. + + :param group: Group from which users will be removed. + :type group: :class:`dropbox.team.GroupSelector` + :param list users: List of users to be removed from the group. + :rtype: :class:`dropbox.team.GroupMembersChangeResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.GroupMembersRemoveError` + """ + arg = team.GroupMembersRemoveArg(group, + users, + return_members) + r = self.request( + team.groups_members_remove, + 'team', + arg, + None, + ) + return r + + def team_groups_members_set_access_type(self, + group, + user, + access_type, + return_members=True): + """ + Sets a member's access type in a group. Permission : Team member + management. + + :param access_type: New group access type the user will have. + :type access_type: :class:`dropbox.team.GroupAccessType` + :param bool return_members: Whether to return the list of members in the + group. Note that the default value will cause all the group members + to be returned in the response. This may take a long time for large + groups. + :rtype: list + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.GroupMemberSetAccessTypeError` + """ + arg = team.GroupMembersSetAccessTypeArg(group, + user, + access_type, + return_members) + r = self.request( + team.groups_members_set_access_type, + 'team', + arg, + None, + ) + return r + + def team_groups_update(self, + group, + return_members=True, + new_group_name=None, + new_group_external_id=None, + new_group_management_type=None): + """ + Updates a group's name and/or external ID. Permission : Team member + management. + + :param group: Specify a group. + :type group: :class:`dropbox.team.GroupSelector` + :param Nullable new_group_name: Optional argument. Set group name to + this if provided. + :param Nullable new_group_external_id: Optional argument. New group + external ID. If the argument is None, the group's external_id won't + be updated. If the argument is empty string, the group's external id + will be cleared. + :param Nullable new_group_management_type: Set new group management + type, if provided. + :rtype: :class:`dropbox.team.GroupFullInfo` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.GroupUpdateError` + """ + arg = team.GroupUpdateArgs(group, + return_members, + new_group_name, + new_group_external_id, + new_group_management_type) + r = self.request( + team.groups_update, + 'team', + arg, + None, + ) + return r + + def team_linked_apps_list_member_linked_apps(self, + team_member_id): + """ + List all linked applications of the team member. Note, this endpoint + does not list any team-linked applications. + + :param str team_member_id: The team member id. + :rtype: :class:`dropbox.team.ListMemberAppsResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.ListMemberAppsError` + """ + arg = team.ListMemberAppsArg(team_member_id) + r = self.request( + team.linked_apps_list_member_linked_apps, + 'team', + arg, + None, + ) + return r + + def team_linked_apps_list_members_linked_apps(self, + cursor=None): + """ + List all applications linked to the team members' accounts. Note, this + endpoint does not list any team-linked applications. + + :param Nullable cursor: At the first call to the + :meth:`team_linked_apps_list_members_linked_apps` the cursor + shouldn't be passed. Then, if the result of the call includes a + cursor, the following requests should include the received cursors + in order to receive the next sub list of the team applications. + :rtype: :class:`dropbox.team.ListMembersAppsResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.ListMembersAppsError` + """ + arg = team.ListMembersAppsArg(cursor) + r = self.request( + team.linked_apps_list_members_linked_apps, + 'team', + arg, + None, + ) + return r + + def team_linked_apps_list_team_linked_apps(self, + cursor=None): + """ + List all applications linked to the team members' accounts. Note, this + endpoint doesn't list any team-linked applications. + + :param Nullable cursor: At the first call to the + :meth:`team_linked_apps_list_team_linked_apps` the cursor shouldn't + be passed. Then, if the result of the call includes a cursor, the + following requests should include the received cursors in order to + receive the next sub list of the team applications. + :rtype: :class:`dropbox.team.ListTeamAppsResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.ListTeamAppsError` + """ + warnings.warn( + 'linked_apps/list_team_linked_apps is deprecated. Use linked_apps/list_members_linked_apps.', + DeprecationWarning, + ) + arg = team.ListTeamAppsArg(cursor) + r = self.request( + team.linked_apps_list_team_linked_apps, + 'team', + arg, + None, + ) + return r + + def team_linked_apps_revoke_linked_app(self, + app_id, + team_member_id, + keep_app_folder=True): + """ + Revoke a linked application of the team member. + + :param str app_id: The application's unique id. + :param str team_member_id: The unique id of the member owning the + device. + :param bool keep_app_folder: Whether to keep the application dedicated + folder (in case the application uses one). + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.RevokeLinkedAppError` + """ + arg = team.RevokeLinkedApiAppArg(app_id, + team_member_id, + keep_app_folder) + r = self.request( + team.linked_apps_revoke_linked_app, + 'team', + arg, + None, + ) + return None + + def team_linked_apps_revoke_linked_app_batch(self, + revoke_linked_app): + """ + Revoke a list of linked applications of the team members. + + :type revoke_linked_app: list + :rtype: :class:`dropbox.team.RevokeLinkedAppBatchResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.RevokeLinkedAppBatchError` + """ + arg = team.RevokeLinkedApiAppBatchArg(revoke_linked_app) + r = self.request( + team.linked_apps_revoke_linked_app_batch, + 'team', + arg, + None, + ) + return r + + def team_member_space_limits_excluded_users_add(self, + users=None): + """ + Add users to member space limits excluded users list. + + :param Nullable users: List of users to be added/removed. + :rtype: :class:`dropbox.team.ExcludedUsersUpdateResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.ExcludedUsersUpdateError` + """ + arg = team.ExcludedUsersUpdateArg(users) + r = self.request( + team.member_space_limits_excluded_users_add, + 'team', + arg, + None, + ) + return r + + def team_member_space_limits_excluded_users_list(self, + limit=1000): + """ + List member space limits excluded users. + + :param int limit: Number of results to return per call. + :rtype: :class:`dropbox.team.ExcludedUsersListResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.ExcludedUsersListError` + """ + arg = team.ExcludedUsersListArg(limit) + r = self.request( + team.member_space_limits_excluded_users_list, + 'team', + arg, + None, + ) + return r + + def team_member_space_limits_excluded_users_list_continue(self, + cursor): + """ + Continue listing member space limits excluded users. + + :param str cursor: Indicates from what point to get the next set of + users. + :rtype: :class:`dropbox.team.ExcludedUsersListResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.ExcludedUsersListContinueError` + """ + arg = team.ExcludedUsersListContinueArg(cursor) + r = self.request( + team.member_space_limits_excluded_users_list_continue, + 'team', + arg, + None, + ) + return r + + def team_member_space_limits_excluded_users_remove(self, + users=None): + """ + Remove users from member space limits excluded users list. + + :param Nullable users: List of users to be added/removed. + :rtype: :class:`dropbox.team.ExcludedUsersUpdateResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.ExcludedUsersUpdateError` + """ + arg = team.ExcludedUsersUpdateArg(users) + r = self.request( + team.member_space_limits_excluded_users_remove, + 'team', + arg, + None, + ) + return r + + def team_member_space_limits_get_custom_quota(self, + users): + """ + Get users custom quota. Returns none as the custom quota if none was + set. A maximum of 1000 members can be specified in a single call. + + :param list users: List of users. + :rtype: list + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.CustomQuotaError` + """ + arg = team.CustomQuotaUsersArg(users) + r = self.request( + team.member_space_limits_get_custom_quota, + 'team', + arg, + None, + ) + return r + + def team_member_space_limits_remove_custom_quota(self, + users): + """ + Remove users custom quota. A maximum of 1000 members can be specified in + a single call. + + :param list users: List of users. + :rtype: list + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.CustomQuotaError` + """ + arg = team.CustomQuotaUsersArg(users) + r = self.request( + team.member_space_limits_remove_custom_quota, + 'team', + arg, + None, + ) + return r + + def team_member_space_limits_set_custom_quota(self, + users_and_quotas): + """ + Set users custom quota. Custom quota has to be at least 15GB. A maximum + of 1000 members can be specified in a single call. + + :param list users_and_quotas: List of users and their custom quotas. + :rtype: list + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.SetCustomQuotaError` + """ + arg = team.SetCustomQuotaArg(users_and_quotas) + r = self.request( + team.member_space_limits_set_custom_quota, + 'team', + arg, + None, + ) + return r + + def team_members_add(self, + new_members, + force_async=False): + """ + Adds members to a team. Permission : Team member management A maximum of + 20 members can be specified in a single call. If no Dropbox account + exists with the email address specified, a new Dropbox account will be + created with the given email address, and that account will be invited + to the team. If a personal Dropbox account exists with the email address + specified in the call, this call will create a placeholder Dropbox + account for the user on the team and send an email inviting the user to + migrate their existing personal account onto the team. Team member + management apps are required to set an initial given_name and surname + for a user to use in the team invitation and for 'Perform as team + member' actions taken on the user before they become 'active'. + + :param list new_members: Details of new members to be added to the team. + :param bool force_async: Whether to force the add to happen + asynchronously. + :rtype: :class:`dropbox.team.MembersAddLaunch` + """ + arg = team.MembersAddArg(new_members, + force_async) + r = self.request( + team.members_add, + 'team', + arg, + None, + ) + return r + + def team_members_add_job_status_get(self, + async_job_id): + """ + Once an async_job_id is returned from :meth:`team_members_add` , use + this to poll the status of the asynchronous request. Permission : Team + member management. + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.team.MembersAddJobStatus` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.PollError` + """ + arg = async_.PollArg(async_job_id) + r = self.request( + team.members_add_job_status_get, + 'team', + arg, + None, + ) + return r + + def team_members_get_info(self, + members): + """ + Returns information about multiple team members. Permission : Team + information This endpoint will return + ``MembersGetInfoItem.id_not_found``, for IDs (or emails) that cannot be + matched to a valid team member. + + :param list members: List of team members. + :rtype: list + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.MembersGetInfoError` + """ + arg = team.MembersGetInfoArgs(members) + r = self.request( + team.members_get_info, + 'team', + arg, + None, + ) + return r + + def team_members_list(self, + limit=1000, + include_removed=False): + """ + Lists members of a team. Permission : Team information. + + :param int limit: Number of results to return per call. + :param bool include_removed: Whether to return removed members. + :rtype: :class:`dropbox.team.MembersListResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.MembersListError` + """ + arg = team.MembersListArg(limit, + include_removed) + r = self.request( + team.members_list, + 'team', + arg, + None, + ) + return r + + def team_members_list_continue(self, + cursor): + """ + Once a cursor has been retrieved from :meth:`team_members_list`, use + this to paginate through all team members. Permission : Team + information. + + :param str cursor: Indicates from what point to get the next set of + members. + :rtype: :class:`dropbox.team.MembersListResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.MembersListContinueError` + """ + arg = team.MembersListContinueArg(cursor) + r = self.request( + team.members_list_continue, + 'team', + arg, + None, + ) + return r + + def team_members_move_former_member_files(self, + user, + transfer_dest_id, + transfer_admin_id): + """ + Moves removed member's files to a different member. This endpoint + initiates an asynchronous job. To obtain the final result of the job, + the client should periodically poll + :meth:`team_members_move_former_member_files_job_status_check`. + Permission : Team member management. + + :param transfer_dest_id: Files from the deleted member account will be + transferred to this user. + :type transfer_dest_id: :class:`dropbox.team.UserSelectorArg` + :param transfer_admin_id: Errors during the transfer process will be + sent via email to this user. + :type transfer_admin_id: :class:`dropbox.team.UserSelectorArg` + :rtype: :class:`dropbox.team.LaunchEmptyResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.MembersTransferFormerMembersFilesError` + """ + arg = team.MembersDataTransferArg(user, + transfer_dest_id, + transfer_admin_id) + r = self.request( + team.members_move_former_member_files, + 'team', + arg, + None, + ) + return r + + def team_members_move_former_member_files_job_status_check(self, + async_job_id): + """ + Once an async_job_id is returned from + :meth:`team_members_move_former_member_files` , use this to poll the + status of the asynchronous request. Permission : Team member management. + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.team.PollEmptyResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.PollError` + """ + arg = async_.PollArg(async_job_id) + r = self.request( + team.members_move_former_member_files_job_status_check, + 'team', + arg, + None, + ) + return r + + def team_members_recover(self, + user): + """ + Recover a deleted member. Permission : Team member management Exactly + one of team_member_id, email, or external_id must be provided to + identify the user account. + + :param user: Identity of user to recover. + :type user: :class:`dropbox.team.UserSelectorArg` + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.MembersRecoverError` + """ + arg = team.MembersRecoverArg(user) + r = self.request( + team.members_recover, + 'team', + arg, + None, + ) + return None + + def team_members_remove(self, + user, + wipe_data=True, + transfer_dest_id=None, + transfer_admin_id=None, + keep_account=False): + """ + Removes a member from a team. Permission : Team member management + Exactly one of team_member_id, email, or external_id must be provided to + identify the user account. Accounts can be recovered via + :meth:`team_members_recover` for a 7 day period or until the account has + been permanently deleted or transferred to another account (whichever + comes first). Calling :meth:`team_members_add` while a user is still + recoverable on your team will return with + ``MemberAddResult.user_already_on_team``. Accounts can have their files + transferred via the admin console for a limited time, based on the + version history length associated with the team (120 days for most + teams). This endpoint may initiate an asynchronous job. To obtain the + final result of the job, the client should periodically poll + :meth:`team_members_remove_job_status_get`. + + :param Nullable transfer_dest_id: If provided, files from the deleted + member account will be transferred to this user. + :param Nullable transfer_admin_id: If provided, errors during the + transfer process will be sent via email to this user. If the + transfer_dest_id argument was provided, then this argument must be + provided as well. + :param bool keep_account: Downgrade the member to a Basic account. The + user will retain the email address associated with their Dropbox + account and data in their account that is not restricted to team + members. In order to keep the account the argument wipe_data should + be set to False. + :rtype: :class:`dropbox.team.LaunchEmptyResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.MembersRemoveError` + """ + arg = team.MembersRemoveArg(user, + wipe_data, + transfer_dest_id, + transfer_admin_id, + keep_account) + r = self.request( + team.members_remove, + 'team', + arg, + None, + ) + return r + + def team_members_remove_job_status_get(self, + async_job_id): + """ + Once an async_job_id is returned from :meth:`team_members_remove` , use + this to poll the status of the asynchronous request. Permission : Team + member management. + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.team.PollEmptyResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.PollError` + """ + arg = async_.PollArg(async_job_id) + r = self.request( + team.members_remove_job_status_get, + 'team', + arg, + None, + ) + return r + + def team_members_send_welcome_email(self, + arg): + """ + Sends welcome email to pending team member. Permission : Team member + management Exactly one of team_member_id, email, or external_id must be + provided to identify the user account. No-op if team member is not + pending. + + :param arg: Argument for selecting a single user, either by + team_member_id, external_id or email. + :type arg: :class:`dropbox.team.UserSelectorArg` + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.MembersSendWelcomeError` + """ + r = self.request( + team.members_send_welcome_email, + 'team', + arg, + None, + ) + return None + + def team_members_set_admin_permissions(self, + user, + new_role): + """ + Updates a team member's permissions. Permission : Team member + management. + + :param user: Identity of user whose role will be set. + :type user: :class:`dropbox.team.UserSelectorArg` + :param new_role: The new role of the member. + :type new_role: :class:`dropbox.team.AdminTier` + :rtype: :class:`dropbox.team.MembersSetPermissionsResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.MembersSetPermissionsError` + """ + arg = team.MembersSetPermissionsArg(user, + new_role) + r = self.request( + team.members_set_admin_permissions, + 'team', + arg, + None, + ) + return r + + def team_members_set_profile(self, + user, + new_email=None, + new_external_id=None, + new_given_name=None, + new_surname=None, + new_persistent_id=None, + new_is_directory_restricted=None): + """ + Updates a team member's profile. Permission : Team member management. + + :param user: Identity of user whose profile will be set. + :type user: :class:`dropbox.team.UserSelectorArg` + :param Nullable new_email: New email for member. + :param Nullable new_external_id: New external ID for member. + :param Nullable new_given_name: New given name for member. + :param Nullable new_surname: New surname for member. + :param Nullable new_persistent_id: New persistent ID. This field only + available to teams using persistent ID SAML configuration. + :param Nullable new_is_directory_restricted: New value for whether the + user is a directory restricted user. + :rtype: :class:`dropbox.team.TeamMemberInfo` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.MembersSetProfileError` + """ + arg = team.MembersSetProfileArg(user, + new_email, + new_external_id, + new_given_name, + new_surname, + new_persistent_id, + new_is_directory_restricted) + r = self.request( + team.members_set_profile, + 'team', + arg, + None, + ) + return r + + def team_members_suspend(self, + user, + wipe_data=True): + """ + Suspend a member from a team. Permission : Team member management + Exactly one of team_member_id, email, or external_id must be provided to + identify the user account. + + :param bool wipe_data: If provided, controls if the user's data will be + deleted on their linked devices. + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.MembersSuspendError` + """ + arg = team.MembersDeactivateArg(user, + wipe_data) + r = self.request( + team.members_suspend, + 'team', + arg, + None, + ) + return None + + def team_members_unsuspend(self, + user): + """ + Unsuspend a member from a team. Permission : Team member management + Exactly one of team_member_id, email, or external_id must be provided to + identify the user account. + + :param user: Identity of user to unsuspend. + :type user: :class:`dropbox.team.UserSelectorArg` + :rtype: None + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.MembersUnsuspendError` + """ + arg = team.MembersUnsuspendArg(user) + r = self.request( + team.members_unsuspend, + 'team', + arg, + None, + ) + return None + + def team_namespaces_list(self, + limit=1000): + """ + Returns a list of all team-accessible namespaces. This list includes + team folders, shared folders containing team members, team members' home + namespaces, and team members' app folders. Home namespaces and app + folders are always owned by this team or members of the team, but shared + folders may be owned by other users or other teams. Duplicates may occur + in the list. + + :param int limit: Specifying a value here has no effect. + :rtype: :class:`dropbox.team.TeamNamespacesListResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.TeamNamespacesListError` + """ + arg = team.TeamNamespacesListArg(limit) + r = self.request( + team.namespaces_list, + 'team', + arg, + None, + ) + return r + + def team_namespaces_list_continue(self, + cursor): + """ + Once a cursor has been retrieved from :meth:`team_namespaces_list`, use + this to paginate through all team-accessible namespaces. Duplicates may + occur in the list. + + :param str cursor: Indicates from what point to get the next set of + team-accessible namespaces. + :rtype: :class:`dropbox.team.TeamNamespacesListResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.TeamNamespacesListContinueError` + """ + arg = team.TeamNamespacesListContinueArg(cursor) + r = self.request( + team.namespaces_list_continue, + 'team', + arg, + None, + ) + return r + + def team_properties_template_add(self, + name, + description, + fields): + """ + Permission : Team member file access. + + :rtype: :class:`dropbox.team.AddTemplateResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.ModifyTemplateError` + """ + warnings.warn( + 'properties/template/add is deprecated.', + DeprecationWarning, + ) + arg = file_properties.AddTemplateArg(name, + description, + fields) + r = self.request( + team.properties_template_add, + 'team', + arg, + None, + ) + return r + + def team_properties_template_get(self, + template_id): + """ + Permission : Team member file access. + + :param str template_id: An identifier for template added by route See + :meth:`team_templates_add_for_user` or + :meth:`team_templates_add_for_team`. + :rtype: :class:`dropbox.team.GetTemplateResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.TemplateError` + """ + warnings.warn( + 'properties/template/get is deprecated.', + DeprecationWarning, + ) + arg = file_properties.GetTemplateArg(template_id) + r = self.request( + team.properties_template_get, + 'team', + arg, + None, + ) + return r + + def team_properties_template_list(self): + """ + Permission : Team member file access. + + :rtype: :class:`dropbox.team.ListTemplateResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.TemplateError` + """ + warnings.warn( + 'properties/template/list is deprecated.', + DeprecationWarning, + ) + arg = None + r = self.request( + team.properties_template_list, + 'team', + arg, + None, + ) + return r + + def team_properties_template_update(self, + template_id, + name=None, + description=None, + add_fields=None): + """ + Permission : Team member file access. + + :param str template_id: An identifier for template added by See + :meth:`team_templates_add_for_user` or + :meth:`team_templates_add_for_team`. + :param Nullable name: A display name for the template. template names + can be up to 256 bytes. + :param Nullable description: Description for the new template. Template + descriptions can be up to 1024 bytes. + :param Nullable add_fields: Property field templates to be added to the + group template. There can be up to 32 properties in a single + template. + :rtype: :class:`dropbox.team.UpdateTemplateResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.ModifyTemplateError` + """ + warnings.warn( + 'properties/template/update is deprecated.', + DeprecationWarning, + ) + arg = file_properties.UpdateTemplateArg(template_id, + name, + description, + add_fields) + r = self.request( + team.properties_template_update, + 'team', + arg, + None, + ) + return r + + def team_reports_get_activity(self, + start_date=None, + end_date=None): + """ + Retrieves reporting data about a team's user activity. + + :param Nullable start_date: Optional starting date (inclusive). + :param Nullable end_date: Optional ending date (exclusive). + :rtype: :class:`dropbox.team.GetActivityReport` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.DateRangeError` + """ + arg = team.DateRange(start_date, + end_date) + r = self.request( + team.reports_get_activity, + 'team', + arg, + None, + ) + return r + + def team_reports_get_devices(self, + start_date=None, + end_date=None): + """ + Retrieves reporting data about a team's linked devices. + + :param Nullable start_date: Optional starting date (inclusive). + :param Nullable end_date: Optional ending date (exclusive). + :rtype: :class:`dropbox.team.GetDevicesReport` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.DateRangeError` + """ + arg = team.DateRange(start_date, + end_date) + r = self.request( + team.reports_get_devices, + 'team', + arg, + None, + ) + return r + + def team_reports_get_membership(self, + start_date=None, + end_date=None): + """ + Retrieves reporting data about a team's membership. + + :param Nullable start_date: Optional starting date (inclusive). + :param Nullable end_date: Optional ending date (exclusive). + :rtype: :class:`dropbox.team.GetMembershipReport` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.DateRangeError` + """ + arg = team.DateRange(start_date, + end_date) + r = self.request( + team.reports_get_membership, + 'team', + arg, + None, + ) + return r + + def team_reports_get_storage(self, + start_date=None, + end_date=None): + """ + Retrieves reporting data about a team's storage usage. + + :param Nullable start_date: Optional starting date (inclusive). + :param Nullable end_date: Optional ending date (exclusive). + :rtype: :class:`dropbox.team.GetStorageReport` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.DateRangeError` + """ + arg = team.DateRange(start_date, + end_date) + r = self.request( + team.reports_get_storage, + 'team', + arg, + None, + ) + return r + + def team_team_folder_activate(self, + team_folder_id): + """ + Sets an archived team folder's status to active. Permission : Team + member file access. + + :param str team_folder_id: The ID of the team folder. + :rtype: :class:`dropbox.team.TeamFolderMetadata` + """ + arg = team.TeamFolderIdArg(team_folder_id) + r = self.request( + team.team_folder_activate, + 'team', + arg, + None, + ) + return r + + def team_team_folder_archive(self, + team_folder_id, + force_async_off=False): + """ + Sets an active team folder's status to archived and removes all folder + and file members. Permission : Team member file access. + + :param bool force_async_off: Whether to force the archive to happen + synchronously. + :rtype: :class:`dropbox.team.TeamFolderArchiveLaunch` + """ + arg = team.TeamFolderArchiveArg(team_folder_id, + force_async_off) + r = self.request( + team.team_folder_archive, + 'team', + arg, + None, + ) + return r + + def team_team_folder_archive_check(self, + async_job_id): + """ + Returns the status of an asynchronous job for archiving a team folder. + Permission : Team member file access. + + :param str async_job_id: Id of the asynchronous job. This is the value + of a response returned from the method that launched the job. + :rtype: :class:`dropbox.team.TeamFolderArchiveJobStatus` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.PollError` + """ + arg = async_.PollArg(async_job_id) + r = self.request( + team.team_folder_archive_check, + 'team', + arg, + None, + ) + return r + + def team_team_folder_create(self, + name, + sync_setting=None): + """ + Creates a new, active, team folder with no members. Permission : Team + member file access. + + :param str name: Name for the new team folder. + :param Nullable sync_setting: The sync setting to apply to this team + folder. Only permitted if the team has team selective sync enabled. + :rtype: :class:`dropbox.team.TeamFolderMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.TeamFolderCreateError` + """ + arg = team.TeamFolderCreateArg(name, + sync_setting) + r = self.request( + team.team_folder_create, + 'team', + arg, + None, + ) + return r + + def team_team_folder_get_info(self, + team_folder_ids): + """ + Retrieves metadata for team folders. Permission : Team member file + access. + + :param list team_folder_ids: The list of team folder IDs. + :rtype: list + """ + arg = team.TeamFolderIdListArg(team_folder_ids) + r = self.request( + team.team_folder_get_info, + 'team', + arg, + None, + ) + return r + + def team_team_folder_list(self, + limit=1000): + """ + Lists all team folders. Permission : Team member file access. + + :param int limit: The maximum number of results to return per request. + :rtype: :class:`dropbox.team.TeamFolderListResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.TeamFolderListError` + """ + arg = team.TeamFolderListArg(limit) + r = self.request( + team.team_folder_list, + 'team', + arg, + None, + ) + return r + + def team_team_folder_list_continue(self, + cursor): + """ + Once a cursor has been retrieved from :meth:`team_team_folder_list`, use + this to paginate through all team folders. Permission : Team member file + access. + + :param str cursor: Indicates from what point to get the next set of team + folders. + :rtype: :class:`dropbox.team.TeamFolderListResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.TeamFolderListContinueError` + """ + arg = team.TeamFolderListContinueArg(cursor) + r = self.request( + team.team_folder_list_continue, + 'team', + arg, + None, + ) + return r + + def team_team_folder_permanently_delete(self, + team_folder_id): + """ + Permanently deletes an archived team folder. Permission : Team member + file access. + + :param str team_folder_id: The ID of the team folder. + :rtype: None + """ + arg = team.TeamFolderIdArg(team_folder_id) + r = self.request( + team.team_folder_permanently_delete, + 'team', + arg, + None, + ) + return None + + def team_team_folder_rename(self, + team_folder_id, + name): + """ + Changes an active team folder's name. Permission : Team member file + access. + + :param str name: New team folder name. + :rtype: :class:`dropbox.team.TeamFolderMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.TeamFolderRenameError` + """ + arg = team.TeamFolderRenameArg(team_folder_id, + name) + r = self.request( + team.team_folder_rename, + 'team', + arg, + None, + ) + return r + + def team_team_folder_update_sync_settings(self, + team_folder_id, + sync_setting=None, + content_sync_settings=None): + """ + Updates the sync settings on a team folder or its contents. Use of this + endpoint requires that the team has team selective sync enabled. + + :param Nullable sync_setting: Sync setting to apply to the team folder + itself. Only meaningful if the team folder is not a shared team + root. + :param Nullable content_sync_settings: Sync settings to apply to + contents of this team folder. + :rtype: :class:`dropbox.team.TeamFolderMetadata` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.TeamFolderUpdateSyncSettingsError` + """ + arg = team.TeamFolderUpdateSyncSettingsArg(team_folder_id, + sync_setting, + content_sync_settings) + r = self.request( + team.team_folder_update_sync_settings, + 'team', + arg, + None, + ) + return r + + def team_token_get_authenticated_admin(self): + """ + Returns the member profile of the admin who generated the team access + token used to make the call. + + :rtype: :class:`dropbox.team.TokenGetAuthenticatedAdminResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team.TokenGetAuthenticatedAdminError` + """ + arg = None + r = self.request( + team.token_get_authenticated_admin, + 'team', + arg, + None, + ) + return r + + # ------------------------------------------ + # Routes in team_log namespace + + def team_log_get_events(self, + limit=1000, + account_id=None, + time=None, + category=None): + """ + Retrieves team events. Events have a lifespan of two years. Events older + than two years will not be returned. Many attributes note 'may be + missing due to historical data gap'. Note that the file_operations + category and & analogous paper events are not available on all Dropbox + Business `plans `_. Use `features/get_values + `_ to + check for this feature. Permission : Team Auditing. + + :param int limit: The maximal number of results to return per call. Note + that some calls may not return ``limit`` number of events, and may + even return no events, even with `has_more` set to true. In this + case, callers should fetch again using + :meth:`team_log_get_events_continue`. + :param Nullable account_id: Filter the events by account ID. Return ony + events with this account_id as either Actor, Context, or + Participants. + :param Nullable time: Filter by time range. + :param Nullable category: Filter the returned events to a single + category. + :rtype: :class:`dropbox.team_log.GetTeamEventsResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team_log.GetTeamEventsError` + """ + arg = team_log.GetTeamEventsArg(limit, + account_id, + time, + category) + r = self.request( + team_log.get_events, + 'team_log', + arg, + None, + ) + return r + + def team_log_get_events_continue(self, + cursor): + """ + Once a cursor has been retrieved from :meth:`team_log_get_events`, use + this to paginate through all events. Permission : Team Auditing. + + :param str cursor: Indicates from what point to get the next set of + events. + :rtype: :class:`dropbox.team_log.GetTeamEventsResult` + :raises: :class:`.exceptions.ApiError` + + If this raises, ApiError will contain: + :class:`dropbox.team_log.GetTeamEventsContinueError` + """ + arg = team_log.GetTeamEventsContinueArg(cursor) + r = self.request( + team_log.get_events_continue, + 'team_log', + arg, + None, + ) + return r + + # ------------------------------------------ + # Routes in users namespace + diff --git a/dropbox-script/dropbox/common.py b/dropbox-script/dropbox/common.py new file mode 100644 index 0000000..e17c92d --- /dev/null +++ b/dropbox-script/dropbox/common.py @@ -0,0 +1,455 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# @generated +# flake8: noqa +# pylint: skip-file +try: + from . import stone_validators as bv + from . import stone_base as bb +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bv + import stone_base as bb + +class PathRoot(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar home: Paths are relative to the authenticating user's home namespace, + whether or not that user belongs to a team. + :ivar str root: Paths are relative to the authenticating user's root + namespace (This results in :field:`PathRootError.invalid_root` if the + user's root namespace has changed.). + :ivar str namespace_id: Paths are relative to given namespace id (This + results in :field:`PathRootError.no_permission` if you don't have access + to this namespace.). + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + home = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def root(cls, val): + """ + Create an instance of this class set to the ``root`` tag with value + ``val``. + + :param str val: + :rtype: PathRoot + """ + return cls('root', val) + + @classmethod + def namespace_id(cls, val): + """ + Create an instance of this class set to the ``namespace_id`` tag with + value ``val``. + + :param str val: + :rtype: PathRoot + """ + return cls('namespace_id', val) + + def is_home(self): + """ + Check if the union tag is ``home``. + + :rtype: bool + """ + return self._tag == 'home' + + def is_root(self): + """ + Check if the union tag is ``root``. + + :rtype: bool + """ + return self._tag == 'root' + + def is_namespace_id(self): + """ + Check if the union tag is ``namespace_id``. + + :rtype: bool + """ + return self._tag == 'namespace_id' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_root(self): + """ + Paths are relative to the authenticating user's root namespace (This + results in ``PathRootError.invalid_root`` if the user's root namespace + has changed.). + + Only call this if :meth:`is_root` is true. + + :rtype: str + """ + if not self.is_root(): + raise AttributeError("tag 'root' not set") + return self._value + + def get_namespace_id(self): + """ + Paths are relative to given namespace id (This results in + ``PathRootError.no_permission`` if you don't have access to this + namespace.). + + Only call this if :meth:`is_namespace_id` is true. + + :rtype: str + """ + if not self.is_namespace_id(): + raise AttributeError("tag 'namespace_id' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(PathRoot, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PathRoot(%r, %r)' % (self._tag, self._value) + +PathRoot_validator = bv.Union(PathRoot) + +class PathRootError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar RootInfo invalid_root: The root namespace id in Dropbox-API-Path-Root + header is not valid. The value of this error is use's latest root info. + :ivar no_permission: You don't have permission to access the namespace id in + Dropbox-API-Path-Root header. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def invalid_root(cls, val): + """ + Create an instance of this class set to the ``invalid_root`` tag with + value ``val``. + + :param RootInfo val: + :rtype: PathRootError + """ + return cls('invalid_root', val) + + def is_invalid_root(self): + """ + Check if the union tag is ``invalid_root``. + + :rtype: bool + """ + return self._tag == 'invalid_root' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_invalid_root(self): + """ + The root namespace id in Dropbox-API-Path-Root header is not valid. The + value of this error is use's latest root info. + + Only call this if :meth:`is_invalid_root` is true. + + :rtype: RootInfo + """ + if not self.is_invalid_root(): + raise AttributeError("tag 'invalid_root' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(PathRootError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PathRootError(%r, %r)' % (self._tag, self._value) + +PathRootError_validator = bv.Union(PathRootError) + +class RootInfo(bb.Struct): + """ + Information about current user's root. + + :ivar root_namespace_id: The namespace ID for user's root namespace. It will + be the namespace ID of the shared team root if the user is member of a + team with a separate team root. Otherwise it will be same as + ``RootInfo.home_namespace_id``. + :ivar home_namespace_id: The namespace ID for user's home namespace. + """ + + __slots__ = [ + '_root_namespace_id_value', + '_root_namespace_id_present', + '_home_namespace_id_value', + '_home_namespace_id_present', + ] + + _has_required_fields = True + + def __init__(self, + root_namespace_id=None, + home_namespace_id=None): + self._root_namespace_id_value = None + self._root_namespace_id_present = False + self._home_namespace_id_value = None + self._home_namespace_id_present = False + if root_namespace_id is not None: + self.root_namespace_id = root_namespace_id + if home_namespace_id is not None: + self.home_namespace_id = home_namespace_id + + @property + def root_namespace_id(self): + """ + The namespace ID for user's root namespace. It will be the namespace ID + of the shared team root if the user is member of a team with a separate + team root. Otherwise it will be same as ``RootInfo.home_namespace_id``. + + :rtype: str + """ + if self._root_namespace_id_present: + return self._root_namespace_id_value + else: + raise AttributeError("missing required field 'root_namespace_id'") + + @root_namespace_id.setter + def root_namespace_id(self, val): + val = self._root_namespace_id_validator.validate(val) + self._root_namespace_id_value = val + self._root_namespace_id_present = True + + @root_namespace_id.deleter + def root_namespace_id(self): + self._root_namespace_id_value = None + self._root_namespace_id_present = False + + @property + def home_namespace_id(self): + """ + The namespace ID for user's home namespace. + + :rtype: str + """ + if self._home_namespace_id_present: + return self._home_namespace_id_value + else: + raise AttributeError("missing required field 'home_namespace_id'") + + @home_namespace_id.setter + def home_namespace_id(self, val): + val = self._home_namespace_id_validator.validate(val) + self._home_namespace_id_value = val + self._home_namespace_id_present = True + + @home_namespace_id.deleter + def home_namespace_id(self): + self._home_namespace_id_value = None + self._home_namespace_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RootInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RootInfo(root_namespace_id={!r}, home_namespace_id={!r})'.format( + self._root_namespace_id_value, + self._home_namespace_id_value, + ) + +RootInfo_validator = bv.StructTree(RootInfo) + +class TeamRootInfo(RootInfo): + """ + Root info when user is member of a team with a separate root namespace ID. + + :ivar home_path: The path for user's home directory under the shared team + root. + """ + + __slots__ = [ + '_home_path_value', + '_home_path_present', + ] + + _has_required_fields = True + + def __init__(self, + root_namespace_id=None, + home_namespace_id=None, + home_path=None): + super(TeamRootInfo, self).__init__(root_namespace_id, + home_namespace_id) + self._home_path_value = None + self._home_path_present = False + if home_path is not None: + self.home_path = home_path + + @property + def home_path(self): + """ + The path for user's home directory under the shared team root. + + :rtype: str + """ + if self._home_path_present: + return self._home_path_value + else: + raise AttributeError("missing required field 'home_path'") + + @home_path.setter + def home_path(self, val): + val = self._home_path_validator.validate(val) + self._home_path_value = val + self._home_path_present = True + + @home_path.deleter + def home_path(self): + self._home_path_value = None + self._home_path_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamRootInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamRootInfo(root_namespace_id={!r}, home_namespace_id={!r}, home_path={!r})'.format( + self._root_namespace_id_value, + self._home_namespace_id_value, + self._home_path_value, + ) + +TeamRootInfo_validator = bv.Struct(TeamRootInfo) + +class UserRootInfo(RootInfo): + """ + Root info when user is not member of a team or the user is a member of a + team and the team does not have a separate root namespace. + """ + + __slots__ = [ + ] + + _has_required_fields = True + + def __init__(self, + root_namespace_id=None, + home_namespace_id=None): + super(UserRootInfo, self).__init__(root_namespace_id, + home_namespace_id) + + def _process_custom_annotations(self, annotation_type, processor): + super(UserRootInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UserRootInfo(root_namespace_id={!r}, home_namespace_id={!r})'.format( + self._root_namespace_id_value, + self._home_namespace_id_value, + ) + +UserRootInfo_validator = bv.Struct(UserRootInfo) + +Date_validator = bv.Timestamp(u'%Y-%m-%d') +DisplayName_validator = bv.String(min_length=1, pattern=u'[^/:?*<>"|]*') +DisplayNameLegacy_validator = bv.String() +DropboxTimestamp_validator = bv.Timestamp(u'%Y-%m-%dT%H:%M:%SZ') +EmailAddress_validator = bv.String(max_length=255, pattern=u"^['&A-Za-z0-9._%+-]+@[A-Za-z0-9-][A-Za-z0-9.-]*\\.[A-Za-z]{2,15}$") +# A ISO639-1 code. +LanguageCode_validator = bv.String(min_length=2) +NamePart_validator = bv.String(min_length=1, max_length=100, pattern=u'[^/:?*<>"|]*') +NamespaceId_validator = bv.String(pattern=u'[-_0-9a-zA-Z:]+') +OptionalNamePart_validator = bv.String(max_length=100, pattern=u'[^/:?*<>"|]*') +SessionId_validator = bv.String() +SharedFolderId_validator = NamespaceId_validator +PathRoot._home_validator = bv.Void() +PathRoot._root_validator = NamespaceId_validator +PathRoot._namespace_id_validator = NamespaceId_validator +PathRoot._other_validator = bv.Void() +PathRoot._tagmap = { + 'home': PathRoot._home_validator, + 'root': PathRoot._root_validator, + 'namespace_id': PathRoot._namespace_id_validator, + 'other': PathRoot._other_validator, +} + +PathRoot.home = PathRoot('home') +PathRoot.other = PathRoot('other') + +PathRootError._invalid_root_validator = RootInfo_validator +PathRootError._no_permission_validator = bv.Void() +PathRootError._other_validator = bv.Void() +PathRootError._tagmap = { + 'invalid_root': PathRootError._invalid_root_validator, + 'no_permission': PathRootError._no_permission_validator, + 'other': PathRootError._other_validator, +} + +PathRootError.no_permission = PathRootError('no_permission') +PathRootError.other = PathRootError('other') + +RootInfo._root_namespace_id_validator = NamespaceId_validator +RootInfo._home_namespace_id_validator = NamespaceId_validator +RootInfo._field_names_ = set([ + 'root_namespace_id', + 'home_namespace_id', +]) +RootInfo._all_field_names_ = RootInfo._field_names_ +RootInfo._fields_ = [ + ('root_namespace_id', RootInfo._root_namespace_id_validator), + ('home_namespace_id', RootInfo._home_namespace_id_validator), +] +RootInfo._all_fields_ = RootInfo._fields_ + +RootInfo._tag_to_subtype_ = { + (u'team',): TeamRootInfo_validator, + (u'user',): UserRootInfo_validator, +} +RootInfo._pytype_to_tag_and_subtype_ = { + TeamRootInfo: ((u'team',), TeamRootInfo_validator), + UserRootInfo: ((u'user',), UserRootInfo_validator), +} +RootInfo._is_catch_all_ = True + +TeamRootInfo._home_path_validator = bv.String() +TeamRootInfo._field_names_ = set(['home_path']) +TeamRootInfo._all_field_names_ = RootInfo._all_field_names_.union(TeamRootInfo._field_names_) +TeamRootInfo._fields_ = [('home_path', TeamRootInfo._home_path_validator)] +TeamRootInfo._all_fields_ = RootInfo._all_fields_ + TeamRootInfo._fields_ + +UserRootInfo._field_names_ = set([]) +UserRootInfo._all_field_names_ = RootInfo._all_field_names_.union(UserRootInfo._field_names_) +UserRootInfo._fields_ = [] +UserRootInfo._all_fields_ = RootInfo._all_fields_ + UserRootInfo._fields_ + +ROUTES = { +} + diff --git a/dropbox-script/dropbox/contacts.py b/dropbox-script/dropbox/contacts.py new file mode 100644 index 0000000..2a54190 --- /dev/null +++ b/dropbox-script/dropbox/contacts.py @@ -0,0 +1,175 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# @generated +# flake8: noqa +# pylint: skip-file +try: + from . import stone_validators as bv + from . import stone_base as bb +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bv + import stone_base as bb + +try: + from . import ( + common, + ) +except (ImportError, SystemError, ValueError): + import common + +class DeleteManualContactsArg(bb.Struct): + """ + :ivar email_addresses: List of manually added contacts to be deleted. + """ + + __slots__ = [ + '_email_addresses_value', + '_email_addresses_present', + ] + + _has_required_fields = True + + def __init__(self, + email_addresses=None): + self._email_addresses_value = None + self._email_addresses_present = False + if email_addresses is not None: + self.email_addresses = email_addresses + + @property + def email_addresses(self): + """ + List of manually added contacts to be deleted. + + :rtype: list of [str] + """ + if self._email_addresses_present: + return self._email_addresses_value + else: + raise AttributeError("missing required field 'email_addresses'") + + @email_addresses.setter + def email_addresses(self, val): + val = self._email_addresses_validator.validate(val) + self._email_addresses_value = val + self._email_addresses_present = True + + @email_addresses.deleter + def email_addresses(self): + self._email_addresses_value = None + self._email_addresses_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeleteManualContactsArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeleteManualContactsArg(email_addresses={!r})'.format( + self._email_addresses_value, + ) + +DeleteManualContactsArg_validator = bv.Struct(DeleteManualContactsArg) + +class DeleteManualContactsError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar list of [str] contacts_not_found: Can't delete contacts from this + list. Make sure the list only has manually added contacts. The deletion + was cancelled. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def contacts_not_found(cls, val): + """ + Create an instance of this class set to the ``contacts_not_found`` tag + with value ``val``. + + :param list of [str] val: + :rtype: DeleteManualContactsError + """ + return cls('contacts_not_found', val) + + def is_contacts_not_found(self): + """ + Check if the union tag is ``contacts_not_found``. + + :rtype: bool + """ + return self._tag == 'contacts_not_found' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_contacts_not_found(self): + """ + Can't delete contacts from this list. Make sure the list only has + manually added contacts. The deletion was cancelled. + + Only call this if :meth:`is_contacts_not_found` is true. + + :rtype: list of [str] + """ + if not self.is_contacts_not_found(): + raise AttributeError("tag 'contacts_not_found' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(DeleteManualContactsError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeleteManualContactsError(%r, %r)' % (self._tag, self._value) + +DeleteManualContactsError_validator = bv.Union(DeleteManualContactsError) + +DeleteManualContactsArg._email_addresses_validator = bv.List(common.EmailAddress_validator) +DeleteManualContactsArg._all_field_names_ = set(['email_addresses']) +DeleteManualContactsArg._all_fields_ = [('email_addresses', DeleteManualContactsArg._email_addresses_validator)] + +DeleteManualContactsError._contacts_not_found_validator = bv.List(common.EmailAddress_validator) +DeleteManualContactsError._other_validator = bv.Void() +DeleteManualContactsError._tagmap = { + 'contacts_not_found': DeleteManualContactsError._contacts_not_found_validator, + 'other': DeleteManualContactsError._other_validator, +} + +DeleteManualContactsError.other = DeleteManualContactsError('other') + +delete_manual_contacts = bb.Route( + 'delete_manual_contacts', + 1, + False, + bv.Void(), + bv.Void(), + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) +delete_manual_contacts_batch = bb.Route( + 'delete_manual_contacts_batch', + 1, + False, + DeleteManualContactsArg_validator, + bv.Void(), + DeleteManualContactsError_validator, + {'host': u'api', + 'style': u'rpc'}, +) + +ROUTES = { + 'delete_manual_contacts': delete_manual_contacts, + 'delete_manual_contacts_batch': delete_manual_contacts_batch, +} + diff --git a/dropbox-script/dropbox/dropbox.py b/dropbox-script/dropbox/dropbox.py new file mode 100644 index 0000000..b8c8dcd --- /dev/null +++ b/dropbox-script/dropbox/dropbox.py @@ -0,0 +1,609 @@ +__all__ = [ + 'Dropbox', + 'DropboxTeam', + 'create_session', +] + +# This should always be 0.0.0 in master. Only update this after tagging +# before release. +__version__ = '9.3.0' + +import contextlib +import json +import logging +import random +import time + +import requests +import six + +from . import files, stone_serializers +from .auth import ( + AuthError_validator, + RateLimitError_validator, +) +from .common import ( + PathRoot, + PathRoot_validator, + PathRootError_validator +) +from .base import DropboxBase +from .base_team import DropboxTeamBase +from .exceptions import ( + ApiError, + AuthError, + BadInputError, + HttpError, + PathRootError, + InternalServerError, + RateLimitError, +) +from .session import ( + API_HOST, + API_CONTENT_HOST, + API_NOTIFICATION_HOST, + HOST_API, + HOST_CONTENT, + HOST_NOTIFY, + pinned_session, +) + +PATH_ROOT_HEADER = 'Dropbox-API-Path-Root' +HTTP_STATUS_INVALID_PATH_ROOT = 422 + +class RouteResult(object): + """The successful result of a call to a route.""" + + def __init__(self, obj_result, http_resp=None): + """ + :param str obj_result: The result of a route not including the binary + payload portion, if one exists. Must be serialized JSON. + :param requests.models.Response http_resp: A raw HTTP response. It will + be used to stream the binary-body payload of the response. + """ + assert isinstance(obj_result, six.string_types), \ + 'obj_result: expected string, got %r' % type(obj_result) + if http_resp is not None: + assert isinstance(http_resp, requests.models.Response), \ + 'http_resp: expected requests.models.Response, got %r' % \ + type(http_resp) + self.obj_result = obj_result + self.http_resp = http_resp + +class RouteErrorResult(object): + """The error result of a call to a route.""" + + def __init__(self, request_id, obj_result): + """ + :param str request_id: A request_id can be shared with Dropbox Support + to pinpoint the exact request that returns an error. + :param str obj_result: The result of a route not including the binary + payload portion, if one exists. + """ + self.request_id = request_id + self.obj_result = obj_result + +def create_session(max_connections=8, proxies=None): + """ + Creates a session object that can be used by multiple :class:`Dropbox` and + :class:`DropboxTeam` instances. This lets you share a connection pool + amongst them, as well as proxy parameters. + + :param int max_connections: Maximum connection pool size. + :param dict proxies: See the `requests module + `_ + for more details. + :rtype: :class:`requests.sessions.Session`. `See the requests module + `_ + for more details. + """ + # We only need as many pool_connections as we have unique hostnames. + session = pinned_session(pool_maxsize=max_connections) + if proxies: + session.proxies = proxies + return session + +class _DropboxTransport(object): + """ + Responsible for implementing the wire protocol for making requests to the + Dropbox API. + """ + + _API_VERSION = '2' + + # Download style means that the route argument goes in a Dropbox-API-Arg + # header, and the result comes back in a Dropbox-API-Result header. The + # HTTP response body contains a binary payload. + _ROUTE_STYLE_DOWNLOAD = 'download' + + # Upload style means that the route argument goes in a Dropbox-API-Arg + # header. The HTTP request body contains a binary payload. The result + # comes back in a Dropbox-API-Result header. + _ROUTE_STYLE_UPLOAD = 'upload' + + # RPC style means that the argument and result of a route are contained in + # the HTTP body. + _ROUTE_STYLE_RPC = 'rpc' + + # This is the default longest time we'll block on receiving data from the server + _DEFAULT_TIMEOUT = 30 + + def __init__(self, + oauth2_access_token, + max_retries_on_error=4, + max_retries_on_rate_limit=None, + user_agent=None, + session=None, + headers=None, + timeout=_DEFAULT_TIMEOUT): + """ + :param str oauth2_access_token: OAuth2 access token for making client + requests. + + :param int max_retries_on_error: On 5xx errors, the number of times to + retry. + :param Optional[int] max_retries_on_rate_limit: On 429 errors, the + number of times to retry. If `None`, always retries. + :param str user_agent: The user agent to use when making requests. This + helps us identify requests coming from your application. We + recommend you use the format "AppName/Version". If set, we append + "/OfficialDropboxPythonSDKv2/__version__" to the user_agent, + :param session: If not provided, a new session (connection pool) is + created. To share a session across multiple clients, use + :func:`create_session`. + :type session: :class:`requests.sessions.Session` + :param dict headers: Additional headers to add to requests. + :param Optional[float] timeout: Maximum duration in seconds that + client will wait for any single packet from the + server. After the timeout the client will give up on + connection. If `None`, client will wait forever. Defaults + to 30 seconds. + """ + assert len(oauth2_access_token) > 0, \ + 'OAuth2 access token cannot be empty.' + assert headers is None or isinstance(headers, dict), \ + 'Expected dict, got %r' % headers + self._oauth2_access_token = oauth2_access_token + + self._max_retries_on_error = max_retries_on_error + self._max_retries_on_rate_limit = max_retries_on_rate_limit + if session: + assert isinstance(session, requests.sessions.Session), \ + 'Expected requests.sessions.Session, got %r' % session + self._session = session + else: + self._session = create_session() + self._headers = headers + + base_user_agent = 'OfficialDropboxPythonSDKv2/' + __version__ + if user_agent: + self._raw_user_agent = user_agent + self._user_agent = '{}/{}'.format(user_agent, base_user_agent) + else: + self._raw_user_agent = None + self._user_agent = base_user_agent + + self._logger = logging.getLogger('dropbox') + + self._host_map = {HOST_API: API_HOST, + HOST_CONTENT: API_CONTENT_HOST, + HOST_NOTIFY: API_NOTIFICATION_HOST} + + self._timeout = timeout + + def clone( + self, + oauth2_access_token=None, + max_retries_on_error=None, + max_retries_on_rate_limit=None, + user_agent=None, + session=None, + headers=None, + timeout=None): + """ + Creates a new copy of the Dropbox client with the same defaults unless modified by + arguments to clone() + + See constructor for original parameter descriptions. + + :return: New instance of Dropbox clent + :rtype: Dropbox + """ + + return self.__class__( + oauth2_access_token or self._oauth2_access_token, + max_retries_on_error or self._max_retries_on_error, + max_retries_on_rate_limit or self._max_retries_on_rate_limit, + user_agent or self._user_agent, + session or self._session, + headers or self._headers, + timeout or self._timeout + ) + + def request(self, + route, + namespace, + request_arg, + request_binary, + timeout=None): + """ + Makes a request to the Dropbox API and in the process validates that + the route argument and result are the expected data types. The + request_arg is converted to JSON based on the arg_data_type. Likewise, + the response is deserialized from JSON and converted to an object based + on the {result,error}_data_type. + + :param host: The Dropbox API host to connect to. + :param route: The route to make the request to. + :type route: :class:`.datatypes.stone_base.Route` + :param request_arg: Argument for the route that conforms to the + validator specified by route.arg_type. + :param request_binary: String or file pointer representing the binary + payload. Use None if there is no binary payload. + :param Optional[float] timeout: Maximum duration in seconds + that client will wait for any single packet from the + server. After the timeout the client will give up on + connection. If `None`, will use default timeout set on + Dropbox object. Defaults to `None`. + :return: The route's result. + """ + host = route.attrs['host'] or 'api' + route_name = namespace + '/' + route.name + if route.version > 1: + route_name += '_v{}'.format(route.version) + route_style = route.attrs['style'] or 'rpc' + serialized_arg = stone_serializers.json_encode(route.arg_type, + request_arg) + + if (timeout is None and + route == files.list_folder_longpoll): + # The client normally sends a timeout value to the + # longpoll route. The server will respond after + # + random(0, 90) seconds. We increase the + # socket timeout to the longpoll timeout value plus 90 + # seconds so that we don't cut the server response short + # due to a shorter socket timeout. + # NB: This is done here because base.py is auto-generated + timeout = request_arg.timeout + 90 + + res = self.request_json_string_with_retry(host, + route_name, + route_style, + serialized_arg, + request_binary, + timeout=timeout) + decoded_obj_result = json.loads(res.obj_result) + if isinstance(res, RouteResult): + returned_data_type = route.result_type + obj = decoded_obj_result + elif isinstance(res, RouteErrorResult): + returned_data_type = route.error_type + obj = decoded_obj_result['error'] + user_message = decoded_obj_result.get('user_message') + user_message_text = user_message and user_message.get('text') + user_message_locale = user_message and user_message.get('locale') + else: + raise AssertionError('Expected RouteResult or RouteErrorResult, ' + 'but res is %s' % type(res)) + + deserialized_result = stone_serializers.json_compat_obj_decode( + returned_data_type, obj, strict=False) + + if isinstance(res, RouteErrorResult): + raise ApiError(res.request_id, + deserialized_result, + user_message_text, + user_message_locale) + elif route_style == self._ROUTE_STYLE_DOWNLOAD: + return (deserialized_result, res.http_resp) + else: + return deserialized_result + + def request_json_object(self, + host, + route_name, + route_style, + request_arg, + request_binary, + timeout=None): + """ + Makes a request to the Dropbox API, taking a JSON-serializable Python + object as an argument, and returning one as a response. + + :param host: The Dropbox API host to connect to. + :param route_name: The name of the route to invoke. + :param route_style: The style of the route. + :param str request_arg: A JSON-serializable Python object representing + the argument for the route. + :param Optional[bytes] request_binary: Bytes representing the binary + payload. Use None if there is no binary payload. + :param Optional[float] timeout: Maximum duration in seconds + that client will wait for any single packet from the + server. After the timeout the client will give up on + connection. If `None`, will use default timeout set on + Dropbox object. Defaults to `None`. + :return: The route's result as a JSON-serializable Python object. + """ + serialized_arg = json.dumps(request_arg) + res = self.request_json_string_with_retry(host, + route_name, + route_style, + serialized_arg, + request_binary, + timeout=timeout) + # This can throw a ValueError if the result is not deserializable, + # but that would be completely unexpected. + deserialized_result = json.loads(res.obj_result) + if isinstance(res, RouteResult) and res.http_resp is not None: + return (deserialized_result, res.http_resp) + else: + return deserialized_result + + def request_json_string_with_retry(self, + host, + route_name, + route_style, + request_json_arg, + request_binary, + timeout=None): + """ + See :meth:`request_json_object` for description of parameters. + + :param request_json_arg: A string representing the serialized JSON + argument to the route. + """ + attempt = 0 + rate_limit_errors = 0 + while True: + self._logger.info('Request to %s', route_name) + try: + return self.request_json_string(host, + route_name, + route_style, + request_json_arg, + request_binary, + timeout=timeout) + except InternalServerError as e: + attempt += 1 + if attempt <= self._max_retries_on_error: + # Use exponential backoff + backoff = 2**attempt * random.random() + self._logger.info( + 'HttpError status_code=%s: Retrying in %.1f seconds', + e.status_code, backoff) + time.sleep(backoff) + else: + raise + except RateLimitError as e: + rate_limit_errors += 1 + if (self._max_retries_on_rate_limit is None or + self._max_retries_on_rate_limit >= rate_limit_errors): + # Set default backoff to 5 seconds. + backoff = e.backoff if e.backoff is not None else 5.0 + self._logger.info( + 'Ratelimit: Retrying in %.1f seconds.', backoff) + time.sleep(backoff) + else: + raise + + def request_json_string(self, + host, + func_name, + route_style, + request_json_arg, + request_binary, + timeout=None): + """ + See :meth:`request_json_string_with_retry` for description of + parameters. + """ + if host not in self._host_map: + raise ValueError('Unknown value for host: %r' % host) + + if not isinstance(request_binary, (six.binary_type, type(None))): + # Disallow streams and file-like objects even though the underlying + # requests library supports them. This is to prevent incorrect + # behavior when a non-rewindable stream is read from, but the + # request fails and needs to be re-tried at a later time. + raise TypeError('expected request_binary as binary type, got %s' % + type(request_binary)) + + # Fully qualified hostname + fq_hostname = self._host_map[host] + url = self._get_route_url(fq_hostname, func_name) + + headers = {'User-Agent': self._user_agent} + if host != HOST_NOTIFY: + headers['Authorization'] = 'Bearer %s' % self._oauth2_access_token + if self._headers: + headers.update(self._headers) + + # The contents of the body of the HTTP request + body = None + # Whether the response should be streamed incrementally, or buffered + # entirely. If stream is True, the caller is responsible for closing + # the HTTP response. + stream = False + + if route_style == self._ROUTE_STYLE_RPC: + headers['Content-Type'] = 'application/json' + body = request_json_arg + elif route_style == self._ROUTE_STYLE_DOWNLOAD: + headers['Dropbox-API-Arg'] = request_json_arg + stream = True + elif route_style == self._ROUTE_STYLE_UPLOAD: + headers['Content-Type'] = 'application/octet-stream' + headers['Dropbox-API-Arg'] = request_json_arg + body = request_binary + else: + raise ValueError('Unknown operation style: %r' % route_style) + + if timeout is None: + timeout = self._timeout + + r = self._session.post(url, + headers=headers, + data=body, + stream=stream, + verify=True, + timeout=timeout, + ) + + request_id = r.headers.get('x-dropbox-request-id') + if r.status_code >= 500: + raise InternalServerError(request_id, r.status_code, r.text) + elif r.status_code == 400: + raise BadInputError(request_id, r.text) + elif r.status_code == 401: + assert r.headers.get('content-type') == 'application/json', ( + 'Expected content-type to be application/json, got %r' % + r.headers.get('content-type')) + err = stone_serializers.json_compat_obj_decode( + AuthError_validator, r.json()['error']) + raise AuthError(request_id, err) + elif r.status_code == HTTP_STATUS_INVALID_PATH_ROOT: + err = stone_serializers.json_compat_obj_decode( + PathRootError_validator, r.json()['error']) + raise PathRootError(request_id, err) + elif r.status_code == 429: + err = None + if r.headers.get('content-type') == 'application/json': + err = stone_serializers.json_compat_obj_decode( + RateLimitError_validator, r.json()['error']) + retry_after = err.retry_after + else: + retry_after_str = r.headers.get('retry-after') + if retry_after_str is not None: + retry_after = int(retry_after_str) + else: + retry_after = None + raise RateLimitError(request_id, err, retry_after) + elif 200 <= r.status_code <= 299: + if route_style == self._ROUTE_STYLE_DOWNLOAD: + raw_resp = r.headers['dropbox-api-result'] + else: + assert r.headers.get('content-type') == 'application/json', ( + 'Expected content-type to be application/json, got %r' % + r.headers.get('content-type')) + raw_resp = r.content.decode('utf-8') + if route_style == self._ROUTE_STYLE_DOWNLOAD: + return RouteResult(raw_resp, r) + else: + return RouteResult(raw_resp) + elif r.status_code in (403, 404, 409): + raw_resp = r.content.decode('utf-8') + return RouteErrorResult(request_id, raw_resp) + else: + raise HttpError(request_id, r.status_code, r.text) + + def _get_route_url(self, hostname, route_name): + """Returns the URL of the route. + + :param str hostname: Hostname to make the request to. + :param str route_name: Name of the route. + :rtype: str + """ + return 'https://{hostname}/{version}/{route_name}'.format( + hostname=hostname, + version=Dropbox._API_VERSION, + route_name=route_name, + ) + + def _save_body_to_file(self, download_path, http_resp, chunksize=2**16): + """ + Saves the body of an HTTP response to a file. + + :param str download_path: Local path to save data to. + :param http_resp: The HTTP response whose body will be saved. + :type http_resp: :class:`requests.models.Response` + :rtype: None + """ + with open(download_path, 'wb') as f: + with contextlib.closing(http_resp): + for c in http_resp.iter_content(chunksize): + f.write(c) + + def with_path_root(self, path_root): + """ + Creates a clone of the Dropbox instance with the Dropbox-API-Path-Root header + as the appropriate serialized instance of PathRoot. + + For more information, see + https://www.dropbox.com/developers/reference/namespace-guide#pathrootmodes + + :param PathRoot path_root: instance of PathRoot to serialize into the headers field + :return: A :class: `Dropbox` + :rtype: Dropbox + """ + + if not isinstance(path_root, PathRoot): + raise ValueError("path_root must be an instance of PathRoot") + + return self.clone( + headers={ + PATH_ROOT_HEADER: stone_serializers.json_encode(PathRoot_validator, path_root) + } + ) + +class Dropbox(_DropboxTransport, DropboxBase): + """ + Use this class to make requests to the Dropbox API using a user's access + token. Methods of this class are meant to act on the corresponding user's + Dropbox. + """ + pass + +class DropboxTeam(_DropboxTransport, DropboxTeamBase): + """ + Use this class to make requests to the Dropbox API using a team's access + token. Methods of this class are meant to act on the team, but there is + also an :meth:`as_user` method for assuming a team member's identity. + """ + def as_admin(self, team_member_id): + """ + Allows a team credential to assume the identity of an administrator on the team + and perform operations on any team-owned content. + + :param str team_member_id: team member id of administrator to perform actions with + :return: A :class:`Dropbox` object that can be used to query on behalf + of this admin of the team. + :rtype: Dropbox + """ + return self._get_dropbox_client_with_select_header('Dropbox-API-Select-Admin', + team_member_id) + + def as_user(self, team_member_id): + """ + Allows a team credential to assume the identity of a member of the + team. + + :param str team_member_id: team member id of team member to perform actions with + :return: A :class:`Dropbox` object that can be used to query on behalf + of this member of the team. + :rtype: Dropbox + """ + return self._get_dropbox_client_with_select_header('Dropbox-API-Select-User', + team_member_id) + + def _get_dropbox_client_with_select_header(self, select_header_name, team_member_id): + """ + Get Dropbox client with modified headers + + :param str select_header_name: Header name used to select users + :param str team_member_id: team member id of team member to perform actions with + :return: A :class:`Dropbox` object that can be used to query on behalf + of a member or admin of the team + :rtype: Dropbox + """ + + new_headers = self._headers.copy() if self._headers else {} + new_headers[select_header_name] = team_member_id + return Dropbox( + self._oauth2_access_token, + max_retries_on_error=self._max_retries_on_error, + max_retries_on_rate_limit=self._max_retries_on_rate_limit, + timeout=self._timeout, + user_agent=self._raw_user_agent, + session=self._session, + headers=new_headers, + ) diff --git a/dropbox-script/dropbox/exceptions.py b/dropbox-script/dropbox/exceptions.py new file mode 100644 index 0000000..12ac045 --- /dev/null +++ b/dropbox-script/dropbox/exceptions.py @@ -0,0 +1,100 @@ +class DropboxException(Exception): + """All errors related to making an API request extend this.""" + + def __init__(self, request_id, *args, **kwargs): + # A request_id can be shared with Dropbox Support to pinpoint the exact + # request that returns an error. + super(DropboxException, self).__init__(request_id, *args, **kwargs) + self.request_id = request_id + + def __str__(self): + return repr(self) + + +class ApiError(DropboxException): + """Errors produced by the Dropbox API.""" + + def __init__(self, request_id, error, user_message_text, user_message_locale): + """ + :param (str) request_id: A request_id can be shared with Dropbox + Support to pinpoint the exact request that returns an error. + :param error: An instance of the error data type for the route. + :param (str) user_message_text: A human-readable message that can be + displayed to the end user. Is None, if unavailable. + :param (str) user_message_locale: The locale of ``user_message_text``, + if present. + """ + super(ApiError, self).__init__(request_id, error) + self.error = error + self.user_message_text = user_message_text + self.user_message_locale = user_message_locale + + def __repr__(self): + return 'ApiError({!r}, {})'.format(self.request_id, self.error) + + +class HttpError(DropboxException): + """Errors produced at the HTTP layer.""" + + def __init__(self, request_id, status_code, body): + super(HttpError, self).__init__(request_id, status_code, body) + self.status_code = status_code + self.body = body + + def __repr__(self): + return 'HttpError({!r}, {}, {!r})'.format(self.request_id, + self.status_code, self.body) + + +class PathRootError(HttpError): + """Error caused by an invalid path root.""" + + def __init__(self, request_id, error=None): + super(PathRootError, self).__init__(request_id, 422, None) + self.error = error + + def __repr__(self): + return 'PathRootError({!r}, {!r})'.format(self.request_id, self.error) + + +class BadInputError(HttpError): + """Errors due to bad input parameters to an API Operation.""" + + def __init__(self, request_id, message): + super(BadInputError, self).__init__(request_id, 400, message) + self.message = message + + def __repr__(self): + return 'BadInputError({!r}, {!r})'.format(self.request_id, self.message) + + +class AuthError(HttpError): + """Errors due to invalid authentication credentials.""" + + def __init__(self, request_id, error): + super(AuthError, self).__init__(request_id, 401, None) + self.error = error + + def __repr__(self): + return 'AuthError({!r}, {!r})'.format(self.request_id, self.error) + + +class RateLimitError(HttpError): + """Error caused by rate limiting.""" + + def __init__(self, request_id, error=None, backoff=None): + super(RateLimitError, self).__init__(request_id, 429, None) + self.error = error + self.backoff = backoff + + def __repr__(self): + return 'RateLimitError({!r}, {!r}, {!r})'.format( + self.request_id, self.error, self.backoff) + + +class InternalServerError(HttpError): + """Errors due to a problem on Dropbox.""" + + def __repr__(self): + return 'InternalServerError({!r}, {}, {!r})'.format( + self.request_id, self.status_code, self.body) diff --git a/dropbox-script/dropbox/file_properties.py b/dropbox-script/dropbox/file_properties.py new file mode 100644 index 0000000..2006e07 --- /dev/null +++ b/dropbox-script/dropbox/file_properties.py @@ -0,0 +1,3396 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# @generated +# flake8: noqa +# pylint: skip-file +""" +This namespace contains helpers for property and template metadata endpoints. + +These endpoints enable you to tag arbitrary key/value data to Dropbox files. + +The most basic unit in this namespace is the :type:`PropertyField`. These fields encapsulate the actual key/value data. + +Fields are added to a Dropbox file using a :type:`PropertyGroup`. Property groups contain a reference to a Dropbox file and a :type:`PropertyGroupTemplate`. Property groups are uniquely identified by the combination of their associated Dropbox file and template. + +The :type:`PropertyGroupTemplate` is a way of restricting the possible key names and value types of the data within a property group. The possible key names and value types are explicitly enumerated using :type:`PropertyFieldTemplate` objects. + +You can think of a property group template as a class definition for a particular key/value metadata object, and the property groups themselves as the instantiations of these objects. + +Templates are owned either by a user/app pair or team/app pair. Templates and their associated properties can't be accessed by any app other than the app that created them, and even then, only when the app is linked with the owner of the template (either a user or team). + +User-owned templates are accessed via the user-auth file_properties/templates/*_for_user endpoints, while team-owned templates are accessed via the team-auth file_properties/templates/*_for_team endpoints. Properties associated with either type of template can be accessed via the user-auth properties/* endpoints. + +Finally, properties can be accessed from a number of endpoints that return metadata, including `files/get_metadata`, and `files/list_folder`. Properties can also be added during upload, using `files/upload`. +""" + +try: + from . import stone_validators as bv + from . import stone_base as bb +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bv + import stone_base as bb + +class AddPropertiesArg(bb.Struct): + """ + :ivar path: A unique identifier for the file or folder. + :ivar property_groups: The property groups which are to be added to a + Dropbox file. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_property_groups_value', + '_property_groups_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + property_groups=None): + self._path_value = None + self._path_present = False + self._property_groups_value = None + self._property_groups_present = False + if path is not None: + self.path = path + if property_groups is not None: + self.property_groups = property_groups + + @property + def path(self): + """ + A unique identifier for the file or folder. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def property_groups(self): + """ + The property groups which are to be added to a Dropbox file. + + :rtype: list of [PropertyGroup] + """ + if self._property_groups_present: + return self._property_groups_value + else: + raise AttributeError("missing required field 'property_groups'") + + @property_groups.setter + def property_groups(self, val): + val = self._property_groups_validator.validate(val) + self._property_groups_value = val + self._property_groups_present = True + + @property_groups.deleter + def property_groups(self): + self._property_groups_value = None + self._property_groups_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AddPropertiesArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AddPropertiesArg(path={!r}, property_groups={!r})'.format( + self._path_value, + self._property_groups_value, + ) + +AddPropertiesArg_validator = bv.Struct(AddPropertiesArg) + +class TemplateError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar str template_not_found: Template does not exist for the given + identifier. + :ivar restricted_content: You do not have permission to modify this + template. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + restricted_content = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def template_not_found(cls, val): + """ + Create an instance of this class set to the ``template_not_found`` tag + with value ``val``. + + :param str val: + :rtype: TemplateError + """ + return cls('template_not_found', val) + + def is_template_not_found(self): + """ + Check if the union tag is ``template_not_found``. + + :rtype: bool + """ + return self._tag == 'template_not_found' + + def is_restricted_content(self): + """ + Check if the union tag is ``restricted_content``. + + :rtype: bool + """ + return self._tag == 'restricted_content' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_template_not_found(self): + """ + Template does not exist for the given identifier. + + Only call this if :meth:`is_template_not_found` is true. + + :rtype: str + """ + if not self.is_template_not_found(): + raise AttributeError("tag 'template_not_found' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(TemplateError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TemplateError(%r, %r)' % (self._tag, self._value) + +TemplateError_validator = bv.Union(TemplateError) + +class PropertiesError(TemplateError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar unsupported_folder: This folder cannot be tagged. Tagging folders is + not supported for team-owned templates. + """ + + # Attribute is overwritten below the class definition + unsupported_folder = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param LookupError val: + :rtype: PropertiesError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_unsupported_folder(self): + """ + Check if the union tag is ``unsupported_folder``. + + :rtype: bool + """ + return self._tag == 'unsupported_folder' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(PropertiesError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PropertiesError(%r, %r)' % (self._tag, self._value) + +PropertiesError_validator = bv.Union(PropertiesError) + +class InvalidPropertyGroupError(PropertiesError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar property_field_too_large: One or more of the supplied property field + values is too large. + :ivar does_not_fit_template: One or more of the supplied property fields + does not conform to the template specifications. + """ + + # Attribute is overwritten below the class definition + property_field_too_large = None + # Attribute is overwritten below the class definition + does_not_fit_template = None + + def is_property_field_too_large(self): + """ + Check if the union tag is ``property_field_too_large``. + + :rtype: bool + """ + return self._tag == 'property_field_too_large' + + def is_does_not_fit_template(self): + """ + Check if the union tag is ``does_not_fit_template``. + + :rtype: bool + """ + return self._tag == 'does_not_fit_template' + + def _process_custom_annotations(self, annotation_type, processor): + super(InvalidPropertyGroupError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'InvalidPropertyGroupError(%r, %r)' % (self._tag, self._value) + +InvalidPropertyGroupError_validator = bv.Union(InvalidPropertyGroupError) + +class AddPropertiesError(InvalidPropertyGroupError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar property_group_already_exists: A property group associated with this + template and file already exists. + """ + + # Attribute is overwritten below the class definition + property_group_already_exists = None + + def is_property_group_already_exists(self): + """ + Check if the union tag is ``property_group_already_exists``. + + :rtype: bool + """ + return self._tag == 'property_group_already_exists' + + def _process_custom_annotations(self, annotation_type, processor): + super(AddPropertiesError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AddPropertiesError(%r, %r)' % (self._tag, self._value) + +AddPropertiesError_validator = bv.Union(AddPropertiesError) + +class PropertyGroupTemplate(bb.Struct): + """ + Defines how a property group may be structured. + + :ivar name: Display name for the template. Template names can be up to 256 + bytes. + :ivar description: Description for the template. Template descriptions can + be up to 1024 bytes. + :ivar fields: Definitions of the property fields associated with this + template. There can be up to 32 properties in a single template. + """ + + __slots__ = [ + '_name_value', + '_name_present', + '_description_value', + '_description_present', + '_fields_value', + '_fields_present', + ] + + _has_required_fields = True + + def __init__(self, + name=None, + description=None, + fields=None): + self._name_value = None + self._name_present = False + self._description_value = None + self._description_present = False + self._fields_value = None + self._fields_present = False + if name is not None: + self.name = name + if description is not None: + self.description = description + if fields is not None: + self.fields = fields + + @property + def name(self): + """ + Display name for the template. Template names can be up to 256 bytes. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def description(self): + """ + Description for the template. Template descriptions can be up to 1024 + bytes. + + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + @property + def fields(self): + """ + Definitions of the property fields associated with this template. There + can be up to 32 properties in a single template. + + :rtype: list of [PropertyFieldTemplate] + """ + if self._fields_present: + return self._fields_value + else: + raise AttributeError("missing required field 'fields'") + + @fields.setter + def fields(self, val): + val = self._fields_validator.validate(val) + self._fields_value = val + self._fields_present = True + + @fields.deleter + def fields(self): + self._fields_value = None + self._fields_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PropertyGroupTemplate, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PropertyGroupTemplate(name={!r}, description={!r}, fields={!r})'.format( + self._name_value, + self._description_value, + self._fields_value, + ) + +PropertyGroupTemplate_validator = bv.Struct(PropertyGroupTemplate) + +class AddTemplateArg(PropertyGroupTemplate): + + __slots__ = [ + ] + + _has_required_fields = True + + def __init__(self, + name=None, + description=None, + fields=None): + super(AddTemplateArg, self).__init__(name, + description, + fields) + + def _process_custom_annotations(self, annotation_type, processor): + super(AddTemplateArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AddTemplateArg(name={!r}, description={!r}, fields={!r})'.format( + self._name_value, + self._description_value, + self._fields_value, + ) + +AddTemplateArg_validator = bv.Struct(AddTemplateArg) + +class AddTemplateResult(bb.Struct): + """ + :ivar template_id: An identifier for template added by See + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_user` + or + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_team`. + """ + + __slots__ = [ + '_template_id_value', + '_template_id_present', + ] + + _has_required_fields = True + + def __init__(self, + template_id=None): + self._template_id_value = None + self._template_id_present = False + if template_id is not None: + self.template_id = template_id + + @property + def template_id(self): + """ + An identifier for template added by See + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_user` + or + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_team`. + + :rtype: str + """ + if self._template_id_present: + return self._template_id_value + else: + raise AttributeError("missing required field 'template_id'") + + @template_id.setter + def template_id(self, val): + val = self._template_id_validator.validate(val) + self._template_id_value = val + self._template_id_present = True + + @template_id.deleter + def template_id(self): + self._template_id_value = None + self._template_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AddTemplateResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AddTemplateResult(template_id={!r})'.format( + self._template_id_value, + ) + +AddTemplateResult_validator = bv.Struct(AddTemplateResult) + +class GetTemplateArg(bb.Struct): + """ + :ivar template_id: An identifier for template added by route See + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_user` + or + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_team`. + """ + + __slots__ = [ + '_template_id_value', + '_template_id_present', + ] + + _has_required_fields = True + + def __init__(self, + template_id=None): + self._template_id_value = None + self._template_id_present = False + if template_id is not None: + self.template_id = template_id + + @property + def template_id(self): + """ + An identifier for template added by route See + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_user` + or + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_team`. + + :rtype: str + """ + if self._template_id_present: + return self._template_id_value + else: + raise AttributeError("missing required field 'template_id'") + + @template_id.setter + def template_id(self, val): + val = self._template_id_validator.validate(val) + self._template_id_value = val + self._template_id_present = True + + @template_id.deleter + def template_id(self): + self._template_id_value = None + self._template_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetTemplateArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetTemplateArg(template_id={!r})'.format( + self._template_id_value, + ) + +GetTemplateArg_validator = bv.Struct(GetTemplateArg) + +class GetTemplateResult(PropertyGroupTemplate): + + __slots__ = [ + ] + + _has_required_fields = True + + def __init__(self, + name=None, + description=None, + fields=None): + super(GetTemplateResult, self).__init__(name, + description, + fields) + + def _process_custom_annotations(self, annotation_type, processor): + super(GetTemplateResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetTemplateResult(name={!r}, description={!r}, fields={!r})'.format( + self._name_value, + self._description_value, + self._fields_value, + ) + +GetTemplateResult_validator = bv.Struct(GetTemplateResult) + +class ListTemplateResult(bb.Struct): + """ + :ivar template_ids: List of identifiers for templates added by See + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_user` + or + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_team`. + """ + + __slots__ = [ + '_template_ids_value', + '_template_ids_present', + ] + + _has_required_fields = True + + def __init__(self, + template_ids=None): + self._template_ids_value = None + self._template_ids_present = False + if template_ids is not None: + self.template_ids = template_ids + + @property + def template_ids(self): + """ + List of identifiers for templates added by See + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_user` + or + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_team`. + + :rtype: list of [str] + """ + if self._template_ids_present: + return self._template_ids_value + else: + raise AttributeError("missing required field 'template_ids'") + + @template_ids.setter + def template_ids(self, val): + val = self._template_ids_validator.validate(val) + self._template_ids_value = val + self._template_ids_present = True + + @template_ids.deleter + def template_ids(self): + self._template_ids_value = None + self._template_ids_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListTemplateResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListTemplateResult(template_ids={!r})'.format( + self._template_ids_value, + ) + +ListTemplateResult_validator = bv.Struct(ListTemplateResult) + +class LogicalOperator(bb.Union): + """ + Logical operator to join search queries together. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar or_operator: Append a query with an "or" operator. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + or_operator = None + # Attribute is overwritten below the class definition + other = None + + def is_or_operator(self): + """ + Check if the union tag is ``or_operator``. + + :rtype: bool + """ + return self._tag == 'or_operator' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(LogicalOperator, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LogicalOperator(%r, %r)' % (self._tag, self._value) + +LogicalOperator_validator = bv.Union(LogicalOperator) + +class LookUpPropertiesError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar property_group_not_found: No property group was found. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + property_group_not_found = None + # Attribute is overwritten below the class definition + other = None + + def is_property_group_not_found(self): + """ + Check if the union tag is ``property_group_not_found``. + + :rtype: bool + """ + return self._tag == 'property_group_not_found' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(LookUpPropertiesError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LookUpPropertiesError(%r, %r)' % (self._tag, self._value) + +LookUpPropertiesError_validator = bv.Union(LookUpPropertiesError) + +class LookupError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar not_found: There is nothing at the given path. + :ivar not_file: We were expecting a file, but the given path refers to + something that isn't a file. + :ivar not_folder: We were expecting a folder, but the given path refers to + something that isn't a folder. + :ivar restricted_content: The file cannot be transferred because the content + is restricted. For example, sometimes there are legal restrictions due + to copyright claims. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + not_found = None + # Attribute is overwritten below the class definition + not_file = None + # Attribute is overwritten below the class definition + not_folder = None + # Attribute is overwritten below the class definition + restricted_content = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def malformed_path(cls, val): + """ + Create an instance of this class set to the ``malformed_path`` tag with + value ``val``. + + :param str val: + :rtype: LookupError + """ + return cls('malformed_path', val) + + def is_malformed_path(self): + """ + Check if the union tag is ``malformed_path``. + + :rtype: bool + """ + return self._tag == 'malformed_path' + + def is_not_found(self): + """ + Check if the union tag is ``not_found``. + + :rtype: bool + """ + return self._tag == 'not_found' + + def is_not_file(self): + """ + Check if the union tag is ``not_file``. + + :rtype: bool + """ + return self._tag == 'not_file' + + def is_not_folder(self): + """ + Check if the union tag is ``not_folder``. + + :rtype: bool + """ + return self._tag == 'not_folder' + + def is_restricted_content(self): + """ + Check if the union tag is ``restricted_content``. + + :rtype: bool + """ + return self._tag == 'restricted_content' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_malformed_path(self): + """ + Only call this if :meth:`is_malformed_path` is true. + + :rtype: str + """ + if not self.is_malformed_path(): + raise AttributeError("tag 'malformed_path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(LookupError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LookupError(%r, %r)' % (self._tag, self._value) + +LookupError_validator = bv.Union(LookupError) + +class ModifyTemplateError(TemplateError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar conflicting_property_names: A property field key with that name + already exists in the template. + :ivar too_many_properties: There are too many properties in the changed + template. The maximum number of properties per template is 32. + :ivar too_many_templates: There are too many templates for the team. + :ivar template_attribute_too_large: The template name, description or one or + more of the property field keys is too large. + """ + + # Attribute is overwritten below the class definition + conflicting_property_names = None + # Attribute is overwritten below the class definition + too_many_properties = None + # Attribute is overwritten below the class definition + too_many_templates = None + # Attribute is overwritten below the class definition + template_attribute_too_large = None + + def is_conflicting_property_names(self): + """ + Check if the union tag is ``conflicting_property_names``. + + :rtype: bool + """ + return self._tag == 'conflicting_property_names' + + def is_too_many_properties(self): + """ + Check if the union tag is ``too_many_properties``. + + :rtype: bool + """ + return self._tag == 'too_many_properties' + + def is_too_many_templates(self): + """ + Check if the union tag is ``too_many_templates``. + + :rtype: bool + """ + return self._tag == 'too_many_templates' + + def is_template_attribute_too_large(self): + """ + Check if the union tag is ``template_attribute_too_large``. + + :rtype: bool + """ + return self._tag == 'template_attribute_too_large' + + def _process_custom_annotations(self, annotation_type, processor): + super(ModifyTemplateError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ModifyTemplateError(%r, %r)' % (self._tag, self._value) + +ModifyTemplateError_validator = bv.Union(ModifyTemplateError) + +class OverwritePropertyGroupArg(bb.Struct): + """ + :ivar path: A unique identifier for the file or folder. + :ivar property_groups: The property groups "snapshot" updates to force + apply. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_property_groups_value', + '_property_groups_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + property_groups=None): + self._path_value = None + self._path_present = False + self._property_groups_value = None + self._property_groups_present = False + if path is not None: + self.path = path + if property_groups is not None: + self.property_groups = property_groups + + @property + def path(self): + """ + A unique identifier for the file or folder. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def property_groups(self): + """ + The property groups "snapshot" updates to force apply. + + :rtype: list of [PropertyGroup] + """ + if self._property_groups_present: + return self._property_groups_value + else: + raise AttributeError("missing required field 'property_groups'") + + @property_groups.setter + def property_groups(self, val): + val = self._property_groups_validator.validate(val) + self._property_groups_value = val + self._property_groups_present = True + + @property_groups.deleter + def property_groups(self): + self._property_groups_value = None + self._property_groups_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(OverwritePropertyGroupArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'OverwritePropertyGroupArg(path={!r}, property_groups={!r})'.format( + self._path_value, + self._property_groups_value, + ) + +OverwritePropertyGroupArg_validator = bv.Struct(OverwritePropertyGroupArg) + +class PropertiesSearchArg(bb.Struct): + """ + :ivar queries: Queries to search. + :ivar template_filter: Filter results to contain only properties associated + with these template IDs. + """ + + __slots__ = [ + '_queries_value', + '_queries_present', + '_template_filter_value', + '_template_filter_present', + ] + + _has_required_fields = True + + def __init__(self, + queries=None, + template_filter=None): + self._queries_value = None + self._queries_present = False + self._template_filter_value = None + self._template_filter_present = False + if queries is not None: + self.queries = queries + if template_filter is not None: + self.template_filter = template_filter + + @property + def queries(self): + """ + Queries to search. + + :rtype: list of [PropertiesSearchQuery] + """ + if self._queries_present: + return self._queries_value + else: + raise AttributeError("missing required field 'queries'") + + @queries.setter + def queries(self, val): + val = self._queries_validator.validate(val) + self._queries_value = val + self._queries_present = True + + @queries.deleter + def queries(self): + self._queries_value = None + self._queries_present = False + + @property + def template_filter(self): + """ + Filter results to contain only properties associated with these template + IDs. + + :rtype: TemplateFilter + """ + if self._template_filter_present: + return self._template_filter_value + else: + return TemplateFilter.filter_none + + @template_filter.setter + def template_filter(self, val): + self._template_filter_validator.validate_type_only(val) + self._template_filter_value = val + self._template_filter_present = True + + @template_filter.deleter + def template_filter(self): + self._template_filter_value = None + self._template_filter_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PropertiesSearchArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PropertiesSearchArg(queries={!r}, template_filter={!r})'.format( + self._queries_value, + self._template_filter_value, + ) + +PropertiesSearchArg_validator = bv.Struct(PropertiesSearchArg) + +class PropertiesSearchContinueArg(bb.Struct): + """ + :ivar cursor: The cursor returned by your last call to + :meth:`dropbox.dropbox.Dropbox.file_properties_properties_search` or + :meth:`dropbox.dropbox.Dropbox.file_properties_properties_search_continue`. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + The cursor returned by your last call to + :meth:`dropbox.dropbox.Dropbox.file_properties_properties_search` or + :meth:`dropbox.dropbox.Dropbox.file_properties_properties_search_continue`. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PropertiesSearchContinueArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PropertiesSearchContinueArg(cursor={!r})'.format( + self._cursor_value, + ) + +PropertiesSearchContinueArg_validator = bv.Struct(PropertiesSearchContinueArg) + +class PropertiesSearchContinueError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar reset: Indicates that the cursor has been invalidated. Call + :meth:`dropbox.dropbox.Dropbox.file_properties_properties_search` to + obtain a new cursor. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + reset = None + # Attribute is overwritten below the class definition + other = None + + def is_reset(self): + """ + Check if the union tag is ``reset``. + + :rtype: bool + """ + return self._tag == 'reset' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(PropertiesSearchContinueError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PropertiesSearchContinueError(%r, %r)' % (self._tag, self._value) + +PropertiesSearchContinueError_validator = bv.Union(PropertiesSearchContinueError) + +class PropertiesSearchError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def property_group_lookup(cls, val): + """ + Create an instance of this class set to the ``property_group_lookup`` + tag with value ``val``. + + :param LookUpPropertiesError val: + :rtype: PropertiesSearchError + """ + return cls('property_group_lookup', val) + + def is_property_group_lookup(self): + """ + Check if the union tag is ``property_group_lookup``. + + :rtype: bool + """ + return self._tag == 'property_group_lookup' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_property_group_lookup(self): + """ + Only call this if :meth:`is_property_group_lookup` is true. + + :rtype: LookUpPropertiesError + """ + if not self.is_property_group_lookup(): + raise AttributeError("tag 'property_group_lookup' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(PropertiesSearchError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PropertiesSearchError(%r, %r)' % (self._tag, self._value) + +PropertiesSearchError_validator = bv.Union(PropertiesSearchError) + +class PropertiesSearchMatch(bb.Struct): + """ + :ivar id: The ID for the matched file or folder. + :ivar path: The path for the matched file or folder. + :ivar is_deleted: Whether the file or folder is deleted. + :ivar property_groups: List of custom property groups associated with the + file. + """ + + __slots__ = [ + '_id_value', + '_id_present', + '_path_value', + '_path_present', + '_is_deleted_value', + '_is_deleted_present', + '_property_groups_value', + '_property_groups_present', + ] + + _has_required_fields = True + + def __init__(self, + id=None, + path=None, + is_deleted=None, + property_groups=None): + self._id_value = None + self._id_present = False + self._path_value = None + self._path_present = False + self._is_deleted_value = None + self._is_deleted_present = False + self._property_groups_value = None + self._property_groups_present = False + if id is not None: + self.id = id + if path is not None: + self.path = path + if is_deleted is not None: + self.is_deleted = is_deleted + if property_groups is not None: + self.property_groups = property_groups + + @property + def id(self): + """ + The ID for the matched file or folder. + + :rtype: str + """ + if self._id_present: + return self._id_value + else: + raise AttributeError("missing required field 'id'") + + @id.setter + def id(self, val): + val = self._id_validator.validate(val) + self._id_value = val + self._id_present = True + + @id.deleter + def id(self): + self._id_value = None + self._id_present = False + + @property + def path(self): + """ + The path for the matched file or folder. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def is_deleted(self): + """ + Whether the file or folder is deleted. + + :rtype: bool + """ + if self._is_deleted_present: + return self._is_deleted_value + else: + raise AttributeError("missing required field 'is_deleted'") + + @is_deleted.setter + def is_deleted(self, val): + val = self._is_deleted_validator.validate(val) + self._is_deleted_value = val + self._is_deleted_present = True + + @is_deleted.deleter + def is_deleted(self): + self._is_deleted_value = None + self._is_deleted_present = False + + @property + def property_groups(self): + """ + List of custom property groups associated with the file. + + :rtype: list of [PropertyGroup] + """ + if self._property_groups_present: + return self._property_groups_value + else: + raise AttributeError("missing required field 'property_groups'") + + @property_groups.setter + def property_groups(self, val): + val = self._property_groups_validator.validate(val) + self._property_groups_value = val + self._property_groups_present = True + + @property_groups.deleter + def property_groups(self): + self._property_groups_value = None + self._property_groups_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PropertiesSearchMatch, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PropertiesSearchMatch(id={!r}, path={!r}, is_deleted={!r}, property_groups={!r})'.format( + self._id_value, + self._path_value, + self._is_deleted_value, + self._property_groups_value, + ) + +PropertiesSearchMatch_validator = bv.Struct(PropertiesSearchMatch) + +class PropertiesSearchMode(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar str field_name: Search for a value associated with this field name. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def field_name(cls, val): + """ + Create an instance of this class set to the ``field_name`` tag with + value ``val``. + + :param str val: + :rtype: PropertiesSearchMode + """ + return cls('field_name', val) + + def is_field_name(self): + """ + Check if the union tag is ``field_name``. + + :rtype: bool + """ + return self._tag == 'field_name' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_field_name(self): + """ + Search for a value associated with this field name. + + Only call this if :meth:`is_field_name` is true. + + :rtype: str + """ + if not self.is_field_name(): + raise AttributeError("tag 'field_name' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(PropertiesSearchMode, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PropertiesSearchMode(%r, %r)' % (self._tag, self._value) + +PropertiesSearchMode_validator = bv.Union(PropertiesSearchMode) + +class PropertiesSearchQuery(bb.Struct): + """ + :ivar query: The property field value for which to search across templates. + :ivar mode: The mode with which to perform the search. + :ivar logical_operator: The logical operator with which to append the query. + """ + + __slots__ = [ + '_query_value', + '_query_present', + '_mode_value', + '_mode_present', + '_logical_operator_value', + '_logical_operator_present', + ] + + _has_required_fields = True + + def __init__(self, + query=None, + mode=None, + logical_operator=None): + self._query_value = None + self._query_present = False + self._mode_value = None + self._mode_present = False + self._logical_operator_value = None + self._logical_operator_present = False + if query is not None: + self.query = query + if mode is not None: + self.mode = mode + if logical_operator is not None: + self.logical_operator = logical_operator + + @property + def query(self): + """ + The property field value for which to search across templates. + + :rtype: str + """ + if self._query_present: + return self._query_value + else: + raise AttributeError("missing required field 'query'") + + @query.setter + def query(self, val): + val = self._query_validator.validate(val) + self._query_value = val + self._query_present = True + + @query.deleter + def query(self): + self._query_value = None + self._query_present = False + + @property + def mode(self): + """ + The mode with which to perform the search. + + :rtype: PropertiesSearchMode + """ + if self._mode_present: + return self._mode_value + else: + raise AttributeError("missing required field 'mode'") + + @mode.setter + def mode(self, val): + self._mode_validator.validate_type_only(val) + self._mode_value = val + self._mode_present = True + + @mode.deleter + def mode(self): + self._mode_value = None + self._mode_present = False + + @property + def logical_operator(self): + """ + The logical operator with which to append the query. + + :rtype: LogicalOperator + """ + if self._logical_operator_present: + return self._logical_operator_value + else: + return LogicalOperator.or_operator + + @logical_operator.setter + def logical_operator(self, val): + self._logical_operator_validator.validate_type_only(val) + self._logical_operator_value = val + self._logical_operator_present = True + + @logical_operator.deleter + def logical_operator(self): + self._logical_operator_value = None + self._logical_operator_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PropertiesSearchQuery, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PropertiesSearchQuery(query={!r}, mode={!r}, logical_operator={!r})'.format( + self._query_value, + self._mode_value, + self._logical_operator_value, + ) + +PropertiesSearchQuery_validator = bv.Struct(PropertiesSearchQuery) + +class PropertiesSearchResult(bb.Struct): + """ + :ivar matches: A list (possibly empty) of matches for the query. + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.file_properties_properties_search_continue` + to continue to receive search results. Cursor will be null when there + are no more results. + """ + + __slots__ = [ + '_matches_value', + '_matches_present', + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + matches=None, + cursor=None): + self._matches_value = None + self._matches_present = False + self._cursor_value = None + self._cursor_present = False + if matches is not None: + self.matches = matches + if cursor is not None: + self.cursor = cursor + + @property + def matches(self): + """ + A list (possibly empty) of matches for the query. + + :rtype: list of [PropertiesSearchMatch] + """ + if self._matches_present: + return self._matches_value + else: + raise AttributeError("missing required field 'matches'") + + @matches.setter + def matches(self, val): + val = self._matches_validator.validate(val) + self._matches_value = val + self._matches_present = True + + @matches.deleter + def matches(self): + self._matches_value = None + self._matches_present = False + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.file_properties_properties_search_continue` + to continue to receive search results. Cursor will be null when there + are no more results. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PropertiesSearchResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PropertiesSearchResult(matches={!r}, cursor={!r})'.format( + self._matches_value, + self._cursor_value, + ) + +PropertiesSearchResult_validator = bv.Struct(PropertiesSearchResult) + +class PropertyField(bb.Struct): + """ + Raw key/value data to be associated with a Dropbox file. Property fields are + added to Dropbox files as a :class:`PropertyGroup`. + + :ivar name: Key of the property field associated with a file and template. + Keys can be up to 256 bytes. + :ivar value: Value of the property field associated with a file and + template. Values can be up to 1024 bytes. + """ + + __slots__ = [ + '_name_value', + '_name_present', + '_value_value', + '_value_present', + ] + + _has_required_fields = True + + def __init__(self, + name=None, + value=None): + self._name_value = None + self._name_present = False + self._value_value = None + self._value_present = False + if name is not None: + self.name = name + if value is not None: + self.value = value + + @property + def name(self): + """ + Key of the property field associated with a file and template. Keys can + be up to 256 bytes. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def value(self): + """ + Value of the property field associated with a file and template. Values + can be up to 1024 bytes. + + :rtype: str + """ + if self._value_present: + return self._value_value + else: + raise AttributeError("missing required field 'value'") + + @value.setter + def value(self, val): + val = self._value_validator.validate(val) + self._value_value = val + self._value_present = True + + @value.deleter + def value(self): + self._value_value = None + self._value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PropertyField, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PropertyField(name={!r}, value={!r})'.format( + self._name_value, + self._value_value, + ) + +PropertyField_validator = bv.Struct(PropertyField) + +class PropertyFieldTemplate(bb.Struct): + """ + Defines how a single property field may be structured. Used exclusively by + :class:`PropertyGroupTemplate`. + + :ivar name: Key of the property field being described. Property field keys + can be up to 256 bytes. + :ivar description: Description of the property field. Property field + descriptions can be up to 1024 bytes. + :ivar type: Data type of the value of this property field. This type will be + enforced upon property creation and modifications. + """ + + __slots__ = [ + '_name_value', + '_name_present', + '_description_value', + '_description_present', + '_type_value', + '_type_present', + ] + + _has_required_fields = True + + def __init__(self, + name=None, + description=None, + type=None): + self._name_value = None + self._name_present = False + self._description_value = None + self._description_present = False + self._type_value = None + self._type_present = False + if name is not None: + self.name = name + if description is not None: + self.description = description + if type is not None: + self.type = type + + @property + def name(self): + """ + Key of the property field being described. Property field keys can be up + to 256 bytes. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def description(self): + """ + Description of the property field. Property field descriptions can be up + to 1024 bytes. + + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + @property + def type(self): + """ + Data type of the value of this property field. This type will be + enforced upon property creation and modifications. + + :rtype: PropertyType + """ + if self._type_present: + return self._type_value + else: + raise AttributeError("missing required field 'type'") + + @type.setter + def type(self, val): + self._type_validator.validate_type_only(val) + self._type_value = val + self._type_present = True + + @type.deleter + def type(self): + self._type_value = None + self._type_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PropertyFieldTemplate, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PropertyFieldTemplate(name={!r}, description={!r}, type={!r})'.format( + self._name_value, + self._description_value, + self._type_value, + ) + +PropertyFieldTemplate_validator = bv.Struct(PropertyFieldTemplate) + +class PropertyGroup(bb.Struct): + """ + A subset of the property fields described by the corresponding + :class:`PropertyGroupTemplate`. Properties are always added to a Dropbox + file as a :class:`PropertyGroup`. The possible key names and value types in + this group are defined by the corresponding :class:`PropertyGroupTemplate`. + + :ivar template_id: A unique identifier for the associated template. + :ivar fields: The actual properties associated with the template. There can + be up to 32 property types per template. + """ + + __slots__ = [ + '_template_id_value', + '_template_id_present', + '_fields_value', + '_fields_present', + ] + + _has_required_fields = True + + def __init__(self, + template_id=None, + fields=None): + self._template_id_value = None + self._template_id_present = False + self._fields_value = None + self._fields_present = False + if template_id is not None: + self.template_id = template_id + if fields is not None: + self.fields = fields + + @property + def template_id(self): + """ + A unique identifier for the associated template. + + :rtype: str + """ + if self._template_id_present: + return self._template_id_value + else: + raise AttributeError("missing required field 'template_id'") + + @template_id.setter + def template_id(self, val): + val = self._template_id_validator.validate(val) + self._template_id_value = val + self._template_id_present = True + + @template_id.deleter + def template_id(self): + self._template_id_value = None + self._template_id_present = False + + @property + def fields(self): + """ + The actual properties associated with the template. There can be up to + 32 property types per template. + + :rtype: list of [PropertyField] + """ + if self._fields_present: + return self._fields_value + else: + raise AttributeError("missing required field 'fields'") + + @fields.setter + def fields(self, val): + val = self._fields_validator.validate(val) + self._fields_value = val + self._fields_present = True + + @fields.deleter + def fields(self): + self._fields_value = None + self._fields_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PropertyGroup, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PropertyGroup(template_id={!r}, fields={!r})'.format( + self._template_id_value, + self._fields_value, + ) + +PropertyGroup_validator = bv.Struct(PropertyGroup) + +class PropertyGroupUpdate(bb.Struct): + """ + :ivar template_id: A unique identifier for a property template. + :ivar add_or_update_fields: Property fields to update. If the property field + already exists, it is updated. If the property field doesn't exist, the + property group is added. + :ivar remove_fields: Property fields to remove (by name), provided they + exist. + """ + + __slots__ = [ + '_template_id_value', + '_template_id_present', + '_add_or_update_fields_value', + '_add_or_update_fields_present', + '_remove_fields_value', + '_remove_fields_present', + ] + + _has_required_fields = True + + def __init__(self, + template_id=None, + add_or_update_fields=None, + remove_fields=None): + self._template_id_value = None + self._template_id_present = False + self._add_or_update_fields_value = None + self._add_or_update_fields_present = False + self._remove_fields_value = None + self._remove_fields_present = False + if template_id is not None: + self.template_id = template_id + if add_or_update_fields is not None: + self.add_or_update_fields = add_or_update_fields + if remove_fields is not None: + self.remove_fields = remove_fields + + @property + def template_id(self): + """ + A unique identifier for a property template. + + :rtype: str + """ + if self._template_id_present: + return self._template_id_value + else: + raise AttributeError("missing required field 'template_id'") + + @template_id.setter + def template_id(self, val): + val = self._template_id_validator.validate(val) + self._template_id_value = val + self._template_id_present = True + + @template_id.deleter + def template_id(self): + self._template_id_value = None + self._template_id_present = False + + @property + def add_or_update_fields(self): + """ + Property fields to update. If the property field already exists, it is + updated. If the property field doesn't exist, the property group is + added. + + :rtype: list of [PropertyField] + """ + if self._add_or_update_fields_present: + return self._add_or_update_fields_value + else: + return None + + @add_or_update_fields.setter + def add_or_update_fields(self, val): + if val is None: + del self.add_or_update_fields + return + val = self._add_or_update_fields_validator.validate(val) + self._add_or_update_fields_value = val + self._add_or_update_fields_present = True + + @add_or_update_fields.deleter + def add_or_update_fields(self): + self._add_or_update_fields_value = None + self._add_or_update_fields_present = False + + @property + def remove_fields(self): + """ + Property fields to remove (by name), provided they exist. + + :rtype: list of [str] + """ + if self._remove_fields_present: + return self._remove_fields_value + else: + return None + + @remove_fields.setter + def remove_fields(self, val): + if val is None: + del self.remove_fields + return + val = self._remove_fields_validator.validate(val) + self._remove_fields_value = val + self._remove_fields_present = True + + @remove_fields.deleter + def remove_fields(self): + self._remove_fields_value = None + self._remove_fields_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PropertyGroupUpdate, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PropertyGroupUpdate(template_id={!r}, add_or_update_fields={!r}, remove_fields={!r})'.format( + self._template_id_value, + self._add_or_update_fields_value, + self._remove_fields_value, + ) + +PropertyGroupUpdate_validator = bv.Struct(PropertyGroupUpdate) + +class PropertyType(bb.Union): + """ + Data type of the given property field added. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar string: The associated property field will be of type string. Unicode + is supported. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + string = None + # Attribute is overwritten below the class definition + other = None + + def is_string(self): + """ + Check if the union tag is ``string``. + + :rtype: bool + """ + return self._tag == 'string' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(PropertyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PropertyType(%r, %r)' % (self._tag, self._value) + +PropertyType_validator = bv.Union(PropertyType) + +class RemovePropertiesArg(bb.Struct): + """ + :ivar path: A unique identifier for the file or folder. + :ivar property_template_ids: A list of identifiers for a template created by + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_user` + or + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_team`. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_property_template_ids_value', + '_property_template_ids_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + property_template_ids=None): + self._path_value = None + self._path_present = False + self._property_template_ids_value = None + self._property_template_ids_present = False + if path is not None: + self.path = path + if property_template_ids is not None: + self.property_template_ids = property_template_ids + + @property + def path(self): + """ + A unique identifier for the file or folder. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def property_template_ids(self): + """ + A list of identifiers for a template created by + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_user` + or + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_team`. + + :rtype: list of [str] + """ + if self._property_template_ids_present: + return self._property_template_ids_value + else: + raise AttributeError("missing required field 'property_template_ids'") + + @property_template_ids.setter + def property_template_ids(self, val): + val = self._property_template_ids_validator.validate(val) + self._property_template_ids_value = val + self._property_template_ids_present = True + + @property_template_ids.deleter + def property_template_ids(self): + self._property_template_ids_value = None + self._property_template_ids_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RemovePropertiesArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RemovePropertiesArg(path={!r}, property_template_ids={!r})'.format( + self._path_value, + self._property_template_ids_value, + ) + +RemovePropertiesArg_validator = bv.Struct(RemovePropertiesArg) + +class RemovePropertiesError(PropertiesError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + @classmethod + def property_group_lookup(cls, val): + """ + Create an instance of this class set to the ``property_group_lookup`` + tag with value ``val``. + + :param LookUpPropertiesError val: + :rtype: RemovePropertiesError + """ + return cls('property_group_lookup', val) + + def is_property_group_lookup(self): + """ + Check if the union tag is ``property_group_lookup``. + + :rtype: bool + """ + return self._tag == 'property_group_lookup' + + def get_property_group_lookup(self): + """ + Only call this if :meth:`is_property_group_lookup` is true. + + :rtype: LookUpPropertiesError + """ + if not self.is_property_group_lookup(): + raise AttributeError("tag 'property_group_lookup' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(RemovePropertiesError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RemovePropertiesError(%r, %r)' % (self._tag, self._value) + +RemovePropertiesError_validator = bv.Union(RemovePropertiesError) + +class RemoveTemplateArg(bb.Struct): + """ + :ivar template_id: An identifier for a template created by + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_user` + or + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_team`. + """ + + __slots__ = [ + '_template_id_value', + '_template_id_present', + ] + + _has_required_fields = True + + def __init__(self, + template_id=None): + self._template_id_value = None + self._template_id_present = False + if template_id is not None: + self.template_id = template_id + + @property + def template_id(self): + """ + An identifier for a template created by + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_user` + or + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_team`. + + :rtype: str + """ + if self._template_id_present: + return self._template_id_value + else: + raise AttributeError("missing required field 'template_id'") + + @template_id.setter + def template_id(self, val): + val = self._template_id_validator.validate(val) + self._template_id_value = val + self._template_id_present = True + + @template_id.deleter + def template_id(self): + self._template_id_value = None + self._template_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RemoveTemplateArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RemoveTemplateArg(template_id={!r})'.format( + self._template_id_value, + ) + +RemoveTemplateArg_validator = bv.Struct(RemoveTemplateArg) + +class TemplateFilterBase(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar list of [str] filter_some: Only templates with an ID in the supplied + list will be returned (a subset of templates will be returned). + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def filter_some(cls, val): + """ + Create an instance of this class set to the ``filter_some`` tag with + value ``val``. + + :param list of [str] val: + :rtype: TemplateFilterBase + """ + return cls('filter_some', val) + + def is_filter_some(self): + """ + Check if the union tag is ``filter_some``. + + :rtype: bool + """ + return self._tag == 'filter_some' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_filter_some(self): + """ + Only templates with an ID in the supplied list will be returned (a + subset of templates will be returned). + + Only call this if :meth:`is_filter_some` is true. + + :rtype: list of [str] + """ + if not self.is_filter_some(): + raise AttributeError("tag 'filter_some' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(TemplateFilterBase, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TemplateFilterBase(%r, %r)' % (self._tag, self._value) + +TemplateFilterBase_validator = bv.Union(TemplateFilterBase) + +class TemplateFilter(TemplateFilterBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar filter_none: No templates will be filtered from the result (all + templates will be returned). + """ + + # Attribute is overwritten below the class definition + filter_none = None + + def is_filter_none(self): + """ + Check if the union tag is ``filter_none``. + + :rtype: bool + """ + return self._tag == 'filter_none' + + def _process_custom_annotations(self, annotation_type, processor): + super(TemplateFilter, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TemplateFilter(%r, %r)' % (self._tag, self._value) + +TemplateFilter_validator = bv.Union(TemplateFilter) + +class TemplateOwnerType(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar user: Template will be associated with a user. + :ivar team: Template will be associated with a team. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + user = None + # Attribute is overwritten below the class definition + team = None + # Attribute is overwritten below the class definition + other = None + + def is_user(self): + """ + Check if the union tag is ``user``. + + :rtype: bool + """ + return self._tag == 'user' + + def is_team(self): + """ + Check if the union tag is ``team``. + + :rtype: bool + """ + return self._tag == 'team' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(TemplateOwnerType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TemplateOwnerType(%r, %r)' % (self._tag, self._value) + +TemplateOwnerType_validator = bv.Union(TemplateOwnerType) + +class UpdatePropertiesArg(bb.Struct): + """ + :ivar path: A unique identifier for the file or folder. + :ivar update_property_groups: The property groups "delta" updates to apply. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_update_property_groups_value', + '_update_property_groups_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + update_property_groups=None): + self._path_value = None + self._path_present = False + self._update_property_groups_value = None + self._update_property_groups_present = False + if path is not None: + self.path = path + if update_property_groups is not None: + self.update_property_groups = update_property_groups + + @property + def path(self): + """ + A unique identifier for the file or folder. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def update_property_groups(self): + """ + The property groups "delta" updates to apply. + + :rtype: list of [PropertyGroupUpdate] + """ + if self._update_property_groups_present: + return self._update_property_groups_value + else: + raise AttributeError("missing required field 'update_property_groups'") + + @update_property_groups.setter + def update_property_groups(self, val): + val = self._update_property_groups_validator.validate(val) + self._update_property_groups_value = val + self._update_property_groups_present = True + + @update_property_groups.deleter + def update_property_groups(self): + self._update_property_groups_value = None + self._update_property_groups_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UpdatePropertiesArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UpdatePropertiesArg(path={!r}, update_property_groups={!r})'.format( + self._path_value, + self._update_property_groups_value, + ) + +UpdatePropertiesArg_validator = bv.Struct(UpdatePropertiesArg) + +class UpdatePropertiesError(InvalidPropertyGroupError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + @classmethod + def property_group_lookup(cls, val): + """ + Create an instance of this class set to the ``property_group_lookup`` + tag with value ``val``. + + :param LookUpPropertiesError val: + :rtype: UpdatePropertiesError + """ + return cls('property_group_lookup', val) + + def is_property_group_lookup(self): + """ + Check if the union tag is ``property_group_lookup``. + + :rtype: bool + """ + return self._tag == 'property_group_lookup' + + def get_property_group_lookup(self): + """ + Only call this if :meth:`is_property_group_lookup` is true. + + :rtype: LookUpPropertiesError + """ + if not self.is_property_group_lookup(): + raise AttributeError("tag 'property_group_lookup' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(UpdatePropertiesError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UpdatePropertiesError(%r, %r)' % (self._tag, self._value) + +UpdatePropertiesError_validator = bv.Union(UpdatePropertiesError) + +class UpdateTemplateArg(bb.Struct): + """ + :ivar template_id: An identifier for template added by See + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_user` + or + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_team`. + :ivar name: A display name for the template. template names can be up to 256 + bytes. + :ivar description: Description for the new template. Template descriptions + can be up to 1024 bytes. + :ivar add_fields: Property field templates to be added to the group + template. There can be up to 32 properties in a single template. + """ + + __slots__ = [ + '_template_id_value', + '_template_id_present', + '_name_value', + '_name_present', + '_description_value', + '_description_present', + '_add_fields_value', + '_add_fields_present', + ] + + _has_required_fields = True + + def __init__(self, + template_id=None, + name=None, + description=None, + add_fields=None): + self._template_id_value = None + self._template_id_present = False + self._name_value = None + self._name_present = False + self._description_value = None + self._description_present = False + self._add_fields_value = None + self._add_fields_present = False + if template_id is not None: + self.template_id = template_id + if name is not None: + self.name = name + if description is not None: + self.description = description + if add_fields is not None: + self.add_fields = add_fields + + @property + def template_id(self): + """ + An identifier for template added by See + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_user` + or + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_team`. + + :rtype: str + """ + if self._template_id_present: + return self._template_id_value + else: + raise AttributeError("missing required field 'template_id'") + + @template_id.setter + def template_id(self, val): + val = self._template_id_validator.validate(val) + self._template_id_value = val + self._template_id_present = True + + @template_id.deleter + def template_id(self): + self._template_id_value = None + self._template_id_present = False + + @property + def name(self): + """ + A display name for the template. template names can be up to 256 bytes. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + return None + + @name.setter + def name(self, val): + if val is None: + del self.name + return + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def description(self): + """ + Description for the new template. Template descriptions can be up to + 1024 bytes. + + :rtype: str + """ + if self._description_present: + return self._description_value + else: + return None + + @description.setter + def description(self, val): + if val is None: + del self.description + return + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + @property + def add_fields(self): + """ + Property field templates to be added to the group template. There can be + up to 32 properties in a single template. + + :rtype: list of [PropertyFieldTemplate] + """ + if self._add_fields_present: + return self._add_fields_value + else: + return None + + @add_fields.setter + def add_fields(self, val): + if val is None: + del self.add_fields + return + val = self._add_fields_validator.validate(val) + self._add_fields_value = val + self._add_fields_present = True + + @add_fields.deleter + def add_fields(self): + self._add_fields_value = None + self._add_fields_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UpdateTemplateArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UpdateTemplateArg(template_id={!r}, name={!r}, description={!r}, add_fields={!r})'.format( + self._template_id_value, + self._name_value, + self._description_value, + self._add_fields_value, + ) + +UpdateTemplateArg_validator = bv.Struct(UpdateTemplateArg) + +class UpdateTemplateResult(bb.Struct): + """ + :ivar template_id: An identifier for template added by route See + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_user` + or + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_team`. + """ + + __slots__ = [ + '_template_id_value', + '_template_id_present', + ] + + _has_required_fields = True + + def __init__(self, + template_id=None): + self._template_id_value = None + self._template_id_present = False + if template_id is not None: + self.template_id = template_id + + @property + def template_id(self): + """ + An identifier for template added by route See + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_user` + or + :meth:`dropbox.dropbox.Dropbox.file_properties_templates_add_for_team`. + + :rtype: str + """ + if self._template_id_present: + return self._template_id_value + else: + raise AttributeError("missing required field 'template_id'") + + @template_id.setter + def template_id(self, val): + val = self._template_id_validator.validate(val) + self._template_id_value = val + self._template_id_present = True + + @template_id.deleter + def template_id(self): + self._template_id_value = None + self._template_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UpdateTemplateResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UpdateTemplateResult(template_id={!r})'.format( + self._template_id_value, + ) + +UpdateTemplateResult_validator = bv.Struct(UpdateTemplateResult) + +Id_validator = bv.String(min_length=1) +PathOrId_validator = bv.String(pattern=u'/(.|[\\r\\n])*|id:.*|(ns:[0-9]+(/.*)?)') +PropertiesSearchCursor_validator = bv.String(min_length=1) +TemplateId_validator = bv.String(min_length=1, pattern=u'(/|ptid:).*') +AddPropertiesArg._path_validator = PathOrId_validator +AddPropertiesArg._property_groups_validator = bv.List(PropertyGroup_validator) +AddPropertiesArg._all_field_names_ = set([ + 'path', + 'property_groups', +]) +AddPropertiesArg._all_fields_ = [ + ('path', AddPropertiesArg._path_validator), + ('property_groups', AddPropertiesArg._property_groups_validator), +] + +TemplateError._template_not_found_validator = TemplateId_validator +TemplateError._restricted_content_validator = bv.Void() +TemplateError._other_validator = bv.Void() +TemplateError._tagmap = { + 'template_not_found': TemplateError._template_not_found_validator, + 'restricted_content': TemplateError._restricted_content_validator, + 'other': TemplateError._other_validator, +} + +TemplateError.restricted_content = TemplateError('restricted_content') +TemplateError.other = TemplateError('other') + +PropertiesError._path_validator = LookupError_validator +PropertiesError._unsupported_folder_validator = bv.Void() +PropertiesError._tagmap = { + 'path': PropertiesError._path_validator, + 'unsupported_folder': PropertiesError._unsupported_folder_validator, +} +PropertiesError._tagmap.update(TemplateError._tagmap) + +PropertiesError.unsupported_folder = PropertiesError('unsupported_folder') + +InvalidPropertyGroupError._property_field_too_large_validator = bv.Void() +InvalidPropertyGroupError._does_not_fit_template_validator = bv.Void() +InvalidPropertyGroupError._tagmap = { + 'property_field_too_large': InvalidPropertyGroupError._property_field_too_large_validator, + 'does_not_fit_template': InvalidPropertyGroupError._does_not_fit_template_validator, +} +InvalidPropertyGroupError._tagmap.update(PropertiesError._tagmap) + +InvalidPropertyGroupError.property_field_too_large = InvalidPropertyGroupError('property_field_too_large') +InvalidPropertyGroupError.does_not_fit_template = InvalidPropertyGroupError('does_not_fit_template') + +AddPropertiesError._property_group_already_exists_validator = bv.Void() +AddPropertiesError._tagmap = { + 'property_group_already_exists': AddPropertiesError._property_group_already_exists_validator, +} +AddPropertiesError._tagmap.update(InvalidPropertyGroupError._tagmap) + +AddPropertiesError.property_group_already_exists = AddPropertiesError('property_group_already_exists') + +PropertyGroupTemplate._name_validator = bv.String() +PropertyGroupTemplate._description_validator = bv.String() +PropertyGroupTemplate._fields_validator = bv.List(PropertyFieldTemplate_validator) +PropertyGroupTemplate._all_field_names_ = set([ + 'name', + 'description', + 'fields', +]) +PropertyGroupTemplate._all_fields_ = [ + ('name', PropertyGroupTemplate._name_validator), + ('description', PropertyGroupTemplate._description_validator), + ('fields', PropertyGroupTemplate._fields_validator), +] + +AddTemplateArg._all_field_names_ = PropertyGroupTemplate._all_field_names_.union(set([])) +AddTemplateArg._all_fields_ = PropertyGroupTemplate._all_fields_ + [] + +AddTemplateResult._template_id_validator = TemplateId_validator +AddTemplateResult._all_field_names_ = set(['template_id']) +AddTemplateResult._all_fields_ = [('template_id', AddTemplateResult._template_id_validator)] + +GetTemplateArg._template_id_validator = TemplateId_validator +GetTemplateArg._all_field_names_ = set(['template_id']) +GetTemplateArg._all_fields_ = [('template_id', GetTemplateArg._template_id_validator)] + +GetTemplateResult._all_field_names_ = PropertyGroupTemplate._all_field_names_.union(set([])) +GetTemplateResult._all_fields_ = PropertyGroupTemplate._all_fields_ + [] + +ListTemplateResult._template_ids_validator = bv.List(TemplateId_validator) +ListTemplateResult._all_field_names_ = set(['template_ids']) +ListTemplateResult._all_fields_ = [('template_ids', ListTemplateResult._template_ids_validator)] + +LogicalOperator._or_operator_validator = bv.Void() +LogicalOperator._other_validator = bv.Void() +LogicalOperator._tagmap = { + 'or_operator': LogicalOperator._or_operator_validator, + 'other': LogicalOperator._other_validator, +} + +LogicalOperator.or_operator = LogicalOperator('or_operator') +LogicalOperator.other = LogicalOperator('other') + +LookUpPropertiesError._property_group_not_found_validator = bv.Void() +LookUpPropertiesError._other_validator = bv.Void() +LookUpPropertiesError._tagmap = { + 'property_group_not_found': LookUpPropertiesError._property_group_not_found_validator, + 'other': LookUpPropertiesError._other_validator, +} + +LookUpPropertiesError.property_group_not_found = LookUpPropertiesError('property_group_not_found') +LookUpPropertiesError.other = LookUpPropertiesError('other') + +LookupError._malformed_path_validator = bv.String() +LookupError._not_found_validator = bv.Void() +LookupError._not_file_validator = bv.Void() +LookupError._not_folder_validator = bv.Void() +LookupError._restricted_content_validator = bv.Void() +LookupError._other_validator = bv.Void() +LookupError._tagmap = { + 'malformed_path': LookupError._malformed_path_validator, + 'not_found': LookupError._not_found_validator, + 'not_file': LookupError._not_file_validator, + 'not_folder': LookupError._not_folder_validator, + 'restricted_content': LookupError._restricted_content_validator, + 'other': LookupError._other_validator, +} + +LookupError.not_found = LookupError('not_found') +LookupError.not_file = LookupError('not_file') +LookupError.not_folder = LookupError('not_folder') +LookupError.restricted_content = LookupError('restricted_content') +LookupError.other = LookupError('other') + +ModifyTemplateError._conflicting_property_names_validator = bv.Void() +ModifyTemplateError._too_many_properties_validator = bv.Void() +ModifyTemplateError._too_many_templates_validator = bv.Void() +ModifyTemplateError._template_attribute_too_large_validator = bv.Void() +ModifyTemplateError._tagmap = { + 'conflicting_property_names': ModifyTemplateError._conflicting_property_names_validator, + 'too_many_properties': ModifyTemplateError._too_many_properties_validator, + 'too_many_templates': ModifyTemplateError._too_many_templates_validator, + 'template_attribute_too_large': ModifyTemplateError._template_attribute_too_large_validator, +} +ModifyTemplateError._tagmap.update(TemplateError._tagmap) + +ModifyTemplateError.conflicting_property_names = ModifyTemplateError('conflicting_property_names') +ModifyTemplateError.too_many_properties = ModifyTemplateError('too_many_properties') +ModifyTemplateError.too_many_templates = ModifyTemplateError('too_many_templates') +ModifyTemplateError.template_attribute_too_large = ModifyTemplateError('template_attribute_too_large') + +OverwritePropertyGroupArg._path_validator = PathOrId_validator +OverwritePropertyGroupArg._property_groups_validator = bv.List(PropertyGroup_validator, min_items=1) +OverwritePropertyGroupArg._all_field_names_ = set([ + 'path', + 'property_groups', +]) +OverwritePropertyGroupArg._all_fields_ = [ + ('path', OverwritePropertyGroupArg._path_validator), + ('property_groups', OverwritePropertyGroupArg._property_groups_validator), +] + +PropertiesSearchArg._queries_validator = bv.List(PropertiesSearchQuery_validator, min_items=1) +PropertiesSearchArg._template_filter_validator = TemplateFilter_validator +PropertiesSearchArg._all_field_names_ = set([ + 'queries', + 'template_filter', +]) +PropertiesSearchArg._all_fields_ = [ + ('queries', PropertiesSearchArg._queries_validator), + ('template_filter', PropertiesSearchArg._template_filter_validator), +] + +PropertiesSearchContinueArg._cursor_validator = PropertiesSearchCursor_validator +PropertiesSearchContinueArg._all_field_names_ = set(['cursor']) +PropertiesSearchContinueArg._all_fields_ = [('cursor', PropertiesSearchContinueArg._cursor_validator)] + +PropertiesSearchContinueError._reset_validator = bv.Void() +PropertiesSearchContinueError._other_validator = bv.Void() +PropertiesSearchContinueError._tagmap = { + 'reset': PropertiesSearchContinueError._reset_validator, + 'other': PropertiesSearchContinueError._other_validator, +} + +PropertiesSearchContinueError.reset = PropertiesSearchContinueError('reset') +PropertiesSearchContinueError.other = PropertiesSearchContinueError('other') + +PropertiesSearchError._property_group_lookup_validator = LookUpPropertiesError_validator +PropertiesSearchError._other_validator = bv.Void() +PropertiesSearchError._tagmap = { + 'property_group_lookup': PropertiesSearchError._property_group_lookup_validator, + 'other': PropertiesSearchError._other_validator, +} + +PropertiesSearchError.other = PropertiesSearchError('other') + +PropertiesSearchMatch._id_validator = Id_validator +PropertiesSearchMatch._path_validator = bv.String() +PropertiesSearchMatch._is_deleted_validator = bv.Boolean() +PropertiesSearchMatch._property_groups_validator = bv.List(PropertyGroup_validator) +PropertiesSearchMatch._all_field_names_ = set([ + 'id', + 'path', + 'is_deleted', + 'property_groups', +]) +PropertiesSearchMatch._all_fields_ = [ + ('id', PropertiesSearchMatch._id_validator), + ('path', PropertiesSearchMatch._path_validator), + ('is_deleted', PropertiesSearchMatch._is_deleted_validator), + ('property_groups', PropertiesSearchMatch._property_groups_validator), +] + +PropertiesSearchMode._field_name_validator = bv.String() +PropertiesSearchMode._other_validator = bv.Void() +PropertiesSearchMode._tagmap = { + 'field_name': PropertiesSearchMode._field_name_validator, + 'other': PropertiesSearchMode._other_validator, +} + +PropertiesSearchMode.other = PropertiesSearchMode('other') + +PropertiesSearchQuery._query_validator = bv.String() +PropertiesSearchQuery._mode_validator = PropertiesSearchMode_validator +PropertiesSearchQuery._logical_operator_validator = LogicalOperator_validator +PropertiesSearchQuery._all_field_names_ = set([ + 'query', + 'mode', + 'logical_operator', +]) +PropertiesSearchQuery._all_fields_ = [ + ('query', PropertiesSearchQuery._query_validator), + ('mode', PropertiesSearchQuery._mode_validator), + ('logical_operator', PropertiesSearchQuery._logical_operator_validator), +] + +PropertiesSearchResult._matches_validator = bv.List(PropertiesSearchMatch_validator) +PropertiesSearchResult._cursor_validator = bv.Nullable(PropertiesSearchCursor_validator) +PropertiesSearchResult._all_field_names_ = set([ + 'matches', + 'cursor', +]) +PropertiesSearchResult._all_fields_ = [ + ('matches', PropertiesSearchResult._matches_validator), + ('cursor', PropertiesSearchResult._cursor_validator), +] + +PropertyField._name_validator = bv.String() +PropertyField._value_validator = bv.String() +PropertyField._all_field_names_ = set([ + 'name', + 'value', +]) +PropertyField._all_fields_ = [ + ('name', PropertyField._name_validator), + ('value', PropertyField._value_validator), +] + +PropertyFieldTemplate._name_validator = bv.String() +PropertyFieldTemplate._description_validator = bv.String() +PropertyFieldTemplate._type_validator = PropertyType_validator +PropertyFieldTemplate._all_field_names_ = set([ + 'name', + 'description', + 'type', +]) +PropertyFieldTemplate._all_fields_ = [ + ('name', PropertyFieldTemplate._name_validator), + ('description', PropertyFieldTemplate._description_validator), + ('type', PropertyFieldTemplate._type_validator), +] + +PropertyGroup._template_id_validator = TemplateId_validator +PropertyGroup._fields_validator = bv.List(PropertyField_validator) +PropertyGroup._all_field_names_ = set([ + 'template_id', + 'fields', +]) +PropertyGroup._all_fields_ = [ + ('template_id', PropertyGroup._template_id_validator), + ('fields', PropertyGroup._fields_validator), +] + +PropertyGroupUpdate._template_id_validator = TemplateId_validator +PropertyGroupUpdate._add_or_update_fields_validator = bv.Nullable(bv.List(PropertyField_validator)) +PropertyGroupUpdate._remove_fields_validator = bv.Nullable(bv.List(bv.String())) +PropertyGroupUpdate._all_field_names_ = set([ + 'template_id', + 'add_or_update_fields', + 'remove_fields', +]) +PropertyGroupUpdate._all_fields_ = [ + ('template_id', PropertyGroupUpdate._template_id_validator), + ('add_or_update_fields', PropertyGroupUpdate._add_or_update_fields_validator), + ('remove_fields', PropertyGroupUpdate._remove_fields_validator), +] + +PropertyType._string_validator = bv.Void() +PropertyType._other_validator = bv.Void() +PropertyType._tagmap = { + 'string': PropertyType._string_validator, + 'other': PropertyType._other_validator, +} + +PropertyType.string = PropertyType('string') +PropertyType.other = PropertyType('other') + +RemovePropertiesArg._path_validator = PathOrId_validator +RemovePropertiesArg._property_template_ids_validator = bv.List(TemplateId_validator) +RemovePropertiesArg._all_field_names_ = set([ + 'path', + 'property_template_ids', +]) +RemovePropertiesArg._all_fields_ = [ + ('path', RemovePropertiesArg._path_validator), + ('property_template_ids', RemovePropertiesArg._property_template_ids_validator), +] + +RemovePropertiesError._property_group_lookup_validator = LookUpPropertiesError_validator +RemovePropertiesError._tagmap = { + 'property_group_lookup': RemovePropertiesError._property_group_lookup_validator, +} +RemovePropertiesError._tagmap.update(PropertiesError._tagmap) + +RemoveTemplateArg._template_id_validator = TemplateId_validator +RemoveTemplateArg._all_field_names_ = set(['template_id']) +RemoveTemplateArg._all_fields_ = [('template_id', RemoveTemplateArg._template_id_validator)] + +TemplateFilterBase._filter_some_validator = bv.List(TemplateId_validator, min_items=1) +TemplateFilterBase._other_validator = bv.Void() +TemplateFilterBase._tagmap = { + 'filter_some': TemplateFilterBase._filter_some_validator, + 'other': TemplateFilterBase._other_validator, +} + +TemplateFilterBase.other = TemplateFilterBase('other') + +TemplateFilter._filter_none_validator = bv.Void() +TemplateFilter._tagmap = { + 'filter_none': TemplateFilter._filter_none_validator, +} +TemplateFilter._tagmap.update(TemplateFilterBase._tagmap) + +TemplateFilter.filter_none = TemplateFilter('filter_none') + +TemplateOwnerType._user_validator = bv.Void() +TemplateOwnerType._team_validator = bv.Void() +TemplateOwnerType._other_validator = bv.Void() +TemplateOwnerType._tagmap = { + 'user': TemplateOwnerType._user_validator, + 'team': TemplateOwnerType._team_validator, + 'other': TemplateOwnerType._other_validator, +} + +TemplateOwnerType.user = TemplateOwnerType('user') +TemplateOwnerType.team = TemplateOwnerType('team') +TemplateOwnerType.other = TemplateOwnerType('other') + +UpdatePropertiesArg._path_validator = PathOrId_validator +UpdatePropertiesArg._update_property_groups_validator = bv.List(PropertyGroupUpdate_validator) +UpdatePropertiesArg._all_field_names_ = set([ + 'path', + 'update_property_groups', +]) +UpdatePropertiesArg._all_fields_ = [ + ('path', UpdatePropertiesArg._path_validator), + ('update_property_groups', UpdatePropertiesArg._update_property_groups_validator), +] + +UpdatePropertiesError._property_group_lookup_validator = LookUpPropertiesError_validator +UpdatePropertiesError._tagmap = { + 'property_group_lookup': UpdatePropertiesError._property_group_lookup_validator, +} +UpdatePropertiesError._tagmap.update(InvalidPropertyGroupError._tagmap) + +UpdateTemplateArg._template_id_validator = TemplateId_validator +UpdateTemplateArg._name_validator = bv.Nullable(bv.String()) +UpdateTemplateArg._description_validator = bv.Nullable(bv.String()) +UpdateTemplateArg._add_fields_validator = bv.Nullable(bv.List(PropertyFieldTemplate_validator)) +UpdateTemplateArg._all_field_names_ = set([ + 'template_id', + 'name', + 'description', + 'add_fields', +]) +UpdateTemplateArg._all_fields_ = [ + ('template_id', UpdateTemplateArg._template_id_validator), + ('name', UpdateTemplateArg._name_validator), + ('description', UpdateTemplateArg._description_validator), + ('add_fields', UpdateTemplateArg._add_fields_validator), +] + +UpdateTemplateResult._template_id_validator = TemplateId_validator +UpdateTemplateResult._all_field_names_ = set(['template_id']) +UpdateTemplateResult._all_fields_ = [('template_id', UpdateTemplateResult._template_id_validator)] + +properties_add = bb.Route( + 'properties/add', + 1, + False, + AddPropertiesArg_validator, + bv.Void(), + AddPropertiesError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +properties_overwrite = bb.Route( + 'properties/overwrite', + 1, + False, + OverwritePropertyGroupArg_validator, + bv.Void(), + InvalidPropertyGroupError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +properties_remove = bb.Route( + 'properties/remove', + 1, + False, + RemovePropertiesArg_validator, + bv.Void(), + RemovePropertiesError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +properties_search = bb.Route( + 'properties/search', + 1, + False, + PropertiesSearchArg_validator, + PropertiesSearchResult_validator, + PropertiesSearchError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +properties_search_continue = bb.Route( + 'properties/search/continue', + 1, + False, + PropertiesSearchContinueArg_validator, + PropertiesSearchResult_validator, + PropertiesSearchContinueError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +properties_update = bb.Route( + 'properties/update', + 1, + False, + UpdatePropertiesArg_validator, + bv.Void(), + UpdatePropertiesError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +templates_add_for_team = bb.Route( + 'templates/add_for_team', + 1, + False, + AddTemplateArg_validator, + AddTemplateResult_validator, + ModifyTemplateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +templates_add_for_user = bb.Route( + 'templates/add_for_user', + 1, + False, + AddTemplateArg_validator, + AddTemplateResult_validator, + ModifyTemplateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +templates_get_for_team = bb.Route( + 'templates/get_for_team', + 1, + False, + GetTemplateArg_validator, + GetTemplateResult_validator, + TemplateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +templates_get_for_user = bb.Route( + 'templates/get_for_user', + 1, + False, + GetTemplateArg_validator, + GetTemplateResult_validator, + TemplateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +templates_list_for_team = bb.Route( + 'templates/list_for_team', + 1, + False, + bv.Void(), + ListTemplateResult_validator, + TemplateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +templates_list_for_user = bb.Route( + 'templates/list_for_user', + 1, + False, + bv.Void(), + ListTemplateResult_validator, + TemplateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +templates_remove_for_team = bb.Route( + 'templates/remove_for_team', + 1, + False, + RemoveTemplateArg_validator, + bv.Void(), + TemplateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +templates_remove_for_user = bb.Route( + 'templates/remove_for_user', + 1, + False, + RemoveTemplateArg_validator, + bv.Void(), + TemplateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +templates_update_for_team = bb.Route( + 'templates/update_for_team', + 1, + False, + UpdateTemplateArg_validator, + UpdateTemplateResult_validator, + ModifyTemplateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +templates_update_for_user = bb.Route( + 'templates/update_for_user', + 1, + False, + UpdateTemplateArg_validator, + UpdateTemplateResult_validator, + ModifyTemplateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) + +ROUTES = { + 'properties/add': properties_add, + 'properties/overwrite': properties_overwrite, + 'properties/remove': properties_remove, + 'properties/search': properties_search, + 'properties/search/continue': properties_search_continue, + 'properties/update': properties_update, + 'templates/add_for_team': templates_add_for_team, + 'templates/add_for_user': templates_add_for_user, + 'templates/get_for_team': templates_get_for_team, + 'templates/get_for_user': templates_get_for_user, + 'templates/list_for_team': templates_list_for_team, + 'templates/list_for_user': templates_list_for_user, + 'templates/remove_for_team': templates_remove_for_team, + 'templates/remove_for_user': templates_remove_for_user, + 'templates/update_for_team': templates_update_for_team, + 'templates/update_for_user': templates_update_for_user, +} + diff --git a/dropbox-script/dropbox/file_requests.py b/dropbox-script/dropbox/file_requests.py new file mode 100644 index 0000000..953467e --- /dev/null +++ b/dropbox-script/dropbox/file_requests.py @@ -0,0 +1,1483 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# @generated +# flake8: noqa +# pylint: skip-file +""" +This namespace contains endpoints and data types for file request operations. +""" + +try: + from . import stone_validators as bv + from . import stone_base as bb +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bv + import stone_base as bb + +try: + from . import ( + common, + files, + ) +except (ImportError, SystemError, ValueError): + import common + import files + +class CreateFileRequestArgs(bb.Struct): + """ + Arguments for :meth:`dropbox.dropbox.Dropbox.file_requests_create`. + + :ivar title: The title of the file request. Must not be empty. + :ivar destination: The path of the folder in the Dropbox where uploaded + files will be sent. For apps with the app folder permission, this will + be relative to the app folder. + :ivar deadline: The deadline for the file request. Deadlines can only be set + by Professional and Business accounts. + :ivar open: Whether or not the file request should be open. If the file + request is closed, it will not accept any file submissions, but it can + be opened later. + """ + + __slots__ = [ + '_title_value', + '_title_present', + '_destination_value', + '_destination_present', + '_deadline_value', + '_deadline_present', + '_open_value', + '_open_present', + ] + + _has_required_fields = True + + def __init__(self, + title=None, + destination=None, + deadline=None, + open=None): + self._title_value = None + self._title_present = False + self._destination_value = None + self._destination_present = False + self._deadline_value = None + self._deadline_present = False + self._open_value = None + self._open_present = False + if title is not None: + self.title = title + if destination is not None: + self.destination = destination + if deadline is not None: + self.deadline = deadline + if open is not None: + self.open = open + + @property + def title(self): + """ + The title of the file request. Must not be empty. + + :rtype: str + """ + if self._title_present: + return self._title_value + else: + raise AttributeError("missing required field 'title'") + + @title.setter + def title(self, val): + val = self._title_validator.validate(val) + self._title_value = val + self._title_present = True + + @title.deleter + def title(self): + self._title_value = None + self._title_present = False + + @property + def destination(self): + """ + The path of the folder in the Dropbox where uploaded files will be sent. + For apps with the app folder permission, this will be relative to the + app folder. + + :rtype: str + """ + if self._destination_present: + return self._destination_value + else: + raise AttributeError("missing required field 'destination'") + + @destination.setter + def destination(self, val): + val = self._destination_validator.validate(val) + self._destination_value = val + self._destination_present = True + + @destination.deleter + def destination(self): + self._destination_value = None + self._destination_present = False + + @property + def deadline(self): + """ + The deadline for the file request. Deadlines can only be set by + Professional and Business accounts. + + :rtype: FileRequestDeadline + """ + if self._deadline_present: + return self._deadline_value + else: + return None + + @deadline.setter + def deadline(self, val): + if val is None: + del self.deadline + return + self._deadline_validator.validate_type_only(val) + self._deadline_value = val + self._deadline_present = True + + @deadline.deleter + def deadline(self): + self._deadline_value = None + self._deadline_present = False + + @property + def open(self): + """ + Whether or not the file request should be open. If the file request is + closed, it will not accept any file submissions, but it can be opened + later. + + :rtype: bool + """ + if self._open_present: + return self._open_value + else: + return True + + @open.setter + def open(self, val): + val = self._open_validator.validate(val) + self._open_value = val + self._open_present = True + + @open.deleter + def open(self): + self._open_value = None + self._open_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateFileRequestArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateFileRequestArgs(title={!r}, destination={!r}, deadline={!r}, open={!r})'.format( + self._title_value, + self._destination_value, + self._deadline_value, + self._open_value, + ) + +CreateFileRequestArgs_validator = bv.Struct(CreateFileRequestArgs) + +class GeneralFileRequestsError(bb.Union): + """ + There is an error accessing the file requests functionality. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar disabled_for_team: This user's Dropbox Business team doesn't allow + file requests. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled_for_team = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled_for_team(self): + """ + Check if the union tag is ``disabled_for_team``. + + :rtype: bool + """ + return self._tag == 'disabled_for_team' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(GeneralFileRequestsError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GeneralFileRequestsError(%r, %r)' % (self._tag, self._value) + +GeneralFileRequestsError_validator = bv.Union(GeneralFileRequestsError) + +class FileRequestError(GeneralFileRequestsError): + """ + There is an error with the file request. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar not_found: This file request ID was not found. + :ivar not_a_folder: The specified path is not a folder. + :ivar app_lacks_access: This file request is not accessible to this app. + Apps with the app folder permission can only access file requests in + their app folder. + :ivar no_permission: This user doesn't have permission to access or modify + this file request. + :ivar email_unverified: This user's email address is not verified. File + requests are only available on accounts with a verified email address. + Users can verify their email address `here + `_. + :ivar validation_error: There was an error validating the request. For + example, the title was invalid, or there were disallowed characters in + the destination path. + """ + + # Attribute is overwritten below the class definition + not_found = None + # Attribute is overwritten below the class definition + not_a_folder = None + # Attribute is overwritten below the class definition + app_lacks_access = None + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + email_unverified = None + # Attribute is overwritten below the class definition + validation_error = None + + def is_not_found(self): + """ + Check if the union tag is ``not_found``. + + :rtype: bool + """ + return self._tag == 'not_found' + + def is_not_a_folder(self): + """ + Check if the union tag is ``not_a_folder``. + + :rtype: bool + """ + return self._tag == 'not_a_folder' + + def is_app_lacks_access(self): + """ + Check if the union tag is ``app_lacks_access``. + + :rtype: bool + """ + return self._tag == 'app_lacks_access' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_email_unverified(self): + """ + Check if the union tag is ``email_unverified``. + + :rtype: bool + """ + return self._tag == 'email_unverified' + + def is_validation_error(self): + """ + Check if the union tag is ``validation_error``. + + :rtype: bool + """ + return self._tag == 'validation_error' + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestError(%r, %r)' % (self._tag, self._value) + +FileRequestError_validator = bv.Union(FileRequestError) + +class CreateFileRequestError(FileRequestError): + """ + There was an error creating the file request. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_location: File requests are not available on the specified + folder. + :ivar rate_limit: The user has reached the rate limit for creating file + requests. The limit is currently 100 file requests per day. + """ + + # Attribute is overwritten below the class definition + invalid_location = None + # Attribute is overwritten below the class definition + rate_limit = None + + def is_invalid_location(self): + """ + Check if the union tag is ``invalid_location``. + + :rtype: bool + """ + return self._tag == 'invalid_location' + + def is_rate_limit(self): + """ + Check if the union tag is ``rate_limit``. + + :rtype: bool + """ + return self._tag == 'rate_limit' + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateFileRequestError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateFileRequestError(%r, %r)' % (self._tag, self._value) + +CreateFileRequestError_validator = bv.Union(CreateFileRequestError) + +class FileRequest(bb.Struct): + """ + A `file request `_ for receiving files + into the user's Dropbox account. + + :ivar id: The ID of the file request. + :ivar url: The URL of the file request. + :ivar title: The title of the file request. + :ivar destination: The path of the folder in the Dropbox where uploaded + files will be sent. This can be None if the destination was removed. For + apps with the app folder permission, this will be relative to the app + folder. + :ivar created: When this file request was created. + :ivar deadline: The deadline for this file request. Only set if the request + has a deadline. + :ivar is_open: Whether or not the file request is open. If the file request + is closed, it will not accept any more file submissions. + :ivar file_count: The number of files this file request has received. + """ + + __slots__ = [ + '_id_value', + '_id_present', + '_url_value', + '_url_present', + '_title_value', + '_title_present', + '_destination_value', + '_destination_present', + '_created_value', + '_created_present', + '_deadline_value', + '_deadline_present', + '_is_open_value', + '_is_open_present', + '_file_count_value', + '_file_count_present', + ] + + _has_required_fields = True + + def __init__(self, + id=None, + url=None, + title=None, + created=None, + is_open=None, + file_count=None, + destination=None, + deadline=None): + self._id_value = None + self._id_present = False + self._url_value = None + self._url_present = False + self._title_value = None + self._title_present = False + self._destination_value = None + self._destination_present = False + self._created_value = None + self._created_present = False + self._deadline_value = None + self._deadline_present = False + self._is_open_value = None + self._is_open_present = False + self._file_count_value = None + self._file_count_present = False + if id is not None: + self.id = id + if url is not None: + self.url = url + if title is not None: + self.title = title + if destination is not None: + self.destination = destination + if created is not None: + self.created = created + if deadline is not None: + self.deadline = deadline + if is_open is not None: + self.is_open = is_open + if file_count is not None: + self.file_count = file_count + + @property + def id(self): + """ + The ID of the file request. + + :rtype: str + """ + if self._id_present: + return self._id_value + else: + raise AttributeError("missing required field 'id'") + + @id.setter + def id(self, val): + val = self._id_validator.validate(val) + self._id_value = val + self._id_present = True + + @id.deleter + def id(self): + self._id_value = None + self._id_present = False + + @property + def url(self): + """ + The URL of the file request. + + :rtype: str + """ + if self._url_present: + return self._url_value + else: + raise AttributeError("missing required field 'url'") + + @url.setter + def url(self, val): + val = self._url_validator.validate(val) + self._url_value = val + self._url_present = True + + @url.deleter + def url(self): + self._url_value = None + self._url_present = False + + @property + def title(self): + """ + The title of the file request. + + :rtype: str + """ + if self._title_present: + return self._title_value + else: + raise AttributeError("missing required field 'title'") + + @title.setter + def title(self, val): + val = self._title_validator.validate(val) + self._title_value = val + self._title_present = True + + @title.deleter + def title(self): + self._title_value = None + self._title_present = False + + @property + def destination(self): + """ + The path of the folder in the Dropbox where uploaded files will be sent. + This can be None if the destination was removed. For apps with the app + folder permission, this will be relative to the app folder. + + :rtype: str + """ + if self._destination_present: + return self._destination_value + else: + return None + + @destination.setter + def destination(self, val): + if val is None: + del self.destination + return + val = self._destination_validator.validate(val) + self._destination_value = val + self._destination_present = True + + @destination.deleter + def destination(self): + self._destination_value = None + self._destination_present = False + + @property + def created(self): + """ + When this file request was created. + + :rtype: datetime.datetime + """ + if self._created_present: + return self._created_value + else: + raise AttributeError("missing required field 'created'") + + @created.setter + def created(self, val): + val = self._created_validator.validate(val) + self._created_value = val + self._created_present = True + + @created.deleter + def created(self): + self._created_value = None + self._created_present = False + + @property + def deadline(self): + """ + The deadline for this file request. Only set if the request has a + deadline. + + :rtype: FileRequestDeadline + """ + if self._deadline_present: + return self._deadline_value + else: + return None + + @deadline.setter + def deadline(self, val): + if val is None: + del self.deadline + return + self._deadline_validator.validate_type_only(val) + self._deadline_value = val + self._deadline_present = True + + @deadline.deleter + def deadline(self): + self._deadline_value = None + self._deadline_present = False + + @property + def is_open(self): + """ + Whether or not the file request is open. If the file request is closed, + it will not accept any more file submissions. + + :rtype: bool + """ + if self._is_open_present: + return self._is_open_value + else: + raise AttributeError("missing required field 'is_open'") + + @is_open.setter + def is_open(self, val): + val = self._is_open_validator.validate(val) + self._is_open_value = val + self._is_open_present = True + + @is_open.deleter + def is_open(self): + self._is_open_value = None + self._is_open_present = False + + @property + def file_count(self): + """ + The number of files this file request has received. + + :rtype: int + """ + if self._file_count_present: + return self._file_count_value + else: + raise AttributeError("missing required field 'file_count'") + + @file_count.setter + def file_count(self, val): + val = self._file_count_validator.validate(val) + self._file_count_value = val + self._file_count_present = True + + @file_count.deleter + def file_count(self): + self._file_count_value = None + self._file_count_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequest, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequest(id={!r}, url={!r}, title={!r}, created={!r}, is_open={!r}, file_count={!r}, destination={!r}, deadline={!r})'.format( + self._id_value, + self._url_value, + self._title_value, + self._created_value, + self._is_open_value, + self._file_count_value, + self._destination_value, + self._deadline_value, + ) + +FileRequest_validator = bv.Struct(FileRequest) + +class FileRequestDeadline(bb.Struct): + """ + :ivar deadline: The deadline for this file request. + :ivar allow_late_uploads: If set, allow uploads after the deadline has + passed. These uploads will be marked overdue. + """ + + __slots__ = [ + '_deadline_value', + '_deadline_present', + '_allow_late_uploads_value', + '_allow_late_uploads_present', + ] + + _has_required_fields = True + + def __init__(self, + deadline=None, + allow_late_uploads=None): + self._deadline_value = None + self._deadline_present = False + self._allow_late_uploads_value = None + self._allow_late_uploads_present = False + if deadline is not None: + self.deadline = deadline + if allow_late_uploads is not None: + self.allow_late_uploads = allow_late_uploads + + @property + def deadline(self): + """ + The deadline for this file request. + + :rtype: datetime.datetime + """ + if self._deadline_present: + return self._deadline_value + else: + raise AttributeError("missing required field 'deadline'") + + @deadline.setter + def deadline(self, val): + val = self._deadline_validator.validate(val) + self._deadline_value = val + self._deadline_present = True + + @deadline.deleter + def deadline(self): + self._deadline_value = None + self._deadline_present = False + + @property + def allow_late_uploads(self): + """ + If set, allow uploads after the deadline has passed. These uploads + will be marked overdue. + + :rtype: GracePeriod + """ + if self._allow_late_uploads_present: + return self._allow_late_uploads_value + else: + return None + + @allow_late_uploads.setter + def allow_late_uploads(self, val): + if val is None: + del self.allow_late_uploads + return + self._allow_late_uploads_validator.validate_type_only(val) + self._allow_late_uploads_value = val + self._allow_late_uploads_present = True + + @allow_late_uploads.deleter + def allow_late_uploads(self): + self._allow_late_uploads_value = None + self._allow_late_uploads_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestDeadline, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestDeadline(deadline={!r}, allow_late_uploads={!r})'.format( + self._deadline_value, + self._allow_late_uploads_value, + ) + +FileRequestDeadline_validator = bv.Struct(FileRequestDeadline) + +class GetFileRequestArgs(bb.Struct): + """ + Arguments for :meth:`dropbox.dropbox.Dropbox.file_requests_get`. + + :ivar id: The ID of the file request to retrieve. + """ + + __slots__ = [ + '_id_value', + '_id_present', + ] + + _has_required_fields = True + + def __init__(self, + id=None): + self._id_value = None + self._id_present = False + if id is not None: + self.id = id + + @property + def id(self): + """ + The ID of the file request to retrieve. + + :rtype: str + """ + if self._id_present: + return self._id_value + else: + raise AttributeError("missing required field 'id'") + + @id.setter + def id(self, val): + val = self._id_validator.validate(val) + self._id_value = val + self._id_present = True + + @id.deleter + def id(self): + self._id_value = None + self._id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetFileRequestArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetFileRequestArgs(id={!r})'.format( + self._id_value, + ) + +GetFileRequestArgs_validator = bv.Struct(GetFileRequestArgs) + +class GetFileRequestError(FileRequestError): + """ + There was an error retrieving the specified file request. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + def _process_custom_annotations(self, annotation_type, processor): + super(GetFileRequestError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetFileRequestError(%r, %r)' % (self._tag, self._value) + +GetFileRequestError_validator = bv.Union(GetFileRequestError) + +class GracePeriod(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + one_day = None + # Attribute is overwritten below the class definition + two_days = None + # Attribute is overwritten below the class definition + seven_days = None + # Attribute is overwritten below the class definition + thirty_days = None + # Attribute is overwritten below the class definition + always = None + # Attribute is overwritten below the class definition + other = None + + def is_one_day(self): + """ + Check if the union tag is ``one_day``. + + :rtype: bool + """ + return self._tag == 'one_day' + + def is_two_days(self): + """ + Check if the union tag is ``two_days``. + + :rtype: bool + """ + return self._tag == 'two_days' + + def is_seven_days(self): + """ + Check if the union tag is ``seven_days``. + + :rtype: bool + """ + return self._tag == 'seven_days' + + def is_thirty_days(self): + """ + Check if the union tag is ``thirty_days``. + + :rtype: bool + """ + return self._tag == 'thirty_days' + + def is_always(self): + """ + Check if the union tag is ``always``. + + :rtype: bool + """ + return self._tag == 'always' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(GracePeriod, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GracePeriod(%r, %r)' % (self._tag, self._value) + +GracePeriod_validator = bv.Union(GracePeriod) + +class ListFileRequestsError(GeneralFileRequestsError): + """ + There was an error retrieving the file requests. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFileRequestsError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFileRequestsError(%r, %r)' % (self._tag, self._value) + +ListFileRequestsError_validator = bv.Union(ListFileRequestsError) + +class ListFileRequestsResult(bb.Struct): + """ + Result for :meth:`dropbox.dropbox.Dropbox.file_requests_list`. + + :ivar file_requests: The file requests owned by this user. Apps with the app + folder permission will only see file requests in their app folder. + """ + + __slots__ = [ + '_file_requests_value', + '_file_requests_present', + ] + + _has_required_fields = True + + def __init__(self, + file_requests=None): + self._file_requests_value = None + self._file_requests_present = False + if file_requests is not None: + self.file_requests = file_requests + + @property + def file_requests(self): + """ + The file requests owned by this user. Apps with the app folder + permission will only see file requests in their app folder. + + :rtype: list of [FileRequest] + """ + if self._file_requests_present: + return self._file_requests_value + else: + raise AttributeError("missing required field 'file_requests'") + + @file_requests.setter + def file_requests(self, val): + val = self._file_requests_validator.validate(val) + self._file_requests_value = val + self._file_requests_present = True + + @file_requests.deleter + def file_requests(self): + self._file_requests_value = None + self._file_requests_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFileRequestsResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFileRequestsResult(file_requests={!r})'.format( + self._file_requests_value, + ) + +ListFileRequestsResult_validator = bv.Struct(ListFileRequestsResult) + +class UpdateFileRequestArgs(bb.Struct): + """ + Arguments for :meth:`dropbox.dropbox.Dropbox.file_requests_update`. + + :ivar id: The ID of the file request to update. + :ivar title: The new title of the file request. Must not be empty. + :ivar destination: The new path of the folder in the Dropbox where uploaded + files will be sent. For apps with the app folder permission, this will + be relative to the app folder. + :ivar deadline: The new deadline for the file request. Deadlines can only be + set by Professional and Business accounts. + :ivar open: Whether to set this file request as open or closed. + """ + + __slots__ = [ + '_id_value', + '_id_present', + '_title_value', + '_title_present', + '_destination_value', + '_destination_present', + '_deadline_value', + '_deadline_present', + '_open_value', + '_open_present', + ] + + _has_required_fields = True + + def __init__(self, + id=None, + title=None, + destination=None, + deadline=None, + open=None): + self._id_value = None + self._id_present = False + self._title_value = None + self._title_present = False + self._destination_value = None + self._destination_present = False + self._deadline_value = None + self._deadline_present = False + self._open_value = None + self._open_present = False + if id is not None: + self.id = id + if title is not None: + self.title = title + if destination is not None: + self.destination = destination + if deadline is not None: + self.deadline = deadline + if open is not None: + self.open = open + + @property + def id(self): + """ + The ID of the file request to update. + + :rtype: str + """ + if self._id_present: + return self._id_value + else: + raise AttributeError("missing required field 'id'") + + @id.setter + def id(self, val): + val = self._id_validator.validate(val) + self._id_value = val + self._id_present = True + + @id.deleter + def id(self): + self._id_value = None + self._id_present = False + + @property + def title(self): + """ + The new title of the file request. Must not be empty. + + :rtype: str + """ + if self._title_present: + return self._title_value + else: + return None + + @title.setter + def title(self, val): + if val is None: + del self.title + return + val = self._title_validator.validate(val) + self._title_value = val + self._title_present = True + + @title.deleter + def title(self): + self._title_value = None + self._title_present = False + + @property + def destination(self): + """ + The new path of the folder in the Dropbox where uploaded files will be + sent. For apps with the app folder permission, this will be relative to + the app folder. + + :rtype: str + """ + if self._destination_present: + return self._destination_value + else: + return None + + @destination.setter + def destination(self, val): + if val is None: + del self.destination + return + val = self._destination_validator.validate(val) + self._destination_value = val + self._destination_present = True + + @destination.deleter + def destination(self): + self._destination_value = None + self._destination_present = False + + @property + def deadline(self): + """ + The new deadline for the file request. Deadlines can only be set by + Professional and Business accounts. + + :rtype: UpdateFileRequestDeadline + """ + if self._deadline_present: + return self._deadline_value + else: + return UpdateFileRequestDeadline.no_update + + @deadline.setter + def deadline(self, val): + self._deadline_validator.validate_type_only(val) + self._deadline_value = val + self._deadline_present = True + + @deadline.deleter + def deadline(self): + self._deadline_value = None + self._deadline_present = False + + @property + def open(self): + """ + Whether to set this file request as open or closed. + + :rtype: bool + """ + if self._open_present: + return self._open_value + else: + return None + + @open.setter + def open(self, val): + if val is None: + del self.open + return + val = self._open_validator.validate(val) + self._open_value = val + self._open_present = True + + @open.deleter + def open(self): + self._open_value = None + self._open_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UpdateFileRequestArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UpdateFileRequestArgs(id={!r}, title={!r}, destination={!r}, deadline={!r}, open={!r})'.format( + self._id_value, + self._title_value, + self._destination_value, + self._deadline_value, + self._open_value, + ) + +UpdateFileRequestArgs_validator = bv.Struct(UpdateFileRequestArgs) + +class UpdateFileRequestDeadline(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar no_update: Do not change the file request's deadline. + :ivar Optional[FileRequestDeadline] update: If :val:`null`, the file + request's deadline is cleared. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + no_update = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def update(cls, val): + """ + Create an instance of this class set to the ``update`` tag with value + ``val``. + + :param FileRequestDeadline val: + :rtype: UpdateFileRequestDeadline + """ + return cls('update', val) + + def is_no_update(self): + """ + Check if the union tag is ``no_update``. + + :rtype: bool + """ + return self._tag == 'no_update' + + def is_update(self): + """ + Check if the union tag is ``update``. + + :rtype: bool + """ + return self._tag == 'update' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_update(self): + """ + If None, the file request's deadline is cleared. + + Only call this if :meth:`is_update` is true. + + :rtype: FileRequestDeadline + """ + if not self.is_update(): + raise AttributeError("tag 'update' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(UpdateFileRequestDeadline, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UpdateFileRequestDeadline(%r, %r)' % (self._tag, self._value) + +UpdateFileRequestDeadline_validator = bv.Union(UpdateFileRequestDeadline) + +class UpdateFileRequestError(FileRequestError): + """ + There is an error updating the file request. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + def _process_custom_annotations(self, annotation_type, processor): + super(UpdateFileRequestError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UpdateFileRequestError(%r, %r)' % (self._tag, self._value) + +UpdateFileRequestError_validator = bv.Union(UpdateFileRequestError) + +FileRequestId_validator = bv.String(min_length=1, pattern=u'[-_0-9a-zA-Z]+') +FileRequestValidationError_validator = bv.Nullable(bv.String()) +CreateFileRequestArgs._title_validator = bv.String(min_length=1) +CreateFileRequestArgs._destination_validator = files.Path_validator +CreateFileRequestArgs._deadline_validator = bv.Nullable(FileRequestDeadline_validator) +CreateFileRequestArgs._open_validator = bv.Boolean() +CreateFileRequestArgs._all_field_names_ = set([ + 'title', + 'destination', + 'deadline', + 'open', +]) +CreateFileRequestArgs._all_fields_ = [ + ('title', CreateFileRequestArgs._title_validator), + ('destination', CreateFileRequestArgs._destination_validator), + ('deadline', CreateFileRequestArgs._deadline_validator), + ('open', CreateFileRequestArgs._open_validator), +] + +GeneralFileRequestsError._disabled_for_team_validator = bv.Void() +GeneralFileRequestsError._other_validator = bv.Void() +GeneralFileRequestsError._tagmap = { + 'disabled_for_team': GeneralFileRequestsError._disabled_for_team_validator, + 'other': GeneralFileRequestsError._other_validator, +} + +GeneralFileRequestsError.disabled_for_team = GeneralFileRequestsError('disabled_for_team') +GeneralFileRequestsError.other = GeneralFileRequestsError('other') + +FileRequestError._not_found_validator = bv.Void() +FileRequestError._not_a_folder_validator = bv.Void() +FileRequestError._app_lacks_access_validator = bv.Void() +FileRequestError._no_permission_validator = bv.Void() +FileRequestError._email_unverified_validator = bv.Void() +FileRequestError._validation_error_validator = bv.Void() +FileRequestError._tagmap = { + 'not_found': FileRequestError._not_found_validator, + 'not_a_folder': FileRequestError._not_a_folder_validator, + 'app_lacks_access': FileRequestError._app_lacks_access_validator, + 'no_permission': FileRequestError._no_permission_validator, + 'email_unverified': FileRequestError._email_unverified_validator, + 'validation_error': FileRequestError._validation_error_validator, +} +FileRequestError._tagmap.update(GeneralFileRequestsError._tagmap) + +FileRequestError.not_found = FileRequestError('not_found') +FileRequestError.not_a_folder = FileRequestError('not_a_folder') +FileRequestError.app_lacks_access = FileRequestError('app_lacks_access') +FileRequestError.no_permission = FileRequestError('no_permission') +FileRequestError.email_unverified = FileRequestError('email_unverified') +FileRequestError.validation_error = FileRequestError('validation_error') + +CreateFileRequestError._invalid_location_validator = bv.Void() +CreateFileRequestError._rate_limit_validator = bv.Void() +CreateFileRequestError._tagmap = { + 'invalid_location': CreateFileRequestError._invalid_location_validator, + 'rate_limit': CreateFileRequestError._rate_limit_validator, +} +CreateFileRequestError._tagmap.update(FileRequestError._tagmap) + +CreateFileRequestError.invalid_location = CreateFileRequestError('invalid_location') +CreateFileRequestError.rate_limit = CreateFileRequestError('rate_limit') + +FileRequest._id_validator = FileRequestId_validator +FileRequest._url_validator = bv.String(min_length=1) +FileRequest._title_validator = bv.String(min_length=1) +FileRequest._destination_validator = bv.Nullable(files.Path_validator) +FileRequest._created_validator = common.DropboxTimestamp_validator +FileRequest._deadline_validator = bv.Nullable(FileRequestDeadline_validator) +FileRequest._is_open_validator = bv.Boolean() +FileRequest._file_count_validator = bv.Int64() +FileRequest._all_field_names_ = set([ + 'id', + 'url', + 'title', + 'destination', + 'created', + 'deadline', + 'is_open', + 'file_count', +]) +FileRequest._all_fields_ = [ + ('id', FileRequest._id_validator), + ('url', FileRequest._url_validator), + ('title', FileRequest._title_validator), + ('destination', FileRequest._destination_validator), + ('created', FileRequest._created_validator), + ('deadline', FileRequest._deadline_validator), + ('is_open', FileRequest._is_open_validator), + ('file_count', FileRequest._file_count_validator), +] + +FileRequestDeadline._deadline_validator = common.DropboxTimestamp_validator +FileRequestDeadline._allow_late_uploads_validator = bv.Nullable(GracePeriod_validator) +FileRequestDeadline._all_field_names_ = set([ + 'deadline', + 'allow_late_uploads', +]) +FileRequestDeadline._all_fields_ = [ + ('deadline', FileRequestDeadline._deadline_validator), + ('allow_late_uploads', FileRequestDeadline._allow_late_uploads_validator), +] + +GetFileRequestArgs._id_validator = FileRequestId_validator +GetFileRequestArgs._all_field_names_ = set(['id']) +GetFileRequestArgs._all_fields_ = [('id', GetFileRequestArgs._id_validator)] + +GetFileRequestError._tagmap = { +} +GetFileRequestError._tagmap.update(FileRequestError._tagmap) + +GracePeriod._one_day_validator = bv.Void() +GracePeriod._two_days_validator = bv.Void() +GracePeriod._seven_days_validator = bv.Void() +GracePeriod._thirty_days_validator = bv.Void() +GracePeriod._always_validator = bv.Void() +GracePeriod._other_validator = bv.Void() +GracePeriod._tagmap = { + 'one_day': GracePeriod._one_day_validator, + 'two_days': GracePeriod._two_days_validator, + 'seven_days': GracePeriod._seven_days_validator, + 'thirty_days': GracePeriod._thirty_days_validator, + 'always': GracePeriod._always_validator, + 'other': GracePeriod._other_validator, +} + +GracePeriod.one_day = GracePeriod('one_day') +GracePeriod.two_days = GracePeriod('two_days') +GracePeriod.seven_days = GracePeriod('seven_days') +GracePeriod.thirty_days = GracePeriod('thirty_days') +GracePeriod.always = GracePeriod('always') +GracePeriod.other = GracePeriod('other') + +ListFileRequestsError._tagmap = { +} +ListFileRequestsError._tagmap.update(GeneralFileRequestsError._tagmap) + +ListFileRequestsResult._file_requests_validator = bv.List(FileRequest_validator) +ListFileRequestsResult._all_field_names_ = set(['file_requests']) +ListFileRequestsResult._all_fields_ = [('file_requests', ListFileRequestsResult._file_requests_validator)] + +UpdateFileRequestArgs._id_validator = FileRequestId_validator +UpdateFileRequestArgs._title_validator = bv.Nullable(bv.String(min_length=1)) +UpdateFileRequestArgs._destination_validator = bv.Nullable(files.Path_validator) +UpdateFileRequestArgs._deadline_validator = UpdateFileRequestDeadline_validator +UpdateFileRequestArgs._open_validator = bv.Nullable(bv.Boolean()) +UpdateFileRequestArgs._all_field_names_ = set([ + 'id', + 'title', + 'destination', + 'deadline', + 'open', +]) +UpdateFileRequestArgs._all_fields_ = [ + ('id', UpdateFileRequestArgs._id_validator), + ('title', UpdateFileRequestArgs._title_validator), + ('destination', UpdateFileRequestArgs._destination_validator), + ('deadline', UpdateFileRequestArgs._deadline_validator), + ('open', UpdateFileRequestArgs._open_validator), +] + +UpdateFileRequestDeadline._no_update_validator = bv.Void() +UpdateFileRequestDeadline._update_validator = bv.Nullable(FileRequestDeadline_validator) +UpdateFileRequestDeadline._other_validator = bv.Void() +UpdateFileRequestDeadline._tagmap = { + 'no_update': UpdateFileRequestDeadline._no_update_validator, + 'update': UpdateFileRequestDeadline._update_validator, + 'other': UpdateFileRequestDeadline._other_validator, +} + +UpdateFileRequestDeadline.no_update = UpdateFileRequestDeadline('no_update') +UpdateFileRequestDeadline.other = UpdateFileRequestDeadline('other') + +UpdateFileRequestError._tagmap = { +} +UpdateFileRequestError._tagmap.update(FileRequestError._tagmap) + +create = bb.Route( + 'create', + 1, + False, + CreateFileRequestArgs_validator, + FileRequest_validator, + CreateFileRequestError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +get = bb.Route( + 'get', + 1, + False, + GetFileRequestArgs_validator, + FileRequest_validator, + GetFileRequestError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +list = bb.Route( + 'list', + 1, + False, + bv.Void(), + ListFileRequestsResult_validator, + ListFileRequestsError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +update = bb.Route( + 'update', + 1, + False, + UpdateFileRequestArgs_validator, + FileRequest_validator, + UpdateFileRequestError_validator, + {'host': u'api', + 'style': u'rpc'}, +) + +ROUTES = { + 'create': create, + 'get': get, + 'list': list, + 'update': update, +} + diff --git a/dropbox-script/dropbox/files.py b/dropbox-script/dropbox/files.py new file mode 100644 index 0000000..496dff0 --- /dev/null +++ b/dropbox-script/dropbox/files.py @@ -0,0 +1,13709 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# @generated +# flake8: noqa +# pylint: skip-file +""" +This namespace contains endpoints and data types for basic file operations. +""" + +try: + from . import stone_validators as bv + from . import stone_base as bb +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bv + import stone_base as bb + +try: + from . import ( + async_, + common, + file_properties, + users_common, + ) +except (ImportError, SystemError, ValueError): + import async_ + import common + import file_properties + import users_common + +class GetMetadataArg(bb.Struct): + """ + :ivar path: The path of a file or folder on Dropbox. + :ivar include_media_info: If true, ``FileMetadata.media_info`` is set for + photo and video. + :ivar include_deleted: If true, :class:`DeletedMetadata` will be returned + for deleted file or folder, otherwise ``LookupError.not_found`` will be + returned. + :ivar include_has_explicit_shared_members: If true, the results will include + a flag for each file indicating whether or not that file has any + explicit members. + :ivar include_property_groups: If set to a valid list of template IDs, + ``FileMetadata.property_groups`` is set if there exists property data + associated with the file and each of the listed templates. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_include_media_info_value', + '_include_media_info_present', + '_include_deleted_value', + '_include_deleted_present', + '_include_has_explicit_shared_members_value', + '_include_has_explicit_shared_members_present', + '_include_property_groups_value', + '_include_property_groups_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + include_media_info=None, + include_deleted=None, + include_has_explicit_shared_members=None, + include_property_groups=None): + self._path_value = None + self._path_present = False + self._include_media_info_value = None + self._include_media_info_present = False + self._include_deleted_value = None + self._include_deleted_present = False + self._include_has_explicit_shared_members_value = None + self._include_has_explicit_shared_members_present = False + self._include_property_groups_value = None + self._include_property_groups_present = False + if path is not None: + self.path = path + if include_media_info is not None: + self.include_media_info = include_media_info + if include_deleted is not None: + self.include_deleted = include_deleted + if include_has_explicit_shared_members is not None: + self.include_has_explicit_shared_members = include_has_explicit_shared_members + if include_property_groups is not None: + self.include_property_groups = include_property_groups + + @property + def path(self): + """ + The path of a file or folder on Dropbox. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def include_media_info(self): + """ + If true, ``FileMetadata.media_info`` is set for photo and video. + + :rtype: bool + """ + if self._include_media_info_present: + return self._include_media_info_value + else: + return False + + @include_media_info.setter + def include_media_info(self, val): + val = self._include_media_info_validator.validate(val) + self._include_media_info_value = val + self._include_media_info_present = True + + @include_media_info.deleter + def include_media_info(self): + self._include_media_info_value = None + self._include_media_info_present = False + + @property + def include_deleted(self): + """ + If true, :class:`DeletedMetadata` will be returned for deleted file or + folder, otherwise ``LookupError.not_found`` will be returned. + + :rtype: bool + """ + if self._include_deleted_present: + return self._include_deleted_value + else: + return False + + @include_deleted.setter + def include_deleted(self, val): + val = self._include_deleted_validator.validate(val) + self._include_deleted_value = val + self._include_deleted_present = True + + @include_deleted.deleter + def include_deleted(self): + self._include_deleted_value = None + self._include_deleted_present = False + + @property + def include_has_explicit_shared_members(self): + """ + If true, the results will include a flag for each file indicating + whether or not that file has any explicit members. + + :rtype: bool + """ + if self._include_has_explicit_shared_members_present: + return self._include_has_explicit_shared_members_value + else: + return False + + @include_has_explicit_shared_members.setter + def include_has_explicit_shared_members(self, val): + val = self._include_has_explicit_shared_members_validator.validate(val) + self._include_has_explicit_shared_members_value = val + self._include_has_explicit_shared_members_present = True + + @include_has_explicit_shared_members.deleter + def include_has_explicit_shared_members(self): + self._include_has_explicit_shared_members_value = None + self._include_has_explicit_shared_members_present = False + + @property + def include_property_groups(self): + """ + If set to a valid list of template IDs, ``FileMetadata.property_groups`` + is set if there exists property data associated with the file and each + of the listed templates. + + :rtype: file_properties.TemplateFilterBase + """ + if self._include_property_groups_present: + return self._include_property_groups_value + else: + return None + + @include_property_groups.setter + def include_property_groups(self, val): + if val is None: + del self.include_property_groups + return + self._include_property_groups_validator.validate_type_only(val) + self._include_property_groups_value = val + self._include_property_groups_present = True + + @include_property_groups.deleter + def include_property_groups(self): + self._include_property_groups_value = None + self._include_property_groups_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetMetadataArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetMetadataArg(path={!r}, include_media_info={!r}, include_deleted={!r}, include_has_explicit_shared_members={!r}, include_property_groups={!r})'.format( + self._path_value, + self._include_media_info_value, + self._include_deleted_value, + self._include_has_explicit_shared_members_value, + self._include_property_groups_value, + ) + +GetMetadataArg_validator = bv.Struct(GetMetadataArg) + +class AlphaGetMetadataArg(GetMetadataArg): + """ + :ivar include_property_templates: If set to a valid list of template IDs, + ``FileMetadata.property_groups`` is set for files with custom + properties. + """ + + __slots__ = [ + '_include_property_templates_value', + '_include_property_templates_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + include_media_info=None, + include_deleted=None, + include_has_explicit_shared_members=None, + include_property_groups=None, + include_property_templates=None): + super(AlphaGetMetadataArg, self).__init__(path, + include_media_info, + include_deleted, + include_has_explicit_shared_members, + include_property_groups) + self._include_property_templates_value = None + self._include_property_templates_present = False + if include_property_templates is not None: + self.include_property_templates = include_property_templates + + @property + def include_property_templates(self): + """ + If set to a valid list of template IDs, ``FileMetadata.property_groups`` + is set for files with custom properties. + + :rtype: list of [str] + """ + if self._include_property_templates_present: + return self._include_property_templates_value + else: + return None + + @include_property_templates.setter + def include_property_templates(self, val): + if val is None: + del self.include_property_templates + return + val = self._include_property_templates_validator.validate(val) + self._include_property_templates_value = val + self._include_property_templates_present = True + + @include_property_templates.deleter + def include_property_templates(self): + self._include_property_templates_value = None + self._include_property_templates_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AlphaGetMetadataArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AlphaGetMetadataArg(path={!r}, include_media_info={!r}, include_deleted={!r}, include_has_explicit_shared_members={!r}, include_property_groups={!r}, include_property_templates={!r})'.format( + self._path_value, + self._include_media_info_value, + self._include_deleted_value, + self._include_has_explicit_shared_members_value, + self._include_property_groups_value, + self._include_property_templates_value, + ) + +AlphaGetMetadataArg_validator = bv.Struct(AlphaGetMetadataArg) + +class GetMetadataError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param LookupError val: + :rtype: GetMetadataError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(GetMetadataError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetMetadataError(%r, %r)' % (self._tag, self._value) + +GetMetadataError_validator = bv.Union(GetMetadataError) + +class AlphaGetMetadataError(GetMetadataError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + @classmethod + def properties_error(cls, val): + """ + Create an instance of this class set to the ``properties_error`` tag + with value ``val``. + + :param file_properties.LookUpPropertiesError val: + :rtype: AlphaGetMetadataError + """ + return cls('properties_error', val) + + def is_properties_error(self): + """ + Check if the union tag is ``properties_error``. + + :rtype: bool + """ + return self._tag == 'properties_error' + + def get_properties_error(self): + """ + Only call this if :meth:`is_properties_error` is true. + + :rtype: file_properties.LookUpPropertiesError + """ + if not self.is_properties_error(): + raise AttributeError("tag 'properties_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(AlphaGetMetadataError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AlphaGetMetadataError(%r, %r)' % (self._tag, self._value) + +AlphaGetMetadataError_validator = bv.Union(AlphaGetMetadataError) + +class CommitInfo(bb.Struct): + """ + :ivar path: Path in the user's Dropbox to save the file. + :ivar mode: Selects what to do if the file already exists. + :ivar autorename: If there's a conflict, as determined by ``mode``, have the + Dropbox server try to autorename the file to avoid conflict. + :ivar client_modified: The value to store as the ``client_modified`` + timestamp. Dropbox automatically records the time at which the file was + written to the Dropbox servers. It can also record an additional + timestamp, provided by Dropbox desktop clients, mobile clients, and API + apps of when the file was actually created or modified. + :ivar mute: Normally, users are made aware of any file modifications in + their Dropbox account via notifications in the client software. If + ``True``, this tells the clients that this modification shouldn't result + in a user notification. + :ivar property_groups: List of custom properties to add to file. + :ivar strict_conflict: Be more strict about how each :class:`WriteMode` + detects conflict. For example, always return a conflict error when + ``mode`` = ``WriteMode.update`` and the given "rev" doesn't match the + existing file's "rev", even if the existing file has been deleted. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_mode_value', + '_mode_present', + '_autorename_value', + '_autorename_present', + '_client_modified_value', + '_client_modified_present', + '_mute_value', + '_mute_present', + '_property_groups_value', + '_property_groups_present', + '_strict_conflict_value', + '_strict_conflict_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + mode=None, + autorename=None, + client_modified=None, + mute=None, + property_groups=None, + strict_conflict=None): + self._path_value = None + self._path_present = False + self._mode_value = None + self._mode_present = False + self._autorename_value = None + self._autorename_present = False + self._client_modified_value = None + self._client_modified_present = False + self._mute_value = None + self._mute_present = False + self._property_groups_value = None + self._property_groups_present = False + self._strict_conflict_value = None + self._strict_conflict_present = False + if path is not None: + self.path = path + if mode is not None: + self.mode = mode + if autorename is not None: + self.autorename = autorename + if client_modified is not None: + self.client_modified = client_modified + if mute is not None: + self.mute = mute + if property_groups is not None: + self.property_groups = property_groups + if strict_conflict is not None: + self.strict_conflict = strict_conflict + + @property + def path(self): + """ + Path in the user's Dropbox to save the file. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def mode(self): + """ + Selects what to do if the file already exists. + + :rtype: WriteMode + """ + if self._mode_present: + return self._mode_value + else: + return WriteMode.add + + @mode.setter + def mode(self, val): + self._mode_validator.validate_type_only(val) + self._mode_value = val + self._mode_present = True + + @mode.deleter + def mode(self): + self._mode_value = None + self._mode_present = False + + @property + def autorename(self): + """ + If there's a conflict, as determined by ``mode``, have the Dropbox + server try to autorename the file to avoid conflict. + + :rtype: bool + """ + if self._autorename_present: + return self._autorename_value + else: + return False + + @autorename.setter + def autorename(self, val): + val = self._autorename_validator.validate(val) + self._autorename_value = val + self._autorename_present = True + + @autorename.deleter + def autorename(self): + self._autorename_value = None + self._autorename_present = False + + @property + def client_modified(self): + """ + The value to store as the ``client_modified`` timestamp. Dropbox + automatically records the time at which the file was written to the + Dropbox servers. It can also record an additional timestamp, provided by + Dropbox desktop clients, mobile clients, and API apps of when the file + was actually created or modified. + + :rtype: datetime.datetime + """ + if self._client_modified_present: + return self._client_modified_value + else: + return None + + @client_modified.setter + def client_modified(self, val): + if val is None: + del self.client_modified + return + val = self._client_modified_validator.validate(val) + self._client_modified_value = val + self._client_modified_present = True + + @client_modified.deleter + def client_modified(self): + self._client_modified_value = None + self._client_modified_present = False + + @property + def mute(self): + """ + Normally, users are made aware of any file modifications in their + Dropbox account via notifications in the client software. If ``True``, + this tells the clients that this modification shouldn't result in a user + notification. + + :rtype: bool + """ + if self._mute_present: + return self._mute_value + else: + return False + + @mute.setter + def mute(self, val): + val = self._mute_validator.validate(val) + self._mute_value = val + self._mute_present = True + + @mute.deleter + def mute(self): + self._mute_value = None + self._mute_present = False + + @property + def property_groups(self): + """ + List of custom properties to add to file. + + :rtype: list of [file_properties.PropertyGroup] + """ + if self._property_groups_present: + return self._property_groups_value + else: + return None + + @property_groups.setter + def property_groups(self, val): + if val is None: + del self.property_groups + return + val = self._property_groups_validator.validate(val) + self._property_groups_value = val + self._property_groups_present = True + + @property_groups.deleter + def property_groups(self): + self._property_groups_value = None + self._property_groups_present = False + + @property + def strict_conflict(self): + """ + Be more strict about how each :class:`WriteMode` detects conflict. For + example, always return a conflict error when ``mode`` = + ``WriteMode.update`` and the given "rev" doesn't match the existing + file's "rev", even if the existing file has been deleted. + + :rtype: bool + """ + if self._strict_conflict_present: + return self._strict_conflict_value + else: + return False + + @strict_conflict.setter + def strict_conflict(self, val): + val = self._strict_conflict_validator.validate(val) + self._strict_conflict_value = val + self._strict_conflict_present = True + + @strict_conflict.deleter + def strict_conflict(self): + self._strict_conflict_value = None + self._strict_conflict_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(CommitInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CommitInfo(path={!r}, mode={!r}, autorename={!r}, client_modified={!r}, mute={!r}, property_groups={!r}, strict_conflict={!r})'.format( + self._path_value, + self._mode_value, + self._autorename_value, + self._client_modified_value, + self._mute_value, + self._property_groups_value, + self._strict_conflict_value, + ) + +CommitInfo_validator = bv.Struct(CommitInfo) + +class CommitInfoWithProperties(CommitInfo): + + __slots__ = [ + ] + + _has_required_fields = True + + def __init__(self, + path=None, + mode=None, + autorename=None, + client_modified=None, + mute=None, + property_groups=None, + strict_conflict=None): + super(CommitInfoWithProperties, self).__init__(path, + mode, + autorename, + client_modified, + mute, + property_groups, + strict_conflict) + + def _process_custom_annotations(self, annotation_type, processor): + super(CommitInfoWithProperties, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CommitInfoWithProperties(path={!r}, mode={!r}, autorename={!r}, client_modified={!r}, mute={!r}, property_groups={!r}, strict_conflict={!r})'.format( + self._path_value, + self._mode_value, + self._autorename_value, + self._client_modified_value, + self._mute_value, + self._property_groups_value, + self._strict_conflict_value, + ) + +CommitInfoWithProperties_validator = bv.Struct(CommitInfoWithProperties) + +class ContentSyncSetting(bb.Struct): + """ + :ivar id: Id of the item this setting is applied to. + :ivar sync_setting: Setting for this item. + """ + + __slots__ = [ + '_id_value', + '_id_present', + '_sync_setting_value', + '_sync_setting_present', + ] + + _has_required_fields = True + + def __init__(self, + id=None, + sync_setting=None): + self._id_value = None + self._id_present = False + self._sync_setting_value = None + self._sync_setting_present = False + if id is not None: + self.id = id + if sync_setting is not None: + self.sync_setting = sync_setting + + @property + def id(self): + """ + Id of the item this setting is applied to. + + :rtype: str + """ + if self._id_present: + return self._id_value + else: + raise AttributeError("missing required field 'id'") + + @id.setter + def id(self, val): + val = self._id_validator.validate(val) + self._id_value = val + self._id_present = True + + @id.deleter + def id(self): + self._id_value = None + self._id_present = False + + @property + def sync_setting(self): + """ + Setting for this item. + + :rtype: SyncSetting + """ + if self._sync_setting_present: + return self._sync_setting_value + else: + raise AttributeError("missing required field 'sync_setting'") + + @sync_setting.setter + def sync_setting(self, val): + self._sync_setting_validator.validate_type_only(val) + self._sync_setting_value = val + self._sync_setting_present = True + + @sync_setting.deleter + def sync_setting(self): + self._sync_setting_value = None + self._sync_setting_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ContentSyncSetting, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ContentSyncSetting(id={!r}, sync_setting={!r})'.format( + self._id_value, + self._sync_setting_value, + ) + +ContentSyncSetting_validator = bv.Struct(ContentSyncSetting) + +class ContentSyncSettingArg(bb.Struct): + """ + :ivar id: Id of the item this setting is applied to. + :ivar sync_setting: Setting for this item. + """ + + __slots__ = [ + '_id_value', + '_id_present', + '_sync_setting_value', + '_sync_setting_present', + ] + + _has_required_fields = True + + def __init__(self, + id=None, + sync_setting=None): + self._id_value = None + self._id_present = False + self._sync_setting_value = None + self._sync_setting_present = False + if id is not None: + self.id = id + if sync_setting is not None: + self.sync_setting = sync_setting + + @property + def id(self): + """ + Id of the item this setting is applied to. + + :rtype: str + """ + if self._id_present: + return self._id_value + else: + raise AttributeError("missing required field 'id'") + + @id.setter + def id(self, val): + val = self._id_validator.validate(val) + self._id_value = val + self._id_present = True + + @id.deleter + def id(self): + self._id_value = None + self._id_present = False + + @property + def sync_setting(self): + """ + Setting for this item. + + :rtype: SyncSettingArg + """ + if self._sync_setting_present: + return self._sync_setting_value + else: + raise AttributeError("missing required field 'sync_setting'") + + @sync_setting.setter + def sync_setting(self, val): + self._sync_setting_validator.validate_type_only(val) + self._sync_setting_value = val + self._sync_setting_present = True + + @sync_setting.deleter + def sync_setting(self): + self._sync_setting_value = None + self._sync_setting_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ContentSyncSettingArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ContentSyncSettingArg(id={!r}, sync_setting={!r})'.format( + self._id_value, + self._sync_setting_value, + ) + +ContentSyncSettingArg_validator = bv.Struct(ContentSyncSettingArg) + +class CreateFolderArg(bb.Struct): + """ + :ivar path: Path in the user's Dropbox to create. + :ivar autorename: If there's a conflict, have the Dropbox server try to + autorename the folder to avoid the conflict. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_autorename_value', + '_autorename_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + autorename=None): + self._path_value = None + self._path_present = False + self._autorename_value = None + self._autorename_present = False + if path is not None: + self.path = path + if autorename is not None: + self.autorename = autorename + + @property + def path(self): + """ + Path in the user's Dropbox to create. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def autorename(self): + """ + If there's a conflict, have the Dropbox server try to autorename the + folder to avoid the conflict. + + :rtype: bool + """ + if self._autorename_present: + return self._autorename_value + else: + return False + + @autorename.setter + def autorename(self, val): + val = self._autorename_validator.validate(val) + self._autorename_value = val + self._autorename_present = True + + @autorename.deleter + def autorename(self): + self._autorename_value = None + self._autorename_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateFolderArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateFolderArg(path={!r}, autorename={!r})'.format( + self._path_value, + self._autorename_value, + ) + +CreateFolderArg_validator = bv.Struct(CreateFolderArg) + +class CreateFolderBatchArg(bb.Struct): + """ + :ivar paths: List of paths to be created in the user's Dropbox. Duplicate + path arguments in the batch are considered only once. + :ivar autorename: If there's a conflict, have the Dropbox server try to + autorename the folder to avoid the conflict. + :ivar force_async: Whether to force the create to happen asynchronously. + """ + + __slots__ = [ + '_paths_value', + '_paths_present', + '_autorename_value', + '_autorename_present', + '_force_async_value', + '_force_async_present', + ] + + _has_required_fields = True + + def __init__(self, + paths=None, + autorename=None, + force_async=None): + self._paths_value = None + self._paths_present = False + self._autorename_value = None + self._autorename_present = False + self._force_async_value = None + self._force_async_present = False + if paths is not None: + self.paths = paths + if autorename is not None: + self.autorename = autorename + if force_async is not None: + self.force_async = force_async + + @property + def paths(self): + """ + List of paths to be created in the user's Dropbox. Duplicate path + arguments in the batch are considered only once. + + :rtype: list of [str] + """ + if self._paths_present: + return self._paths_value + else: + raise AttributeError("missing required field 'paths'") + + @paths.setter + def paths(self, val): + val = self._paths_validator.validate(val) + self._paths_value = val + self._paths_present = True + + @paths.deleter + def paths(self): + self._paths_value = None + self._paths_present = False + + @property + def autorename(self): + """ + If there's a conflict, have the Dropbox server try to autorename the + folder to avoid the conflict. + + :rtype: bool + """ + if self._autorename_present: + return self._autorename_value + else: + return False + + @autorename.setter + def autorename(self, val): + val = self._autorename_validator.validate(val) + self._autorename_value = val + self._autorename_present = True + + @autorename.deleter + def autorename(self): + self._autorename_value = None + self._autorename_present = False + + @property + def force_async(self): + """ + Whether to force the create to happen asynchronously. + + :rtype: bool + """ + if self._force_async_present: + return self._force_async_value + else: + return False + + @force_async.setter + def force_async(self, val): + val = self._force_async_validator.validate(val) + self._force_async_value = val + self._force_async_present = True + + @force_async.deleter + def force_async(self): + self._force_async_value = None + self._force_async_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateFolderBatchArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateFolderBatchArg(paths={!r}, autorename={!r}, force_async={!r})'.format( + self._paths_value, + self._autorename_value, + self._force_async_value, + ) + +CreateFolderBatchArg_validator = bv.Struct(CreateFolderBatchArg) + +class CreateFolderBatchError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar too_many_files: The operation would involve too many files or folders. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + too_many_files = None + # Attribute is overwritten below the class definition + other = None + + def is_too_many_files(self): + """ + Check if the union tag is ``too_many_files``. + + :rtype: bool + """ + return self._tag == 'too_many_files' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateFolderBatchError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateFolderBatchError(%r, %r)' % (self._tag, self._value) + +CreateFolderBatchError_validator = bv.Union(CreateFolderBatchError) + +class CreateFolderBatchJobStatus(async_.PollResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar CreateFolderBatchResult complete: The batch create folder has + finished. + :ivar CreateFolderBatchError failed: The batch create folder has failed. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param CreateFolderBatchResult val: + :rtype: CreateFolderBatchJobStatus + """ + return cls('complete', val) + + @classmethod + def failed(cls, val): + """ + Create an instance of this class set to the ``failed`` tag with value + ``val``. + + :param CreateFolderBatchError val: + :rtype: CreateFolderBatchJobStatus + """ + return cls('failed', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def is_failed(self): + """ + Check if the union tag is ``failed``. + + :rtype: bool + """ + return self._tag == 'failed' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_complete(self): + """ + The batch create folder has finished. + + Only call this if :meth:`is_complete` is true. + + :rtype: CreateFolderBatchResult + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def get_failed(self): + """ + The batch create folder has failed. + + Only call this if :meth:`is_failed` is true. + + :rtype: CreateFolderBatchError + """ + if not self.is_failed(): + raise AttributeError("tag 'failed' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateFolderBatchJobStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateFolderBatchJobStatus(%r, %r)' % (self._tag, self._value) + +CreateFolderBatchJobStatus_validator = bv.Union(CreateFolderBatchJobStatus) + +class CreateFolderBatchLaunch(async_.LaunchResultBase): + """ + Result returned by :meth:`dropbox.dropbox.Dropbox.files_create_folder_batch` + that may either launch an asynchronous job or complete synchronously. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param CreateFolderBatchResult val: + :rtype: CreateFolderBatchLaunch + """ + return cls('complete', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_complete(self): + """ + Only call this if :meth:`is_complete` is true. + + :rtype: CreateFolderBatchResult + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateFolderBatchLaunch, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateFolderBatchLaunch(%r, %r)' % (self._tag, self._value) + +CreateFolderBatchLaunch_validator = bv.Union(CreateFolderBatchLaunch) + +class FileOpsResult(bb.Struct): + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(FileOpsResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileOpsResult()' + +FileOpsResult_validator = bv.Struct(FileOpsResult) + +class CreateFolderBatchResult(FileOpsResult): + """ + :ivar entries: Each entry in ``CreateFolderBatchArg.paths`` will appear at + the same position inside ``CreateFolderBatchResult.entries``. + """ + + __slots__ = [ + '_entries_value', + '_entries_present', + ] + + _has_required_fields = True + + def __init__(self, + entries=None): + super(CreateFolderBatchResult, self).__init__() + self._entries_value = None + self._entries_present = False + if entries is not None: + self.entries = entries + + @property + def entries(self): + """ + Each entry in ``CreateFolderBatchArg.paths`` will appear at the same + position inside ``CreateFolderBatchResult.entries``. + + :rtype: list of [CreateFolderBatchResultEntry] + """ + if self._entries_present: + return self._entries_value + else: + raise AttributeError("missing required field 'entries'") + + @entries.setter + def entries(self, val): + val = self._entries_validator.validate(val) + self._entries_value = val + self._entries_present = True + + @entries.deleter + def entries(self): + self._entries_value = None + self._entries_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateFolderBatchResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateFolderBatchResult(entries={!r})'.format( + self._entries_value, + ) + +CreateFolderBatchResult_validator = bv.Struct(CreateFolderBatchResult) + +class CreateFolderBatchResultEntry(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = None + + @classmethod + def success(cls, val): + """ + Create an instance of this class set to the ``success`` tag with value + ``val``. + + :param CreateFolderEntryResult val: + :rtype: CreateFolderBatchResultEntry + """ + return cls('success', val) + + @classmethod + def failure(cls, val): + """ + Create an instance of this class set to the ``failure`` tag with value + ``val``. + + :param CreateFolderEntryError val: + :rtype: CreateFolderBatchResultEntry + """ + return cls('failure', val) + + def is_success(self): + """ + Check if the union tag is ``success``. + + :rtype: bool + """ + return self._tag == 'success' + + def is_failure(self): + """ + Check if the union tag is ``failure``. + + :rtype: bool + """ + return self._tag == 'failure' + + def get_success(self): + """ + Only call this if :meth:`is_success` is true. + + :rtype: CreateFolderEntryResult + """ + if not self.is_success(): + raise AttributeError("tag 'success' not set") + return self._value + + def get_failure(self): + """ + Only call this if :meth:`is_failure` is true. + + :rtype: CreateFolderEntryError + """ + if not self.is_failure(): + raise AttributeError("tag 'failure' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateFolderBatchResultEntry, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateFolderBatchResultEntry(%r, %r)' % (self._tag, self._value) + +CreateFolderBatchResultEntry_validator = bv.Union(CreateFolderBatchResultEntry) + +class CreateFolderEntryError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param WriteError val: + :rtype: CreateFolderEntryError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: WriteError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateFolderEntryError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateFolderEntryError(%r, %r)' % (self._tag, self._value) + +CreateFolderEntryError_validator = bv.Union(CreateFolderEntryError) + +class CreateFolderEntryResult(bb.Struct): + """ + :ivar metadata: Metadata of the created folder. + """ + + __slots__ = [ + '_metadata_value', + '_metadata_present', + ] + + _has_required_fields = True + + def __init__(self, + metadata=None): + self._metadata_value = None + self._metadata_present = False + if metadata is not None: + self.metadata = metadata + + @property + def metadata(self): + """ + Metadata of the created folder. + + :rtype: FolderMetadata + """ + if self._metadata_present: + return self._metadata_value + else: + raise AttributeError("missing required field 'metadata'") + + @metadata.setter + def metadata(self, val): + self._metadata_validator.validate_type_only(val) + self._metadata_value = val + self._metadata_present = True + + @metadata.deleter + def metadata(self): + self._metadata_value = None + self._metadata_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateFolderEntryResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateFolderEntryResult(metadata={!r})'.format( + self._metadata_value, + ) + +CreateFolderEntryResult_validator = bv.Struct(CreateFolderEntryResult) + +class CreateFolderError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param WriteError val: + :rtype: CreateFolderError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: WriteError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateFolderError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateFolderError(%r, %r)' % (self._tag, self._value) + +CreateFolderError_validator = bv.Union(CreateFolderError) + +class CreateFolderResult(FileOpsResult): + """ + :ivar metadata: Metadata of the created folder. + """ + + __slots__ = [ + '_metadata_value', + '_metadata_present', + ] + + _has_required_fields = True + + def __init__(self, + metadata=None): + super(CreateFolderResult, self).__init__() + self._metadata_value = None + self._metadata_present = False + if metadata is not None: + self.metadata = metadata + + @property + def metadata(self): + """ + Metadata of the created folder. + + :rtype: FolderMetadata + """ + if self._metadata_present: + return self._metadata_value + else: + raise AttributeError("missing required field 'metadata'") + + @metadata.setter + def metadata(self, val): + self._metadata_validator.validate_type_only(val) + self._metadata_value = val + self._metadata_present = True + + @metadata.deleter + def metadata(self): + self._metadata_value = None + self._metadata_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateFolderResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateFolderResult(metadata={!r})'.format( + self._metadata_value, + ) + +CreateFolderResult_validator = bv.Struct(CreateFolderResult) + +class DeleteArg(bb.Struct): + """ + :ivar path: Path in the user's Dropbox to delete. + :ivar parent_rev: Perform delete if given "rev" matches the existing file's + latest "rev". This field does not support deleting a folder. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_parent_rev_value', + '_parent_rev_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + parent_rev=None): + self._path_value = None + self._path_present = False + self._parent_rev_value = None + self._parent_rev_present = False + if path is not None: + self.path = path + if parent_rev is not None: + self.parent_rev = parent_rev + + @property + def path(self): + """ + Path in the user's Dropbox to delete. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def parent_rev(self): + """ + Perform delete if given "rev" matches the existing file's latest "rev". + This field does not support deleting a folder. + + :rtype: str + """ + if self._parent_rev_present: + return self._parent_rev_value + else: + return None + + @parent_rev.setter + def parent_rev(self, val): + if val is None: + del self.parent_rev + return + val = self._parent_rev_validator.validate(val) + self._parent_rev_value = val + self._parent_rev_present = True + + @parent_rev.deleter + def parent_rev(self): + self._parent_rev_value = None + self._parent_rev_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeleteArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeleteArg(path={!r}, parent_rev={!r})'.format( + self._path_value, + self._parent_rev_value, + ) + +DeleteArg_validator = bv.Struct(DeleteArg) + +class DeleteBatchArg(bb.Struct): + + __slots__ = [ + '_entries_value', + '_entries_present', + ] + + _has_required_fields = True + + def __init__(self, + entries=None): + self._entries_value = None + self._entries_present = False + if entries is not None: + self.entries = entries + + @property + def entries(self): + """ + :rtype: list of [DeleteArg] + """ + if self._entries_present: + return self._entries_value + else: + raise AttributeError("missing required field 'entries'") + + @entries.setter + def entries(self, val): + val = self._entries_validator.validate(val) + self._entries_value = val + self._entries_present = True + + @entries.deleter + def entries(self): + self._entries_value = None + self._entries_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeleteBatchArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeleteBatchArg(entries={!r})'.format( + self._entries_value, + ) + +DeleteBatchArg_validator = bv.Struct(DeleteBatchArg) + +class DeleteBatchError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar too_many_write_operations: Use + ``DeleteError.too_many_write_operations``. + :meth:`dropbox.dropbox.Dropbox.files_delete_batch` now provides smaller + granularity about which entry has failed because of this. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + too_many_write_operations = None + # Attribute is overwritten below the class definition + other = None + + def is_too_many_write_operations(self): + """ + Check if the union tag is ``too_many_write_operations``. + + :rtype: bool + """ + return self._tag == 'too_many_write_operations' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(DeleteBatchError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeleteBatchError(%r, %r)' % (self._tag, self._value) + +DeleteBatchError_validator = bv.Union(DeleteBatchError) + +class DeleteBatchJobStatus(async_.PollResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar DeleteBatchResult complete: The batch delete has finished. + :ivar DeleteBatchError failed: The batch delete has failed. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param DeleteBatchResult val: + :rtype: DeleteBatchJobStatus + """ + return cls('complete', val) + + @classmethod + def failed(cls, val): + """ + Create an instance of this class set to the ``failed`` tag with value + ``val``. + + :param DeleteBatchError val: + :rtype: DeleteBatchJobStatus + """ + return cls('failed', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def is_failed(self): + """ + Check if the union tag is ``failed``. + + :rtype: bool + """ + return self._tag == 'failed' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_complete(self): + """ + The batch delete has finished. + + Only call this if :meth:`is_complete` is true. + + :rtype: DeleteBatchResult + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def get_failed(self): + """ + The batch delete has failed. + + Only call this if :meth:`is_failed` is true. + + :rtype: DeleteBatchError + """ + if not self.is_failed(): + raise AttributeError("tag 'failed' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(DeleteBatchJobStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeleteBatchJobStatus(%r, %r)' % (self._tag, self._value) + +DeleteBatchJobStatus_validator = bv.Union(DeleteBatchJobStatus) + +class DeleteBatchLaunch(async_.LaunchResultBase): + """ + Result returned by :meth:`dropbox.dropbox.Dropbox.files_delete_batch` that + may either launch an asynchronous job or complete synchronously. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param DeleteBatchResult val: + :rtype: DeleteBatchLaunch + """ + return cls('complete', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_complete(self): + """ + Only call this if :meth:`is_complete` is true. + + :rtype: DeleteBatchResult + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(DeleteBatchLaunch, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeleteBatchLaunch(%r, %r)' % (self._tag, self._value) + +DeleteBatchLaunch_validator = bv.Union(DeleteBatchLaunch) + +class DeleteBatchResult(FileOpsResult): + """ + :ivar entries: Each entry in ``DeleteBatchArg.entries`` will appear at the + same position inside ``DeleteBatchResult.entries``. + """ + + __slots__ = [ + '_entries_value', + '_entries_present', + ] + + _has_required_fields = True + + def __init__(self, + entries=None): + super(DeleteBatchResult, self).__init__() + self._entries_value = None + self._entries_present = False + if entries is not None: + self.entries = entries + + @property + def entries(self): + """ + Each entry in ``DeleteBatchArg.entries`` will appear at the same + position inside ``DeleteBatchResult.entries``. + + :rtype: list of [DeleteBatchResultEntry] + """ + if self._entries_present: + return self._entries_value + else: + raise AttributeError("missing required field 'entries'") + + @entries.setter + def entries(self, val): + val = self._entries_validator.validate(val) + self._entries_value = val + self._entries_present = True + + @entries.deleter + def entries(self): + self._entries_value = None + self._entries_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeleteBatchResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeleteBatchResult(entries={!r})'.format( + self._entries_value, + ) + +DeleteBatchResult_validator = bv.Struct(DeleteBatchResult) + +class DeleteBatchResultData(bb.Struct): + """ + :ivar metadata: Metadata of the deleted object. + """ + + __slots__ = [ + '_metadata_value', + '_metadata_present', + ] + + _has_required_fields = True + + def __init__(self, + metadata=None): + self._metadata_value = None + self._metadata_present = False + if metadata is not None: + self.metadata = metadata + + @property + def metadata(self): + """ + Metadata of the deleted object. + + :rtype: Metadata + """ + if self._metadata_present: + return self._metadata_value + else: + raise AttributeError("missing required field 'metadata'") + + @metadata.setter + def metadata(self, val): + self._metadata_validator.validate_type_only(val) + self._metadata_value = val + self._metadata_present = True + + @metadata.deleter + def metadata(self): + self._metadata_value = None + self._metadata_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeleteBatchResultData, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeleteBatchResultData(metadata={!r})'.format( + self._metadata_value, + ) + +DeleteBatchResultData_validator = bv.Struct(DeleteBatchResultData) + +class DeleteBatchResultEntry(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = None + + @classmethod + def success(cls, val): + """ + Create an instance of this class set to the ``success`` tag with value + ``val``. + + :param DeleteBatchResultData val: + :rtype: DeleteBatchResultEntry + """ + return cls('success', val) + + @classmethod + def failure(cls, val): + """ + Create an instance of this class set to the ``failure`` tag with value + ``val``. + + :param DeleteError val: + :rtype: DeleteBatchResultEntry + """ + return cls('failure', val) + + def is_success(self): + """ + Check if the union tag is ``success``. + + :rtype: bool + """ + return self._tag == 'success' + + def is_failure(self): + """ + Check if the union tag is ``failure``. + + :rtype: bool + """ + return self._tag == 'failure' + + def get_success(self): + """ + Only call this if :meth:`is_success` is true. + + :rtype: DeleteBatchResultData + """ + if not self.is_success(): + raise AttributeError("tag 'success' not set") + return self._value + + def get_failure(self): + """ + Only call this if :meth:`is_failure` is true. + + :rtype: DeleteError + """ + if not self.is_failure(): + raise AttributeError("tag 'failure' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(DeleteBatchResultEntry, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeleteBatchResultEntry(%r, %r)' % (self._tag, self._value) + +DeleteBatchResultEntry_validator = bv.Union(DeleteBatchResultEntry) + +class DeleteError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar too_many_write_operations: There are too many write operations in + user's Dropbox. Please retry this request. + :ivar too_many_files: There are too many files in one request. Please retry + with fewer files. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + too_many_write_operations = None + # Attribute is overwritten below the class definition + too_many_files = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path_lookup(cls, val): + """ + Create an instance of this class set to the ``path_lookup`` tag with + value ``val``. + + :param LookupError val: + :rtype: DeleteError + """ + return cls('path_lookup', val) + + @classmethod + def path_write(cls, val): + """ + Create an instance of this class set to the ``path_write`` tag with + value ``val``. + + :param WriteError val: + :rtype: DeleteError + """ + return cls('path_write', val) + + def is_path_lookup(self): + """ + Check if the union tag is ``path_lookup``. + + :rtype: bool + """ + return self._tag == 'path_lookup' + + def is_path_write(self): + """ + Check if the union tag is ``path_write``. + + :rtype: bool + """ + return self._tag == 'path_write' + + def is_too_many_write_operations(self): + """ + Check if the union tag is ``too_many_write_operations``. + + :rtype: bool + """ + return self._tag == 'too_many_write_operations' + + def is_too_many_files(self): + """ + Check if the union tag is ``too_many_files``. + + :rtype: bool + """ + return self._tag == 'too_many_files' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path_lookup(self): + """ + Only call this if :meth:`is_path_lookup` is true. + + :rtype: LookupError + """ + if not self.is_path_lookup(): + raise AttributeError("tag 'path_lookup' not set") + return self._value + + def get_path_write(self): + """ + Only call this if :meth:`is_path_write` is true. + + :rtype: WriteError + """ + if not self.is_path_write(): + raise AttributeError("tag 'path_write' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(DeleteError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeleteError(%r, %r)' % (self._tag, self._value) + +DeleteError_validator = bv.Union(DeleteError) + +class DeleteResult(FileOpsResult): + """ + :ivar metadata: Metadata of the deleted object. + """ + + __slots__ = [ + '_metadata_value', + '_metadata_present', + ] + + _has_required_fields = True + + def __init__(self, + metadata=None): + super(DeleteResult, self).__init__() + self._metadata_value = None + self._metadata_present = False + if metadata is not None: + self.metadata = metadata + + @property + def metadata(self): + """ + Metadata of the deleted object. + + :rtype: Metadata + """ + if self._metadata_present: + return self._metadata_value + else: + raise AttributeError("missing required field 'metadata'") + + @metadata.setter + def metadata(self, val): + self._metadata_validator.validate_type_only(val) + self._metadata_value = val + self._metadata_present = True + + @metadata.deleter + def metadata(self): + self._metadata_value = None + self._metadata_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeleteResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeleteResult(metadata={!r})'.format( + self._metadata_value, + ) + +DeleteResult_validator = bv.Struct(DeleteResult) + +class Metadata(bb.Struct): + """ + Metadata for a file or folder. + + :ivar name: The last component of the path (including extension). This never + contains a slash. + :ivar path_lower: The lowercased full path in the user's Dropbox. This + always starts with a slash. This field will be null if the file or + folder is not mounted. + :ivar path_display: The cased path to be used for display purposes only. In + rare instances the casing will not correctly match the user's + filesystem, but this behavior will match the path provided in the Core + API v1, and at least the last path component will have the correct + casing. Changes to only the casing of paths won't be returned by + :meth:`dropbox.dropbox.Dropbox.files_list_folder_continue`. This field + will be null if the file or folder is not mounted. + :ivar parent_shared_folder_id: Please use + ``FileSharingInfo.parent_shared_folder_id`` or + ``FolderSharingInfo.parent_shared_folder_id`` instead. + """ + + __slots__ = [ + '_name_value', + '_name_present', + '_path_lower_value', + '_path_lower_present', + '_path_display_value', + '_path_display_present', + '_parent_shared_folder_id_value', + '_parent_shared_folder_id_present', + ] + + _has_required_fields = True + + def __init__(self, + name=None, + path_lower=None, + path_display=None, + parent_shared_folder_id=None): + self._name_value = None + self._name_present = False + self._path_lower_value = None + self._path_lower_present = False + self._path_display_value = None + self._path_display_present = False + self._parent_shared_folder_id_value = None + self._parent_shared_folder_id_present = False + if name is not None: + self.name = name + if path_lower is not None: + self.path_lower = path_lower + if path_display is not None: + self.path_display = path_display + if parent_shared_folder_id is not None: + self.parent_shared_folder_id = parent_shared_folder_id + + @property + def name(self): + """ + The last component of the path (including extension). This never + contains a slash. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def path_lower(self): + """ + The lowercased full path in the user's Dropbox. This always starts with + a slash. This field will be null if the file or folder is not mounted. + + :rtype: str + """ + if self._path_lower_present: + return self._path_lower_value + else: + return None + + @path_lower.setter + def path_lower(self, val): + if val is None: + del self.path_lower + return + val = self._path_lower_validator.validate(val) + self._path_lower_value = val + self._path_lower_present = True + + @path_lower.deleter + def path_lower(self): + self._path_lower_value = None + self._path_lower_present = False + + @property + def path_display(self): + """ + The cased path to be used for display purposes only. In rare instances + the casing will not correctly match the user's filesystem, but this + behavior will match the path provided in the Core API v1, and at least + the last path component will have the correct casing. Changes to only + the casing of paths won't be returned by + :meth:`dropbox.dropbox.Dropbox.files_list_folder_continue`. This field + will be null if the file or folder is not mounted. + + :rtype: str + """ + if self._path_display_present: + return self._path_display_value + else: + return None + + @path_display.setter + def path_display(self, val): + if val is None: + del self.path_display + return + val = self._path_display_validator.validate(val) + self._path_display_value = val + self._path_display_present = True + + @path_display.deleter + def path_display(self): + self._path_display_value = None + self._path_display_present = False + + @property + def parent_shared_folder_id(self): + """ + Please use ``FileSharingInfo.parent_shared_folder_id`` or + ``FolderSharingInfo.parent_shared_folder_id`` instead. + + :rtype: str + """ + if self._parent_shared_folder_id_present: + return self._parent_shared_folder_id_value + else: + return None + + @parent_shared_folder_id.setter + def parent_shared_folder_id(self, val): + if val is None: + del self.parent_shared_folder_id + return + val = self._parent_shared_folder_id_validator.validate(val) + self._parent_shared_folder_id_value = val + self._parent_shared_folder_id_present = True + + @parent_shared_folder_id.deleter + def parent_shared_folder_id(self): + self._parent_shared_folder_id_value = None + self._parent_shared_folder_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(Metadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'Metadata(name={!r}, path_lower={!r}, path_display={!r}, parent_shared_folder_id={!r})'.format( + self._name_value, + self._path_lower_value, + self._path_display_value, + self._parent_shared_folder_id_value, + ) + +Metadata_validator = bv.StructTree(Metadata) + +class DeletedMetadata(Metadata): + """ + Indicates that there used to be a file or folder at this path, but it no + longer exists. + """ + + __slots__ = [ + ] + + _has_required_fields = True + + def __init__(self, + name=None, + path_lower=None, + path_display=None, + parent_shared_folder_id=None): + super(DeletedMetadata, self).__init__(name, + path_lower, + path_display, + parent_shared_folder_id) + + def _process_custom_annotations(self, annotation_type, processor): + super(DeletedMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeletedMetadata(name={!r}, path_lower={!r}, path_display={!r}, parent_shared_folder_id={!r})'.format( + self._name_value, + self._path_lower_value, + self._path_display_value, + self._parent_shared_folder_id_value, + ) + +DeletedMetadata_validator = bv.Struct(DeletedMetadata) + +class Dimensions(bb.Struct): + """ + Dimensions for a photo or video. + + :ivar height: Height of the photo/video. + :ivar width: Width of the photo/video. + """ + + __slots__ = [ + '_height_value', + '_height_present', + '_width_value', + '_width_present', + ] + + _has_required_fields = True + + def __init__(self, + height=None, + width=None): + self._height_value = None + self._height_present = False + self._width_value = None + self._width_present = False + if height is not None: + self.height = height + if width is not None: + self.width = width + + @property + def height(self): + """ + Height of the photo/video. + + :rtype: int + """ + if self._height_present: + return self._height_value + else: + raise AttributeError("missing required field 'height'") + + @height.setter + def height(self, val): + val = self._height_validator.validate(val) + self._height_value = val + self._height_present = True + + @height.deleter + def height(self): + self._height_value = None + self._height_present = False + + @property + def width(self): + """ + Width of the photo/video. + + :rtype: int + """ + if self._width_present: + return self._width_value + else: + raise AttributeError("missing required field 'width'") + + @width.setter + def width(self, val): + val = self._width_validator.validate(val) + self._width_value = val + self._width_present = True + + @width.deleter + def width(self): + self._width_value = None + self._width_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(Dimensions, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'Dimensions(height={!r}, width={!r})'.format( + self._height_value, + self._width_value, + ) + +Dimensions_validator = bv.Struct(Dimensions) + +class DownloadArg(bb.Struct): + """ + :ivar path: The path of the file to download. + :ivar rev: Please specify revision in ``path`` instead. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_rev_value', + '_rev_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + rev=None): + self._path_value = None + self._path_present = False + self._rev_value = None + self._rev_present = False + if path is not None: + self.path = path + if rev is not None: + self.rev = rev + + @property + def path(self): + """ + The path of the file to download. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def rev(self): + """ + Please specify revision in ``path`` instead. + + :rtype: str + """ + if self._rev_present: + return self._rev_value + else: + return None + + @rev.setter + def rev(self, val): + if val is None: + del self.rev + return + val = self._rev_validator.validate(val) + self._rev_value = val + self._rev_present = True + + @rev.deleter + def rev(self): + self._rev_value = None + self._rev_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DownloadArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DownloadArg(path={!r}, rev={!r})'.format( + self._path_value, + self._rev_value, + ) + +DownloadArg_validator = bv.Struct(DownloadArg) + +class DownloadError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param LookupError val: + :rtype: DownloadError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(DownloadError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DownloadError(%r, %r)' % (self._tag, self._value) + +DownloadError_validator = bv.Union(DownloadError) + +class DownloadZipArg(bb.Struct): + """ + :ivar path: The path of the folder to download. + """ + + __slots__ = [ + '_path_value', + '_path_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None): + self._path_value = None + self._path_present = False + if path is not None: + self.path = path + + @property + def path(self): + """ + The path of the folder to download. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DownloadZipArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DownloadZipArg(path={!r})'.format( + self._path_value, + ) + +DownloadZipArg_validator = bv.Struct(DownloadZipArg) + +class DownloadZipError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar too_large: The folder or a file is too large to download. + :ivar too_many_files: The folder has too many files to download. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + too_large = None + # Attribute is overwritten below the class definition + too_many_files = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param LookupError val: + :rtype: DownloadZipError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_too_large(self): + """ + Check if the union tag is ``too_large``. + + :rtype: bool + """ + return self._tag == 'too_large' + + def is_too_many_files(self): + """ + Check if the union tag is ``too_many_files``. + + :rtype: bool + """ + return self._tag == 'too_many_files' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(DownloadZipError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DownloadZipError(%r, %r)' % (self._tag, self._value) + +DownloadZipError_validator = bv.Union(DownloadZipError) + +class DownloadZipResult(bb.Struct): + + __slots__ = [ + '_metadata_value', + '_metadata_present', + ] + + _has_required_fields = True + + def __init__(self, + metadata=None): + self._metadata_value = None + self._metadata_present = False + if metadata is not None: + self.metadata = metadata + + @property + def metadata(self): + """ + :rtype: FolderMetadata + """ + if self._metadata_present: + return self._metadata_value + else: + raise AttributeError("missing required field 'metadata'") + + @metadata.setter + def metadata(self, val): + self._metadata_validator.validate_type_only(val) + self._metadata_value = val + self._metadata_present = True + + @metadata.deleter + def metadata(self): + self._metadata_value = None + self._metadata_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DownloadZipResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DownloadZipResult(metadata={!r})'.format( + self._metadata_value, + ) + +DownloadZipResult_validator = bv.Struct(DownloadZipResult) + +class FileMetadata(Metadata): + """ + :ivar id: A unique identifier for the file. + :ivar client_modified: For files, this is the modification time set by the + desktop client when the file was added to Dropbox. Since this time is + not verified (the Dropbox server stores whatever the desktop client + sends up), this should only be used for display purposes (such as + sorting) and not, for example, to determine if a file has changed or + not. + :ivar server_modified: The last time the file was modified on Dropbox. + :ivar rev: A unique identifier for the current revision of a file. This + field is the same rev as elsewhere in the API and can be used to detect + changes and avoid conflicts. + :ivar size: The file size in bytes. + :ivar media_info: Additional information if the file is a photo or video. + :ivar symlink_info: Set if this file is a symlink. + :ivar sharing_info: Set if this file is contained in a shared folder. + :ivar property_groups: Additional information if the file has custom + properties with the property template specified. + :ivar has_explicit_shared_members: This flag will only be present if + include_has_explicit_shared_members is true in + :meth:`dropbox.dropbox.Dropbox.files_list_folder` or + :meth:`dropbox.dropbox.Dropbox.files_get_metadata`. If this flag is + present, it will be true if this file has any explicit shared members. + This is different from sharing_info in that this could be true in the + case where a file has explicit members but is not contained within a + shared folder. + :ivar content_hash: A hash of the file content. This field can be used to + verify data integrity. For more information see our `Content hash + `_ page. + """ + + __slots__ = [ + '_id_value', + '_id_present', + '_client_modified_value', + '_client_modified_present', + '_server_modified_value', + '_server_modified_present', + '_rev_value', + '_rev_present', + '_size_value', + '_size_present', + '_media_info_value', + '_media_info_present', + '_symlink_info_value', + '_symlink_info_present', + '_sharing_info_value', + '_sharing_info_present', + '_property_groups_value', + '_property_groups_present', + '_has_explicit_shared_members_value', + '_has_explicit_shared_members_present', + '_content_hash_value', + '_content_hash_present', + ] + + _has_required_fields = True + + def __init__(self, + name=None, + id=None, + client_modified=None, + server_modified=None, + rev=None, + size=None, + path_lower=None, + path_display=None, + parent_shared_folder_id=None, + media_info=None, + symlink_info=None, + sharing_info=None, + property_groups=None, + has_explicit_shared_members=None, + content_hash=None): + super(FileMetadata, self).__init__(name, + path_lower, + path_display, + parent_shared_folder_id) + self._id_value = None + self._id_present = False + self._client_modified_value = None + self._client_modified_present = False + self._server_modified_value = None + self._server_modified_present = False + self._rev_value = None + self._rev_present = False + self._size_value = None + self._size_present = False + self._media_info_value = None + self._media_info_present = False + self._symlink_info_value = None + self._symlink_info_present = False + self._sharing_info_value = None + self._sharing_info_present = False + self._property_groups_value = None + self._property_groups_present = False + self._has_explicit_shared_members_value = None + self._has_explicit_shared_members_present = False + self._content_hash_value = None + self._content_hash_present = False + if id is not None: + self.id = id + if client_modified is not None: + self.client_modified = client_modified + if server_modified is not None: + self.server_modified = server_modified + if rev is not None: + self.rev = rev + if size is not None: + self.size = size + if media_info is not None: + self.media_info = media_info + if symlink_info is not None: + self.symlink_info = symlink_info + if sharing_info is not None: + self.sharing_info = sharing_info + if property_groups is not None: + self.property_groups = property_groups + if has_explicit_shared_members is not None: + self.has_explicit_shared_members = has_explicit_shared_members + if content_hash is not None: + self.content_hash = content_hash + + @property + def id(self): + """ + A unique identifier for the file. + + :rtype: str + """ + if self._id_present: + return self._id_value + else: + raise AttributeError("missing required field 'id'") + + @id.setter + def id(self, val): + val = self._id_validator.validate(val) + self._id_value = val + self._id_present = True + + @id.deleter + def id(self): + self._id_value = None + self._id_present = False + + @property + def client_modified(self): + """ + For files, this is the modification time set by the desktop client when + the file was added to Dropbox. Since this time is not verified (the + Dropbox server stores whatever the desktop client sends up), this should + only be used for display purposes (such as sorting) and not, for + example, to determine if a file has changed or not. + + :rtype: datetime.datetime + """ + if self._client_modified_present: + return self._client_modified_value + else: + raise AttributeError("missing required field 'client_modified'") + + @client_modified.setter + def client_modified(self, val): + val = self._client_modified_validator.validate(val) + self._client_modified_value = val + self._client_modified_present = True + + @client_modified.deleter + def client_modified(self): + self._client_modified_value = None + self._client_modified_present = False + + @property + def server_modified(self): + """ + The last time the file was modified on Dropbox. + + :rtype: datetime.datetime + """ + if self._server_modified_present: + return self._server_modified_value + else: + raise AttributeError("missing required field 'server_modified'") + + @server_modified.setter + def server_modified(self, val): + val = self._server_modified_validator.validate(val) + self._server_modified_value = val + self._server_modified_present = True + + @server_modified.deleter + def server_modified(self): + self._server_modified_value = None + self._server_modified_present = False + + @property + def rev(self): + """ + A unique identifier for the current revision of a file. This field is + the same rev as elsewhere in the API and can be used to detect changes + and avoid conflicts. + + :rtype: str + """ + if self._rev_present: + return self._rev_value + else: + raise AttributeError("missing required field 'rev'") + + @rev.setter + def rev(self, val): + val = self._rev_validator.validate(val) + self._rev_value = val + self._rev_present = True + + @rev.deleter + def rev(self): + self._rev_value = None + self._rev_present = False + + @property + def size(self): + """ + The file size in bytes. + + :rtype: int + """ + if self._size_present: + return self._size_value + else: + raise AttributeError("missing required field 'size'") + + @size.setter + def size(self, val): + val = self._size_validator.validate(val) + self._size_value = val + self._size_present = True + + @size.deleter + def size(self): + self._size_value = None + self._size_present = False + + @property + def media_info(self): + """ + Additional information if the file is a photo or video. + + :rtype: MediaInfo + """ + if self._media_info_present: + return self._media_info_value + else: + return None + + @media_info.setter + def media_info(self, val): + if val is None: + del self.media_info + return + self._media_info_validator.validate_type_only(val) + self._media_info_value = val + self._media_info_present = True + + @media_info.deleter + def media_info(self): + self._media_info_value = None + self._media_info_present = False + + @property + def symlink_info(self): + """ + Set if this file is a symlink. + + :rtype: SymlinkInfo + """ + if self._symlink_info_present: + return self._symlink_info_value + else: + return None + + @symlink_info.setter + def symlink_info(self, val): + if val is None: + del self.symlink_info + return + self._symlink_info_validator.validate_type_only(val) + self._symlink_info_value = val + self._symlink_info_present = True + + @symlink_info.deleter + def symlink_info(self): + self._symlink_info_value = None + self._symlink_info_present = False + + @property + def sharing_info(self): + """ + Set if this file is contained in a shared folder. + + :rtype: FileSharingInfo + """ + if self._sharing_info_present: + return self._sharing_info_value + else: + return None + + @sharing_info.setter + def sharing_info(self, val): + if val is None: + del self.sharing_info + return + self._sharing_info_validator.validate_type_only(val) + self._sharing_info_value = val + self._sharing_info_present = True + + @sharing_info.deleter + def sharing_info(self): + self._sharing_info_value = None + self._sharing_info_present = False + + @property + def property_groups(self): + """ + Additional information if the file has custom properties with the + property template specified. + + :rtype: list of [file_properties.PropertyGroup] + """ + if self._property_groups_present: + return self._property_groups_value + else: + return None + + @property_groups.setter + def property_groups(self, val): + if val is None: + del self.property_groups + return + val = self._property_groups_validator.validate(val) + self._property_groups_value = val + self._property_groups_present = True + + @property_groups.deleter + def property_groups(self): + self._property_groups_value = None + self._property_groups_present = False + + @property + def has_explicit_shared_members(self): + """ + This flag will only be present if include_has_explicit_shared_members + is true in :meth:`dropbox.dropbox.Dropbox.files_list_folder` or + :meth:`dropbox.dropbox.Dropbox.files_get_metadata`. If this flag is + present, it will be true if this file has any explicit shared members. + This is different from sharing_info in that this could be true in the + case where a file has explicit members but is not contained within a + shared folder. + + :rtype: bool + """ + if self._has_explicit_shared_members_present: + return self._has_explicit_shared_members_value + else: + return None + + @has_explicit_shared_members.setter + def has_explicit_shared_members(self, val): + if val is None: + del self.has_explicit_shared_members + return + val = self._has_explicit_shared_members_validator.validate(val) + self._has_explicit_shared_members_value = val + self._has_explicit_shared_members_present = True + + @has_explicit_shared_members.deleter + def has_explicit_shared_members(self): + self._has_explicit_shared_members_value = None + self._has_explicit_shared_members_present = False + + @property + def content_hash(self): + """ + A hash of the file content. This field can be used to verify data + integrity. For more information see our `Content hash + `_ page. + + :rtype: str + """ + if self._content_hash_present: + return self._content_hash_value + else: + return None + + @content_hash.setter + def content_hash(self, val): + if val is None: + del self.content_hash + return + val = self._content_hash_validator.validate(val) + self._content_hash_value = val + self._content_hash_present = True + + @content_hash.deleter + def content_hash(self): + self._content_hash_value = None + self._content_hash_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileMetadata(name={!r}, id={!r}, client_modified={!r}, server_modified={!r}, rev={!r}, size={!r}, path_lower={!r}, path_display={!r}, parent_shared_folder_id={!r}, media_info={!r}, symlink_info={!r}, sharing_info={!r}, property_groups={!r}, has_explicit_shared_members={!r}, content_hash={!r})'.format( + self._name_value, + self._id_value, + self._client_modified_value, + self._server_modified_value, + self._rev_value, + self._size_value, + self._path_lower_value, + self._path_display_value, + self._parent_shared_folder_id_value, + self._media_info_value, + self._symlink_info_value, + self._sharing_info_value, + self._property_groups_value, + self._has_explicit_shared_members_value, + self._content_hash_value, + ) + +FileMetadata_validator = bv.Struct(FileMetadata) + +class SharingInfo(bb.Struct): + """ + Sharing info for a file or folder. + + :ivar read_only: True if the file or folder is inside a read-only shared + folder. + """ + + __slots__ = [ + '_read_only_value', + '_read_only_present', + ] + + _has_required_fields = True + + def __init__(self, + read_only=None): + self._read_only_value = None + self._read_only_present = False + if read_only is not None: + self.read_only = read_only + + @property + def read_only(self): + """ + True if the file or folder is inside a read-only shared folder. + + :rtype: bool + """ + if self._read_only_present: + return self._read_only_value + else: + raise AttributeError("missing required field 'read_only'") + + @read_only.setter + def read_only(self, val): + val = self._read_only_validator.validate(val) + self._read_only_value = val + self._read_only_present = True + + @read_only.deleter + def read_only(self): + self._read_only_value = None + self._read_only_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharingInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharingInfo(read_only={!r})'.format( + self._read_only_value, + ) + +SharingInfo_validator = bv.Struct(SharingInfo) + +class FileSharingInfo(SharingInfo): + """ + Sharing info for a file which is contained by a shared folder. + + :ivar parent_shared_folder_id: ID of shared folder that holds this file. + :ivar modified_by: The last user who modified the file. This field will be + null if the user's account has been deleted. + """ + + __slots__ = [ + '_parent_shared_folder_id_value', + '_parent_shared_folder_id_present', + '_modified_by_value', + '_modified_by_present', + ] + + _has_required_fields = True + + def __init__(self, + read_only=None, + parent_shared_folder_id=None, + modified_by=None): + super(FileSharingInfo, self).__init__(read_only) + self._parent_shared_folder_id_value = None + self._parent_shared_folder_id_present = False + self._modified_by_value = None + self._modified_by_present = False + if parent_shared_folder_id is not None: + self.parent_shared_folder_id = parent_shared_folder_id + if modified_by is not None: + self.modified_by = modified_by + + @property + def parent_shared_folder_id(self): + """ + ID of shared folder that holds this file. + + :rtype: str + """ + if self._parent_shared_folder_id_present: + return self._parent_shared_folder_id_value + else: + raise AttributeError("missing required field 'parent_shared_folder_id'") + + @parent_shared_folder_id.setter + def parent_shared_folder_id(self, val): + val = self._parent_shared_folder_id_validator.validate(val) + self._parent_shared_folder_id_value = val + self._parent_shared_folder_id_present = True + + @parent_shared_folder_id.deleter + def parent_shared_folder_id(self): + self._parent_shared_folder_id_value = None + self._parent_shared_folder_id_present = False + + @property + def modified_by(self): + """ + The last user who modified the file. This field will be null if the + user's account has been deleted. + + :rtype: str + """ + if self._modified_by_present: + return self._modified_by_value + else: + return None + + @modified_by.setter + def modified_by(self, val): + if val is None: + del self.modified_by + return + val = self._modified_by_validator.validate(val) + self._modified_by_value = val + self._modified_by_present = True + + @modified_by.deleter + def modified_by(self): + self._modified_by_value = None + self._modified_by_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileSharingInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileSharingInfo(read_only={!r}, parent_shared_folder_id={!r}, modified_by={!r})'.format( + self._read_only_value, + self._parent_shared_folder_id_value, + self._modified_by_value, + ) + +FileSharingInfo_validator = bv.Struct(FileSharingInfo) + +class FolderMetadata(Metadata): + """ + :ivar id: A unique identifier for the folder. + :ivar shared_folder_id: Please use ``sharing_info`` instead. + :ivar sharing_info: Set if the folder is contained in a shared folder or is + a shared folder mount point. + :ivar property_groups: Additional information if the file has custom + properties with the property template specified. Note that only + properties associated with user-owned templates, not team-owned + templates, can be attached to folders. + """ + + __slots__ = [ + '_id_value', + '_id_present', + '_shared_folder_id_value', + '_shared_folder_id_present', + '_sharing_info_value', + '_sharing_info_present', + '_property_groups_value', + '_property_groups_present', + ] + + _has_required_fields = True + + def __init__(self, + name=None, + id=None, + path_lower=None, + path_display=None, + parent_shared_folder_id=None, + shared_folder_id=None, + sharing_info=None, + property_groups=None): + super(FolderMetadata, self).__init__(name, + path_lower, + path_display, + parent_shared_folder_id) + self._id_value = None + self._id_present = False + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._sharing_info_value = None + self._sharing_info_present = False + self._property_groups_value = None + self._property_groups_present = False + if id is not None: + self.id = id + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if sharing_info is not None: + self.sharing_info = sharing_info + if property_groups is not None: + self.property_groups = property_groups + + @property + def id(self): + """ + A unique identifier for the folder. + + :rtype: str + """ + if self._id_present: + return self._id_value + else: + raise AttributeError("missing required field 'id'") + + @id.setter + def id(self, val): + val = self._id_validator.validate(val) + self._id_value = val + self._id_present = True + + @id.deleter + def id(self): + self._id_value = None + self._id_present = False + + @property + def shared_folder_id(self): + """ + Please use ``sharing_info`` instead. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + return None + + @shared_folder_id.setter + def shared_folder_id(self, val): + if val is None: + del self.shared_folder_id + return + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def sharing_info(self): + """ + Set if the folder is contained in a shared folder or is a shared folder + mount point. + + :rtype: FolderSharingInfo + """ + if self._sharing_info_present: + return self._sharing_info_value + else: + return None + + @sharing_info.setter + def sharing_info(self, val): + if val is None: + del self.sharing_info + return + self._sharing_info_validator.validate_type_only(val) + self._sharing_info_value = val + self._sharing_info_present = True + + @sharing_info.deleter + def sharing_info(self): + self._sharing_info_value = None + self._sharing_info_present = False + + @property + def property_groups(self): + """ + Additional information if the file has custom properties with the + property template specified. Note that only properties associated with + user-owned templates, not team-owned templates, can be attached to + folders. + + :rtype: list of [file_properties.PropertyGroup] + """ + if self._property_groups_present: + return self._property_groups_value + else: + return None + + @property_groups.setter + def property_groups(self, val): + if val is None: + del self.property_groups + return + val = self._property_groups_validator.validate(val) + self._property_groups_value = val + self._property_groups_present = True + + @property_groups.deleter + def property_groups(self): + self._property_groups_value = None + self._property_groups_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FolderMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FolderMetadata(name={!r}, id={!r}, path_lower={!r}, path_display={!r}, parent_shared_folder_id={!r}, shared_folder_id={!r}, sharing_info={!r}, property_groups={!r})'.format( + self._name_value, + self._id_value, + self._path_lower_value, + self._path_display_value, + self._parent_shared_folder_id_value, + self._shared_folder_id_value, + self._sharing_info_value, + self._property_groups_value, + ) + +FolderMetadata_validator = bv.Struct(FolderMetadata) + +class FolderSharingInfo(SharingInfo): + """ + Sharing info for a folder which is contained in a shared folder or is a + shared folder mount point. + + :ivar parent_shared_folder_id: Set if the folder is contained by a shared + folder. + :ivar shared_folder_id: If this folder is a shared folder mount point, the + ID of the shared folder mounted at this location. + :ivar traverse_only: Specifies that the folder can only be traversed and the + user can only see a limited subset of the contents of this folder + because they don't have read access to this folder. They do, however, + have access to some sub folder. + :ivar no_access: Specifies that the folder cannot be accessed by the user. + """ + + __slots__ = [ + '_parent_shared_folder_id_value', + '_parent_shared_folder_id_present', + '_shared_folder_id_value', + '_shared_folder_id_present', + '_traverse_only_value', + '_traverse_only_present', + '_no_access_value', + '_no_access_present', + ] + + _has_required_fields = True + + def __init__(self, + read_only=None, + parent_shared_folder_id=None, + shared_folder_id=None, + traverse_only=None, + no_access=None): + super(FolderSharingInfo, self).__init__(read_only) + self._parent_shared_folder_id_value = None + self._parent_shared_folder_id_present = False + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._traverse_only_value = None + self._traverse_only_present = False + self._no_access_value = None + self._no_access_present = False + if parent_shared_folder_id is not None: + self.parent_shared_folder_id = parent_shared_folder_id + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if traverse_only is not None: + self.traverse_only = traverse_only + if no_access is not None: + self.no_access = no_access + + @property + def parent_shared_folder_id(self): + """ + Set if the folder is contained by a shared folder. + + :rtype: str + """ + if self._parent_shared_folder_id_present: + return self._parent_shared_folder_id_value + else: + return None + + @parent_shared_folder_id.setter + def parent_shared_folder_id(self, val): + if val is None: + del self.parent_shared_folder_id + return + val = self._parent_shared_folder_id_validator.validate(val) + self._parent_shared_folder_id_value = val + self._parent_shared_folder_id_present = True + + @parent_shared_folder_id.deleter + def parent_shared_folder_id(self): + self._parent_shared_folder_id_value = None + self._parent_shared_folder_id_present = False + + @property + def shared_folder_id(self): + """ + If this folder is a shared folder mount point, the ID of the shared + folder mounted at this location. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + return None + + @shared_folder_id.setter + def shared_folder_id(self, val): + if val is None: + del self.shared_folder_id + return + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def traverse_only(self): + """ + Specifies that the folder can only be traversed and the user can only + see a limited subset of the contents of this folder because they don't + have read access to this folder. They do, however, have access to some + sub folder. + + :rtype: bool + """ + if self._traverse_only_present: + return self._traverse_only_value + else: + return False + + @traverse_only.setter + def traverse_only(self, val): + val = self._traverse_only_validator.validate(val) + self._traverse_only_value = val + self._traverse_only_present = True + + @traverse_only.deleter + def traverse_only(self): + self._traverse_only_value = None + self._traverse_only_present = False + + @property + def no_access(self): + """ + Specifies that the folder cannot be accessed by the user. + + :rtype: bool + """ + if self._no_access_present: + return self._no_access_value + else: + return False + + @no_access.setter + def no_access(self, val): + val = self._no_access_validator.validate(val) + self._no_access_value = val + self._no_access_present = True + + @no_access.deleter + def no_access(self): + self._no_access_value = None + self._no_access_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FolderSharingInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FolderSharingInfo(read_only={!r}, parent_shared_folder_id={!r}, shared_folder_id={!r}, traverse_only={!r}, no_access={!r})'.format( + self._read_only_value, + self._parent_shared_folder_id_value, + self._shared_folder_id_value, + self._traverse_only_value, + self._no_access_value, + ) + +FolderSharingInfo_validator = bv.Struct(FolderSharingInfo) + +class GetCopyReferenceArg(bb.Struct): + """ + :ivar path: The path to the file or folder you want to get a copy reference + to. + """ + + __slots__ = [ + '_path_value', + '_path_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None): + self._path_value = None + self._path_present = False + if path is not None: + self.path = path + + @property + def path(self): + """ + The path to the file or folder you want to get a copy reference to. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetCopyReferenceArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetCopyReferenceArg(path={!r})'.format( + self._path_value, + ) + +GetCopyReferenceArg_validator = bv.Struct(GetCopyReferenceArg) + +class GetCopyReferenceError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param LookupError val: + :rtype: GetCopyReferenceError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(GetCopyReferenceError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetCopyReferenceError(%r, %r)' % (self._tag, self._value) + +GetCopyReferenceError_validator = bv.Union(GetCopyReferenceError) + +class GetCopyReferenceResult(bb.Struct): + """ + :ivar metadata: Metadata of the file or folder. + :ivar copy_reference: A copy reference to the file or folder. + :ivar expires: The expiration date of the copy reference. This value is + currently set to be far enough in the future so that expiration is + effectively not an issue. + """ + + __slots__ = [ + '_metadata_value', + '_metadata_present', + '_copy_reference_value', + '_copy_reference_present', + '_expires_value', + '_expires_present', + ] + + _has_required_fields = True + + def __init__(self, + metadata=None, + copy_reference=None, + expires=None): + self._metadata_value = None + self._metadata_present = False + self._copy_reference_value = None + self._copy_reference_present = False + self._expires_value = None + self._expires_present = False + if metadata is not None: + self.metadata = metadata + if copy_reference is not None: + self.copy_reference = copy_reference + if expires is not None: + self.expires = expires + + @property + def metadata(self): + """ + Metadata of the file or folder. + + :rtype: Metadata + """ + if self._metadata_present: + return self._metadata_value + else: + raise AttributeError("missing required field 'metadata'") + + @metadata.setter + def metadata(self, val): + self._metadata_validator.validate_type_only(val) + self._metadata_value = val + self._metadata_present = True + + @metadata.deleter + def metadata(self): + self._metadata_value = None + self._metadata_present = False + + @property + def copy_reference(self): + """ + A copy reference to the file or folder. + + :rtype: str + """ + if self._copy_reference_present: + return self._copy_reference_value + else: + raise AttributeError("missing required field 'copy_reference'") + + @copy_reference.setter + def copy_reference(self, val): + val = self._copy_reference_validator.validate(val) + self._copy_reference_value = val + self._copy_reference_present = True + + @copy_reference.deleter + def copy_reference(self): + self._copy_reference_value = None + self._copy_reference_present = False + + @property + def expires(self): + """ + The expiration date of the copy reference. This value is currently set + to be far enough in the future so that expiration is effectively not an + issue. + + :rtype: datetime.datetime + """ + if self._expires_present: + return self._expires_value + else: + raise AttributeError("missing required field 'expires'") + + @expires.setter + def expires(self, val): + val = self._expires_validator.validate(val) + self._expires_value = val + self._expires_present = True + + @expires.deleter + def expires(self): + self._expires_value = None + self._expires_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetCopyReferenceResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetCopyReferenceResult(metadata={!r}, copy_reference={!r}, expires={!r})'.format( + self._metadata_value, + self._copy_reference_value, + self._expires_value, + ) + +GetCopyReferenceResult_validator = bv.Struct(GetCopyReferenceResult) + +class GetTemporaryLinkArg(bb.Struct): + """ + :ivar path: The path to the file you want a temporary link to. + """ + + __slots__ = [ + '_path_value', + '_path_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None): + self._path_value = None + self._path_present = False + if path is not None: + self.path = path + + @property + def path(self): + """ + The path to the file you want a temporary link to. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetTemporaryLinkArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetTemporaryLinkArg(path={!r})'.format( + self._path_value, + ) + +GetTemporaryLinkArg_validator = bv.Struct(GetTemporaryLinkArg) + +class GetTemporaryLinkError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param LookupError val: + :rtype: GetTemporaryLinkError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(GetTemporaryLinkError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetTemporaryLinkError(%r, %r)' % (self._tag, self._value) + +GetTemporaryLinkError_validator = bv.Union(GetTemporaryLinkError) + +class GetTemporaryLinkResult(bb.Struct): + """ + :ivar metadata: Metadata of the file. + :ivar link: The temporary link which can be used to stream content the file. + """ + + __slots__ = [ + '_metadata_value', + '_metadata_present', + '_link_value', + '_link_present', + ] + + _has_required_fields = True + + def __init__(self, + metadata=None, + link=None): + self._metadata_value = None + self._metadata_present = False + self._link_value = None + self._link_present = False + if metadata is not None: + self.metadata = metadata + if link is not None: + self.link = link + + @property + def metadata(self): + """ + Metadata of the file. + + :rtype: FileMetadata + """ + if self._metadata_present: + return self._metadata_value + else: + raise AttributeError("missing required field 'metadata'") + + @metadata.setter + def metadata(self, val): + self._metadata_validator.validate_type_only(val) + self._metadata_value = val + self._metadata_present = True + + @metadata.deleter + def metadata(self): + self._metadata_value = None + self._metadata_present = False + + @property + def link(self): + """ + The temporary link which can be used to stream content the file. + + :rtype: str + """ + if self._link_present: + return self._link_value + else: + raise AttributeError("missing required field 'link'") + + @link.setter + def link(self, val): + val = self._link_validator.validate(val) + self._link_value = val + self._link_present = True + + @link.deleter + def link(self): + self._link_value = None + self._link_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetTemporaryLinkResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetTemporaryLinkResult(metadata={!r}, link={!r})'.format( + self._metadata_value, + self._link_value, + ) + +GetTemporaryLinkResult_validator = bv.Struct(GetTemporaryLinkResult) + +class GetTemporaryUploadLinkArg(bb.Struct): + """ + :ivar commit_info: Contains the path and other optional modifiers for the + future upload commit. Equivalent to the parameters provided to + :meth:`dropbox.dropbox.Dropbox.files_upload`. + :ivar duration: How long before this link expires, in seconds. Attempting + to start an upload with this link longer than this period of time after + link creation will result in an error. + """ + + __slots__ = [ + '_commit_info_value', + '_commit_info_present', + '_duration_value', + '_duration_present', + ] + + _has_required_fields = True + + def __init__(self, + commit_info=None, + duration=None): + self._commit_info_value = None + self._commit_info_present = False + self._duration_value = None + self._duration_present = False + if commit_info is not None: + self.commit_info = commit_info + if duration is not None: + self.duration = duration + + @property + def commit_info(self): + """ + Contains the path and other optional modifiers for the future upload + commit. Equivalent to the parameters provided to + :meth:`dropbox.dropbox.Dropbox.files_upload`. + + :rtype: CommitInfo + """ + if self._commit_info_present: + return self._commit_info_value + else: + raise AttributeError("missing required field 'commit_info'") + + @commit_info.setter + def commit_info(self, val): + self._commit_info_validator.validate_type_only(val) + self._commit_info_value = val + self._commit_info_present = True + + @commit_info.deleter + def commit_info(self): + self._commit_info_value = None + self._commit_info_present = False + + @property + def duration(self): + """ + How long before this link expires, in seconds. Attempting to start an + upload with this link longer than this period of time after link + creation will result in an error. + + :rtype: float + """ + if self._duration_present: + return self._duration_value + else: + return 14400.0 + + @duration.setter + def duration(self, val): + val = self._duration_validator.validate(val) + self._duration_value = val + self._duration_present = True + + @duration.deleter + def duration(self): + self._duration_value = None + self._duration_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetTemporaryUploadLinkArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetTemporaryUploadLinkArg(commit_info={!r}, duration={!r})'.format( + self._commit_info_value, + self._duration_value, + ) + +GetTemporaryUploadLinkArg_validator = bv.Struct(GetTemporaryUploadLinkArg) + +class GetTemporaryUploadLinkResult(bb.Struct): + """ + :ivar link: The temporary link which can be used to stream a file to a + Dropbox location. + """ + + __slots__ = [ + '_link_value', + '_link_present', + ] + + _has_required_fields = True + + def __init__(self, + link=None): + self._link_value = None + self._link_present = False + if link is not None: + self.link = link + + @property + def link(self): + """ + The temporary link which can be used to stream a file to a Dropbox + location. + + :rtype: str + """ + if self._link_present: + return self._link_value + else: + raise AttributeError("missing required field 'link'") + + @link.setter + def link(self, val): + val = self._link_validator.validate(val) + self._link_value = val + self._link_present = True + + @link.deleter + def link(self): + self._link_value = None + self._link_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetTemporaryUploadLinkResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetTemporaryUploadLinkResult(link={!r})'.format( + self._link_value, + ) + +GetTemporaryUploadLinkResult_validator = bv.Struct(GetTemporaryUploadLinkResult) + +class GetThumbnailBatchArg(bb.Struct): + """ + Arguments for :meth:`dropbox.dropbox.Dropbox.files_get_thumbnail_batch`. + + :ivar entries: List of files to get thumbnails. + """ + + __slots__ = [ + '_entries_value', + '_entries_present', + ] + + _has_required_fields = True + + def __init__(self, + entries=None): + self._entries_value = None + self._entries_present = False + if entries is not None: + self.entries = entries + + @property + def entries(self): + """ + List of files to get thumbnails. + + :rtype: list of [ThumbnailArg] + """ + if self._entries_present: + return self._entries_value + else: + raise AttributeError("missing required field 'entries'") + + @entries.setter + def entries(self, val): + val = self._entries_validator.validate(val) + self._entries_value = val + self._entries_present = True + + @entries.deleter + def entries(self): + self._entries_value = None + self._entries_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetThumbnailBatchArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetThumbnailBatchArg(entries={!r})'.format( + self._entries_value, + ) + +GetThumbnailBatchArg_validator = bv.Struct(GetThumbnailBatchArg) + +class GetThumbnailBatchError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar too_many_files: The operation involves more than 25 files. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + too_many_files = None + # Attribute is overwritten below the class definition + other = None + + def is_too_many_files(self): + """ + Check if the union tag is ``too_many_files``. + + :rtype: bool + """ + return self._tag == 'too_many_files' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(GetThumbnailBatchError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetThumbnailBatchError(%r, %r)' % (self._tag, self._value) + +GetThumbnailBatchError_validator = bv.Union(GetThumbnailBatchError) + +class GetThumbnailBatchResult(bb.Struct): + """ + :ivar entries: List of files and their thumbnails. + """ + + __slots__ = [ + '_entries_value', + '_entries_present', + ] + + _has_required_fields = True + + def __init__(self, + entries=None): + self._entries_value = None + self._entries_present = False + if entries is not None: + self.entries = entries + + @property + def entries(self): + """ + List of files and their thumbnails. + + :rtype: list of [GetThumbnailBatchResultEntry] + """ + if self._entries_present: + return self._entries_value + else: + raise AttributeError("missing required field 'entries'") + + @entries.setter + def entries(self, val): + val = self._entries_validator.validate(val) + self._entries_value = val + self._entries_present = True + + @entries.deleter + def entries(self): + self._entries_value = None + self._entries_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetThumbnailBatchResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetThumbnailBatchResult(entries={!r})'.format( + self._entries_value, + ) + +GetThumbnailBatchResult_validator = bv.Struct(GetThumbnailBatchResult) + +class GetThumbnailBatchResultData(bb.Struct): + """ + :ivar thumbnail: A string containing the base64-encoded thumbnail data for + this file. + """ + + __slots__ = [ + '_metadata_value', + '_metadata_present', + '_thumbnail_value', + '_thumbnail_present', + ] + + _has_required_fields = True + + def __init__(self, + metadata=None, + thumbnail=None): + self._metadata_value = None + self._metadata_present = False + self._thumbnail_value = None + self._thumbnail_present = False + if metadata is not None: + self.metadata = metadata + if thumbnail is not None: + self.thumbnail = thumbnail + + @property + def metadata(self): + """ + :rtype: FileMetadata + """ + if self._metadata_present: + return self._metadata_value + else: + raise AttributeError("missing required field 'metadata'") + + @metadata.setter + def metadata(self, val): + self._metadata_validator.validate_type_only(val) + self._metadata_value = val + self._metadata_present = True + + @metadata.deleter + def metadata(self): + self._metadata_value = None + self._metadata_present = False + + @property + def thumbnail(self): + """ + A string containing the base64-encoded thumbnail data for this file. + + :rtype: str + """ + if self._thumbnail_present: + return self._thumbnail_value + else: + raise AttributeError("missing required field 'thumbnail'") + + @thumbnail.setter + def thumbnail(self, val): + val = self._thumbnail_validator.validate(val) + self._thumbnail_value = val + self._thumbnail_present = True + + @thumbnail.deleter + def thumbnail(self): + self._thumbnail_value = None + self._thumbnail_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetThumbnailBatchResultData, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetThumbnailBatchResultData(metadata={!r}, thumbnail={!r})'.format( + self._metadata_value, + self._thumbnail_value, + ) + +GetThumbnailBatchResultData_validator = bv.Struct(GetThumbnailBatchResultData) + +class GetThumbnailBatchResultEntry(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar ThumbnailError failure: The result for this file if it was an error. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def success(cls, val): + """ + Create an instance of this class set to the ``success`` tag with value + ``val``. + + :param GetThumbnailBatchResultData val: + :rtype: GetThumbnailBatchResultEntry + """ + return cls('success', val) + + @classmethod + def failure(cls, val): + """ + Create an instance of this class set to the ``failure`` tag with value + ``val``. + + :param ThumbnailError val: + :rtype: GetThumbnailBatchResultEntry + """ + return cls('failure', val) + + def is_success(self): + """ + Check if the union tag is ``success``. + + :rtype: bool + """ + return self._tag == 'success' + + def is_failure(self): + """ + Check if the union tag is ``failure``. + + :rtype: bool + """ + return self._tag == 'failure' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_success(self): + """ + Only call this if :meth:`is_success` is true. + + :rtype: GetThumbnailBatchResultData + """ + if not self.is_success(): + raise AttributeError("tag 'success' not set") + return self._value + + def get_failure(self): + """ + The result for this file if it was an error. + + Only call this if :meth:`is_failure` is true. + + :rtype: ThumbnailError + """ + if not self.is_failure(): + raise AttributeError("tag 'failure' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(GetThumbnailBatchResultEntry, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetThumbnailBatchResultEntry(%r, %r)' % (self._tag, self._value) + +GetThumbnailBatchResultEntry_validator = bv.Union(GetThumbnailBatchResultEntry) + +class GpsCoordinates(bb.Struct): + """ + GPS coordinates for a photo or video. + + :ivar latitude: Latitude of the GPS coordinates. + :ivar longitude: Longitude of the GPS coordinates. + """ + + __slots__ = [ + '_latitude_value', + '_latitude_present', + '_longitude_value', + '_longitude_present', + ] + + _has_required_fields = True + + def __init__(self, + latitude=None, + longitude=None): + self._latitude_value = None + self._latitude_present = False + self._longitude_value = None + self._longitude_present = False + if latitude is not None: + self.latitude = latitude + if longitude is not None: + self.longitude = longitude + + @property + def latitude(self): + """ + Latitude of the GPS coordinates. + + :rtype: float + """ + if self._latitude_present: + return self._latitude_value + else: + raise AttributeError("missing required field 'latitude'") + + @latitude.setter + def latitude(self, val): + val = self._latitude_validator.validate(val) + self._latitude_value = val + self._latitude_present = True + + @latitude.deleter + def latitude(self): + self._latitude_value = None + self._latitude_present = False + + @property + def longitude(self): + """ + Longitude of the GPS coordinates. + + :rtype: float + """ + if self._longitude_present: + return self._longitude_value + else: + raise AttributeError("missing required field 'longitude'") + + @longitude.setter + def longitude(self, val): + val = self._longitude_validator.validate(val) + self._longitude_value = val + self._longitude_present = True + + @longitude.deleter + def longitude(self): + self._longitude_value = None + self._longitude_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GpsCoordinates, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GpsCoordinates(latitude={!r}, longitude={!r})'.format( + self._latitude_value, + self._longitude_value, + ) + +GpsCoordinates_validator = bv.Struct(GpsCoordinates) + +class ListFolderArg(bb.Struct): + """ + :ivar path: A unique identifier for the file. + :ivar recursive: If true, the list folder operation will be applied + recursively to all subfolders and the response will contain contents of + all subfolders. + :ivar include_media_info: If true, ``FileMetadata.media_info`` is set for + photo and video. + :ivar include_deleted: If true, the results will include entries for files + and folders that used to exist but were deleted. + :ivar include_has_explicit_shared_members: If true, the results will include + a flag for each file indicating whether or not that file has any + explicit members. + :ivar include_mounted_folders: If true, the results will include entries + under mounted folders which includes app folder, shared folder and team + folder. + :ivar limit: The maximum number of results to return per request. Note: This + is an approximate number and there can be slightly more entries returned + in some cases. + :ivar shared_link: A shared link to list the contents of. If the link is + password-protected, the password must be provided. If this field is + present, ``ListFolderArg.path`` will be relative to root of the shared + link. Only non-recursive mode is supported for shared link. + :ivar include_property_groups: If set to a valid list of template IDs, + ``FileMetadata.property_groups`` is set if there exists property data + associated with the file and each of the listed templates. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_recursive_value', + '_recursive_present', + '_include_media_info_value', + '_include_media_info_present', + '_include_deleted_value', + '_include_deleted_present', + '_include_has_explicit_shared_members_value', + '_include_has_explicit_shared_members_present', + '_include_mounted_folders_value', + '_include_mounted_folders_present', + '_limit_value', + '_limit_present', + '_shared_link_value', + '_shared_link_present', + '_include_property_groups_value', + '_include_property_groups_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + recursive=None, + include_media_info=None, + include_deleted=None, + include_has_explicit_shared_members=None, + include_mounted_folders=None, + limit=None, + shared_link=None, + include_property_groups=None): + self._path_value = None + self._path_present = False + self._recursive_value = None + self._recursive_present = False + self._include_media_info_value = None + self._include_media_info_present = False + self._include_deleted_value = None + self._include_deleted_present = False + self._include_has_explicit_shared_members_value = None + self._include_has_explicit_shared_members_present = False + self._include_mounted_folders_value = None + self._include_mounted_folders_present = False + self._limit_value = None + self._limit_present = False + self._shared_link_value = None + self._shared_link_present = False + self._include_property_groups_value = None + self._include_property_groups_present = False + if path is not None: + self.path = path + if recursive is not None: + self.recursive = recursive + if include_media_info is not None: + self.include_media_info = include_media_info + if include_deleted is not None: + self.include_deleted = include_deleted + if include_has_explicit_shared_members is not None: + self.include_has_explicit_shared_members = include_has_explicit_shared_members + if include_mounted_folders is not None: + self.include_mounted_folders = include_mounted_folders + if limit is not None: + self.limit = limit + if shared_link is not None: + self.shared_link = shared_link + if include_property_groups is not None: + self.include_property_groups = include_property_groups + + @property + def path(self): + """ + A unique identifier for the file. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def recursive(self): + """ + If true, the list folder operation will be applied recursively to all + subfolders and the response will contain contents of all subfolders. + + :rtype: bool + """ + if self._recursive_present: + return self._recursive_value + else: + return False + + @recursive.setter + def recursive(self, val): + val = self._recursive_validator.validate(val) + self._recursive_value = val + self._recursive_present = True + + @recursive.deleter + def recursive(self): + self._recursive_value = None + self._recursive_present = False + + @property + def include_media_info(self): + """ + If true, ``FileMetadata.media_info`` is set for photo and video. + + :rtype: bool + """ + if self._include_media_info_present: + return self._include_media_info_value + else: + return False + + @include_media_info.setter + def include_media_info(self, val): + val = self._include_media_info_validator.validate(val) + self._include_media_info_value = val + self._include_media_info_present = True + + @include_media_info.deleter + def include_media_info(self): + self._include_media_info_value = None + self._include_media_info_present = False + + @property + def include_deleted(self): + """ + If true, the results will include entries for files and folders that + used to exist but were deleted. + + :rtype: bool + """ + if self._include_deleted_present: + return self._include_deleted_value + else: + return False + + @include_deleted.setter + def include_deleted(self, val): + val = self._include_deleted_validator.validate(val) + self._include_deleted_value = val + self._include_deleted_present = True + + @include_deleted.deleter + def include_deleted(self): + self._include_deleted_value = None + self._include_deleted_present = False + + @property + def include_has_explicit_shared_members(self): + """ + If true, the results will include a flag for each file indicating + whether or not that file has any explicit members. + + :rtype: bool + """ + if self._include_has_explicit_shared_members_present: + return self._include_has_explicit_shared_members_value + else: + return False + + @include_has_explicit_shared_members.setter + def include_has_explicit_shared_members(self, val): + val = self._include_has_explicit_shared_members_validator.validate(val) + self._include_has_explicit_shared_members_value = val + self._include_has_explicit_shared_members_present = True + + @include_has_explicit_shared_members.deleter + def include_has_explicit_shared_members(self): + self._include_has_explicit_shared_members_value = None + self._include_has_explicit_shared_members_present = False + + @property + def include_mounted_folders(self): + """ + If true, the results will include entries under mounted folders which + includes app folder, shared folder and team folder. + + :rtype: bool + """ + if self._include_mounted_folders_present: + return self._include_mounted_folders_value + else: + return True + + @include_mounted_folders.setter + def include_mounted_folders(self, val): + val = self._include_mounted_folders_validator.validate(val) + self._include_mounted_folders_value = val + self._include_mounted_folders_present = True + + @include_mounted_folders.deleter + def include_mounted_folders(self): + self._include_mounted_folders_value = None + self._include_mounted_folders_present = False + + @property + def limit(self): + """ + The maximum number of results to return per request. Note: This is an + approximate number and there can be slightly more entries returned in + some cases. + + :rtype: int + """ + if self._limit_present: + return self._limit_value + else: + return None + + @limit.setter + def limit(self, val): + if val is None: + del self.limit + return + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + @property + def shared_link(self): + """ + A shared link to list the contents of. If the link is + password-protected, the password must be provided. If this field is + present, ``ListFolderArg.path`` will be relative to root of the shared + link. Only non-recursive mode is supported for shared link. + + :rtype: SharedLink + """ + if self._shared_link_present: + return self._shared_link_value + else: + return None + + @shared_link.setter + def shared_link(self, val): + if val is None: + del self.shared_link + return + self._shared_link_validator.validate_type_only(val) + self._shared_link_value = val + self._shared_link_present = True + + @shared_link.deleter + def shared_link(self): + self._shared_link_value = None + self._shared_link_present = False + + @property + def include_property_groups(self): + """ + If set to a valid list of template IDs, ``FileMetadata.property_groups`` + is set if there exists property data associated with the file and each + of the listed templates. + + :rtype: file_properties.TemplateFilterBase + """ + if self._include_property_groups_present: + return self._include_property_groups_value + else: + return None + + @include_property_groups.setter + def include_property_groups(self, val): + if val is None: + del self.include_property_groups + return + self._include_property_groups_validator.validate_type_only(val) + self._include_property_groups_value = val + self._include_property_groups_present = True + + @include_property_groups.deleter + def include_property_groups(self): + self._include_property_groups_value = None + self._include_property_groups_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFolderArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFolderArg(path={!r}, recursive={!r}, include_media_info={!r}, include_deleted={!r}, include_has_explicit_shared_members={!r}, include_mounted_folders={!r}, limit={!r}, shared_link={!r}, include_property_groups={!r})'.format( + self._path_value, + self._recursive_value, + self._include_media_info_value, + self._include_deleted_value, + self._include_has_explicit_shared_members_value, + self._include_mounted_folders_value, + self._limit_value, + self._shared_link_value, + self._include_property_groups_value, + ) + +ListFolderArg_validator = bv.Struct(ListFolderArg) + +class ListFolderContinueArg(bb.Struct): + """ + :ivar cursor: The cursor returned by your last call to + :meth:`dropbox.dropbox.Dropbox.files_list_folder` or + :meth:`dropbox.dropbox.Dropbox.files_list_folder_continue`. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + The cursor returned by your last call to + :meth:`dropbox.dropbox.Dropbox.files_list_folder` or + :meth:`dropbox.dropbox.Dropbox.files_list_folder_continue`. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFolderContinueArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFolderContinueArg(cursor={!r})'.format( + self._cursor_value, + ) + +ListFolderContinueArg_validator = bv.Struct(ListFolderContinueArg) + +class ListFolderContinueError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar reset: Indicates that the cursor has been invalidated. Call + :meth:`dropbox.dropbox.Dropbox.files_list_folder` to obtain a new + cursor. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + reset = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param LookupError val: + :rtype: ListFolderContinueError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_reset(self): + """ + Check if the union tag is ``reset``. + + :rtype: bool + """ + return self._tag == 'reset' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFolderContinueError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFolderContinueError(%r, %r)' % (self._tag, self._value) + +ListFolderContinueError_validator = bv.Union(ListFolderContinueError) + +class ListFolderError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param LookupError val: + :rtype: ListFolderError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFolderError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFolderError(%r, %r)' % (self._tag, self._value) + +ListFolderError_validator = bv.Union(ListFolderError) + +class ListFolderGetLatestCursorResult(bb.Struct): + """ + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.files_list_folder_continue` to see what's + changed in the folder since your previous query. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.files_list_folder_continue` to see what's + changed in the folder since your previous query. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFolderGetLatestCursorResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFolderGetLatestCursorResult(cursor={!r})'.format( + self._cursor_value, + ) + +ListFolderGetLatestCursorResult_validator = bv.Struct(ListFolderGetLatestCursorResult) + +class ListFolderLongpollArg(bb.Struct): + """ + :ivar cursor: A cursor as returned by + :meth:`dropbox.dropbox.Dropbox.files_list_folder` or + :meth:`dropbox.dropbox.Dropbox.files_list_folder_continue`. Cursors + retrieved by setting ``ListFolderArg.include_media_info`` to ``True`` + are not supported. + :ivar timeout: A timeout in seconds. The request will block for at most this + length of time, plus up to 90 seconds of random jitter added to avoid + the thundering herd problem. Care should be taken when using this + parameter, as some network infrastructure does not support long + timeouts. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + '_timeout_value', + '_timeout_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None, + timeout=None): + self._cursor_value = None + self._cursor_present = False + self._timeout_value = None + self._timeout_present = False + if cursor is not None: + self.cursor = cursor + if timeout is not None: + self.timeout = timeout + + @property + def cursor(self): + """ + A cursor as returned by + :meth:`dropbox.dropbox.Dropbox.files_list_folder` or + :meth:`dropbox.dropbox.Dropbox.files_list_folder_continue`. Cursors + retrieved by setting ``ListFolderArg.include_media_info`` to ``True`` + are not supported. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def timeout(self): + """ + A timeout in seconds. The request will block for at most this length of + time, plus up to 90 seconds of random jitter added to avoid the + thundering herd problem. Care should be taken when using this parameter, + as some network infrastructure does not support long timeouts. + + :rtype: int + """ + if self._timeout_present: + return self._timeout_value + else: + return 30 + + @timeout.setter + def timeout(self, val): + val = self._timeout_validator.validate(val) + self._timeout_value = val + self._timeout_present = True + + @timeout.deleter + def timeout(self): + self._timeout_value = None + self._timeout_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFolderLongpollArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFolderLongpollArg(cursor={!r}, timeout={!r})'.format( + self._cursor_value, + self._timeout_value, + ) + +ListFolderLongpollArg_validator = bv.Struct(ListFolderLongpollArg) + +class ListFolderLongpollError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar reset: Indicates that the cursor has been invalidated. Call + :meth:`dropbox.dropbox.Dropbox.files_list_folder` to obtain a new + cursor. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + reset = None + # Attribute is overwritten below the class definition + other = None + + def is_reset(self): + """ + Check if the union tag is ``reset``. + + :rtype: bool + """ + return self._tag == 'reset' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFolderLongpollError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFolderLongpollError(%r, %r)' % (self._tag, self._value) + +ListFolderLongpollError_validator = bv.Union(ListFolderLongpollError) + +class ListFolderLongpollResult(bb.Struct): + """ + :ivar changes: Indicates whether new changes are available. If true, call + :meth:`dropbox.dropbox.Dropbox.files_list_folder_continue` to retrieve + the changes. + :ivar backoff: If present, backoff for at least this many seconds before + calling :meth:`dropbox.dropbox.Dropbox.files_list_folder_longpoll` + again. + """ + + __slots__ = [ + '_changes_value', + '_changes_present', + '_backoff_value', + '_backoff_present', + ] + + _has_required_fields = True + + def __init__(self, + changes=None, + backoff=None): + self._changes_value = None + self._changes_present = False + self._backoff_value = None + self._backoff_present = False + if changes is not None: + self.changes = changes + if backoff is not None: + self.backoff = backoff + + @property + def changes(self): + """ + Indicates whether new changes are available. If true, call + :meth:`dropbox.dropbox.Dropbox.files_list_folder_continue` to retrieve + the changes. + + :rtype: bool + """ + if self._changes_present: + return self._changes_value + else: + raise AttributeError("missing required field 'changes'") + + @changes.setter + def changes(self, val): + val = self._changes_validator.validate(val) + self._changes_value = val + self._changes_present = True + + @changes.deleter + def changes(self): + self._changes_value = None + self._changes_present = False + + @property + def backoff(self): + """ + If present, backoff for at least this many seconds before calling + :meth:`dropbox.dropbox.Dropbox.files_list_folder_longpoll` again. + + :rtype: int + """ + if self._backoff_present: + return self._backoff_value + else: + return None + + @backoff.setter + def backoff(self, val): + if val is None: + del self.backoff + return + val = self._backoff_validator.validate(val) + self._backoff_value = val + self._backoff_present = True + + @backoff.deleter + def backoff(self): + self._backoff_value = None + self._backoff_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFolderLongpollResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFolderLongpollResult(changes={!r}, backoff={!r})'.format( + self._changes_value, + self._backoff_value, + ) + +ListFolderLongpollResult_validator = bv.Struct(ListFolderLongpollResult) + +class ListFolderResult(bb.Struct): + """ + :ivar entries: The files and (direct) subfolders in the folder. + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.files_list_folder_continue` to see what's + changed in the folder since your previous query. + :ivar has_more: If true, then there are more entries available. Pass the + cursor to :meth:`dropbox.dropbox.Dropbox.files_list_folder_continue` to + retrieve the rest. + """ + + __slots__ = [ + '_entries_value', + '_entries_present', + '_cursor_value', + '_cursor_present', + '_has_more_value', + '_has_more_present', + ] + + _has_required_fields = True + + def __init__(self, + entries=None, + cursor=None, + has_more=None): + self._entries_value = None + self._entries_present = False + self._cursor_value = None + self._cursor_present = False + self._has_more_value = None + self._has_more_present = False + if entries is not None: + self.entries = entries + if cursor is not None: + self.cursor = cursor + if has_more is not None: + self.has_more = has_more + + @property + def entries(self): + """ + The files and (direct) subfolders in the folder. + + :rtype: list of [Metadata] + """ + if self._entries_present: + return self._entries_value + else: + raise AttributeError("missing required field 'entries'") + + @entries.setter + def entries(self, val): + val = self._entries_validator.validate(val) + self._entries_value = val + self._entries_present = True + + @entries.deleter + def entries(self): + self._entries_value = None + self._entries_present = False + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.files_list_folder_continue` to see what's + changed in the folder since your previous query. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def has_more(self): + """ + If true, then there are more entries available. Pass the cursor to + :meth:`dropbox.dropbox.Dropbox.files_list_folder_continue` to retrieve + the rest. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFolderResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFolderResult(entries={!r}, cursor={!r}, has_more={!r})'.format( + self._entries_value, + self._cursor_value, + self._has_more_value, + ) + +ListFolderResult_validator = bv.Struct(ListFolderResult) + +class ListRevisionsArg(bb.Struct): + """ + :ivar path: The path to the file you want to see the revisions of. + :ivar mode: Determines the behavior of the API in listing the revisions for + a given file path or id. + :ivar limit: The maximum number of revision entries returned. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_mode_value', + '_mode_present', + '_limit_value', + '_limit_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + mode=None, + limit=None): + self._path_value = None + self._path_present = False + self._mode_value = None + self._mode_present = False + self._limit_value = None + self._limit_present = False + if path is not None: + self.path = path + if mode is not None: + self.mode = mode + if limit is not None: + self.limit = limit + + @property + def path(self): + """ + The path to the file you want to see the revisions of. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def mode(self): + """ + Determines the behavior of the API in listing the revisions for a given + file path or id. + + :rtype: ListRevisionsMode + """ + if self._mode_present: + return self._mode_value + else: + return ListRevisionsMode.path + + @mode.setter + def mode(self, val): + self._mode_validator.validate_type_only(val) + self._mode_value = val + self._mode_present = True + + @mode.deleter + def mode(self): + self._mode_value = None + self._mode_present = False + + @property + def limit(self): + """ + The maximum number of revision entries returned. + + :rtype: int + """ + if self._limit_present: + return self._limit_value + else: + return 10 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListRevisionsArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListRevisionsArg(path={!r}, mode={!r}, limit={!r})'.format( + self._path_value, + self._mode_value, + self._limit_value, + ) + +ListRevisionsArg_validator = bv.Struct(ListRevisionsArg) + +class ListRevisionsError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param LookupError val: + :rtype: ListRevisionsError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ListRevisionsError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListRevisionsError(%r, %r)' % (self._tag, self._value) + +ListRevisionsError_validator = bv.Union(ListRevisionsError) + +class ListRevisionsMode(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar path: Returns revisions with the same file path as identified by the + latest file entry at the given file path or id. + :ivar id: Returns revisions with the same file id as identified by the + latest file entry at the given file path or id. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + path = None + # Attribute is overwritten below the class definition + id = None + # Attribute is overwritten below the class definition + other = None + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_id(self): + """ + Check if the union tag is ``id``. + + :rtype: bool + """ + return self._tag == 'id' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ListRevisionsMode, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListRevisionsMode(%r, %r)' % (self._tag, self._value) + +ListRevisionsMode_validator = bv.Union(ListRevisionsMode) + +class ListRevisionsResult(bb.Struct): + """ + :ivar is_deleted: If the file identified by the latest revision in the + response is either deleted or moved. + :ivar server_deleted: The time of deletion if the file was deleted. + :ivar entries: The revisions for the file. Only revisions that are not + deleted will show up here. + """ + + __slots__ = [ + '_is_deleted_value', + '_is_deleted_present', + '_server_deleted_value', + '_server_deleted_present', + '_entries_value', + '_entries_present', + ] + + _has_required_fields = True + + def __init__(self, + is_deleted=None, + entries=None, + server_deleted=None): + self._is_deleted_value = None + self._is_deleted_present = False + self._server_deleted_value = None + self._server_deleted_present = False + self._entries_value = None + self._entries_present = False + if is_deleted is not None: + self.is_deleted = is_deleted + if server_deleted is not None: + self.server_deleted = server_deleted + if entries is not None: + self.entries = entries + + @property + def is_deleted(self): + """ + If the file identified by the latest revision in the response is either + deleted or moved. + + :rtype: bool + """ + if self._is_deleted_present: + return self._is_deleted_value + else: + raise AttributeError("missing required field 'is_deleted'") + + @is_deleted.setter + def is_deleted(self, val): + val = self._is_deleted_validator.validate(val) + self._is_deleted_value = val + self._is_deleted_present = True + + @is_deleted.deleter + def is_deleted(self): + self._is_deleted_value = None + self._is_deleted_present = False + + @property + def server_deleted(self): + """ + The time of deletion if the file was deleted. + + :rtype: datetime.datetime + """ + if self._server_deleted_present: + return self._server_deleted_value + else: + return None + + @server_deleted.setter + def server_deleted(self, val): + if val is None: + del self.server_deleted + return + val = self._server_deleted_validator.validate(val) + self._server_deleted_value = val + self._server_deleted_present = True + + @server_deleted.deleter + def server_deleted(self): + self._server_deleted_value = None + self._server_deleted_present = False + + @property + def entries(self): + """ + The revisions for the file. Only revisions that are not deleted will + show up here. + + :rtype: list of [FileMetadata] + """ + if self._entries_present: + return self._entries_value + else: + raise AttributeError("missing required field 'entries'") + + @entries.setter + def entries(self, val): + val = self._entries_validator.validate(val) + self._entries_value = val + self._entries_present = True + + @entries.deleter + def entries(self): + self._entries_value = None + self._entries_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListRevisionsResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListRevisionsResult(is_deleted={!r}, entries={!r}, server_deleted={!r})'.format( + self._is_deleted_value, + self._entries_value, + self._server_deleted_value, + ) + +ListRevisionsResult_validator = bv.Struct(ListRevisionsResult) + +class LookupError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar Optional[str] malformed_path: The given path does not satisfy the + required path format. Please refer to the :link:`Path formats + documentation + https://www.dropbox.com/developers/documentation/http/documentation#path-formats` + for more information. + :ivar not_found: There is nothing at the given path. + :ivar not_file: We were expecting a file, but the given path refers to + something that isn't a file. + :ivar not_folder: We were expecting a folder, but the given path refers to + something that isn't a folder. + :ivar restricted_content: The file cannot be transferred because the content + is restricted. For example, sometimes there are legal restrictions due + to copyright claims. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + not_found = None + # Attribute is overwritten below the class definition + not_file = None + # Attribute is overwritten below the class definition + not_folder = None + # Attribute is overwritten below the class definition + restricted_content = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def malformed_path(cls, val): + """ + Create an instance of this class set to the ``malformed_path`` tag with + value ``val``. + + :param Optional[str] val: + :rtype: LookupError + """ + return cls('malformed_path', val) + + def is_malformed_path(self): + """ + Check if the union tag is ``malformed_path``. + + :rtype: bool + """ + return self._tag == 'malformed_path' + + def is_not_found(self): + """ + Check if the union tag is ``not_found``. + + :rtype: bool + """ + return self._tag == 'not_found' + + def is_not_file(self): + """ + Check if the union tag is ``not_file``. + + :rtype: bool + """ + return self._tag == 'not_file' + + def is_not_folder(self): + """ + Check if the union tag is ``not_folder``. + + :rtype: bool + """ + return self._tag == 'not_folder' + + def is_restricted_content(self): + """ + Check if the union tag is ``restricted_content``. + + :rtype: bool + """ + return self._tag == 'restricted_content' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_malformed_path(self): + """ + The given path does not satisfy the required path format. Please refer + to the `Path formats documentation + `_ + for more information. + + Only call this if :meth:`is_malformed_path` is true. + + :rtype: Optional[str] + """ + if not self.is_malformed_path(): + raise AttributeError("tag 'malformed_path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(LookupError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LookupError(%r, %r)' % (self._tag, self._value) + +LookupError_validator = bv.Union(LookupError) + +class MediaInfo(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar pending: Indicate the photo/video is still under processing and + metadata is not available yet. + :ivar MediaMetadata metadata: The metadata for the photo/video. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + pending = None + + @classmethod + def metadata(cls, val): + """ + Create an instance of this class set to the ``metadata`` tag with value + ``val``. + + :param MediaMetadata val: + :rtype: MediaInfo + """ + return cls('metadata', val) + + def is_pending(self): + """ + Check if the union tag is ``pending``. + + :rtype: bool + """ + return self._tag == 'pending' + + def is_metadata(self): + """ + Check if the union tag is ``metadata``. + + :rtype: bool + """ + return self._tag == 'metadata' + + def get_metadata(self): + """ + The metadata for the photo/video. + + Only call this if :meth:`is_metadata` is true. + + :rtype: MediaMetadata + """ + if not self.is_metadata(): + raise AttributeError("tag 'metadata' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(MediaInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MediaInfo(%r, %r)' % (self._tag, self._value) + +MediaInfo_validator = bv.Union(MediaInfo) + +class MediaMetadata(bb.Struct): + """ + Metadata for a photo or video. + + :ivar dimensions: Dimension of the photo/video. + :ivar location: The GPS coordinate of the photo/video. + :ivar time_taken: The timestamp when the photo/video is taken. + """ + + __slots__ = [ + '_dimensions_value', + '_dimensions_present', + '_location_value', + '_location_present', + '_time_taken_value', + '_time_taken_present', + ] + + _has_required_fields = False + + def __init__(self, + dimensions=None, + location=None, + time_taken=None): + self._dimensions_value = None + self._dimensions_present = False + self._location_value = None + self._location_present = False + self._time_taken_value = None + self._time_taken_present = False + if dimensions is not None: + self.dimensions = dimensions + if location is not None: + self.location = location + if time_taken is not None: + self.time_taken = time_taken + + @property + def dimensions(self): + """ + Dimension of the photo/video. + + :rtype: Dimensions + """ + if self._dimensions_present: + return self._dimensions_value + else: + return None + + @dimensions.setter + def dimensions(self, val): + if val is None: + del self.dimensions + return + self._dimensions_validator.validate_type_only(val) + self._dimensions_value = val + self._dimensions_present = True + + @dimensions.deleter + def dimensions(self): + self._dimensions_value = None + self._dimensions_present = False + + @property + def location(self): + """ + The GPS coordinate of the photo/video. + + :rtype: GpsCoordinates + """ + if self._location_present: + return self._location_value + else: + return None + + @location.setter + def location(self, val): + if val is None: + del self.location + return + self._location_validator.validate_type_only(val) + self._location_value = val + self._location_present = True + + @location.deleter + def location(self): + self._location_value = None + self._location_present = False + + @property + def time_taken(self): + """ + The timestamp when the photo/video is taken. + + :rtype: datetime.datetime + """ + if self._time_taken_present: + return self._time_taken_value + else: + return None + + @time_taken.setter + def time_taken(self, val): + if val is None: + del self.time_taken + return + val = self._time_taken_validator.validate(val) + self._time_taken_value = val + self._time_taken_present = True + + @time_taken.deleter + def time_taken(self): + self._time_taken_value = None + self._time_taken_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MediaMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MediaMetadata(dimensions={!r}, location={!r}, time_taken={!r})'.format( + self._dimensions_value, + self._location_value, + self._time_taken_value, + ) + +MediaMetadata_validator = bv.StructTree(MediaMetadata) + +class RelocationBatchArgBase(bb.Struct): + """ + :ivar entries: List of entries to be moved or copied. Each entry is + :class:`RelocationPath`. + :ivar autorename: If there's a conflict with any file, have the Dropbox + server try to autorename that file to avoid the conflict. + """ + + __slots__ = [ + '_entries_value', + '_entries_present', + '_autorename_value', + '_autorename_present', + ] + + _has_required_fields = True + + def __init__(self, + entries=None, + autorename=None): + self._entries_value = None + self._entries_present = False + self._autorename_value = None + self._autorename_present = False + if entries is not None: + self.entries = entries + if autorename is not None: + self.autorename = autorename + + @property + def entries(self): + """ + List of entries to be moved or copied. Each entry is + :class:`RelocationPath`. + + :rtype: list of [RelocationPath] + """ + if self._entries_present: + return self._entries_value + else: + raise AttributeError("missing required field 'entries'") + + @entries.setter + def entries(self, val): + val = self._entries_validator.validate(val) + self._entries_value = val + self._entries_present = True + + @entries.deleter + def entries(self): + self._entries_value = None + self._entries_present = False + + @property + def autorename(self): + """ + If there's a conflict with any file, have the Dropbox server try to + autorename that file to avoid the conflict. + + :rtype: bool + """ + if self._autorename_present: + return self._autorename_value + else: + return False + + @autorename.setter + def autorename(self, val): + val = self._autorename_validator.validate(val) + self._autorename_value = val + self._autorename_present = True + + @autorename.deleter + def autorename(self): + self._autorename_value = None + self._autorename_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RelocationBatchArgBase, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelocationBatchArgBase(entries={!r}, autorename={!r})'.format( + self._entries_value, + self._autorename_value, + ) + +RelocationBatchArgBase_validator = bv.Struct(RelocationBatchArgBase) + +class MoveBatchArg(RelocationBatchArgBase): + """ + :ivar allow_ownership_transfer: Allow moves by owner even if it would result + in an ownership transfer for the content being moved. This does not + apply to copies. + """ + + __slots__ = [ + '_allow_ownership_transfer_value', + '_allow_ownership_transfer_present', + ] + + _has_required_fields = True + + def __init__(self, + entries=None, + autorename=None, + allow_ownership_transfer=None): + super(MoveBatchArg, self).__init__(entries, + autorename) + self._allow_ownership_transfer_value = None + self._allow_ownership_transfer_present = False + if allow_ownership_transfer is not None: + self.allow_ownership_transfer = allow_ownership_transfer + + @property + def allow_ownership_transfer(self): + """ + Allow moves by owner even if it would result in an ownership transfer + for the content being moved. This does not apply to copies. + + :rtype: bool + """ + if self._allow_ownership_transfer_present: + return self._allow_ownership_transfer_value + else: + return False + + @allow_ownership_transfer.setter + def allow_ownership_transfer(self, val): + val = self._allow_ownership_transfer_validator.validate(val) + self._allow_ownership_transfer_value = val + self._allow_ownership_transfer_present = True + + @allow_ownership_transfer.deleter + def allow_ownership_transfer(self): + self._allow_ownership_transfer_value = None + self._allow_ownership_transfer_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MoveBatchArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MoveBatchArg(entries={!r}, autorename={!r}, allow_ownership_transfer={!r})'.format( + self._entries_value, + self._autorename_value, + self._allow_ownership_transfer_value, + ) + +MoveBatchArg_validator = bv.Struct(MoveBatchArg) + +class PhotoMetadata(MediaMetadata): + """ + Metadata for a photo. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self, + dimensions=None, + location=None, + time_taken=None): + super(PhotoMetadata, self).__init__(dimensions, + location, + time_taken) + + def _process_custom_annotations(self, annotation_type, processor): + super(PhotoMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PhotoMetadata(dimensions={!r}, location={!r}, time_taken={!r})'.format( + self._dimensions_value, + self._location_value, + self._time_taken_value, + ) + +PhotoMetadata_validator = bv.Struct(PhotoMetadata) + +class PreviewArg(bb.Struct): + """ + :ivar path: The path of the file to preview. + :ivar rev: Please specify revision in ``path`` instead. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_rev_value', + '_rev_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + rev=None): + self._path_value = None + self._path_present = False + self._rev_value = None + self._rev_present = False + if path is not None: + self.path = path + if rev is not None: + self.rev = rev + + @property + def path(self): + """ + The path of the file to preview. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def rev(self): + """ + Please specify revision in ``path`` instead. + + :rtype: str + """ + if self._rev_present: + return self._rev_value + else: + return None + + @rev.setter + def rev(self, val): + if val is None: + del self.rev + return + val = self._rev_validator.validate(val) + self._rev_value = val + self._rev_present = True + + @rev.deleter + def rev(self): + self._rev_value = None + self._rev_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PreviewArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PreviewArg(path={!r}, rev={!r})'.format( + self._path_value, + self._rev_value, + ) + +PreviewArg_validator = bv.Struct(PreviewArg) + +class PreviewError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar LookupError path: An error occurs when downloading metadata for the + file. + :ivar in_progress: This preview generation is still in progress and the file + is not ready for preview yet. + :ivar unsupported_extension: The file extension is not supported preview + generation. + :ivar unsupported_content: The file content is not supported for preview + generation. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + in_progress = None + # Attribute is overwritten below the class definition + unsupported_extension = None + # Attribute is overwritten below the class definition + unsupported_content = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param LookupError val: + :rtype: PreviewError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_in_progress(self): + """ + Check if the union tag is ``in_progress``. + + :rtype: bool + """ + return self._tag == 'in_progress' + + def is_unsupported_extension(self): + """ + Check if the union tag is ``unsupported_extension``. + + :rtype: bool + """ + return self._tag == 'unsupported_extension' + + def is_unsupported_content(self): + """ + Check if the union tag is ``unsupported_content``. + + :rtype: bool + """ + return self._tag == 'unsupported_content' + + def get_path(self): + """ + An error occurs when downloading metadata for the file. + + Only call this if :meth:`is_path` is true. + + :rtype: LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(PreviewError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PreviewError(%r, %r)' % (self._tag, self._value) + +PreviewError_validator = bv.Union(PreviewError) + +class RelocationPath(bb.Struct): + """ + :ivar from_path: Path in the user's Dropbox to be copied or moved. + :ivar to_path: Path in the user's Dropbox that is the destination. + """ + + __slots__ = [ + '_from_path_value', + '_from_path_present', + '_to_path_value', + '_to_path_present', + ] + + _has_required_fields = True + + def __init__(self, + from_path=None, + to_path=None): + self._from_path_value = None + self._from_path_present = False + self._to_path_value = None + self._to_path_present = False + if from_path is not None: + self.from_path = from_path + if to_path is not None: + self.to_path = to_path + + @property + def from_path(self): + """ + Path in the user's Dropbox to be copied or moved. + + :rtype: str + """ + if self._from_path_present: + return self._from_path_value + else: + raise AttributeError("missing required field 'from_path'") + + @from_path.setter + def from_path(self, val): + val = self._from_path_validator.validate(val) + self._from_path_value = val + self._from_path_present = True + + @from_path.deleter + def from_path(self): + self._from_path_value = None + self._from_path_present = False + + @property + def to_path(self): + """ + Path in the user's Dropbox that is the destination. + + :rtype: str + """ + if self._to_path_present: + return self._to_path_value + else: + raise AttributeError("missing required field 'to_path'") + + @to_path.setter + def to_path(self, val): + val = self._to_path_validator.validate(val) + self._to_path_value = val + self._to_path_present = True + + @to_path.deleter + def to_path(self): + self._to_path_value = None + self._to_path_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RelocationPath, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelocationPath(from_path={!r}, to_path={!r})'.format( + self._from_path_value, + self._to_path_value, + ) + +RelocationPath_validator = bv.Struct(RelocationPath) + +class RelocationArg(RelocationPath): + """ + :ivar allow_shared_folder: If true, + :meth:`dropbox.dropbox.Dropbox.files_copy` will copy contents in shared + folder, otherwise ``RelocationError.cant_copy_shared_folder`` will be + returned if ``from_path`` contains shared folder. This field is always + true for :meth:`dropbox.dropbox.Dropbox.files_move`. + :ivar autorename: If there's a conflict, have the Dropbox server try to + autorename the file to avoid the conflict. + :ivar allow_ownership_transfer: Allow moves by owner even if it would result + in an ownership transfer for the content being moved. This does not + apply to copies. + """ + + __slots__ = [ + '_allow_shared_folder_value', + '_allow_shared_folder_present', + '_autorename_value', + '_autorename_present', + '_allow_ownership_transfer_value', + '_allow_ownership_transfer_present', + ] + + _has_required_fields = True + + def __init__(self, + from_path=None, + to_path=None, + allow_shared_folder=None, + autorename=None, + allow_ownership_transfer=None): + super(RelocationArg, self).__init__(from_path, + to_path) + self._allow_shared_folder_value = None + self._allow_shared_folder_present = False + self._autorename_value = None + self._autorename_present = False + self._allow_ownership_transfer_value = None + self._allow_ownership_transfer_present = False + if allow_shared_folder is not None: + self.allow_shared_folder = allow_shared_folder + if autorename is not None: + self.autorename = autorename + if allow_ownership_transfer is not None: + self.allow_ownership_transfer = allow_ownership_transfer + + @property + def allow_shared_folder(self): + """ + If true, :meth:`dropbox.dropbox.Dropbox.files_copy` will copy contents + in shared folder, otherwise ``RelocationError.cant_copy_shared_folder`` + will be returned if ``from_path`` contains shared folder. This field is + always true for :meth:`dropbox.dropbox.Dropbox.files_move`. + + :rtype: bool + """ + if self._allow_shared_folder_present: + return self._allow_shared_folder_value + else: + return False + + @allow_shared_folder.setter + def allow_shared_folder(self, val): + val = self._allow_shared_folder_validator.validate(val) + self._allow_shared_folder_value = val + self._allow_shared_folder_present = True + + @allow_shared_folder.deleter + def allow_shared_folder(self): + self._allow_shared_folder_value = None + self._allow_shared_folder_present = False + + @property + def autorename(self): + """ + If there's a conflict, have the Dropbox server try to autorename the + file to avoid the conflict. + + :rtype: bool + """ + if self._autorename_present: + return self._autorename_value + else: + return False + + @autorename.setter + def autorename(self, val): + val = self._autorename_validator.validate(val) + self._autorename_value = val + self._autorename_present = True + + @autorename.deleter + def autorename(self): + self._autorename_value = None + self._autorename_present = False + + @property + def allow_ownership_transfer(self): + """ + Allow moves by owner even if it would result in an ownership transfer + for the content being moved. This does not apply to copies. + + :rtype: bool + """ + if self._allow_ownership_transfer_present: + return self._allow_ownership_transfer_value + else: + return False + + @allow_ownership_transfer.setter + def allow_ownership_transfer(self, val): + val = self._allow_ownership_transfer_validator.validate(val) + self._allow_ownership_transfer_value = val + self._allow_ownership_transfer_present = True + + @allow_ownership_transfer.deleter + def allow_ownership_transfer(self): + self._allow_ownership_transfer_value = None + self._allow_ownership_transfer_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RelocationArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelocationArg(from_path={!r}, to_path={!r}, allow_shared_folder={!r}, autorename={!r}, allow_ownership_transfer={!r})'.format( + self._from_path_value, + self._to_path_value, + self._allow_shared_folder_value, + self._autorename_value, + self._allow_ownership_transfer_value, + ) + +RelocationArg_validator = bv.Struct(RelocationArg) + +class RelocationBatchArg(RelocationBatchArgBase): + """ + :ivar allow_shared_folder: If true, + :meth:`dropbox.dropbox.Dropbox.files_copy_batch` will copy contents in + shared folder, otherwise ``RelocationError.cant_copy_shared_folder`` + will be returned if ``RelocationPath.from_path`` contains shared folder. + This field is always true for + :meth:`dropbox.dropbox.Dropbox.files_move_batch`. + :ivar allow_ownership_transfer: Allow moves by owner even if it would result + in an ownership transfer for the content being moved. This does not + apply to copies. + """ + + __slots__ = [ + '_allow_shared_folder_value', + '_allow_shared_folder_present', + '_allow_ownership_transfer_value', + '_allow_ownership_transfer_present', + ] + + _has_required_fields = True + + def __init__(self, + entries=None, + autorename=None, + allow_shared_folder=None, + allow_ownership_transfer=None): + super(RelocationBatchArg, self).__init__(entries, + autorename) + self._allow_shared_folder_value = None + self._allow_shared_folder_present = False + self._allow_ownership_transfer_value = None + self._allow_ownership_transfer_present = False + if allow_shared_folder is not None: + self.allow_shared_folder = allow_shared_folder + if allow_ownership_transfer is not None: + self.allow_ownership_transfer = allow_ownership_transfer + + @property + def allow_shared_folder(self): + """ + If true, :meth:`dropbox.dropbox.Dropbox.files_copy_batch` will copy + contents in shared folder, otherwise + ``RelocationError.cant_copy_shared_folder`` will be returned if + ``RelocationPath.from_path`` contains shared folder. This field is + always true for :meth:`dropbox.dropbox.Dropbox.files_move_batch`. + + :rtype: bool + """ + if self._allow_shared_folder_present: + return self._allow_shared_folder_value + else: + return False + + @allow_shared_folder.setter + def allow_shared_folder(self, val): + val = self._allow_shared_folder_validator.validate(val) + self._allow_shared_folder_value = val + self._allow_shared_folder_present = True + + @allow_shared_folder.deleter + def allow_shared_folder(self): + self._allow_shared_folder_value = None + self._allow_shared_folder_present = False + + @property + def allow_ownership_transfer(self): + """ + Allow moves by owner even if it would result in an ownership transfer + for the content being moved. This does not apply to copies. + + :rtype: bool + """ + if self._allow_ownership_transfer_present: + return self._allow_ownership_transfer_value + else: + return False + + @allow_ownership_transfer.setter + def allow_ownership_transfer(self, val): + val = self._allow_ownership_transfer_validator.validate(val) + self._allow_ownership_transfer_value = val + self._allow_ownership_transfer_present = True + + @allow_ownership_transfer.deleter + def allow_ownership_transfer(self): + self._allow_ownership_transfer_value = None + self._allow_ownership_transfer_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RelocationBatchArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelocationBatchArg(entries={!r}, autorename={!r}, allow_shared_folder={!r}, allow_ownership_transfer={!r})'.format( + self._entries_value, + self._autorename_value, + self._allow_shared_folder_value, + self._allow_ownership_transfer_value, + ) + +RelocationBatchArg_validator = bv.Struct(RelocationBatchArg) + +class RelocationError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar cant_copy_shared_folder: Shared folders can't be copied. + :ivar cant_nest_shared_folder: Your move operation would result in nested + shared folders. This is not allowed. + :ivar cant_move_folder_into_itself: You cannot move a folder into itself. + :ivar too_many_files: The operation would involve more than 10,000 files and + folders. + :ivar duplicated_or_nested_paths: There are duplicated/nested paths among + ``RelocationArg.from_path`` and ``RelocationArg.to_path``. + :ivar cant_transfer_ownership: Your move operation would result in an + ownership transfer. You may reissue the request with the field + ``RelocationArg.allow_ownership_transfer`` to true. + :ivar insufficient_quota: The current user does not have enough space to + move or copy the files. + :ivar internal_error: Something went wrong with the job on Dropbox's end. + You'll need to verify that the action you were taking succeeded, and if + not, try again. This should happen very rarely. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + cant_copy_shared_folder = None + # Attribute is overwritten below the class definition + cant_nest_shared_folder = None + # Attribute is overwritten below the class definition + cant_move_folder_into_itself = None + # Attribute is overwritten below the class definition + too_many_files = None + # Attribute is overwritten below the class definition + duplicated_or_nested_paths = None + # Attribute is overwritten below the class definition + cant_transfer_ownership = None + # Attribute is overwritten below the class definition + insufficient_quota = None + # Attribute is overwritten below the class definition + internal_error = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def from_lookup(cls, val): + """ + Create an instance of this class set to the ``from_lookup`` tag with + value ``val``. + + :param LookupError val: + :rtype: RelocationError + """ + return cls('from_lookup', val) + + @classmethod + def from_write(cls, val): + """ + Create an instance of this class set to the ``from_write`` tag with + value ``val``. + + :param WriteError val: + :rtype: RelocationError + """ + return cls('from_write', val) + + @classmethod + def to(cls, val): + """ + Create an instance of this class set to the ``to`` tag with value + ``val``. + + :param WriteError val: + :rtype: RelocationError + """ + return cls('to', val) + + def is_from_lookup(self): + """ + Check if the union tag is ``from_lookup``. + + :rtype: bool + """ + return self._tag == 'from_lookup' + + def is_from_write(self): + """ + Check if the union tag is ``from_write``. + + :rtype: bool + """ + return self._tag == 'from_write' + + def is_to(self): + """ + Check if the union tag is ``to``. + + :rtype: bool + """ + return self._tag == 'to' + + def is_cant_copy_shared_folder(self): + """ + Check if the union tag is ``cant_copy_shared_folder``. + + :rtype: bool + """ + return self._tag == 'cant_copy_shared_folder' + + def is_cant_nest_shared_folder(self): + """ + Check if the union tag is ``cant_nest_shared_folder``. + + :rtype: bool + """ + return self._tag == 'cant_nest_shared_folder' + + def is_cant_move_folder_into_itself(self): + """ + Check if the union tag is ``cant_move_folder_into_itself``. + + :rtype: bool + """ + return self._tag == 'cant_move_folder_into_itself' + + def is_too_many_files(self): + """ + Check if the union tag is ``too_many_files``. + + :rtype: bool + """ + return self._tag == 'too_many_files' + + def is_duplicated_or_nested_paths(self): + """ + Check if the union tag is ``duplicated_or_nested_paths``. + + :rtype: bool + """ + return self._tag == 'duplicated_or_nested_paths' + + def is_cant_transfer_ownership(self): + """ + Check if the union tag is ``cant_transfer_ownership``. + + :rtype: bool + """ + return self._tag == 'cant_transfer_ownership' + + def is_insufficient_quota(self): + """ + Check if the union tag is ``insufficient_quota``. + + :rtype: bool + """ + return self._tag == 'insufficient_quota' + + def is_internal_error(self): + """ + Check if the union tag is ``internal_error``. + + :rtype: bool + """ + return self._tag == 'internal_error' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_from_lookup(self): + """ + Only call this if :meth:`is_from_lookup` is true. + + :rtype: LookupError + """ + if not self.is_from_lookup(): + raise AttributeError("tag 'from_lookup' not set") + return self._value + + def get_from_write(self): + """ + Only call this if :meth:`is_from_write` is true. + + :rtype: WriteError + """ + if not self.is_from_write(): + raise AttributeError("tag 'from_write' not set") + return self._value + + def get_to(self): + """ + Only call this if :meth:`is_to` is true. + + :rtype: WriteError + """ + if not self.is_to(): + raise AttributeError("tag 'to' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(RelocationError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelocationError(%r, %r)' % (self._tag, self._value) + +RelocationError_validator = bv.Union(RelocationError) + +class RelocationBatchError(RelocationError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar too_many_write_operations: There are too many write operations in + user's Dropbox. Please retry this request. + """ + + # Attribute is overwritten below the class definition + too_many_write_operations = None + + def is_too_many_write_operations(self): + """ + Check if the union tag is ``too_many_write_operations``. + + :rtype: bool + """ + return self._tag == 'too_many_write_operations' + + def _process_custom_annotations(self, annotation_type, processor): + super(RelocationBatchError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelocationBatchError(%r, %r)' % (self._tag, self._value) + +RelocationBatchError_validator = bv.Union(RelocationBatchError) + +class RelocationBatchErrorEntry(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar RelocationError relocation_error: User errors that retry won't help. + :ivar internal_error: Something went wrong with the job on Dropbox's end. + You'll need to verify that the action you were taking succeeded, and if + not, try again. This should happen very rarely. + :ivar too_many_write_operations: There are too many write operations in + user's Dropbox. Please retry this request. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + internal_error = None + # Attribute is overwritten below the class definition + too_many_write_operations = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def relocation_error(cls, val): + """ + Create an instance of this class set to the ``relocation_error`` tag + with value ``val``. + + :param RelocationError val: + :rtype: RelocationBatchErrorEntry + """ + return cls('relocation_error', val) + + def is_relocation_error(self): + """ + Check if the union tag is ``relocation_error``. + + :rtype: bool + """ + return self._tag == 'relocation_error' + + def is_internal_error(self): + """ + Check if the union tag is ``internal_error``. + + :rtype: bool + """ + return self._tag == 'internal_error' + + def is_too_many_write_operations(self): + """ + Check if the union tag is ``too_many_write_operations``. + + :rtype: bool + """ + return self._tag == 'too_many_write_operations' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_relocation_error(self): + """ + User errors that retry won't help. + + Only call this if :meth:`is_relocation_error` is true. + + :rtype: RelocationError + """ + if not self.is_relocation_error(): + raise AttributeError("tag 'relocation_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(RelocationBatchErrorEntry, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelocationBatchErrorEntry(%r, %r)' % (self._tag, self._value) + +RelocationBatchErrorEntry_validator = bv.Union(RelocationBatchErrorEntry) + +class RelocationBatchJobStatus(async_.PollResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar RelocationBatchResult complete: The copy or move batch job has + finished. + :ivar RelocationBatchError failed: The copy or move batch job has failed + with exception. + """ + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param RelocationBatchResult val: + :rtype: RelocationBatchJobStatus + """ + return cls('complete', val) + + @classmethod + def failed(cls, val): + """ + Create an instance of this class set to the ``failed`` tag with value + ``val``. + + :param RelocationBatchError val: + :rtype: RelocationBatchJobStatus + """ + return cls('failed', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def is_failed(self): + """ + Check if the union tag is ``failed``. + + :rtype: bool + """ + return self._tag == 'failed' + + def get_complete(self): + """ + The copy or move batch job has finished. + + Only call this if :meth:`is_complete` is true. + + :rtype: RelocationBatchResult + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def get_failed(self): + """ + The copy or move batch job has failed with exception. + + Only call this if :meth:`is_failed` is true. + + :rtype: RelocationBatchError + """ + if not self.is_failed(): + raise AttributeError("tag 'failed' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(RelocationBatchJobStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelocationBatchJobStatus(%r, %r)' % (self._tag, self._value) + +RelocationBatchJobStatus_validator = bv.Union(RelocationBatchJobStatus) + +class RelocationBatchLaunch(async_.LaunchResultBase): + """ + Result returned by :meth:`dropbox.dropbox.Dropbox.files_copy_batch` or + :meth:`dropbox.dropbox.Dropbox.files_move_batch` that may either launch an + asynchronous job or complete synchronously. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param RelocationBatchResult val: + :rtype: RelocationBatchLaunch + """ + return cls('complete', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_complete(self): + """ + Only call this if :meth:`is_complete` is true. + + :rtype: RelocationBatchResult + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(RelocationBatchLaunch, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelocationBatchLaunch(%r, %r)' % (self._tag, self._value) + +RelocationBatchLaunch_validator = bv.Union(RelocationBatchLaunch) + +class RelocationBatchResult(FileOpsResult): + + __slots__ = [ + '_entries_value', + '_entries_present', + ] + + _has_required_fields = True + + def __init__(self, + entries=None): + super(RelocationBatchResult, self).__init__() + self._entries_value = None + self._entries_present = False + if entries is not None: + self.entries = entries + + @property + def entries(self): + """ + :rtype: list of [RelocationBatchResultData] + """ + if self._entries_present: + return self._entries_value + else: + raise AttributeError("missing required field 'entries'") + + @entries.setter + def entries(self, val): + val = self._entries_validator.validate(val) + self._entries_value = val + self._entries_present = True + + @entries.deleter + def entries(self): + self._entries_value = None + self._entries_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RelocationBatchResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelocationBatchResult(entries={!r})'.format( + self._entries_value, + ) + +RelocationBatchResult_validator = bv.Struct(RelocationBatchResult) + +class RelocationBatchResultData(bb.Struct): + """ + :ivar metadata: Metadata of the relocated object. + """ + + __slots__ = [ + '_metadata_value', + '_metadata_present', + ] + + _has_required_fields = True + + def __init__(self, + metadata=None): + self._metadata_value = None + self._metadata_present = False + if metadata is not None: + self.metadata = metadata + + @property + def metadata(self): + """ + Metadata of the relocated object. + + :rtype: Metadata + """ + if self._metadata_present: + return self._metadata_value + else: + raise AttributeError("missing required field 'metadata'") + + @metadata.setter + def metadata(self, val): + self._metadata_validator.validate_type_only(val) + self._metadata_value = val + self._metadata_present = True + + @metadata.deleter + def metadata(self): + self._metadata_value = None + self._metadata_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RelocationBatchResultData, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelocationBatchResultData(metadata={!r})'.format( + self._metadata_value, + ) + +RelocationBatchResultData_validator = bv.Struct(RelocationBatchResultData) + +class RelocationBatchResultEntry(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def success(cls, val): + """ + Create an instance of this class set to the ``success`` tag with value + ``val``. + + :param Metadata val: + :rtype: RelocationBatchResultEntry + """ + return cls('success', val) + + @classmethod + def failure(cls, val): + """ + Create an instance of this class set to the ``failure`` tag with value + ``val``. + + :param RelocationBatchErrorEntry val: + :rtype: RelocationBatchResultEntry + """ + return cls('failure', val) + + def is_success(self): + """ + Check if the union tag is ``success``. + + :rtype: bool + """ + return self._tag == 'success' + + def is_failure(self): + """ + Check if the union tag is ``failure``. + + :rtype: bool + """ + return self._tag == 'failure' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_success(self): + """ + Only call this if :meth:`is_success` is true. + + :rtype: Metadata + """ + if not self.is_success(): + raise AttributeError("tag 'success' not set") + return self._value + + def get_failure(self): + """ + Only call this if :meth:`is_failure` is true. + + :rtype: RelocationBatchErrorEntry + """ + if not self.is_failure(): + raise AttributeError("tag 'failure' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(RelocationBatchResultEntry, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelocationBatchResultEntry(%r, %r)' % (self._tag, self._value) + +RelocationBatchResultEntry_validator = bv.Union(RelocationBatchResultEntry) + +class RelocationBatchV2JobStatus(async_.PollResultBase): + """ + Result returned by :meth:`dropbox.dropbox.Dropbox.files_copy_batch` or + :meth:`dropbox.dropbox.Dropbox.files_move_batch` that may either launch an + asynchronous job or complete synchronously. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar RelocationBatchV2Result complete: The copy or move batch job has + finished. + """ + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param RelocationBatchV2Result val: + :rtype: RelocationBatchV2JobStatus + """ + return cls('complete', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def get_complete(self): + """ + The copy or move batch job has finished. + + Only call this if :meth:`is_complete` is true. + + :rtype: RelocationBatchV2Result + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(RelocationBatchV2JobStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelocationBatchV2JobStatus(%r, %r)' % (self._tag, self._value) + +RelocationBatchV2JobStatus_validator = bv.Union(RelocationBatchV2JobStatus) + +class RelocationBatchV2Launch(async_.LaunchResultBase): + """ + Result returned by :meth:`dropbox.dropbox.Dropbox.files_copy_batch` or + :meth:`dropbox.dropbox.Dropbox.files_move_batch` that may either launch an + asynchronous job or complete synchronously. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param RelocationBatchV2Result val: + :rtype: RelocationBatchV2Launch + """ + return cls('complete', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def get_complete(self): + """ + Only call this if :meth:`is_complete` is true. + + :rtype: RelocationBatchV2Result + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(RelocationBatchV2Launch, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelocationBatchV2Launch(%r, %r)' % (self._tag, self._value) + +RelocationBatchV2Launch_validator = bv.Union(RelocationBatchV2Launch) + +class RelocationBatchV2Result(FileOpsResult): + """ + :ivar entries: Each entry in CopyBatchArg.entries or + ``MoveBatchArg.entries`` will appear at the same position inside + ``RelocationBatchV2Result.entries``. + """ + + __slots__ = [ + '_entries_value', + '_entries_present', + ] + + _has_required_fields = True + + def __init__(self, + entries=None): + super(RelocationBatchV2Result, self).__init__() + self._entries_value = None + self._entries_present = False + if entries is not None: + self.entries = entries + + @property + def entries(self): + """ + Each entry in CopyBatchArg.entries or ``MoveBatchArg.entries`` will + appear at the same position inside ``RelocationBatchV2Result.entries``. + + :rtype: list of [RelocationBatchResultEntry] + """ + if self._entries_present: + return self._entries_value + else: + raise AttributeError("missing required field 'entries'") + + @entries.setter + def entries(self, val): + val = self._entries_validator.validate(val) + self._entries_value = val + self._entries_present = True + + @entries.deleter + def entries(self): + self._entries_value = None + self._entries_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RelocationBatchV2Result, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelocationBatchV2Result(entries={!r})'.format( + self._entries_value, + ) + +RelocationBatchV2Result_validator = bv.Struct(RelocationBatchV2Result) + +class RelocationResult(FileOpsResult): + """ + :ivar metadata: Metadata of the relocated object. + """ + + __slots__ = [ + '_metadata_value', + '_metadata_present', + ] + + _has_required_fields = True + + def __init__(self, + metadata=None): + super(RelocationResult, self).__init__() + self._metadata_value = None + self._metadata_present = False + if metadata is not None: + self.metadata = metadata + + @property + def metadata(self): + """ + Metadata of the relocated object. + + :rtype: Metadata + """ + if self._metadata_present: + return self._metadata_value + else: + raise AttributeError("missing required field 'metadata'") + + @metadata.setter + def metadata(self, val): + self._metadata_validator.validate_type_only(val) + self._metadata_value = val + self._metadata_present = True + + @metadata.deleter + def metadata(self): + self._metadata_value = None + self._metadata_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RelocationResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelocationResult(metadata={!r})'.format( + self._metadata_value, + ) + +RelocationResult_validator = bv.Struct(RelocationResult) + +class RestoreArg(bb.Struct): + """ + :ivar path: The path to save the restored file. + :ivar rev: The revision to restore. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_rev_value', + '_rev_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + rev=None): + self._path_value = None + self._path_present = False + self._rev_value = None + self._rev_present = False + if path is not None: + self.path = path + if rev is not None: + self.rev = rev + + @property + def path(self): + """ + The path to save the restored file. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def rev(self): + """ + The revision to restore. + + :rtype: str + """ + if self._rev_present: + return self._rev_value + else: + raise AttributeError("missing required field 'rev'") + + @rev.setter + def rev(self, val): + val = self._rev_validator.validate(val) + self._rev_value = val + self._rev_present = True + + @rev.deleter + def rev(self): + self._rev_value = None + self._rev_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RestoreArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RestoreArg(path={!r}, rev={!r})'.format( + self._path_value, + self._rev_value, + ) + +RestoreArg_validator = bv.Struct(RestoreArg) + +class RestoreError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar LookupError path_lookup: An error occurs when downloading metadata for + the file. + :ivar WriteError path_write: An error occurs when trying to restore the file + to that path. + :ivar invalid_revision: The revision is invalid. It may not exist. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_revision = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path_lookup(cls, val): + """ + Create an instance of this class set to the ``path_lookup`` tag with + value ``val``. + + :param LookupError val: + :rtype: RestoreError + """ + return cls('path_lookup', val) + + @classmethod + def path_write(cls, val): + """ + Create an instance of this class set to the ``path_write`` tag with + value ``val``. + + :param WriteError val: + :rtype: RestoreError + """ + return cls('path_write', val) + + def is_path_lookup(self): + """ + Check if the union tag is ``path_lookup``. + + :rtype: bool + """ + return self._tag == 'path_lookup' + + def is_path_write(self): + """ + Check if the union tag is ``path_write``. + + :rtype: bool + """ + return self._tag == 'path_write' + + def is_invalid_revision(self): + """ + Check if the union tag is ``invalid_revision``. + + :rtype: bool + """ + return self._tag == 'invalid_revision' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path_lookup(self): + """ + An error occurs when downloading metadata for the file. + + Only call this if :meth:`is_path_lookup` is true. + + :rtype: LookupError + """ + if not self.is_path_lookup(): + raise AttributeError("tag 'path_lookup' not set") + return self._value + + def get_path_write(self): + """ + An error occurs when trying to restore the file to that path. + + Only call this if :meth:`is_path_write` is true. + + :rtype: WriteError + """ + if not self.is_path_write(): + raise AttributeError("tag 'path_write' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(RestoreError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RestoreError(%r, %r)' % (self._tag, self._value) + +RestoreError_validator = bv.Union(RestoreError) + +class SaveCopyReferenceArg(bb.Struct): + """ + :ivar copy_reference: A copy reference returned by + :meth:`dropbox.dropbox.Dropbox.files_copy_reference_get`. + :ivar path: Path in the user's Dropbox that is the destination. + """ + + __slots__ = [ + '_copy_reference_value', + '_copy_reference_present', + '_path_value', + '_path_present', + ] + + _has_required_fields = True + + def __init__(self, + copy_reference=None, + path=None): + self._copy_reference_value = None + self._copy_reference_present = False + self._path_value = None + self._path_present = False + if copy_reference is not None: + self.copy_reference = copy_reference + if path is not None: + self.path = path + + @property + def copy_reference(self): + """ + A copy reference returned by + :meth:`dropbox.dropbox.Dropbox.files_copy_reference_get`. + + :rtype: str + """ + if self._copy_reference_present: + return self._copy_reference_value + else: + raise AttributeError("missing required field 'copy_reference'") + + @copy_reference.setter + def copy_reference(self, val): + val = self._copy_reference_validator.validate(val) + self._copy_reference_value = val + self._copy_reference_present = True + + @copy_reference.deleter + def copy_reference(self): + self._copy_reference_value = None + self._copy_reference_present = False + + @property + def path(self): + """ + Path in the user's Dropbox that is the destination. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SaveCopyReferenceArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SaveCopyReferenceArg(copy_reference={!r}, path={!r})'.format( + self._copy_reference_value, + self._path_value, + ) + +SaveCopyReferenceArg_validator = bv.Struct(SaveCopyReferenceArg) + +class SaveCopyReferenceError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_copy_reference: The copy reference is invalid. + :ivar no_permission: You don't have permission to save the given copy + reference. Please make sure this app is same app which created the copy + reference and the source user is still linked to the app. + :ivar not_found: The file referenced by the copy reference cannot be found. + :ivar too_many_files: The operation would involve more than 10,000 files and + folders. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_copy_reference = None + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + not_found = None + # Attribute is overwritten below the class definition + too_many_files = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param WriteError val: + :rtype: SaveCopyReferenceError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_invalid_copy_reference(self): + """ + Check if the union tag is ``invalid_copy_reference``. + + :rtype: bool + """ + return self._tag == 'invalid_copy_reference' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_not_found(self): + """ + Check if the union tag is ``not_found``. + + :rtype: bool + """ + return self._tag == 'not_found' + + def is_too_many_files(self): + """ + Check if the union tag is ``too_many_files``. + + :rtype: bool + """ + return self._tag == 'too_many_files' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: WriteError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(SaveCopyReferenceError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SaveCopyReferenceError(%r, %r)' % (self._tag, self._value) + +SaveCopyReferenceError_validator = bv.Union(SaveCopyReferenceError) + +class SaveCopyReferenceResult(bb.Struct): + """ + :ivar metadata: The metadata of the saved file or folder in the user's + Dropbox. + """ + + __slots__ = [ + '_metadata_value', + '_metadata_present', + ] + + _has_required_fields = True + + def __init__(self, + metadata=None): + self._metadata_value = None + self._metadata_present = False + if metadata is not None: + self.metadata = metadata + + @property + def metadata(self): + """ + The metadata of the saved file or folder in the user's Dropbox. + + :rtype: Metadata + """ + if self._metadata_present: + return self._metadata_value + else: + raise AttributeError("missing required field 'metadata'") + + @metadata.setter + def metadata(self, val): + self._metadata_validator.validate_type_only(val) + self._metadata_value = val + self._metadata_present = True + + @metadata.deleter + def metadata(self): + self._metadata_value = None + self._metadata_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SaveCopyReferenceResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SaveCopyReferenceResult(metadata={!r})'.format( + self._metadata_value, + ) + +SaveCopyReferenceResult_validator = bv.Struct(SaveCopyReferenceResult) + +class SaveUrlArg(bb.Struct): + """ + :ivar path: The path in Dropbox where the URL will be saved to. + :ivar url: The URL to be saved. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_url_value', + '_url_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + url=None): + self._path_value = None + self._path_present = False + self._url_value = None + self._url_present = False + if path is not None: + self.path = path + if url is not None: + self.url = url + + @property + def path(self): + """ + The path in Dropbox where the URL will be saved to. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def url(self): + """ + The URL to be saved. + + :rtype: str + """ + if self._url_present: + return self._url_value + else: + raise AttributeError("missing required field 'url'") + + @url.setter + def url(self, val): + val = self._url_validator.validate(val) + self._url_value = val + self._url_present = True + + @url.deleter + def url(self): + self._url_value = None + self._url_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SaveUrlArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SaveUrlArg(path={!r}, url={!r})'.format( + self._path_value, + self._url_value, + ) + +SaveUrlArg_validator = bv.Struct(SaveUrlArg) + +class SaveUrlError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar download_failed: Failed downloading the given URL. + :ivar invalid_url: The given URL is invalid. + :ivar not_found: The file where the URL is saved to no longer exists. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + download_failed = None + # Attribute is overwritten below the class definition + invalid_url = None + # Attribute is overwritten below the class definition + not_found = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param WriteError val: + :rtype: SaveUrlError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_download_failed(self): + """ + Check if the union tag is ``download_failed``. + + :rtype: bool + """ + return self._tag == 'download_failed' + + def is_invalid_url(self): + """ + Check if the union tag is ``invalid_url``. + + :rtype: bool + """ + return self._tag == 'invalid_url' + + def is_not_found(self): + """ + Check if the union tag is ``not_found``. + + :rtype: bool + """ + return self._tag == 'not_found' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: WriteError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(SaveUrlError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SaveUrlError(%r, %r)' % (self._tag, self._value) + +SaveUrlError_validator = bv.Union(SaveUrlError) + +class SaveUrlJobStatus(async_.PollResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar FileMetadata complete: Metadata of the file where the URL is saved to. + """ + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param FileMetadata val: + :rtype: SaveUrlJobStatus + """ + return cls('complete', val) + + @classmethod + def failed(cls, val): + """ + Create an instance of this class set to the ``failed`` tag with value + ``val``. + + :param SaveUrlError val: + :rtype: SaveUrlJobStatus + """ + return cls('failed', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def is_failed(self): + """ + Check if the union tag is ``failed``. + + :rtype: bool + """ + return self._tag == 'failed' + + def get_complete(self): + """ + Metadata of the file where the URL is saved to. + + Only call this if :meth:`is_complete` is true. + + :rtype: FileMetadata + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def get_failed(self): + """ + Only call this if :meth:`is_failed` is true. + + :rtype: SaveUrlError + """ + if not self.is_failed(): + raise AttributeError("tag 'failed' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(SaveUrlJobStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SaveUrlJobStatus(%r, %r)' % (self._tag, self._value) + +SaveUrlJobStatus_validator = bv.Union(SaveUrlJobStatus) + +class SaveUrlResult(async_.LaunchResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar FileMetadata complete: Metadata of the file where the URL is saved to. + """ + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param FileMetadata val: + :rtype: SaveUrlResult + """ + return cls('complete', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def get_complete(self): + """ + Metadata of the file where the URL is saved to. + + Only call this if :meth:`is_complete` is true. + + :rtype: FileMetadata + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(SaveUrlResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SaveUrlResult(%r, %r)' % (self._tag, self._value) + +SaveUrlResult_validator = bv.Union(SaveUrlResult) + +class SearchArg(bb.Struct): + """ + :ivar path: The path in the user's Dropbox to search. Should probably be a + folder. + :ivar query: The string to search for. The search string is split on spaces + into multiple tokens. For file name searching, the last token is used + for prefix matching (i.e. "bat c" matches "bat cave" but not "batman + car"). + :ivar start: The starting index within the search results (used for paging). + :ivar max_results: The maximum number of search results to return. + :ivar mode: The search mode (filename, filename_and_content, or + deleted_filename). Note that searching file content is only available + for Dropbox Business accounts. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_query_value', + '_query_present', + '_start_value', + '_start_present', + '_max_results_value', + '_max_results_present', + '_mode_value', + '_mode_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + query=None, + start=None, + max_results=None, + mode=None): + self._path_value = None + self._path_present = False + self._query_value = None + self._query_present = False + self._start_value = None + self._start_present = False + self._max_results_value = None + self._max_results_present = False + self._mode_value = None + self._mode_present = False + if path is not None: + self.path = path + if query is not None: + self.query = query + if start is not None: + self.start = start + if max_results is not None: + self.max_results = max_results + if mode is not None: + self.mode = mode + + @property + def path(self): + """ + The path in the user's Dropbox to search. Should probably be a folder. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def query(self): + """ + The string to search for. The search string is split on spaces into + multiple tokens. For file name searching, the last token is used for + prefix matching (i.e. "bat c" matches "bat cave" but not "batman car"). + + :rtype: str + """ + if self._query_present: + return self._query_value + else: + raise AttributeError("missing required field 'query'") + + @query.setter + def query(self, val): + val = self._query_validator.validate(val) + self._query_value = val + self._query_present = True + + @query.deleter + def query(self): + self._query_value = None + self._query_present = False + + @property + def start(self): + """ + The starting index within the search results (used for paging). + + :rtype: int + """ + if self._start_present: + return self._start_value + else: + return 0 + + @start.setter + def start(self, val): + val = self._start_validator.validate(val) + self._start_value = val + self._start_present = True + + @start.deleter + def start(self): + self._start_value = None + self._start_present = False + + @property + def max_results(self): + """ + The maximum number of search results to return. + + :rtype: int + """ + if self._max_results_present: + return self._max_results_value + else: + return 100 + + @max_results.setter + def max_results(self, val): + val = self._max_results_validator.validate(val) + self._max_results_value = val + self._max_results_present = True + + @max_results.deleter + def max_results(self): + self._max_results_value = None + self._max_results_present = False + + @property + def mode(self): + """ + The search mode (filename, filename_and_content, or deleted_filename). + Note that searching file content is only available for Dropbox Business + accounts. + + :rtype: SearchMode + """ + if self._mode_present: + return self._mode_value + else: + return SearchMode.filename + + @mode.setter + def mode(self, val): + self._mode_validator.validate_type_only(val) + self._mode_value = val + self._mode_present = True + + @mode.deleter + def mode(self): + self._mode_value = None + self._mode_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SearchArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SearchArg(path={!r}, query={!r}, start={!r}, max_results={!r}, mode={!r})'.format( + self._path_value, + self._query_value, + self._start_value, + self._max_results_value, + self._mode_value, + ) + +SearchArg_validator = bv.Struct(SearchArg) + +class SearchError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param LookupError val: + :rtype: SearchError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(SearchError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SearchError(%r, %r)' % (self._tag, self._value) + +SearchError_validator = bv.Union(SearchError) + +class SearchMatch(bb.Struct): + """ + :ivar match_type: The type of the match. + :ivar metadata: The metadata for the matched file or folder. + """ + + __slots__ = [ + '_match_type_value', + '_match_type_present', + '_metadata_value', + '_metadata_present', + ] + + _has_required_fields = True + + def __init__(self, + match_type=None, + metadata=None): + self._match_type_value = None + self._match_type_present = False + self._metadata_value = None + self._metadata_present = False + if match_type is not None: + self.match_type = match_type + if metadata is not None: + self.metadata = metadata + + @property + def match_type(self): + """ + The type of the match. + + :rtype: SearchMatchType + """ + if self._match_type_present: + return self._match_type_value + else: + raise AttributeError("missing required field 'match_type'") + + @match_type.setter + def match_type(self, val): + self._match_type_validator.validate_type_only(val) + self._match_type_value = val + self._match_type_present = True + + @match_type.deleter + def match_type(self): + self._match_type_value = None + self._match_type_present = False + + @property + def metadata(self): + """ + The metadata for the matched file or folder. + + :rtype: Metadata + """ + if self._metadata_present: + return self._metadata_value + else: + raise AttributeError("missing required field 'metadata'") + + @metadata.setter + def metadata(self, val): + self._metadata_validator.validate_type_only(val) + self._metadata_value = val + self._metadata_present = True + + @metadata.deleter + def metadata(self): + self._metadata_value = None + self._metadata_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SearchMatch, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SearchMatch(match_type={!r}, metadata={!r})'.format( + self._match_type_value, + self._metadata_value, + ) + +SearchMatch_validator = bv.Struct(SearchMatch) + +class SearchMatchType(bb.Union): + """ + Indicates what type of match was found for a given item. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar filename: This item was matched on its file or folder name. + :ivar content: This item was matched based on its file contents. + :ivar both: This item was matched based on both its contents and its file + name. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + filename = None + # Attribute is overwritten below the class definition + content = None + # Attribute is overwritten below the class definition + both = None + + def is_filename(self): + """ + Check if the union tag is ``filename``. + + :rtype: bool + """ + return self._tag == 'filename' + + def is_content(self): + """ + Check if the union tag is ``content``. + + :rtype: bool + """ + return self._tag == 'content' + + def is_both(self): + """ + Check if the union tag is ``both``. + + :rtype: bool + """ + return self._tag == 'both' + + def _process_custom_annotations(self, annotation_type, processor): + super(SearchMatchType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SearchMatchType(%r, %r)' % (self._tag, self._value) + +SearchMatchType_validator = bv.Union(SearchMatchType) + +class SearchMode(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar filename: Search file and folder names. + :ivar filename_and_content: Search file and folder names as well as file + contents. + :ivar deleted_filename: Search for deleted file and folder names. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + filename = None + # Attribute is overwritten below the class definition + filename_and_content = None + # Attribute is overwritten below the class definition + deleted_filename = None + + def is_filename(self): + """ + Check if the union tag is ``filename``. + + :rtype: bool + """ + return self._tag == 'filename' + + def is_filename_and_content(self): + """ + Check if the union tag is ``filename_and_content``. + + :rtype: bool + """ + return self._tag == 'filename_and_content' + + def is_deleted_filename(self): + """ + Check if the union tag is ``deleted_filename``. + + :rtype: bool + """ + return self._tag == 'deleted_filename' + + def _process_custom_annotations(self, annotation_type, processor): + super(SearchMode, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SearchMode(%r, %r)' % (self._tag, self._value) + +SearchMode_validator = bv.Union(SearchMode) + +class SearchResult(bb.Struct): + """ + :ivar matches: A list (possibly empty) of matches for the query. + :ivar more: Used for paging. If true, indicates there is another page of + results available that can be fetched by calling + :meth:`dropbox.dropbox.Dropbox.files_search` again. + :ivar start: Used for paging. Value to set the start argument to when + calling :meth:`dropbox.dropbox.Dropbox.files_search` to fetch the next + page of results. + """ + + __slots__ = [ + '_matches_value', + '_matches_present', + '_more_value', + '_more_present', + '_start_value', + '_start_present', + ] + + _has_required_fields = True + + def __init__(self, + matches=None, + more=None, + start=None): + self._matches_value = None + self._matches_present = False + self._more_value = None + self._more_present = False + self._start_value = None + self._start_present = False + if matches is not None: + self.matches = matches + if more is not None: + self.more = more + if start is not None: + self.start = start + + @property + def matches(self): + """ + A list (possibly empty) of matches for the query. + + :rtype: list of [SearchMatch] + """ + if self._matches_present: + return self._matches_value + else: + raise AttributeError("missing required field 'matches'") + + @matches.setter + def matches(self, val): + val = self._matches_validator.validate(val) + self._matches_value = val + self._matches_present = True + + @matches.deleter + def matches(self): + self._matches_value = None + self._matches_present = False + + @property + def more(self): + """ + Used for paging. If true, indicates there is another page of results + available that can be fetched by calling + :meth:`dropbox.dropbox.Dropbox.files_search` again. + + :rtype: bool + """ + if self._more_present: + return self._more_value + else: + raise AttributeError("missing required field 'more'") + + @more.setter + def more(self, val): + val = self._more_validator.validate(val) + self._more_value = val + self._more_present = True + + @more.deleter + def more(self): + self._more_value = None + self._more_present = False + + @property + def start(self): + """ + Used for paging. Value to set the start argument to when calling + :meth:`dropbox.dropbox.Dropbox.files_search` to fetch the next page of + results. + + :rtype: int + """ + if self._start_present: + return self._start_value + else: + raise AttributeError("missing required field 'start'") + + @start.setter + def start(self, val): + val = self._start_validator.validate(val) + self._start_value = val + self._start_present = True + + @start.deleter + def start(self): + self._start_value = None + self._start_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SearchResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SearchResult(matches={!r}, more={!r}, start={!r})'.format( + self._matches_value, + self._more_value, + self._start_value, + ) + +SearchResult_validator = bv.Struct(SearchResult) + +class SharedLink(bb.Struct): + """ + :ivar url: Shared link url. + :ivar password: Password for the shared link. + """ + + __slots__ = [ + '_url_value', + '_url_present', + '_password_value', + '_password_present', + ] + + _has_required_fields = True + + def __init__(self, + url=None, + password=None): + self._url_value = None + self._url_present = False + self._password_value = None + self._password_present = False + if url is not None: + self.url = url + if password is not None: + self.password = password + + @property + def url(self): + """ + Shared link url. + + :rtype: str + """ + if self._url_present: + return self._url_value + else: + raise AttributeError("missing required field 'url'") + + @url.setter + def url(self, val): + val = self._url_validator.validate(val) + self._url_value = val + self._url_present = True + + @url.deleter + def url(self): + self._url_value = None + self._url_present = False + + @property + def password(self): + """ + Password for the shared link. + + :rtype: str + """ + if self._password_present: + return self._password_value + else: + return None + + @password.setter + def password(self, val): + if val is None: + del self.password + return + val = self._password_validator.validate(val) + self._password_value = val + self._password_present = True + + @password.deleter + def password(self): + self._password_value = None + self._password_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLink, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLink(url={!r}, password={!r})'.format( + self._url_value, + self._password_value, + ) + +SharedLink_validator = bv.Struct(SharedLink) + +class SymlinkInfo(bb.Struct): + """ + :ivar target: The target this symlink points to. + """ + + __slots__ = [ + '_target_value', + '_target_present', + ] + + _has_required_fields = True + + def __init__(self, + target=None): + self._target_value = None + self._target_present = False + if target is not None: + self.target = target + + @property + def target(self): + """ + The target this symlink points to. + + :rtype: str + """ + if self._target_present: + return self._target_value + else: + raise AttributeError("missing required field 'target'") + + @target.setter + def target(self, val): + val = self._target_validator.validate(val) + self._target_value = val + self._target_present = True + + @target.deleter + def target(self): + self._target_value = None + self._target_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SymlinkInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SymlinkInfo(target={!r})'.format( + self._target_value, + ) + +SymlinkInfo_validator = bv.Struct(SymlinkInfo) + +class SyncSetting(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar default: On first sync to members' computers, the specified folder + will follow its parent folder's setting or otherwise follow default sync + behavior. + :ivar not_synced: On first sync to members' computers, the specified folder + will be set to not sync with selective sync. + :ivar not_synced_inactive: The specified folder's not_synced setting is + inactive due to its location or other configuration changes. It will + follow its parent folder's setting. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + default = None + # Attribute is overwritten below the class definition + not_synced = None + # Attribute is overwritten below the class definition + not_synced_inactive = None + # Attribute is overwritten below the class definition + other = None + + def is_default(self): + """ + Check if the union tag is ``default``. + + :rtype: bool + """ + return self._tag == 'default' + + def is_not_synced(self): + """ + Check if the union tag is ``not_synced``. + + :rtype: bool + """ + return self._tag == 'not_synced' + + def is_not_synced_inactive(self): + """ + Check if the union tag is ``not_synced_inactive``. + + :rtype: bool + """ + return self._tag == 'not_synced_inactive' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SyncSetting, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SyncSetting(%r, %r)' % (self._tag, self._value) + +SyncSetting_validator = bv.Union(SyncSetting) + +class SyncSettingArg(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar default: On first sync to members' computers, the specified folder + will follow its parent folder's setting or otherwise follow default sync + behavior. + :ivar not_synced: On first sync to members' computers, the specified folder + will be set to not sync with selective sync. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + default = None + # Attribute is overwritten below the class definition + not_synced = None + # Attribute is overwritten below the class definition + other = None + + def is_default(self): + """ + Check if the union tag is ``default``. + + :rtype: bool + """ + return self._tag == 'default' + + def is_not_synced(self): + """ + Check if the union tag is ``not_synced``. + + :rtype: bool + """ + return self._tag == 'not_synced' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SyncSettingArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SyncSettingArg(%r, %r)' % (self._tag, self._value) + +SyncSettingArg_validator = bv.Union(SyncSettingArg) + +class SyncSettingsError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar unsupported_combination: Setting this combination of sync settings + simultaneously is not supported. + :ivar unsupported_configuration: The specified configuration is not + supported. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + unsupported_combination = None + # Attribute is overwritten below the class definition + unsupported_configuration = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param LookupError val: + :rtype: SyncSettingsError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_unsupported_combination(self): + """ + Check if the union tag is ``unsupported_combination``. + + :rtype: bool + """ + return self._tag == 'unsupported_combination' + + def is_unsupported_configuration(self): + """ + Check if the union tag is ``unsupported_configuration``. + + :rtype: bool + """ + return self._tag == 'unsupported_configuration' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(SyncSettingsError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SyncSettingsError(%r, %r)' % (self._tag, self._value) + +SyncSettingsError_validator = bv.Union(SyncSettingsError) + +class ThumbnailArg(bb.Struct): + """ + :ivar path: The path to the image file you want to thumbnail. + :ivar format: The format for the thumbnail image, jpeg (default) or png. For + images that are photos, jpeg should be preferred, while png is better + for screenshots and digital arts. + :ivar size: The size for the thumbnail image. + :ivar mode: How to resize and crop the image to achieve the desired size. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_format_value', + '_format_present', + '_size_value', + '_size_present', + '_mode_value', + '_mode_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + format=None, + size=None, + mode=None): + self._path_value = None + self._path_present = False + self._format_value = None + self._format_present = False + self._size_value = None + self._size_present = False + self._mode_value = None + self._mode_present = False + if path is not None: + self.path = path + if format is not None: + self.format = format + if size is not None: + self.size = size + if mode is not None: + self.mode = mode + + @property + def path(self): + """ + The path to the image file you want to thumbnail. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def format(self): + """ + The format for the thumbnail image, jpeg (default) or png. For images + that are photos, jpeg should be preferred, while png is better for + screenshots and digital arts. + + :rtype: ThumbnailFormat + """ + if self._format_present: + return self._format_value + else: + return ThumbnailFormat.jpeg + + @format.setter + def format(self, val): + self._format_validator.validate_type_only(val) + self._format_value = val + self._format_present = True + + @format.deleter + def format(self): + self._format_value = None + self._format_present = False + + @property + def size(self): + """ + The size for the thumbnail image. + + :rtype: ThumbnailSize + """ + if self._size_present: + return self._size_value + else: + return ThumbnailSize.w64h64 + + @size.setter + def size(self, val): + self._size_validator.validate_type_only(val) + self._size_value = val + self._size_present = True + + @size.deleter + def size(self): + self._size_value = None + self._size_present = False + + @property + def mode(self): + """ + How to resize and crop the image to achieve the desired size. + + :rtype: ThumbnailMode + """ + if self._mode_present: + return self._mode_value + else: + return ThumbnailMode.strict + + @mode.setter + def mode(self, val): + self._mode_validator.validate_type_only(val) + self._mode_value = val + self._mode_present = True + + @mode.deleter + def mode(self): + self._mode_value = None + self._mode_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ThumbnailArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ThumbnailArg(path={!r}, format={!r}, size={!r}, mode={!r})'.format( + self._path_value, + self._format_value, + self._size_value, + self._mode_value, + ) + +ThumbnailArg_validator = bv.Struct(ThumbnailArg) + +class ThumbnailError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar LookupError path: An error occurs when downloading metadata for the + image. + :ivar unsupported_extension: The file extension doesn't allow conversion to + a thumbnail. + :ivar unsupported_image: The image cannot be converted to a thumbnail. + :ivar conversion_error: An error occurs during thumbnail conversion. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + unsupported_extension = None + # Attribute is overwritten below the class definition + unsupported_image = None + # Attribute is overwritten below the class definition + conversion_error = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param LookupError val: + :rtype: ThumbnailError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_unsupported_extension(self): + """ + Check if the union tag is ``unsupported_extension``. + + :rtype: bool + """ + return self._tag == 'unsupported_extension' + + def is_unsupported_image(self): + """ + Check if the union tag is ``unsupported_image``. + + :rtype: bool + """ + return self._tag == 'unsupported_image' + + def is_conversion_error(self): + """ + Check if the union tag is ``conversion_error``. + + :rtype: bool + """ + return self._tag == 'conversion_error' + + def get_path(self): + """ + An error occurs when downloading metadata for the image. + + Only call this if :meth:`is_path` is true. + + :rtype: LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ThumbnailError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ThumbnailError(%r, %r)' % (self._tag, self._value) + +ThumbnailError_validator = bv.Union(ThumbnailError) + +class ThumbnailFormat(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + jpeg = None + # Attribute is overwritten below the class definition + png = None + + def is_jpeg(self): + """ + Check if the union tag is ``jpeg``. + + :rtype: bool + """ + return self._tag == 'jpeg' + + def is_png(self): + """ + Check if the union tag is ``png``. + + :rtype: bool + """ + return self._tag == 'png' + + def _process_custom_annotations(self, annotation_type, processor): + super(ThumbnailFormat, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ThumbnailFormat(%r, %r)' % (self._tag, self._value) + +ThumbnailFormat_validator = bv.Union(ThumbnailFormat) + +class ThumbnailMode(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar strict: Scale down the image to fit within the given size. + :ivar bestfit: Scale down the image to fit within the given size or its + transpose. + :ivar fitone_bestfit: Scale down the image to completely cover the given + size or its transpose. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + strict = None + # Attribute is overwritten below the class definition + bestfit = None + # Attribute is overwritten below the class definition + fitone_bestfit = None + + def is_strict(self): + """ + Check if the union tag is ``strict``. + + :rtype: bool + """ + return self._tag == 'strict' + + def is_bestfit(self): + """ + Check if the union tag is ``bestfit``. + + :rtype: bool + """ + return self._tag == 'bestfit' + + def is_fitone_bestfit(self): + """ + Check if the union tag is ``fitone_bestfit``. + + :rtype: bool + """ + return self._tag == 'fitone_bestfit' + + def _process_custom_annotations(self, annotation_type, processor): + super(ThumbnailMode, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ThumbnailMode(%r, %r)' % (self._tag, self._value) + +ThumbnailMode_validator = bv.Union(ThumbnailMode) + +class ThumbnailSize(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar w32h32: 32 by 32 px. + :ivar w64h64: 64 by 64 px. + :ivar w128h128: 128 by 128 px. + :ivar w256h256: 256 by 256 px. + :ivar w480h320: 480 by 320 px. + :ivar w640h480: 640 by 480 px. + :ivar w960h640: 960 by 640 px. + :ivar w1024h768: 1024 by 768 px. + :ivar w2048h1536: 2048 by 1536 px. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + w32h32 = None + # Attribute is overwritten below the class definition + w64h64 = None + # Attribute is overwritten below the class definition + w128h128 = None + # Attribute is overwritten below the class definition + w256h256 = None + # Attribute is overwritten below the class definition + w480h320 = None + # Attribute is overwritten below the class definition + w640h480 = None + # Attribute is overwritten below the class definition + w960h640 = None + # Attribute is overwritten below the class definition + w1024h768 = None + # Attribute is overwritten below the class definition + w2048h1536 = None + + def is_w32h32(self): + """ + Check if the union tag is ``w32h32``. + + :rtype: bool + """ + return self._tag == 'w32h32' + + def is_w64h64(self): + """ + Check if the union tag is ``w64h64``. + + :rtype: bool + """ + return self._tag == 'w64h64' + + def is_w128h128(self): + """ + Check if the union tag is ``w128h128``. + + :rtype: bool + """ + return self._tag == 'w128h128' + + def is_w256h256(self): + """ + Check if the union tag is ``w256h256``. + + :rtype: bool + """ + return self._tag == 'w256h256' + + def is_w480h320(self): + """ + Check if the union tag is ``w480h320``. + + :rtype: bool + """ + return self._tag == 'w480h320' + + def is_w640h480(self): + """ + Check if the union tag is ``w640h480``. + + :rtype: bool + """ + return self._tag == 'w640h480' + + def is_w960h640(self): + """ + Check if the union tag is ``w960h640``. + + :rtype: bool + """ + return self._tag == 'w960h640' + + def is_w1024h768(self): + """ + Check if the union tag is ``w1024h768``. + + :rtype: bool + """ + return self._tag == 'w1024h768' + + def is_w2048h1536(self): + """ + Check if the union tag is ``w2048h1536``. + + :rtype: bool + """ + return self._tag == 'w2048h1536' + + def _process_custom_annotations(self, annotation_type, processor): + super(ThumbnailSize, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ThumbnailSize(%r, %r)' % (self._tag, self._value) + +ThumbnailSize_validator = bv.Union(ThumbnailSize) + +class UploadError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar UploadWriteFailed path: Unable to save the uploaded contents to a + file. + :ivar InvalidPropertyGroupError properties_error: The supplied property + group is invalid. The file has uploaded without property groups. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param UploadWriteFailed val: + :rtype: UploadError + """ + return cls('path', val) + + @classmethod + def properties_error(cls, val): + """ + Create an instance of this class set to the ``properties_error`` tag + with value ``val``. + + :param file_properties.InvalidPropertyGroupError val: + :rtype: UploadError + """ + return cls('properties_error', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_properties_error(self): + """ + Check if the union tag is ``properties_error``. + + :rtype: bool + """ + return self._tag == 'properties_error' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path(self): + """ + Unable to save the uploaded contents to a file. + + Only call this if :meth:`is_path` is true. + + :rtype: UploadWriteFailed + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def get_properties_error(self): + """ + The supplied property group is invalid. The file has uploaded without + property groups. + + Only call this if :meth:`is_properties_error` is true. + + :rtype: file_properties.InvalidPropertyGroupError + """ + if not self.is_properties_error(): + raise AttributeError("tag 'properties_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(UploadError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UploadError(%r, %r)' % (self._tag, self._value) + +UploadError_validator = bv.Union(UploadError) + +class UploadErrorWithProperties(UploadError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + def _process_custom_annotations(self, annotation_type, processor): + super(UploadErrorWithProperties, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UploadErrorWithProperties(%r, %r)' % (self._tag, self._value) + +UploadErrorWithProperties_validator = bv.Union(UploadErrorWithProperties) + +class UploadSessionAppendArg(bb.Struct): + """ + :ivar cursor: Contains the upload session ID and the offset. + :ivar close: If true, the current session will be closed, at which point you + won't be able to call + :meth:`dropbox.dropbox.Dropbox.files_upload_session_append` anymore with + the current session. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + '_close_value', + '_close_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None, + close=None): + self._cursor_value = None + self._cursor_present = False + self._close_value = None + self._close_present = False + if cursor is not None: + self.cursor = cursor + if close is not None: + self.close = close + + @property + def cursor(self): + """ + Contains the upload session ID and the offset. + + :rtype: UploadSessionCursor + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + self._cursor_validator.validate_type_only(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def close(self): + """ + If true, the current session will be closed, at which point you won't be + able to call :meth:`dropbox.dropbox.Dropbox.files_upload_session_append` + anymore with the current session. + + :rtype: bool + """ + if self._close_present: + return self._close_value + else: + return False + + @close.setter + def close(self, val): + val = self._close_validator.validate(val) + self._close_value = val + self._close_present = True + + @close.deleter + def close(self): + self._close_value = None + self._close_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UploadSessionAppendArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UploadSessionAppendArg(cursor={!r}, close={!r})'.format( + self._cursor_value, + self._close_value, + ) + +UploadSessionAppendArg_validator = bv.Struct(UploadSessionAppendArg) + +class UploadSessionCursor(bb.Struct): + """ + :ivar session_id: The upload session ID (returned by + :meth:`dropbox.dropbox.Dropbox.files_upload_session_start`). + :ivar offset: The amount of data that has been uploaded so far. We use this + to make sure upload data isn't lost or duplicated in the event of a + network error. + """ + + __slots__ = [ + '_session_id_value', + '_session_id_present', + '_offset_value', + '_offset_present', + ] + + _has_required_fields = True + + def __init__(self, + session_id=None, + offset=None): + self._session_id_value = None + self._session_id_present = False + self._offset_value = None + self._offset_present = False + if session_id is not None: + self.session_id = session_id + if offset is not None: + self.offset = offset + + @property + def session_id(self): + """ + The upload session ID (returned by + :meth:`dropbox.dropbox.Dropbox.files_upload_session_start`). + + :rtype: str + """ + if self._session_id_present: + return self._session_id_value + else: + raise AttributeError("missing required field 'session_id'") + + @session_id.setter + def session_id(self, val): + val = self._session_id_validator.validate(val) + self._session_id_value = val + self._session_id_present = True + + @session_id.deleter + def session_id(self): + self._session_id_value = None + self._session_id_present = False + + @property + def offset(self): + """ + The amount of data that has been uploaded so far. We use this to make + sure upload data isn't lost or duplicated in the event of a network + error. + + :rtype: int + """ + if self._offset_present: + return self._offset_value + else: + raise AttributeError("missing required field 'offset'") + + @offset.setter + def offset(self, val): + val = self._offset_validator.validate(val) + self._offset_value = val + self._offset_present = True + + @offset.deleter + def offset(self): + self._offset_value = None + self._offset_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UploadSessionCursor, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UploadSessionCursor(session_id={!r}, offset={!r})'.format( + self._session_id_value, + self._offset_value, + ) + +UploadSessionCursor_validator = bv.Struct(UploadSessionCursor) + +class UploadSessionFinishArg(bb.Struct): + """ + :ivar cursor: Contains the upload session ID and the offset. + :ivar commit: Contains the path and other optional modifiers for the commit. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + '_commit_value', + '_commit_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None, + commit=None): + self._cursor_value = None + self._cursor_present = False + self._commit_value = None + self._commit_present = False + if cursor is not None: + self.cursor = cursor + if commit is not None: + self.commit = commit + + @property + def cursor(self): + """ + Contains the upload session ID and the offset. + + :rtype: UploadSessionCursor + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + self._cursor_validator.validate_type_only(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def commit(self): + """ + Contains the path and other optional modifiers for the commit. + + :rtype: CommitInfo + """ + if self._commit_present: + return self._commit_value + else: + raise AttributeError("missing required field 'commit'") + + @commit.setter + def commit(self, val): + self._commit_validator.validate_type_only(val) + self._commit_value = val + self._commit_present = True + + @commit.deleter + def commit(self): + self._commit_value = None + self._commit_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UploadSessionFinishArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UploadSessionFinishArg(cursor={!r}, commit={!r})'.format( + self._cursor_value, + self._commit_value, + ) + +UploadSessionFinishArg_validator = bv.Struct(UploadSessionFinishArg) + +class UploadSessionFinishBatchArg(bb.Struct): + """ + :ivar entries: Commit information for each file in the batch. + """ + + __slots__ = [ + '_entries_value', + '_entries_present', + ] + + _has_required_fields = True + + def __init__(self, + entries=None): + self._entries_value = None + self._entries_present = False + if entries is not None: + self.entries = entries + + @property + def entries(self): + """ + Commit information for each file in the batch. + + :rtype: list of [UploadSessionFinishArg] + """ + if self._entries_present: + return self._entries_value + else: + raise AttributeError("missing required field 'entries'") + + @entries.setter + def entries(self, val): + val = self._entries_validator.validate(val) + self._entries_value = val + self._entries_present = True + + @entries.deleter + def entries(self): + self._entries_value = None + self._entries_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UploadSessionFinishBatchArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UploadSessionFinishBatchArg(entries={!r})'.format( + self._entries_value, + ) + +UploadSessionFinishBatchArg_validator = bv.Struct(UploadSessionFinishBatchArg) + +class UploadSessionFinishBatchJobStatus(async_.PollResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar UploadSessionFinishBatchResult complete: The + :meth:`dropbox.dropbox.Dropbox.files_upload_session_finish_batch` has + finished. + """ + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param UploadSessionFinishBatchResult val: + :rtype: UploadSessionFinishBatchJobStatus + """ + return cls('complete', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def get_complete(self): + """ + The :meth:`dropbox.dropbox.Dropbox.files_upload_session_finish_batch` + has finished. + + Only call this if :meth:`is_complete` is true. + + :rtype: UploadSessionFinishBatchResult + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(UploadSessionFinishBatchJobStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UploadSessionFinishBatchJobStatus(%r, %r)' % (self._tag, self._value) + +UploadSessionFinishBatchJobStatus_validator = bv.Union(UploadSessionFinishBatchJobStatus) + +class UploadSessionFinishBatchLaunch(async_.LaunchResultBase): + """ + Result returned by + :meth:`dropbox.dropbox.Dropbox.files_upload_session_finish_batch` that may + either launch an asynchronous job or complete synchronously. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param UploadSessionFinishBatchResult val: + :rtype: UploadSessionFinishBatchLaunch + """ + return cls('complete', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_complete(self): + """ + Only call this if :meth:`is_complete` is true. + + :rtype: UploadSessionFinishBatchResult + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(UploadSessionFinishBatchLaunch, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UploadSessionFinishBatchLaunch(%r, %r)' % (self._tag, self._value) + +UploadSessionFinishBatchLaunch_validator = bv.Union(UploadSessionFinishBatchLaunch) + +class UploadSessionFinishBatchResult(bb.Struct): + """ + :ivar entries: Each entry in ``UploadSessionFinishBatchArg.entries`` will + appear at the same position inside + ``UploadSessionFinishBatchResult.entries``. + """ + + __slots__ = [ + '_entries_value', + '_entries_present', + ] + + _has_required_fields = True + + def __init__(self, + entries=None): + self._entries_value = None + self._entries_present = False + if entries is not None: + self.entries = entries + + @property + def entries(self): + """ + Each entry in ``UploadSessionFinishBatchArg.entries`` will appear at the + same position inside ``UploadSessionFinishBatchResult.entries``. + + :rtype: list of [UploadSessionFinishBatchResultEntry] + """ + if self._entries_present: + return self._entries_value + else: + raise AttributeError("missing required field 'entries'") + + @entries.setter + def entries(self, val): + val = self._entries_validator.validate(val) + self._entries_value = val + self._entries_present = True + + @entries.deleter + def entries(self): + self._entries_value = None + self._entries_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UploadSessionFinishBatchResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UploadSessionFinishBatchResult(entries={!r})'.format( + self._entries_value, + ) + +UploadSessionFinishBatchResult_validator = bv.Struct(UploadSessionFinishBatchResult) + +class UploadSessionFinishBatchResultEntry(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = None + + @classmethod + def success(cls, val): + """ + Create an instance of this class set to the ``success`` tag with value + ``val``. + + :param FileMetadata val: + :rtype: UploadSessionFinishBatchResultEntry + """ + return cls('success', val) + + @classmethod + def failure(cls, val): + """ + Create an instance of this class set to the ``failure`` tag with value + ``val``. + + :param UploadSessionFinishError val: + :rtype: UploadSessionFinishBatchResultEntry + """ + return cls('failure', val) + + def is_success(self): + """ + Check if the union tag is ``success``. + + :rtype: bool + """ + return self._tag == 'success' + + def is_failure(self): + """ + Check if the union tag is ``failure``. + + :rtype: bool + """ + return self._tag == 'failure' + + def get_success(self): + """ + Only call this if :meth:`is_success` is true. + + :rtype: FileMetadata + """ + if not self.is_success(): + raise AttributeError("tag 'success' not set") + return self._value + + def get_failure(self): + """ + Only call this if :meth:`is_failure` is true. + + :rtype: UploadSessionFinishError + """ + if not self.is_failure(): + raise AttributeError("tag 'failure' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(UploadSessionFinishBatchResultEntry, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UploadSessionFinishBatchResultEntry(%r, %r)' % (self._tag, self._value) + +UploadSessionFinishBatchResultEntry_validator = bv.Union(UploadSessionFinishBatchResultEntry) + +class UploadSessionFinishError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar UploadSessionLookupError lookup_failed: The session arguments are + incorrect; the value explains the reason. + :ivar WriteError path: Unable to save the uploaded contents to a file. Data + has already been appended to the upload session. Please retry with empty + data body and updated offset. + :ivar InvalidPropertyGroupError properties_error: The supplied property + group is invalid. The file has uploaded without property groups. + :ivar too_many_shared_folder_targets: The batch request commits files into + too many different shared folders. Please limit your batch request to + files contained in a single shared folder. + :ivar too_many_write_operations: There are too many write operations + happening in the user's Dropbox. You should retry uploading this file. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + too_many_shared_folder_targets = None + # Attribute is overwritten below the class definition + too_many_write_operations = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def lookup_failed(cls, val): + """ + Create an instance of this class set to the ``lookup_failed`` tag with + value ``val``. + + :param UploadSessionLookupError val: + :rtype: UploadSessionFinishError + """ + return cls('lookup_failed', val) + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param WriteError val: + :rtype: UploadSessionFinishError + """ + return cls('path', val) + + @classmethod + def properties_error(cls, val): + """ + Create an instance of this class set to the ``properties_error`` tag + with value ``val``. + + :param file_properties.InvalidPropertyGroupError val: + :rtype: UploadSessionFinishError + """ + return cls('properties_error', val) + + def is_lookup_failed(self): + """ + Check if the union tag is ``lookup_failed``. + + :rtype: bool + """ + return self._tag == 'lookup_failed' + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_properties_error(self): + """ + Check if the union tag is ``properties_error``. + + :rtype: bool + """ + return self._tag == 'properties_error' + + def is_too_many_shared_folder_targets(self): + """ + Check if the union tag is ``too_many_shared_folder_targets``. + + :rtype: bool + """ + return self._tag == 'too_many_shared_folder_targets' + + def is_too_many_write_operations(self): + """ + Check if the union tag is ``too_many_write_operations``. + + :rtype: bool + """ + return self._tag == 'too_many_write_operations' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_lookup_failed(self): + """ + The session arguments are incorrect; the value explains the reason. + + Only call this if :meth:`is_lookup_failed` is true. + + :rtype: UploadSessionLookupError + """ + if not self.is_lookup_failed(): + raise AttributeError("tag 'lookup_failed' not set") + return self._value + + def get_path(self): + """ + Unable to save the uploaded contents to a file. Data has already been + appended to the upload session. Please retry with empty data body and + updated offset. + + Only call this if :meth:`is_path` is true. + + :rtype: WriteError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def get_properties_error(self): + """ + The supplied property group is invalid. The file has uploaded without + property groups. + + Only call this if :meth:`is_properties_error` is true. + + :rtype: file_properties.InvalidPropertyGroupError + """ + if not self.is_properties_error(): + raise AttributeError("tag 'properties_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(UploadSessionFinishError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UploadSessionFinishError(%r, %r)' % (self._tag, self._value) + +UploadSessionFinishError_validator = bv.Union(UploadSessionFinishError) + +class UploadSessionLookupError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar not_found: The upload session ID was not found or has expired. Upload + sessions are valid for 48 hours. + :ivar UploadSessionOffsetError incorrect_offset: The specified offset was + incorrect. See the value for the correct offset. This error may occur + when a previous request was received and processed successfully but the + client did not receive the response, e.g. due to a network error. + :ivar closed: You are attempting to append data to an upload session that + has alread been closed (i.e. committed). + :ivar not_closed: The session must be closed before calling + upload_session/finish_batch. + :ivar too_large: You can not append to the upload session because the size + of a file should not reach the max file size limit (i.e. 350GB). + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + not_found = None + # Attribute is overwritten below the class definition + closed = None + # Attribute is overwritten below the class definition + not_closed = None + # Attribute is overwritten below the class definition + too_large = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def incorrect_offset(cls, val): + """ + Create an instance of this class set to the ``incorrect_offset`` tag + with value ``val``. + + :param UploadSessionOffsetError val: + :rtype: UploadSessionLookupError + """ + return cls('incorrect_offset', val) + + def is_not_found(self): + """ + Check if the union tag is ``not_found``. + + :rtype: bool + """ + return self._tag == 'not_found' + + def is_incorrect_offset(self): + """ + Check if the union tag is ``incorrect_offset``. + + :rtype: bool + """ + return self._tag == 'incorrect_offset' + + def is_closed(self): + """ + Check if the union tag is ``closed``. + + :rtype: bool + """ + return self._tag == 'closed' + + def is_not_closed(self): + """ + Check if the union tag is ``not_closed``. + + :rtype: bool + """ + return self._tag == 'not_closed' + + def is_too_large(self): + """ + Check if the union tag is ``too_large``. + + :rtype: bool + """ + return self._tag == 'too_large' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_incorrect_offset(self): + """ + The specified offset was incorrect. See the value for the correct + offset. This error may occur when a previous request was received and + processed successfully but the client did not receive the response, e.g. + due to a network error. + + Only call this if :meth:`is_incorrect_offset` is true. + + :rtype: UploadSessionOffsetError + """ + if not self.is_incorrect_offset(): + raise AttributeError("tag 'incorrect_offset' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(UploadSessionLookupError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UploadSessionLookupError(%r, %r)' % (self._tag, self._value) + +UploadSessionLookupError_validator = bv.Union(UploadSessionLookupError) + +class UploadSessionOffsetError(bb.Struct): + """ + :ivar correct_offset: The offset up to which data has been collected. + """ + + __slots__ = [ + '_correct_offset_value', + '_correct_offset_present', + ] + + _has_required_fields = True + + def __init__(self, + correct_offset=None): + self._correct_offset_value = None + self._correct_offset_present = False + if correct_offset is not None: + self.correct_offset = correct_offset + + @property + def correct_offset(self): + """ + The offset up to which data has been collected. + + :rtype: int + """ + if self._correct_offset_present: + return self._correct_offset_value + else: + raise AttributeError("missing required field 'correct_offset'") + + @correct_offset.setter + def correct_offset(self, val): + val = self._correct_offset_validator.validate(val) + self._correct_offset_value = val + self._correct_offset_present = True + + @correct_offset.deleter + def correct_offset(self): + self._correct_offset_value = None + self._correct_offset_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UploadSessionOffsetError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UploadSessionOffsetError(correct_offset={!r})'.format( + self._correct_offset_value, + ) + +UploadSessionOffsetError_validator = bv.Struct(UploadSessionOffsetError) + +class UploadSessionStartArg(bb.Struct): + """ + :ivar close: If true, the current session will be closed, at which point you + won't be able to call + :meth:`dropbox.dropbox.Dropbox.files_upload_session_append` anymore with + the current session. + """ + + __slots__ = [ + '_close_value', + '_close_present', + ] + + _has_required_fields = False + + def __init__(self, + close=None): + self._close_value = None + self._close_present = False + if close is not None: + self.close = close + + @property + def close(self): + """ + If true, the current session will be closed, at which point you won't be + able to call :meth:`dropbox.dropbox.Dropbox.files_upload_session_append` + anymore with the current session. + + :rtype: bool + """ + if self._close_present: + return self._close_value + else: + return False + + @close.setter + def close(self, val): + val = self._close_validator.validate(val) + self._close_value = val + self._close_present = True + + @close.deleter + def close(self): + self._close_value = None + self._close_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UploadSessionStartArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UploadSessionStartArg(close={!r})'.format( + self._close_value, + ) + +UploadSessionStartArg_validator = bv.Struct(UploadSessionStartArg) + +class UploadSessionStartResult(bb.Struct): + """ + :ivar session_id: A unique identifier for the upload session. Pass this to + :meth:`dropbox.dropbox.Dropbox.files_upload_session_append` and + :meth:`dropbox.dropbox.Dropbox.files_upload_session_finish`. + """ + + __slots__ = [ + '_session_id_value', + '_session_id_present', + ] + + _has_required_fields = True + + def __init__(self, + session_id=None): + self._session_id_value = None + self._session_id_present = False + if session_id is not None: + self.session_id = session_id + + @property + def session_id(self): + """ + A unique identifier for the upload session. Pass this to + :meth:`dropbox.dropbox.Dropbox.files_upload_session_append` and + :meth:`dropbox.dropbox.Dropbox.files_upload_session_finish`. + + :rtype: str + """ + if self._session_id_present: + return self._session_id_value + else: + raise AttributeError("missing required field 'session_id'") + + @session_id.setter + def session_id(self, val): + val = self._session_id_validator.validate(val) + self._session_id_value = val + self._session_id_present = True + + @session_id.deleter + def session_id(self): + self._session_id_value = None + self._session_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UploadSessionStartResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UploadSessionStartResult(session_id={!r})'.format( + self._session_id_value, + ) + +UploadSessionStartResult_validator = bv.Struct(UploadSessionStartResult) + +class UploadWriteFailed(bb.Struct): + """ + :ivar reason: The reason why the file couldn't be saved. + :ivar upload_session_id: The upload session ID; data has already been + uploaded to the corresponding upload session and this ID may be used to + retry the commit with + :meth:`dropbox.dropbox.Dropbox.files_upload_session_finish`. + """ + + __slots__ = [ + '_reason_value', + '_reason_present', + '_upload_session_id_value', + '_upload_session_id_present', + ] + + _has_required_fields = True + + def __init__(self, + reason=None, + upload_session_id=None): + self._reason_value = None + self._reason_present = False + self._upload_session_id_value = None + self._upload_session_id_present = False + if reason is not None: + self.reason = reason + if upload_session_id is not None: + self.upload_session_id = upload_session_id + + @property + def reason(self): + """ + The reason why the file couldn't be saved. + + :rtype: WriteError + """ + if self._reason_present: + return self._reason_value + else: + raise AttributeError("missing required field 'reason'") + + @reason.setter + def reason(self, val): + self._reason_validator.validate_type_only(val) + self._reason_value = val + self._reason_present = True + + @reason.deleter + def reason(self): + self._reason_value = None + self._reason_present = False + + @property + def upload_session_id(self): + """ + The upload session ID; data has already been uploaded to the + corresponding upload session and this ID may be used to retry the commit + with :meth:`dropbox.dropbox.Dropbox.files_upload_session_finish`. + + :rtype: str + """ + if self._upload_session_id_present: + return self._upload_session_id_value + else: + raise AttributeError("missing required field 'upload_session_id'") + + @upload_session_id.setter + def upload_session_id(self, val): + val = self._upload_session_id_validator.validate(val) + self._upload_session_id_value = val + self._upload_session_id_present = True + + @upload_session_id.deleter + def upload_session_id(self): + self._upload_session_id_value = None + self._upload_session_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UploadWriteFailed, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UploadWriteFailed(reason={!r}, upload_session_id={!r})'.format( + self._reason_value, + self._upload_session_id_value, + ) + +UploadWriteFailed_validator = bv.Struct(UploadWriteFailed) + +class VideoMetadata(MediaMetadata): + """ + Metadata for a video. + + :ivar duration: The duration of the video in milliseconds. + """ + + __slots__ = [ + '_duration_value', + '_duration_present', + ] + + _has_required_fields = False + + def __init__(self, + dimensions=None, + location=None, + time_taken=None, + duration=None): + super(VideoMetadata, self).__init__(dimensions, + location, + time_taken) + self._duration_value = None + self._duration_present = False + if duration is not None: + self.duration = duration + + @property + def duration(self): + """ + The duration of the video in milliseconds. + + :rtype: int + """ + if self._duration_present: + return self._duration_value + else: + return None + + @duration.setter + def duration(self, val): + if val is None: + del self.duration + return + val = self._duration_validator.validate(val) + self._duration_value = val + self._duration_present = True + + @duration.deleter + def duration(self): + self._duration_value = None + self._duration_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(VideoMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'VideoMetadata(dimensions={!r}, location={!r}, time_taken={!r}, duration={!r})'.format( + self._dimensions_value, + self._location_value, + self._time_taken_value, + self._duration_value, + ) + +VideoMetadata_validator = bv.Struct(VideoMetadata) + +class WriteConflictError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar file: There's a file in the way. + :ivar folder: There's a folder in the way. + :ivar file_ancestor: There's a file at an ancestor path, so we couldn't + create the required parent folders. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + file = None + # Attribute is overwritten below the class definition + folder = None + # Attribute is overwritten below the class definition + file_ancestor = None + # Attribute is overwritten below the class definition + other = None + + def is_file(self): + """ + Check if the union tag is ``file``. + + :rtype: bool + """ + return self._tag == 'file' + + def is_folder(self): + """ + Check if the union tag is ``folder``. + + :rtype: bool + """ + return self._tag == 'folder' + + def is_file_ancestor(self): + """ + Check if the union tag is ``file_ancestor``. + + :rtype: bool + """ + return self._tag == 'file_ancestor' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(WriteConflictError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'WriteConflictError(%r, %r)' % (self._tag, self._value) + +WriteConflictError_validator = bv.Union(WriteConflictError) + +class WriteError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar Optional[str] malformed_path: The given path does not satisfy the + required path format. Please refer to the :link:`Path formats + documentation + https://www.dropbox.com/developers/documentation/http/documentation#path-formats` + for more information. + :ivar WriteConflictError conflict: Couldn't write to the target path because + there was something in the way. + :ivar no_write_permission: The user doesn't have permissions to write to the + target location. + :ivar insufficient_space: The user doesn't have enough available space + (bytes) to write more data. + :ivar disallowed_name: Dropbox will not save the file or folder because of + its name. + :ivar team_folder: This endpoint cannot move or delete team folders. + :ivar too_many_write_operations: There are too many write operations in + user's Dropbox. Please retry this request. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + no_write_permission = None + # Attribute is overwritten below the class definition + insufficient_space = None + # Attribute is overwritten below the class definition + disallowed_name = None + # Attribute is overwritten below the class definition + team_folder = None + # Attribute is overwritten below the class definition + too_many_write_operations = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def malformed_path(cls, val): + """ + Create an instance of this class set to the ``malformed_path`` tag with + value ``val``. + + :param Optional[str] val: + :rtype: WriteError + """ + return cls('malformed_path', val) + + @classmethod + def conflict(cls, val): + """ + Create an instance of this class set to the ``conflict`` tag with value + ``val``. + + :param WriteConflictError val: + :rtype: WriteError + """ + return cls('conflict', val) + + def is_malformed_path(self): + """ + Check if the union tag is ``malformed_path``. + + :rtype: bool + """ + return self._tag == 'malformed_path' + + def is_conflict(self): + """ + Check if the union tag is ``conflict``. + + :rtype: bool + """ + return self._tag == 'conflict' + + def is_no_write_permission(self): + """ + Check if the union tag is ``no_write_permission``. + + :rtype: bool + """ + return self._tag == 'no_write_permission' + + def is_insufficient_space(self): + """ + Check if the union tag is ``insufficient_space``. + + :rtype: bool + """ + return self._tag == 'insufficient_space' + + def is_disallowed_name(self): + """ + Check if the union tag is ``disallowed_name``. + + :rtype: bool + """ + return self._tag == 'disallowed_name' + + def is_team_folder(self): + """ + Check if the union tag is ``team_folder``. + + :rtype: bool + """ + return self._tag == 'team_folder' + + def is_too_many_write_operations(self): + """ + Check if the union tag is ``too_many_write_operations``. + + :rtype: bool + """ + return self._tag == 'too_many_write_operations' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_malformed_path(self): + """ + The given path does not satisfy the required path format. Please refer + to the `Path formats documentation + `_ + for more information. + + Only call this if :meth:`is_malformed_path` is true. + + :rtype: Optional[str] + """ + if not self.is_malformed_path(): + raise AttributeError("tag 'malformed_path' not set") + return self._value + + def get_conflict(self): + """ + Couldn't write to the target path because there was something in the + way. + + Only call this if :meth:`is_conflict` is true. + + :rtype: WriteConflictError + """ + if not self.is_conflict(): + raise AttributeError("tag 'conflict' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(WriteError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'WriteError(%r, %r)' % (self._tag, self._value) + +WriteError_validator = bv.Union(WriteError) + +class WriteMode(bb.Union): + """ + Your intent when writing a file to some path. This is used to determine what + constitutes a conflict and what the autorename strategy is. In some + situations, the conflict behavior is identical: (a) If the target path + doesn't refer to anything, the file is always written; no conflict. (b) If + the target path refers to a folder, it's always a conflict. (c) If the + target path refers to a file with identical contents, nothing gets written; + no conflict. The conflict checking differs in the case where there's a file + at the target path with contents different from the contents you're trying + to write. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar add: Do not overwrite an existing file if there is a conflict. The + autorename strategy is to append a number to the file name. For example, + "document.txt" might become "document (2).txt". + :ivar overwrite: Always overwrite the existing file. The autorename strategy + is the same as it is for ``add``. + :ivar str update: Overwrite if the given "rev" matches the existing file's + "rev". The autorename strategy is to append the string "conflicted copy" + to the file name. For example, "document.txt" might become "document + (conflicted copy).txt" or "document (Panda's conflicted copy).txt". + """ + + _catch_all = None + # Attribute is overwritten below the class definition + add = None + # Attribute is overwritten below the class definition + overwrite = None + + @classmethod + def update(cls, val): + """ + Create an instance of this class set to the ``update`` tag with value + ``val``. + + :param str val: + :rtype: WriteMode + """ + return cls('update', val) + + def is_add(self): + """ + Check if the union tag is ``add``. + + :rtype: bool + """ + return self._tag == 'add' + + def is_overwrite(self): + """ + Check if the union tag is ``overwrite``. + + :rtype: bool + """ + return self._tag == 'overwrite' + + def is_update(self): + """ + Check if the union tag is ``update``. + + :rtype: bool + """ + return self._tag == 'update' + + def get_update(self): + """ + Overwrite if the given "rev" matches the existing file's "rev". The + autorename strategy is to append the string "conflicted copy" to the + file name. For example, "document.txt" might become "document + (conflicted copy).txt" or "document (Panda's conflicted copy).txt". + + Only call this if :meth:`is_update` is true. + + :rtype: str + """ + if not self.is_update(): + raise AttributeError("tag 'update' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(WriteMode, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'WriteMode(%r, %r)' % (self._tag, self._value) + +WriteMode_validator = bv.Union(WriteMode) + +CopyBatchArg_validator = RelocationBatchArgBase_validator +CopyBatchArg = RelocationBatchArgBase +FileId_validator = bv.String(min_length=4, pattern=u'id:.+') +Id_validator = bv.String(min_length=1) +ListFolderCursor_validator = bv.String(min_length=1) +MalformedPathError_validator = bv.Nullable(bv.String()) +Path_validator = bv.String(pattern=u'/(.|[\\r\\n])*') +PathOrId_validator = bv.String(pattern=u'/(.|[\\r\\n])*|id:.*|(ns:[0-9]+(/.*)?)') +PathR_validator = bv.String(pattern=u'(/(.|[\\r\\n])*)?|(ns:[0-9]+(/.*)?)') +PathROrId_validator = bv.String(pattern=u'(/(.|[\\r\\n])*)?|id:.*|(ns:[0-9]+(/.*)?)') +ReadPath_validator = bv.String(pattern=u'(/(.|[\\r\\n])*|id:.*)|(rev:[0-9a-f]{9,})|(ns:[0-9]+(/.*)?)') +Rev_validator = bv.String(min_length=9, pattern=u'[0-9a-f]+') +Sha256HexHash_validator = bv.String(min_length=64, max_length=64) +SharedLinkUrl_validator = bv.String() +WritePath_validator = bv.String(pattern=u'(/(.|[\\r\\n])*)|(ns:[0-9]+(/.*)?)') +WritePathOrId_validator = bv.String(pattern=u'(/(.|[\\r\\n])*)|(ns:[0-9]+(/.*)?)|(id:.*)') +GetMetadataArg._path_validator = ReadPath_validator +GetMetadataArg._include_media_info_validator = bv.Boolean() +GetMetadataArg._include_deleted_validator = bv.Boolean() +GetMetadataArg._include_has_explicit_shared_members_validator = bv.Boolean() +GetMetadataArg._include_property_groups_validator = bv.Nullable(file_properties.TemplateFilterBase_validator) +GetMetadataArg._all_field_names_ = set([ + 'path', + 'include_media_info', + 'include_deleted', + 'include_has_explicit_shared_members', + 'include_property_groups', +]) +GetMetadataArg._all_fields_ = [ + ('path', GetMetadataArg._path_validator), + ('include_media_info', GetMetadataArg._include_media_info_validator), + ('include_deleted', GetMetadataArg._include_deleted_validator), + ('include_has_explicit_shared_members', GetMetadataArg._include_has_explicit_shared_members_validator), + ('include_property_groups', GetMetadataArg._include_property_groups_validator), +] + +AlphaGetMetadataArg._include_property_templates_validator = bv.Nullable(bv.List(file_properties.TemplateId_validator)) +AlphaGetMetadataArg._all_field_names_ = GetMetadataArg._all_field_names_.union(set(['include_property_templates'])) +AlphaGetMetadataArg._all_fields_ = GetMetadataArg._all_fields_ + [('include_property_templates', AlphaGetMetadataArg._include_property_templates_validator)] + +GetMetadataError._path_validator = LookupError_validator +GetMetadataError._tagmap = { + 'path': GetMetadataError._path_validator, +} + +AlphaGetMetadataError._properties_error_validator = file_properties.LookUpPropertiesError_validator +AlphaGetMetadataError._tagmap = { + 'properties_error': AlphaGetMetadataError._properties_error_validator, +} +AlphaGetMetadataError._tagmap.update(GetMetadataError._tagmap) + +CommitInfo._path_validator = WritePathOrId_validator +CommitInfo._mode_validator = WriteMode_validator +CommitInfo._autorename_validator = bv.Boolean() +CommitInfo._client_modified_validator = bv.Nullable(common.DropboxTimestamp_validator) +CommitInfo._mute_validator = bv.Boolean() +CommitInfo._property_groups_validator = bv.Nullable(bv.List(file_properties.PropertyGroup_validator)) +CommitInfo._strict_conflict_validator = bv.Boolean() +CommitInfo._all_field_names_ = set([ + 'path', + 'mode', + 'autorename', + 'client_modified', + 'mute', + 'property_groups', + 'strict_conflict', +]) +CommitInfo._all_fields_ = [ + ('path', CommitInfo._path_validator), + ('mode', CommitInfo._mode_validator), + ('autorename', CommitInfo._autorename_validator), + ('client_modified', CommitInfo._client_modified_validator), + ('mute', CommitInfo._mute_validator), + ('property_groups', CommitInfo._property_groups_validator), + ('strict_conflict', CommitInfo._strict_conflict_validator), +] + +CommitInfoWithProperties._all_field_names_ = CommitInfo._all_field_names_.union(set([])) +CommitInfoWithProperties._all_fields_ = CommitInfo._all_fields_ + [] + +ContentSyncSetting._id_validator = FileId_validator +ContentSyncSetting._sync_setting_validator = SyncSetting_validator +ContentSyncSetting._all_field_names_ = set([ + 'id', + 'sync_setting', +]) +ContentSyncSetting._all_fields_ = [ + ('id', ContentSyncSetting._id_validator), + ('sync_setting', ContentSyncSetting._sync_setting_validator), +] + +ContentSyncSettingArg._id_validator = FileId_validator +ContentSyncSettingArg._sync_setting_validator = SyncSettingArg_validator +ContentSyncSettingArg._all_field_names_ = set([ + 'id', + 'sync_setting', +]) +ContentSyncSettingArg._all_fields_ = [ + ('id', ContentSyncSettingArg._id_validator), + ('sync_setting', ContentSyncSettingArg._sync_setting_validator), +] + +CreateFolderArg._path_validator = WritePath_validator +CreateFolderArg._autorename_validator = bv.Boolean() +CreateFolderArg._all_field_names_ = set([ + 'path', + 'autorename', +]) +CreateFolderArg._all_fields_ = [ + ('path', CreateFolderArg._path_validator), + ('autorename', CreateFolderArg._autorename_validator), +] + +CreateFolderBatchArg._paths_validator = bv.List(WritePath_validator) +CreateFolderBatchArg._autorename_validator = bv.Boolean() +CreateFolderBatchArg._force_async_validator = bv.Boolean() +CreateFolderBatchArg._all_field_names_ = set([ + 'paths', + 'autorename', + 'force_async', +]) +CreateFolderBatchArg._all_fields_ = [ + ('paths', CreateFolderBatchArg._paths_validator), + ('autorename', CreateFolderBatchArg._autorename_validator), + ('force_async', CreateFolderBatchArg._force_async_validator), +] + +CreateFolderBatchError._too_many_files_validator = bv.Void() +CreateFolderBatchError._other_validator = bv.Void() +CreateFolderBatchError._tagmap = { + 'too_many_files': CreateFolderBatchError._too_many_files_validator, + 'other': CreateFolderBatchError._other_validator, +} + +CreateFolderBatchError.too_many_files = CreateFolderBatchError('too_many_files') +CreateFolderBatchError.other = CreateFolderBatchError('other') + +CreateFolderBatchJobStatus._complete_validator = CreateFolderBatchResult_validator +CreateFolderBatchJobStatus._failed_validator = CreateFolderBatchError_validator +CreateFolderBatchJobStatus._other_validator = bv.Void() +CreateFolderBatchJobStatus._tagmap = { + 'complete': CreateFolderBatchJobStatus._complete_validator, + 'failed': CreateFolderBatchJobStatus._failed_validator, + 'other': CreateFolderBatchJobStatus._other_validator, +} +CreateFolderBatchJobStatus._tagmap.update(async_.PollResultBase._tagmap) + +CreateFolderBatchJobStatus.other = CreateFolderBatchJobStatus('other') + +CreateFolderBatchLaunch._complete_validator = CreateFolderBatchResult_validator +CreateFolderBatchLaunch._other_validator = bv.Void() +CreateFolderBatchLaunch._tagmap = { + 'complete': CreateFolderBatchLaunch._complete_validator, + 'other': CreateFolderBatchLaunch._other_validator, +} +CreateFolderBatchLaunch._tagmap.update(async_.LaunchResultBase._tagmap) + +CreateFolderBatchLaunch.other = CreateFolderBatchLaunch('other') + +FileOpsResult._all_field_names_ = set([]) +FileOpsResult._all_fields_ = [] + +CreateFolderBatchResult._entries_validator = bv.List(CreateFolderBatchResultEntry_validator) +CreateFolderBatchResult._all_field_names_ = FileOpsResult._all_field_names_.union(set(['entries'])) +CreateFolderBatchResult._all_fields_ = FileOpsResult._all_fields_ + [('entries', CreateFolderBatchResult._entries_validator)] + +CreateFolderBatchResultEntry._success_validator = CreateFolderEntryResult_validator +CreateFolderBatchResultEntry._failure_validator = CreateFolderEntryError_validator +CreateFolderBatchResultEntry._tagmap = { + 'success': CreateFolderBatchResultEntry._success_validator, + 'failure': CreateFolderBatchResultEntry._failure_validator, +} + +CreateFolderEntryError._path_validator = WriteError_validator +CreateFolderEntryError._other_validator = bv.Void() +CreateFolderEntryError._tagmap = { + 'path': CreateFolderEntryError._path_validator, + 'other': CreateFolderEntryError._other_validator, +} + +CreateFolderEntryError.other = CreateFolderEntryError('other') + +CreateFolderEntryResult._metadata_validator = FolderMetadata_validator +CreateFolderEntryResult._all_field_names_ = set(['metadata']) +CreateFolderEntryResult._all_fields_ = [('metadata', CreateFolderEntryResult._metadata_validator)] + +CreateFolderError._path_validator = WriteError_validator +CreateFolderError._tagmap = { + 'path': CreateFolderError._path_validator, +} + +CreateFolderResult._metadata_validator = FolderMetadata_validator +CreateFolderResult._all_field_names_ = FileOpsResult._all_field_names_.union(set(['metadata'])) +CreateFolderResult._all_fields_ = FileOpsResult._all_fields_ + [('metadata', CreateFolderResult._metadata_validator)] + +DeleteArg._path_validator = WritePathOrId_validator +DeleteArg._parent_rev_validator = bv.Nullable(Rev_validator) +DeleteArg._all_field_names_ = set([ + 'path', + 'parent_rev', +]) +DeleteArg._all_fields_ = [ + ('path', DeleteArg._path_validator), + ('parent_rev', DeleteArg._parent_rev_validator), +] + +DeleteBatchArg._entries_validator = bv.List(DeleteArg_validator) +DeleteBatchArg._all_field_names_ = set(['entries']) +DeleteBatchArg._all_fields_ = [('entries', DeleteBatchArg._entries_validator)] + +DeleteBatchError._too_many_write_operations_validator = bv.Void() +DeleteBatchError._other_validator = bv.Void() +DeleteBatchError._tagmap = { + 'too_many_write_operations': DeleteBatchError._too_many_write_operations_validator, + 'other': DeleteBatchError._other_validator, +} + +DeleteBatchError.too_many_write_operations = DeleteBatchError('too_many_write_operations') +DeleteBatchError.other = DeleteBatchError('other') + +DeleteBatchJobStatus._complete_validator = DeleteBatchResult_validator +DeleteBatchJobStatus._failed_validator = DeleteBatchError_validator +DeleteBatchJobStatus._other_validator = bv.Void() +DeleteBatchJobStatus._tagmap = { + 'complete': DeleteBatchJobStatus._complete_validator, + 'failed': DeleteBatchJobStatus._failed_validator, + 'other': DeleteBatchJobStatus._other_validator, +} +DeleteBatchJobStatus._tagmap.update(async_.PollResultBase._tagmap) + +DeleteBatchJobStatus.other = DeleteBatchJobStatus('other') + +DeleteBatchLaunch._complete_validator = DeleteBatchResult_validator +DeleteBatchLaunch._other_validator = bv.Void() +DeleteBatchLaunch._tagmap = { + 'complete': DeleteBatchLaunch._complete_validator, + 'other': DeleteBatchLaunch._other_validator, +} +DeleteBatchLaunch._tagmap.update(async_.LaunchResultBase._tagmap) + +DeleteBatchLaunch.other = DeleteBatchLaunch('other') + +DeleteBatchResult._entries_validator = bv.List(DeleteBatchResultEntry_validator) +DeleteBatchResult._all_field_names_ = FileOpsResult._all_field_names_.union(set(['entries'])) +DeleteBatchResult._all_fields_ = FileOpsResult._all_fields_ + [('entries', DeleteBatchResult._entries_validator)] + +DeleteBatchResultData._metadata_validator = Metadata_validator +DeleteBatchResultData._all_field_names_ = set(['metadata']) +DeleteBatchResultData._all_fields_ = [('metadata', DeleteBatchResultData._metadata_validator)] + +DeleteBatchResultEntry._success_validator = DeleteBatchResultData_validator +DeleteBatchResultEntry._failure_validator = DeleteError_validator +DeleteBatchResultEntry._tagmap = { + 'success': DeleteBatchResultEntry._success_validator, + 'failure': DeleteBatchResultEntry._failure_validator, +} + +DeleteError._path_lookup_validator = LookupError_validator +DeleteError._path_write_validator = WriteError_validator +DeleteError._too_many_write_operations_validator = bv.Void() +DeleteError._too_many_files_validator = bv.Void() +DeleteError._other_validator = bv.Void() +DeleteError._tagmap = { + 'path_lookup': DeleteError._path_lookup_validator, + 'path_write': DeleteError._path_write_validator, + 'too_many_write_operations': DeleteError._too_many_write_operations_validator, + 'too_many_files': DeleteError._too_many_files_validator, + 'other': DeleteError._other_validator, +} + +DeleteError.too_many_write_operations = DeleteError('too_many_write_operations') +DeleteError.too_many_files = DeleteError('too_many_files') +DeleteError.other = DeleteError('other') + +DeleteResult._metadata_validator = Metadata_validator +DeleteResult._all_field_names_ = FileOpsResult._all_field_names_.union(set(['metadata'])) +DeleteResult._all_fields_ = FileOpsResult._all_fields_ + [('metadata', DeleteResult._metadata_validator)] + +Metadata._name_validator = bv.String() +Metadata._path_lower_validator = bv.Nullable(bv.String()) +Metadata._path_display_validator = bv.Nullable(bv.String()) +Metadata._parent_shared_folder_id_validator = bv.Nullable(common.SharedFolderId_validator) +Metadata._field_names_ = set([ + 'name', + 'path_lower', + 'path_display', + 'parent_shared_folder_id', +]) +Metadata._all_field_names_ = Metadata._field_names_ +Metadata._fields_ = [ + ('name', Metadata._name_validator), + ('path_lower', Metadata._path_lower_validator), + ('path_display', Metadata._path_display_validator), + ('parent_shared_folder_id', Metadata._parent_shared_folder_id_validator), +] +Metadata._all_fields_ = Metadata._fields_ + +Metadata._tag_to_subtype_ = { + (u'file',): FileMetadata_validator, + (u'folder',): FolderMetadata_validator, + (u'deleted',): DeletedMetadata_validator, +} +Metadata._pytype_to_tag_and_subtype_ = { + FileMetadata: ((u'file',), FileMetadata_validator), + FolderMetadata: ((u'folder',), FolderMetadata_validator), + DeletedMetadata: ((u'deleted',), DeletedMetadata_validator), +} +Metadata._is_catch_all_ = False + +DeletedMetadata._field_names_ = set([]) +DeletedMetadata._all_field_names_ = Metadata._all_field_names_.union(DeletedMetadata._field_names_) +DeletedMetadata._fields_ = [] +DeletedMetadata._all_fields_ = Metadata._all_fields_ + DeletedMetadata._fields_ + +Dimensions._height_validator = bv.UInt64() +Dimensions._width_validator = bv.UInt64() +Dimensions._all_field_names_ = set([ + 'height', + 'width', +]) +Dimensions._all_fields_ = [ + ('height', Dimensions._height_validator), + ('width', Dimensions._width_validator), +] + +DownloadArg._path_validator = ReadPath_validator +DownloadArg._rev_validator = bv.Nullable(Rev_validator) +DownloadArg._all_field_names_ = set([ + 'path', + 'rev', +]) +DownloadArg._all_fields_ = [ + ('path', DownloadArg._path_validator), + ('rev', DownloadArg._rev_validator), +] + +DownloadError._path_validator = LookupError_validator +DownloadError._other_validator = bv.Void() +DownloadError._tagmap = { + 'path': DownloadError._path_validator, + 'other': DownloadError._other_validator, +} + +DownloadError.other = DownloadError('other') + +DownloadZipArg._path_validator = ReadPath_validator +DownloadZipArg._all_field_names_ = set(['path']) +DownloadZipArg._all_fields_ = [('path', DownloadZipArg._path_validator)] + +DownloadZipError._path_validator = LookupError_validator +DownloadZipError._too_large_validator = bv.Void() +DownloadZipError._too_many_files_validator = bv.Void() +DownloadZipError._other_validator = bv.Void() +DownloadZipError._tagmap = { + 'path': DownloadZipError._path_validator, + 'too_large': DownloadZipError._too_large_validator, + 'too_many_files': DownloadZipError._too_many_files_validator, + 'other': DownloadZipError._other_validator, +} + +DownloadZipError.too_large = DownloadZipError('too_large') +DownloadZipError.too_many_files = DownloadZipError('too_many_files') +DownloadZipError.other = DownloadZipError('other') + +DownloadZipResult._metadata_validator = FolderMetadata_validator +DownloadZipResult._all_field_names_ = set(['metadata']) +DownloadZipResult._all_fields_ = [('metadata', DownloadZipResult._metadata_validator)] + +FileMetadata._id_validator = Id_validator +FileMetadata._client_modified_validator = common.DropboxTimestamp_validator +FileMetadata._server_modified_validator = common.DropboxTimestamp_validator +FileMetadata._rev_validator = Rev_validator +FileMetadata._size_validator = bv.UInt64() +FileMetadata._media_info_validator = bv.Nullable(MediaInfo_validator) +FileMetadata._symlink_info_validator = bv.Nullable(SymlinkInfo_validator) +FileMetadata._sharing_info_validator = bv.Nullable(FileSharingInfo_validator) +FileMetadata._property_groups_validator = bv.Nullable(bv.List(file_properties.PropertyGroup_validator)) +FileMetadata._has_explicit_shared_members_validator = bv.Nullable(bv.Boolean()) +FileMetadata._content_hash_validator = bv.Nullable(Sha256HexHash_validator) +FileMetadata._field_names_ = set([ + 'id', + 'client_modified', + 'server_modified', + 'rev', + 'size', + 'media_info', + 'symlink_info', + 'sharing_info', + 'property_groups', + 'has_explicit_shared_members', + 'content_hash', +]) +FileMetadata._all_field_names_ = Metadata._all_field_names_.union(FileMetadata._field_names_) +FileMetadata._fields_ = [ + ('id', FileMetadata._id_validator), + ('client_modified', FileMetadata._client_modified_validator), + ('server_modified', FileMetadata._server_modified_validator), + ('rev', FileMetadata._rev_validator), + ('size', FileMetadata._size_validator), + ('media_info', FileMetadata._media_info_validator), + ('symlink_info', FileMetadata._symlink_info_validator), + ('sharing_info', FileMetadata._sharing_info_validator), + ('property_groups', FileMetadata._property_groups_validator), + ('has_explicit_shared_members', FileMetadata._has_explicit_shared_members_validator), + ('content_hash', FileMetadata._content_hash_validator), +] +FileMetadata._all_fields_ = Metadata._all_fields_ + FileMetadata._fields_ + +SharingInfo._read_only_validator = bv.Boolean() +SharingInfo._all_field_names_ = set(['read_only']) +SharingInfo._all_fields_ = [('read_only', SharingInfo._read_only_validator)] + +FileSharingInfo._parent_shared_folder_id_validator = common.SharedFolderId_validator +FileSharingInfo._modified_by_validator = bv.Nullable(users_common.AccountId_validator) +FileSharingInfo._all_field_names_ = SharingInfo._all_field_names_.union(set([ + 'parent_shared_folder_id', + 'modified_by', +])) +FileSharingInfo._all_fields_ = SharingInfo._all_fields_ + [ + ('parent_shared_folder_id', FileSharingInfo._parent_shared_folder_id_validator), + ('modified_by', FileSharingInfo._modified_by_validator), +] + +FolderMetadata._id_validator = Id_validator +FolderMetadata._shared_folder_id_validator = bv.Nullable(common.SharedFolderId_validator) +FolderMetadata._sharing_info_validator = bv.Nullable(FolderSharingInfo_validator) +FolderMetadata._property_groups_validator = bv.Nullable(bv.List(file_properties.PropertyGroup_validator)) +FolderMetadata._field_names_ = set([ + 'id', + 'shared_folder_id', + 'sharing_info', + 'property_groups', +]) +FolderMetadata._all_field_names_ = Metadata._all_field_names_.union(FolderMetadata._field_names_) +FolderMetadata._fields_ = [ + ('id', FolderMetadata._id_validator), + ('shared_folder_id', FolderMetadata._shared_folder_id_validator), + ('sharing_info', FolderMetadata._sharing_info_validator), + ('property_groups', FolderMetadata._property_groups_validator), +] +FolderMetadata._all_fields_ = Metadata._all_fields_ + FolderMetadata._fields_ + +FolderSharingInfo._parent_shared_folder_id_validator = bv.Nullable(common.SharedFolderId_validator) +FolderSharingInfo._shared_folder_id_validator = bv.Nullable(common.SharedFolderId_validator) +FolderSharingInfo._traverse_only_validator = bv.Boolean() +FolderSharingInfo._no_access_validator = bv.Boolean() +FolderSharingInfo._all_field_names_ = SharingInfo._all_field_names_.union(set([ + 'parent_shared_folder_id', + 'shared_folder_id', + 'traverse_only', + 'no_access', +])) +FolderSharingInfo._all_fields_ = SharingInfo._all_fields_ + [ + ('parent_shared_folder_id', FolderSharingInfo._parent_shared_folder_id_validator), + ('shared_folder_id', FolderSharingInfo._shared_folder_id_validator), + ('traverse_only', FolderSharingInfo._traverse_only_validator), + ('no_access', FolderSharingInfo._no_access_validator), +] + +GetCopyReferenceArg._path_validator = ReadPath_validator +GetCopyReferenceArg._all_field_names_ = set(['path']) +GetCopyReferenceArg._all_fields_ = [('path', GetCopyReferenceArg._path_validator)] + +GetCopyReferenceError._path_validator = LookupError_validator +GetCopyReferenceError._other_validator = bv.Void() +GetCopyReferenceError._tagmap = { + 'path': GetCopyReferenceError._path_validator, + 'other': GetCopyReferenceError._other_validator, +} + +GetCopyReferenceError.other = GetCopyReferenceError('other') + +GetCopyReferenceResult._metadata_validator = Metadata_validator +GetCopyReferenceResult._copy_reference_validator = bv.String() +GetCopyReferenceResult._expires_validator = common.DropboxTimestamp_validator +GetCopyReferenceResult._all_field_names_ = set([ + 'metadata', + 'copy_reference', + 'expires', +]) +GetCopyReferenceResult._all_fields_ = [ + ('metadata', GetCopyReferenceResult._metadata_validator), + ('copy_reference', GetCopyReferenceResult._copy_reference_validator), + ('expires', GetCopyReferenceResult._expires_validator), +] + +GetTemporaryLinkArg._path_validator = ReadPath_validator +GetTemporaryLinkArg._all_field_names_ = set(['path']) +GetTemporaryLinkArg._all_fields_ = [('path', GetTemporaryLinkArg._path_validator)] + +GetTemporaryLinkError._path_validator = LookupError_validator +GetTemporaryLinkError._other_validator = bv.Void() +GetTemporaryLinkError._tagmap = { + 'path': GetTemporaryLinkError._path_validator, + 'other': GetTemporaryLinkError._other_validator, +} + +GetTemporaryLinkError.other = GetTemporaryLinkError('other') + +GetTemporaryLinkResult._metadata_validator = FileMetadata_validator +GetTemporaryLinkResult._link_validator = bv.String() +GetTemporaryLinkResult._all_field_names_ = set([ + 'metadata', + 'link', +]) +GetTemporaryLinkResult._all_fields_ = [ + ('metadata', GetTemporaryLinkResult._metadata_validator), + ('link', GetTemporaryLinkResult._link_validator), +] + +GetTemporaryUploadLinkArg._commit_info_validator = CommitInfo_validator +GetTemporaryUploadLinkArg._duration_validator = bv.Float64(min_value=60.0, max_value=14400.0) +GetTemporaryUploadLinkArg._all_field_names_ = set([ + 'commit_info', + 'duration', +]) +GetTemporaryUploadLinkArg._all_fields_ = [ + ('commit_info', GetTemporaryUploadLinkArg._commit_info_validator), + ('duration', GetTemporaryUploadLinkArg._duration_validator), +] + +GetTemporaryUploadLinkResult._link_validator = bv.String() +GetTemporaryUploadLinkResult._all_field_names_ = set(['link']) +GetTemporaryUploadLinkResult._all_fields_ = [('link', GetTemporaryUploadLinkResult._link_validator)] + +GetThumbnailBatchArg._entries_validator = bv.List(ThumbnailArg_validator) +GetThumbnailBatchArg._all_field_names_ = set(['entries']) +GetThumbnailBatchArg._all_fields_ = [('entries', GetThumbnailBatchArg._entries_validator)] + +GetThumbnailBatchError._too_many_files_validator = bv.Void() +GetThumbnailBatchError._other_validator = bv.Void() +GetThumbnailBatchError._tagmap = { + 'too_many_files': GetThumbnailBatchError._too_many_files_validator, + 'other': GetThumbnailBatchError._other_validator, +} + +GetThumbnailBatchError.too_many_files = GetThumbnailBatchError('too_many_files') +GetThumbnailBatchError.other = GetThumbnailBatchError('other') + +GetThumbnailBatchResult._entries_validator = bv.List(GetThumbnailBatchResultEntry_validator) +GetThumbnailBatchResult._all_field_names_ = set(['entries']) +GetThumbnailBatchResult._all_fields_ = [('entries', GetThumbnailBatchResult._entries_validator)] + +GetThumbnailBatchResultData._metadata_validator = FileMetadata_validator +GetThumbnailBatchResultData._thumbnail_validator = bv.String() +GetThumbnailBatchResultData._all_field_names_ = set([ + 'metadata', + 'thumbnail', +]) +GetThumbnailBatchResultData._all_fields_ = [ + ('metadata', GetThumbnailBatchResultData._metadata_validator), + ('thumbnail', GetThumbnailBatchResultData._thumbnail_validator), +] + +GetThumbnailBatchResultEntry._success_validator = GetThumbnailBatchResultData_validator +GetThumbnailBatchResultEntry._failure_validator = ThumbnailError_validator +GetThumbnailBatchResultEntry._other_validator = bv.Void() +GetThumbnailBatchResultEntry._tagmap = { + 'success': GetThumbnailBatchResultEntry._success_validator, + 'failure': GetThumbnailBatchResultEntry._failure_validator, + 'other': GetThumbnailBatchResultEntry._other_validator, +} + +GetThumbnailBatchResultEntry.other = GetThumbnailBatchResultEntry('other') + +GpsCoordinates._latitude_validator = bv.Float64() +GpsCoordinates._longitude_validator = bv.Float64() +GpsCoordinates._all_field_names_ = set([ + 'latitude', + 'longitude', +]) +GpsCoordinates._all_fields_ = [ + ('latitude', GpsCoordinates._latitude_validator), + ('longitude', GpsCoordinates._longitude_validator), +] + +ListFolderArg._path_validator = PathROrId_validator +ListFolderArg._recursive_validator = bv.Boolean() +ListFolderArg._include_media_info_validator = bv.Boolean() +ListFolderArg._include_deleted_validator = bv.Boolean() +ListFolderArg._include_has_explicit_shared_members_validator = bv.Boolean() +ListFolderArg._include_mounted_folders_validator = bv.Boolean() +ListFolderArg._limit_validator = bv.Nullable(bv.UInt32(min_value=1, max_value=2000)) +ListFolderArg._shared_link_validator = bv.Nullable(SharedLink_validator) +ListFolderArg._include_property_groups_validator = bv.Nullable(file_properties.TemplateFilterBase_validator) +ListFolderArg._all_field_names_ = set([ + 'path', + 'recursive', + 'include_media_info', + 'include_deleted', + 'include_has_explicit_shared_members', + 'include_mounted_folders', + 'limit', + 'shared_link', + 'include_property_groups', +]) +ListFolderArg._all_fields_ = [ + ('path', ListFolderArg._path_validator), + ('recursive', ListFolderArg._recursive_validator), + ('include_media_info', ListFolderArg._include_media_info_validator), + ('include_deleted', ListFolderArg._include_deleted_validator), + ('include_has_explicit_shared_members', ListFolderArg._include_has_explicit_shared_members_validator), + ('include_mounted_folders', ListFolderArg._include_mounted_folders_validator), + ('limit', ListFolderArg._limit_validator), + ('shared_link', ListFolderArg._shared_link_validator), + ('include_property_groups', ListFolderArg._include_property_groups_validator), +] + +ListFolderContinueArg._cursor_validator = ListFolderCursor_validator +ListFolderContinueArg._all_field_names_ = set(['cursor']) +ListFolderContinueArg._all_fields_ = [('cursor', ListFolderContinueArg._cursor_validator)] + +ListFolderContinueError._path_validator = LookupError_validator +ListFolderContinueError._reset_validator = bv.Void() +ListFolderContinueError._other_validator = bv.Void() +ListFolderContinueError._tagmap = { + 'path': ListFolderContinueError._path_validator, + 'reset': ListFolderContinueError._reset_validator, + 'other': ListFolderContinueError._other_validator, +} + +ListFolderContinueError.reset = ListFolderContinueError('reset') +ListFolderContinueError.other = ListFolderContinueError('other') + +ListFolderError._path_validator = LookupError_validator +ListFolderError._other_validator = bv.Void() +ListFolderError._tagmap = { + 'path': ListFolderError._path_validator, + 'other': ListFolderError._other_validator, +} + +ListFolderError.other = ListFolderError('other') + +ListFolderGetLatestCursorResult._cursor_validator = ListFolderCursor_validator +ListFolderGetLatestCursorResult._all_field_names_ = set(['cursor']) +ListFolderGetLatestCursorResult._all_fields_ = [('cursor', ListFolderGetLatestCursorResult._cursor_validator)] + +ListFolderLongpollArg._cursor_validator = ListFolderCursor_validator +ListFolderLongpollArg._timeout_validator = bv.UInt64(min_value=30, max_value=480) +ListFolderLongpollArg._all_field_names_ = set([ + 'cursor', + 'timeout', +]) +ListFolderLongpollArg._all_fields_ = [ + ('cursor', ListFolderLongpollArg._cursor_validator), + ('timeout', ListFolderLongpollArg._timeout_validator), +] + +ListFolderLongpollError._reset_validator = bv.Void() +ListFolderLongpollError._other_validator = bv.Void() +ListFolderLongpollError._tagmap = { + 'reset': ListFolderLongpollError._reset_validator, + 'other': ListFolderLongpollError._other_validator, +} + +ListFolderLongpollError.reset = ListFolderLongpollError('reset') +ListFolderLongpollError.other = ListFolderLongpollError('other') + +ListFolderLongpollResult._changes_validator = bv.Boolean() +ListFolderLongpollResult._backoff_validator = bv.Nullable(bv.UInt64()) +ListFolderLongpollResult._all_field_names_ = set([ + 'changes', + 'backoff', +]) +ListFolderLongpollResult._all_fields_ = [ + ('changes', ListFolderLongpollResult._changes_validator), + ('backoff', ListFolderLongpollResult._backoff_validator), +] + +ListFolderResult._entries_validator = bv.List(Metadata_validator) +ListFolderResult._cursor_validator = ListFolderCursor_validator +ListFolderResult._has_more_validator = bv.Boolean() +ListFolderResult._all_field_names_ = set([ + 'entries', + 'cursor', + 'has_more', +]) +ListFolderResult._all_fields_ = [ + ('entries', ListFolderResult._entries_validator), + ('cursor', ListFolderResult._cursor_validator), + ('has_more', ListFolderResult._has_more_validator), +] + +ListRevisionsArg._path_validator = PathOrId_validator +ListRevisionsArg._mode_validator = ListRevisionsMode_validator +ListRevisionsArg._limit_validator = bv.UInt64(min_value=1, max_value=100) +ListRevisionsArg._all_field_names_ = set([ + 'path', + 'mode', + 'limit', +]) +ListRevisionsArg._all_fields_ = [ + ('path', ListRevisionsArg._path_validator), + ('mode', ListRevisionsArg._mode_validator), + ('limit', ListRevisionsArg._limit_validator), +] + +ListRevisionsError._path_validator = LookupError_validator +ListRevisionsError._other_validator = bv.Void() +ListRevisionsError._tagmap = { + 'path': ListRevisionsError._path_validator, + 'other': ListRevisionsError._other_validator, +} + +ListRevisionsError.other = ListRevisionsError('other') + +ListRevisionsMode._path_validator = bv.Void() +ListRevisionsMode._id_validator = bv.Void() +ListRevisionsMode._other_validator = bv.Void() +ListRevisionsMode._tagmap = { + 'path': ListRevisionsMode._path_validator, + 'id': ListRevisionsMode._id_validator, + 'other': ListRevisionsMode._other_validator, +} + +ListRevisionsMode.path = ListRevisionsMode('path') +ListRevisionsMode.id = ListRevisionsMode('id') +ListRevisionsMode.other = ListRevisionsMode('other') + +ListRevisionsResult._is_deleted_validator = bv.Boolean() +ListRevisionsResult._server_deleted_validator = bv.Nullable(common.DropboxTimestamp_validator) +ListRevisionsResult._entries_validator = bv.List(FileMetadata_validator) +ListRevisionsResult._all_field_names_ = set([ + 'is_deleted', + 'server_deleted', + 'entries', +]) +ListRevisionsResult._all_fields_ = [ + ('is_deleted', ListRevisionsResult._is_deleted_validator), + ('server_deleted', ListRevisionsResult._server_deleted_validator), + ('entries', ListRevisionsResult._entries_validator), +] + +LookupError._malformed_path_validator = MalformedPathError_validator +LookupError._not_found_validator = bv.Void() +LookupError._not_file_validator = bv.Void() +LookupError._not_folder_validator = bv.Void() +LookupError._restricted_content_validator = bv.Void() +LookupError._other_validator = bv.Void() +LookupError._tagmap = { + 'malformed_path': LookupError._malformed_path_validator, + 'not_found': LookupError._not_found_validator, + 'not_file': LookupError._not_file_validator, + 'not_folder': LookupError._not_folder_validator, + 'restricted_content': LookupError._restricted_content_validator, + 'other': LookupError._other_validator, +} + +LookupError.not_found = LookupError('not_found') +LookupError.not_file = LookupError('not_file') +LookupError.not_folder = LookupError('not_folder') +LookupError.restricted_content = LookupError('restricted_content') +LookupError.other = LookupError('other') + +MediaInfo._pending_validator = bv.Void() +MediaInfo._metadata_validator = MediaMetadata_validator +MediaInfo._tagmap = { + 'pending': MediaInfo._pending_validator, + 'metadata': MediaInfo._metadata_validator, +} + +MediaInfo.pending = MediaInfo('pending') + +MediaMetadata._dimensions_validator = bv.Nullable(Dimensions_validator) +MediaMetadata._location_validator = bv.Nullable(GpsCoordinates_validator) +MediaMetadata._time_taken_validator = bv.Nullable(common.DropboxTimestamp_validator) +MediaMetadata._field_names_ = set([ + 'dimensions', + 'location', + 'time_taken', +]) +MediaMetadata._all_field_names_ = MediaMetadata._field_names_ +MediaMetadata._fields_ = [ + ('dimensions', MediaMetadata._dimensions_validator), + ('location', MediaMetadata._location_validator), + ('time_taken', MediaMetadata._time_taken_validator), +] +MediaMetadata._all_fields_ = MediaMetadata._fields_ + +MediaMetadata._tag_to_subtype_ = { + (u'photo',): PhotoMetadata_validator, + (u'video',): VideoMetadata_validator, +} +MediaMetadata._pytype_to_tag_and_subtype_ = { + PhotoMetadata: ((u'photo',), PhotoMetadata_validator), + VideoMetadata: ((u'video',), VideoMetadata_validator), +} +MediaMetadata._is_catch_all_ = False + +RelocationBatchArgBase._entries_validator = bv.List(RelocationPath_validator, min_items=1) +RelocationBatchArgBase._autorename_validator = bv.Boolean() +RelocationBatchArgBase._all_field_names_ = set([ + 'entries', + 'autorename', +]) +RelocationBatchArgBase._all_fields_ = [ + ('entries', RelocationBatchArgBase._entries_validator), + ('autorename', RelocationBatchArgBase._autorename_validator), +] + +MoveBatchArg._allow_ownership_transfer_validator = bv.Boolean() +MoveBatchArg._all_field_names_ = RelocationBatchArgBase._all_field_names_.union(set(['allow_ownership_transfer'])) +MoveBatchArg._all_fields_ = RelocationBatchArgBase._all_fields_ + [('allow_ownership_transfer', MoveBatchArg._allow_ownership_transfer_validator)] + +PhotoMetadata._field_names_ = set([]) +PhotoMetadata._all_field_names_ = MediaMetadata._all_field_names_.union(PhotoMetadata._field_names_) +PhotoMetadata._fields_ = [] +PhotoMetadata._all_fields_ = MediaMetadata._all_fields_ + PhotoMetadata._fields_ + +PreviewArg._path_validator = ReadPath_validator +PreviewArg._rev_validator = bv.Nullable(Rev_validator) +PreviewArg._all_field_names_ = set([ + 'path', + 'rev', +]) +PreviewArg._all_fields_ = [ + ('path', PreviewArg._path_validator), + ('rev', PreviewArg._rev_validator), +] + +PreviewError._path_validator = LookupError_validator +PreviewError._in_progress_validator = bv.Void() +PreviewError._unsupported_extension_validator = bv.Void() +PreviewError._unsupported_content_validator = bv.Void() +PreviewError._tagmap = { + 'path': PreviewError._path_validator, + 'in_progress': PreviewError._in_progress_validator, + 'unsupported_extension': PreviewError._unsupported_extension_validator, + 'unsupported_content': PreviewError._unsupported_content_validator, +} + +PreviewError.in_progress = PreviewError('in_progress') +PreviewError.unsupported_extension = PreviewError('unsupported_extension') +PreviewError.unsupported_content = PreviewError('unsupported_content') + +RelocationPath._from_path_validator = WritePathOrId_validator +RelocationPath._to_path_validator = WritePathOrId_validator +RelocationPath._all_field_names_ = set([ + 'from_path', + 'to_path', +]) +RelocationPath._all_fields_ = [ + ('from_path', RelocationPath._from_path_validator), + ('to_path', RelocationPath._to_path_validator), +] + +RelocationArg._allow_shared_folder_validator = bv.Boolean() +RelocationArg._autorename_validator = bv.Boolean() +RelocationArg._allow_ownership_transfer_validator = bv.Boolean() +RelocationArg._all_field_names_ = RelocationPath._all_field_names_.union(set([ + 'allow_shared_folder', + 'autorename', + 'allow_ownership_transfer', +])) +RelocationArg._all_fields_ = RelocationPath._all_fields_ + [ + ('allow_shared_folder', RelocationArg._allow_shared_folder_validator), + ('autorename', RelocationArg._autorename_validator), + ('allow_ownership_transfer', RelocationArg._allow_ownership_transfer_validator), +] + +RelocationBatchArg._allow_shared_folder_validator = bv.Boolean() +RelocationBatchArg._allow_ownership_transfer_validator = bv.Boolean() +RelocationBatchArg._all_field_names_ = RelocationBatchArgBase._all_field_names_.union(set([ + 'allow_shared_folder', + 'allow_ownership_transfer', +])) +RelocationBatchArg._all_fields_ = RelocationBatchArgBase._all_fields_ + [ + ('allow_shared_folder', RelocationBatchArg._allow_shared_folder_validator), + ('allow_ownership_transfer', RelocationBatchArg._allow_ownership_transfer_validator), +] + +RelocationError._from_lookup_validator = LookupError_validator +RelocationError._from_write_validator = WriteError_validator +RelocationError._to_validator = WriteError_validator +RelocationError._cant_copy_shared_folder_validator = bv.Void() +RelocationError._cant_nest_shared_folder_validator = bv.Void() +RelocationError._cant_move_folder_into_itself_validator = bv.Void() +RelocationError._too_many_files_validator = bv.Void() +RelocationError._duplicated_or_nested_paths_validator = bv.Void() +RelocationError._cant_transfer_ownership_validator = bv.Void() +RelocationError._insufficient_quota_validator = bv.Void() +RelocationError._internal_error_validator = bv.Void() +RelocationError._other_validator = bv.Void() +RelocationError._tagmap = { + 'from_lookup': RelocationError._from_lookup_validator, + 'from_write': RelocationError._from_write_validator, + 'to': RelocationError._to_validator, + 'cant_copy_shared_folder': RelocationError._cant_copy_shared_folder_validator, + 'cant_nest_shared_folder': RelocationError._cant_nest_shared_folder_validator, + 'cant_move_folder_into_itself': RelocationError._cant_move_folder_into_itself_validator, + 'too_many_files': RelocationError._too_many_files_validator, + 'duplicated_or_nested_paths': RelocationError._duplicated_or_nested_paths_validator, + 'cant_transfer_ownership': RelocationError._cant_transfer_ownership_validator, + 'insufficient_quota': RelocationError._insufficient_quota_validator, + 'internal_error': RelocationError._internal_error_validator, + 'other': RelocationError._other_validator, +} + +RelocationError.cant_copy_shared_folder = RelocationError('cant_copy_shared_folder') +RelocationError.cant_nest_shared_folder = RelocationError('cant_nest_shared_folder') +RelocationError.cant_move_folder_into_itself = RelocationError('cant_move_folder_into_itself') +RelocationError.too_many_files = RelocationError('too_many_files') +RelocationError.duplicated_or_nested_paths = RelocationError('duplicated_or_nested_paths') +RelocationError.cant_transfer_ownership = RelocationError('cant_transfer_ownership') +RelocationError.insufficient_quota = RelocationError('insufficient_quota') +RelocationError.internal_error = RelocationError('internal_error') +RelocationError.other = RelocationError('other') + +RelocationBatchError._too_many_write_operations_validator = bv.Void() +RelocationBatchError._tagmap = { + 'too_many_write_operations': RelocationBatchError._too_many_write_operations_validator, +} +RelocationBatchError._tagmap.update(RelocationError._tagmap) + +RelocationBatchError.too_many_write_operations = RelocationBatchError('too_many_write_operations') + +RelocationBatchErrorEntry._relocation_error_validator = RelocationError_validator +RelocationBatchErrorEntry._internal_error_validator = bv.Void() +RelocationBatchErrorEntry._too_many_write_operations_validator = bv.Void() +RelocationBatchErrorEntry._other_validator = bv.Void() +RelocationBatchErrorEntry._tagmap = { + 'relocation_error': RelocationBatchErrorEntry._relocation_error_validator, + 'internal_error': RelocationBatchErrorEntry._internal_error_validator, + 'too_many_write_operations': RelocationBatchErrorEntry._too_many_write_operations_validator, + 'other': RelocationBatchErrorEntry._other_validator, +} + +RelocationBatchErrorEntry.internal_error = RelocationBatchErrorEntry('internal_error') +RelocationBatchErrorEntry.too_many_write_operations = RelocationBatchErrorEntry('too_many_write_operations') +RelocationBatchErrorEntry.other = RelocationBatchErrorEntry('other') + +RelocationBatchJobStatus._complete_validator = RelocationBatchResult_validator +RelocationBatchJobStatus._failed_validator = RelocationBatchError_validator +RelocationBatchJobStatus._tagmap = { + 'complete': RelocationBatchJobStatus._complete_validator, + 'failed': RelocationBatchJobStatus._failed_validator, +} +RelocationBatchJobStatus._tagmap.update(async_.PollResultBase._tagmap) + +RelocationBatchLaunch._complete_validator = RelocationBatchResult_validator +RelocationBatchLaunch._other_validator = bv.Void() +RelocationBatchLaunch._tagmap = { + 'complete': RelocationBatchLaunch._complete_validator, + 'other': RelocationBatchLaunch._other_validator, +} +RelocationBatchLaunch._tagmap.update(async_.LaunchResultBase._tagmap) + +RelocationBatchLaunch.other = RelocationBatchLaunch('other') + +RelocationBatchResult._entries_validator = bv.List(RelocationBatchResultData_validator) +RelocationBatchResult._all_field_names_ = FileOpsResult._all_field_names_.union(set(['entries'])) +RelocationBatchResult._all_fields_ = FileOpsResult._all_fields_ + [('entries', RelocationBatchResult._entries_validator)] + +RelocationBatchResultData._metadata_validator = Metadata_validator +RelocationBatchResultData._all_field_names_ = set(['metadata']) +RelocationBatchResultData._all_fields_ = [('metadata', RelocationBatchResultData._metadata_validator)] + +RelocationBatchResultEntry._success_validator = Metadata_validator +RelocationBatchResultEntry._failure_validator = RelocationBatchErrorEntry_validator +RelocationBatchResultEntry._other_validator = bv.Void() +RelocationBatchResultEntry._tagmap = { + 'success': RelocationBatchResultEntry._success_validator, + 'failure': RelocationBatchResultEntry._failure_validator, + 'other': RelocationBatchResultEntry._other_validator, +} + +RelocationBatchResultEntry.other = RelocationBatchResultEntry('other') + +RelocationBatchV2JobStatus._complete_validator = RelocationBatchV2Result_validator +RelocationBatchV2JobStatus._tagmap = { + 'complete': RelocationBatchV2JobStatus._complete_validator, +} +RelocationBatchV2JobStatus._tagmap.update(async_.PollResultBase._tagmap) + +RelocationBatchV2Launch._complete_validator = RelocationBatchV2Result_validator +RelocationBatchV2Launch._tagmap = { + 'complete': RelocationBatchV2Launch._complete_validator, +} +RelocationBatchV2Launch._tagmap.update(async_.LaunchResultBase._tagmap) + +RelocationBatchV2Result._entries_validator = bv.List(RelocationBatchResultEntry_validator) +RelocationBatchV2Result._all_field_names_ = FileOpsResult._all_field_names_.union(set(['entries'])) +RelocationBatchV2Result._all_fields_ = FileOpsResult._all_fields_ + [('entries', RelocationBatchV2Result._entries_validator)] + +RelocationResult._metadata_validator = Metadata_validator +RelocationResult._all_field_names_ = FileOpsResult._all_field_names_.union(set(['metadata'])) +RelocationResult._all_fields_ = FileOpsResult._all_fields_ + [('metadata', RelocationResult._metadata_validator)] + +RestoreArg._path_validator = WritePath_validator +RestoreArg._rev_validator = Rev_validator +RestoreArg._all_field_names_ = set([ + 'path', + 'rev', +]) +RestoreArg._all_fields_ = [ + ('path', RestoreArg._path_validator), + ('rev', RestoreArg._rev_validator), +] + +RestoreError._path_lookup_validator = LookupError_validator +RestoreError._path_write_validator = WriteError_validator +RestoreError._invalid_revision_validator = bv.Void() +RestoreError._other_validator = bv.Void() +RestoreError._tagmap = { + 'path_lookup': RestoreError._path_lookup_validator, + 'path_write': RestoreError._path_write_validator, + 'invalid_revision': RestoreError._invalid_revision_validator, + 'other': RestoreError._other_validator, +} + +RestoreError.invalid_revision = RestoreError('invalid_revision') +RestoreError.other = RestoreError('other') + +SaveCopyReferenceArg._copy_reference_validator = bv.String() +SaveCopyReferenceArg._path_validator = Path_validator +SaveCopyReferenceArg._all_field_names_ = set([ + 'copy_reference', + 'path', +]) +SaveCopyReferenceArg._all_fields_ = [ + ('copy_reference', SaveCopyReferenceArg._copy_reference_validator), + ('path', SaveCopyReferenceArg._path_validator), +] + +SaveCopyReferenceError._path_validator = WriteError_validator +SaveCopyReferenceError._invalid_copy_reference_validator = bv.Void() +SaveCopyReferenceError._no_permission_validator = bv.Void() +SaveCopyReferenceError._not_found_validator = bv.Void() +SaveCopyReferenceError._too_many_files_validator = bv.Void() +SaveCopyReferenceError._other_validator = bv.Void() +SaveCopyReferenceError._tagmap = { + 'path': SaveCopyReferenceError._path_validator, + 'invalid_copy_reference': SaveCopyReferenceError._invalid_copy_reference_validator, + 'no_permission': SaveCopyReferenceError._no_permission_validator, + 'not_found': SaveCopyReferenceError._not_found_validator, + 'too_many_files': SaveCopyReferenceError._too_many_files_validator, + 'other': SaveCopyReferenceError._other_validator, +} + +SaveCopyReferenceError.invalid_copy_reference = SaveCopyReferenceError('invalid_copy_reference') +SaveCopyReferenceError.no_permission = SaveCopyReferenceError('no_permission') +SaveCopyReferenceError.not_found = SaveCopyReferenceError('not_found') +SaveCopyReferenceError.too_many_files = SaveCopyReferenceError('too_many_files') +SaveCopyReferenceError.other = SaveCopyReferenceError('other') + +SaveCopyReferenceResult._metadata_validator = Metadata_validator +SaveCopyReferenceResult._all_field_names_ = set(['metadata']) +SaveCopyReferenceResult._all_fields_ = [('metadata', SaveCopyReferenceResult._metadata_validator)] + +SaveUrlArg._path_validator = Path_validator +SaveUrlArg._url_validator = bv.String() +SaveUrlArg._all_field_names_ = set([ + 'path', + 'url', +]) +SaveUrlArg._all_fields_ = [ + ('path', SaveUrlArg._path_validator), + ('url', SaveUrlArg._url_validator), +] + +SaveUrlError._path_validator = WriteError_validator +SaveUrlError._download_failed_validator = bv.Void() +SaveUrlError._invalid_url_validator = bv.Void() +SaveUrlError._not_found_validator = bv.Void() +SaveUrlError._other_validator = bv.Void() +SaveUrlError._tagmap = { + 'path': SaveUrlError._path_validator, + 'download_failed': SaveUrlError._download_failed_validator, + 'invalid_url': SaveUrlError._invalid_url_validator, + 'not_found': SaveUrlError._not_found_validator, + 'other': SaveUrlError._other_validator, +} + +SaveUrlError.download_failed = SaveUrlError('download_failed') +SaveUrlError.invalid_url = SaveUrlError('invalid_url') +SaveUrlError.not_found = SaveUrlError('not_found') +SaveUrlError.other = SaveUrlError('other') + +SaveUrlJobStatus._complete_validator = FileMetadata_validator +SaveUrlJobStatus._failed_validator = SaveUrlError_validator +SaveUrlJobStatus._tagmap = { + 'complete': SaveUrlJobStatus._complete_validator, + 'failed': SaveUrlJobStatus._failed_validator, +} +SaveUrlJobStatus._tagmap.update(async_.PollResultBase._tagmap) + +SaveUrlResult._complete_validator = FileMetadata_validator +SaveUrlResult._tagmap = { + 'complete': SaveUrlResult._complete_validator, +} +SaveUrlResult._tagmap.update(async_.LaunchResultBase._tagmap) + +SearchArg._path_validator = PathROrId_validator +SearchArg._query_validator = bv.String() +SearchArg._start_validator = bv.UInt64() +SearchArg._max_results_validator = bv.UInt64(min_value=1, max_value=1000) +SearchArg._mode_validator = SearchMode_validator +SearchArg._all_field_names_ = set([ + 'path', + 'query', + 'start', + 'max_results', + 'mode', +]) +SearchArg._all_fields_ = [ + ('path', SearchArg._path_validator), + ('query', SearchArg._query_validator), + ('start', SearchArg._start_validator), + ('max_results', SearchArg._max_results_validator), + ('mode', SearchArg._mode_validator), +] + +SearchError._path_validator = LookupError_validator +SearchError._other_validator = bv.Void() +SearchError._tagmap = { + 'path': SearchError._path_validator, + 'other': SearchError._other_validator, +} + +SearchError.other = SearchError('other') + +SearchMatch._match_type_validator = SearchMatchType_validator +SearchMatch._metadata_validator = Metadata_validator +SearchMatch._all_field_names_ = set([ + 'match_type', + 'metadata', +]) +SearchMatch._all_fields_ = [ + ('match_type', SearchMatch._match_type_validator), + ('metadata', SearchMatch._metadata_validator), +] + +SearchMatchType._filename_validator = bv.Void() +SearchMatchType._content_validator = bv.Void() +SearchMatchType._both_validator = bv.Void() +SearchMatchType._tagmap = { + 'filename': SearchMatchType._filename_validator, + 'content': SearchMatchType._content_validator, + 'both': SearchMatchType._both_validator, +} + +SearchMatchType.filename = SearchMatchType('filename') +SearchMatchType.content = SearchMatchType('content') +SearchMatchType.both = SearchMatchType('both') + +SearchMode._filename_validator = bv.Void() +SearchMode._filename_and_content_validator = bv.Void() +SearchMode._deleted_filename_validator = bv.Void() +SearchMode._tagmap = { + 'filename': SearchMode._filename_validator, + 'filename_and_content': SearchMode._filename_and_content_validator, + 'deleted_filename': SearchMode._deleted_filename_validator, +} + +SearchMode.filename = SearchMode('filename') +SearchMode.filename_and_content = SearchMode('filename_and_content') +SearchMode.deleted_filename = SearchMode('deleted_filename') + +SearchResult._matches_validator = bv.List(SearchMatch_validator) +SearchResult._more_validator = bv.Boolean() +SearchResult._start_validator = bv.UInt64() +SearchResult._all_field_names_ = set([ + 'matches', + 'more', + 'start', +]) +SearchResult._all_fields_ = [ + ('matches', SearchResult._matches_validator), + ('more', SearchResult._more_validator), + ('start', SearchResult._start_validator), +] + +SharedLink._url_validator = SharedLinkUrl_validator +SharedLink._password_validator = bv.Nullable(bv.String()) +SharedLink._all_field_names_ = set([ + 'url', + 'password', +]) +SharedLink._all_fields_ = [ + ('url', SharedLink._url_validator), + ('password', SharedLink._password_validator), +] + +SymlinkInfo._target_validator = bv.String() +SymlinkInfo._all_field_names_ = set(['target']) +SymlinkInfo._all_fields_ = [('target', SymlinkInfo._target_validator)] + +SyncSetting._default_validator = bv.Void() +SyncSetting._not_synced_validator = bv.Void() +SyncSetting._not_synced_inactive_validator = bv.Void() +SyncSetting._other_validator = bv.Void() +SyncSetting._tagmap = { + 'default': SyncSetting._default_validator, + 'not_synced': SyncSetting._not_synced_validator, + 'not_synced_inactive': SyncSetting._not_synced_inactive_validator, + 'other': SyncSetting._other_validator, +} + +SyncSetting.default = SyncSetting('default') +SyncSetting.not_synced = SyncSetting('not_synced') +SyncSetting.not_synced_inactive = SyncSetting('not_synced_inactive') +SyncSetting.other = SyncSetting('other') + +SyncSettingArg._default_validator = bv.Void() +SyncSettingArg._not_synced_validator = bv.Void() +SyncSettingArg._other_validator = bv.Void() +SyncSettingArg._tagmap = { + 'default': SyncSettingArg._default_validator, + 'not_synced': SyncSettingArg._not_synced_validator, + 'other': SyncSettingArg._other_validator, +} + +SyncSettingArg.default = SyncSettingArg('default') +SyncSettingArg.not_synced = SyncSettingArg('not_synced') +SyncSettingArg.other = SyncSettingArg('other') + +SyncSettingsError._path_validator = LookupError_validator +SyncSettingsError._unsupported_combination_validator = bv.Void() +SyncSettingsError._unsupported_configuration_validator = bv.Void() +SyncSettingsError._other_validator = bv.Void() +SyncSettingsError._tagmap = { + 'path': SyncSettingsError._path_validator, + 'unsupported_combination': SyncSettingsError._unsupported_combination_validator, + 'unsupported_configuration': SyncSettingsError._unsupported_configuration_validator, + 'other': SyncSettingsError._other_validator, +} + +SyncSettingsError.unsupported_combination = SyncSettingsError('unsupported_combination') +SyncSettingsError.unsupported_configuration = SyncSettingsError('unsupported_configuration') +SyncSettingsError.other = SyncSettingsError('other') + +ThumbnailArg._path_validator = ReadPath_validator +ThumbnailArg._format_validator = ThumbnailFormat_validator +ThumbnailArg._size_validator = ThumbnailSize_validator +ThumbnailArg._mode_validator = ThumbnailMode_validator +ThumbnailArg._all_field_names_ = set([ + 'path', + 'format', + 'size', + 'mode', +]) +ThumbnailArg._all_fields_ = [ + ('path', ThumbnailArg._path_validator), + ('format', ThumbnailArg._format_validator), + ('size', ThumbnailArg._size_validator), + ('mode', ThumbnailArg._mode_validator), +] + +ThumbnailError._path_validator = LookupError_validator +ThumbnailError._unsupported_extension_validator = bv.Void() +ThumbnailError._unsupported_image_validator = bv.Void() +ThumbnailError._conversion_error_validator = bv.Void() +ThumbnailError._tagmap = { + 'path': ThumbnailError._path_validator, + 'unsupported_extension': ThumbnailError._unsupported_extension_validator, + 'unsupported_image': ThumbnailError._unsupported_image_validator, + 'conversion_error': ThumbnailError._conversion_error_validator, +} + +ThumbnailError.unsupported_extension = ThumbnailError('unsupported_extension') +ThumbnailError.unsupported_image = ThumbnailError('unsupported_image') +ThumbnailError.conversion_error = ThumbnailError('conversion_error') + +ThumbnailFormat._jpeg_validator = bv.Void() +ThumbnailFormat._png_validator = bv.Void() +ThumbnailFormat._tagmap = { + 'jpeg': ThumbnailFormat._jpeg_validator, + 'png': ThumbnailFormat._png_validator, +} + +ThumbnailFormat.jpeg = ThumbnailFormat('jpeg') +ThumbnailFormat.png = ThumbnailFormat('png') + +ThumbnailMode._strict_validator = bv.Void() +ThumbnailMode._bestfit_validator = bv.Void() +ThumbnailMode._fitone_bestfit_validator = bv.Void() +ThumbnailMode._tagmap = { + 'strict': ThumbnailMode._strict_validator, + 'bestfit': ThumbnailMode._bestfit_validator, + 'fitone_bestfit': ThumbnailMode._fitone_bestfit_validator, +} + +ThumbnailMode.strict = ThumbnailMode('strict') +ThumbnailMode.bestfit = ThumbnailMode('bestfit') +ThumbnailMode.fitone_bestfit = ThumbnailMode('fitone_bestfit') + +ThumbnailSize._w32h32_validator = bv.Void() +ThumbnailSize._w64h64_validator = bv.Void() +ThumbnailSize._w128h128_validator = bv.Void() +ThumbnailSize._w256h256_validator = bv.Void() +ThumbnailSize._w480h320_validator = bv.Void() +ThumbnailSize._w640h480_validator = bv.Void() +ThumbnailSize._w960h640_validator = bv.Void() +ThumbnailSize._w1024h768_validator = bv.Void() +ThumbnailSize._w2048h1536_validator = bv.Void() +ThumbnailSize._tagmap = { + 'w32h32': ThumbnailSize._w32h32_validator, + 'w64h64': ThumbnailSize._w64h64_validator, + 'w128h128': ThumbnailSize._w128h128_validator, + 'w256h256': ThumbnailSize._w256h256_validator, + 'w480h320': ThumbnailSize._w480h320_validator, + 'w640h480': ThumbnailSize._w640h480_validator, + 'w960h640': ThumbnailSize._w960h640_validator, + 'w1024h768': ThumbnailSize._w1024h768_validator, + 'w2048h1536': ThumbnailSize._w2048h1536_validator, +} + +ThumbnailSize.w32h32 = ThumbnailSize('w32h32') +ThumbnailSize.w64h64 = ThumbnailSize('w64h64') +ThumbnailSize.w128h128 = ThumbnailSize('w128h128') +ThumbnailSize.w256h256 = ThumbnailSize('w256h256') +ThumbnailSize.w480h320 = ThumbnailSize('w480h320') +ThumbnailSize.w640h480 = ThumbnailSize('w640h480') +ThumbnailSize.w960h640 = ThumbnailSize('w960h640') +ThumbnailSize.w1024h768 = ThumbnailSize('w1024h768') +ThumbnailSize.w2048h1536 = ThumbnailSize('w2048h1536') + +UploadError._path_validator = UploadWriteFailed_validator +UploadError._properties_error_validator = file_properties.InvalidPropertyGroupError_validator +UploadError._other_validator = bv.Void() +UploadError._tagmap = { + 'path': UploadError._path_validator, + 'properties_error': UploadError._properties_error_validator, + 'other': UploadError._other_validator, +} + +UploadError.other = UploadError('other') + +UploadErrorWithProperties._tagmap = { +} +UploadErrorWithProperties._tagmap.update(UploadError._tagmap) + +UploadSessionAppendArg._cursor_validator = UploadSessionCursor_validator +UploadSessionAppendArg._close_validator = bv.Boolean() +UploadSessionAppendArg._all_field_names_ = set([ + 'cursor', + 'close', +]) +UploadSessionAppendArg._all_fields_ = [ + ('cursor', UploadSessionAppendArg._cursor_validator), + ('close', UploadSessionAppendArg._close_validator), +] + +UploadSessionCursor._session_id_validator = bv.String() +UploadSessionCursor._offset_validator = bv.UInt64() +UploadSessionCursor._all_field_names_ = set([ + 'session_id', + 'offset', +]) +UploadSessionCursor._all_fields_ = [ + ('session_id', UploadSessionCursor._session_id_validator), + ('offset', UploadSessionCursor._offset_validator), +] + +UploadSessionFinishArg._cursor_validator = UploadSessionCursor_validator +UploadSessionFinishArg._commit_validator = CommitInfo_validator +UploadSessionFinishArg._all_field_names_ = set([ + 'cursor', + 'commit', +]) +UploadSessionFinishArg._all_fields_ = [ + ('cursor', UploadSessionFinishArg._cursor_validator), + ('commit', UploadSessionFinishArg._commit_validator), +] + +UploadSessionFinishBatchArg._entries_validator = bv.List(UploadSessionFinishArg_validator, max_items=1000) +UploadSessionFinishBatchArg._all_field_names_ = set(['entries']) +UploadSessionFinishBatchArg._all_fields_ = [('entries', UploadSessionFinishBatchArg._entries_validator)] + +UploadSessionFinishBatchJobStatus._complete_validator = UploadSessionFinishBatchResult_validator +UploadSessionFinishBatchJobStatus._tagmap = { + 'complete': UploadSessionFinishBatchJobStatus._complete_validator, +} +UploadSessionFinishBatchJobStatus._tagmap.update(async_.PollResultBase._tagmap) + +UploadSessionFinishBatchLaunch._complete_validator = UploadSessionFinishBatchResult_validator +UploadSessionFinishBatchLaunch._other_validator = bv.Void() +UploadSessionFinishBatchLaunch._tagmap = { + 'complete': UploadSessionFinishBatchLaunch._complete_validator, + 'other': UploadSessionFinishBatchLaunch._other_validator, +} +UploadSessionFinishBatchLaunch._tagmap.update(async_.LaunchResultBase._tagmap) + +UploadSessionFinishBatchLaunch.other = UploadSessionFinishBatchLaunch('other') + +UploadSessionFinishBatchResult._entries_validator = bv.List(UploadSessionFinishBatchResultEntry_validator) +UploadSessionFinishBatchResult._all_field_names_ = set(['entries']) +UploadSessionFinishBatchResult._all_fields_ = [('entries', UploadSessionFinishBatchResult._entries_validator)] + +UploadSessionFinishBatchResultEntry._success_validator = FileMetadata_validator +UploadSessionFinishBatchResultEntry._failure_validator = UploadSessionFinishError_validator +UploadSessionFinishBatchResultEntry._tagmap = { + 'success': UploadSessionFinishBatchResultEntry._success_validator, + 'failure': UploadSessionFinishBatchResultEntry._failure_validator, +} + +UploadSessionFinishError._lookup_failed_validator = UploadSessionLookupError_validator +UploadSessionFinishError._path_validator = WriteError_validator +UploadSessionFinishError._properties_error_validator = file_properties.InvalidPropertyGroupError_validator +UploadSessionFinishError._too_many_shared_folder_targets_validator = bv.Void() +UploadSessionFinishError._too_many_write_operations_validator = bv.Void() +UploadSessionFinishError._other_validator = bv.Void() +UploadSessionFinishError._tagmap = { + 'lookup_failed': UploadSessionFinishError._lookup_failed_validator, + 'path': UploadSessionFinishError._path_validator, + 'properties_error': UploadSessionFinishError._properties_error_validator, + 'too_many_shared_folder_targets': UploadSessionFinishError._too_many_shared_folder_targets_validator, + 'too_many_write_operations': UploadSessionFinishError._too_many_write_operations_validator, + 'other': UploadSessionFinishError._other_validator, +} + +UploadSessionFinishError.too_many_shared_folder_targets = UploadSessionFinishError('too_many_shared_folder_targets') +UploadSessionFinishError.too_many_write_operations = UploadSessionFinishError('too_many_write_operations') +UploadSessionFinishError.other = UploadSessionFinishError('other') + +UploadSessionLookupError._not_found_validator = bv.Void() +UploadSessionLookupError._incorrect_offset_validator = UploadSessionOffsetError_validator +UploadSessionLookupError._closed_validator = bv.Void() +UploadSessionLookupError._not_closed_validator = bv.Void() +UploadSessionLookupError._too_large_validator = bv.Void() +UploadSessionLookupError._other_validator = bv.Void() +UploadSessionLookupError._tagmap = { + 'not_found': UploadSessionLookupError._not_found_validator, + 'incorrect_offset': UploadSessionLookupError._incorrect_offset_validator, + 'closed': UploadSessionLookupError._closed_validator, + 'not_closed': UploadSessionLookupError._not_closed_validator, + 'too_large': UploadSessionLookupError._too_large_validator, + 'other': UploadSessionLookupError._other_validator, +} + +UploadSessionLookupError.not_found = UploadSessionLookupError('not_found') +UploadSessionLookupError.closed = UploadSessionLookupError('closed') +UploadSessionLookupError.not_closed = UploadSessionLookupError('not_closed') +UploadSessionLookupError.too_large = UploadSessionLookupError('too_large') +UploadSessionLookupError.other = UploadSessionLookupError('other') + +UploadSessionOffsetError._correct_offset_validator = bv.UInt64() +UploadSessionOffsetError._all_field_names_ = set(['correct_offset']) +UploadSessionOffsetError._all_fields_ = [('correct_offset', UploadSessionOffsetError._correct_offset_validator)] + +UploadSessionStartArg._close_validator = bv.Boolean() +UploadSessionStartArg._all_field_names_ = set(['close']) +UploadSessionStartArg._all_fields_ = [('close', UploadSessionStartArg._close_validator)] + +UploadSessionStartResult._session_id_validator = bv.String() +UploadSessionStartResult._all_field_names_ = set(['session_id']) +UploadSessionStartResult._all_fields_ = [('session_id', UploadSessionStartResult._session_id_validator)] + +UploadWriteFailed._reason_validator = WriteError_validator +UploadWriteFailed._upload_session_id_validator = bv.String() +UploadWriteFailed._all_field_names_ = set([ + 'reason', + 'upload_session_id', +]) +UploadWriteFailed._all_fields_ = [ + ('reason', UploadWriteFailed._reason_validator), + ('upload_session_id', UploadWriteFailed._upload_session_id_validator), +] + +VideoMetadata._duration_validator = bv.Nullable(bv.UInt64()) +VideoMetadata._field_names_ = set(['duration']) +VideoMetadata._all_field_names_ = MediaMetadata._all_field_names_.union(VideoMetadata._field_names_) +VideoMetadata._fields_ = [('duration', VideoMetadata._duration_validator)] +VideoMetadata._all_fields_ = MediaMetadata._all_fields_ + VideoMetadata._fields_ + +WriteConflictError._file_validator = bv.Void() +WriteConflictError._folder_validator = bv.Void() +WriteConflictError._file_ancestor_validator = bv.Void() +WriteConflictError._other_validator = bv.Void() +WriteConflictError._tagmap = { + 'file': WriteConflictError._file_validator, + 'folder': WriteConflictError._folder_validator, + 'file_ancestor': WriteConflictError._file_ancestor_validator, + 'other': WriteConflictError._other_validator, +} + +WriteConflictError.file = WriteConflictError('file') +WriteConflictError.folder = WriteConflictError('folder') +WriteConflictError.file_ancestor = WriteConflictError('file_ancestor') +WriteConflictError.other = WriteConflictError('other') + +WriteError._malformed_path_validator = MalformedPathError_validator +WriteError._conflict_validator = WriteConflictError_validator +WriteError._no_write_permission_validator = bv.Void() +WriteError._insufficient_space_validator = bv.Void() +WriteError._disallowed_name_validator = bv.Void() +WriteError._team_folder_validator = bv.Void() +WriteError._too_many_write_operations_validator = bv.Void() +WriteError._other_validator = bv.Void() +WriteError._tagmap = { + 'malformed_path': WriteError._malformed_path_validator, + 'conflict': WriteError._conflict_validator, + 'no_write_permission': WriteError._no_write_permission_validator, + 'insufficient_space': WriteError._insufficient_space_validator, + 'disallowed_name': WriteError._disallowed_name_validator, + 'team_folder': WriteError._team_folder_validator, + 'too_many_write_operations': WriteError._too_many_write_operations_validator, + 'other': WriteError._other_validator, +} + +WriteError.no_write_permission = WriteError('no_write_permission') +WriteError.insufficient_space = WriteError('insufficient_space') +WriteError.disallowed_name = WriteError('disallowed_name') +WriteError.team_folder = WriteError('team_folder') +WriteError.too_many_write_operations = WriteError('too_many_write_operations') +WriteError.other = WriteError('other') + +WriteMode._add_validator = bv.Void() +WriteMode._overwrite_validator = bv.Void() +WriteMode._update_validator = Rev_validator +WriteMode._tagmap = { + 'add': WriteMode._add_validator, + 'overwrite': WriteMode._overwrite_validator, + 'update': WriteMode._update_validator, +} + +WriteMode.add = WriteMode('add') +WriteMode.overwrite = WriteMode('overwrite') + +alpha_get_metadata = bb.Route( + 'alpha/get_metadata', + 1, + True, + AlphaGetMetadataArg_validator, + Metadata_validator, + AlphaGetMetadataError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +alpha_upload = bb.Route( + 'alpha/upload', + 1, + True, + CommitInfoWithProperties_validator, + FileMetadata_validator, + UploadErrorWithProperties_validator, + {'host': u'content', + 'style': u'upload'}, +) +copy_v2 = bb.Route( + 'copy', + 2, + False, + RelocationArg_validator, + RelocationResult_validator, + RelocationError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +copy = bb.Route( + 'copy', + 1, + True, + RelocationArg_validator, + Metadata_validator, + RelocationError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +copy_batch_v2 = bb.Route( + 'copy_batch', + 2, + False, + CopyBatchArg_validator, + RelocationBatchV2Launch_validator, + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) +copy_batch = bb.Route( + 'copy_batch', + 1, + True, + RelocationBatchArg_validator, + RelocationBatchLaunch_validator, + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) +copy_batch_check_v2 = bb.Route( + 'copy_batch/check', + 2, + False, + async_.PollArg_validator, + RelocationBatchV2JobStatus_validator, + async_.PollError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +copy_batch_check = bb.Route( + 'copy_batch/check', + 1, + True, + async_.PollArg_validator, + RelocationBatchJobStatus_validator, + async_.PollError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +copy_reference_get = bb.Route( + 'copy_reference/get', + 1, + False, + GetCopyReferenceArg_validator, + GetCopyReferenceResult_validator, + GetCopyReferenceError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +copy_reference_save = bb.Route( + 'copy_reference/save', + 1, + False, + SaveCopyReferenceArg_validator, + SaveCopyReferenceResult_validator, + SaveCopyReferenceError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +create_folder_v2 = bb.Route( + 'create_folder', + 2, + False, + CreateFolderArg_validator, + CreateFolderResult_validator, + CreateFolderError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +create_folder = bb.Route( + 'create_folder', + 1, + True, + CreateFolderArg_validator, + FolderMetadata_validator, + CreateFolderError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +create_folder_batch = bb.Route( + 'create_folder_batch', + 1, + False, + CreateFolderBatchArg_validator, + CreateFolderBatchLaunch_validator, + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) +create_folder_batch_check = bb.Route( + 'create_folder_batch/check', + 1, + False, + async_.PollArg_validator, + CreateFolderBatchJobStatus_validator, + async_.PollError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +delete_v2 = bb.Route( + 'delete', + 2, + False, + DeleteArg_validator, + DeleteResult_validator, + DeleteError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +delete = bb.Route( + 'delete', + 1, + True, + DeleteArg_validator, + Metadata_validator, + DeleteError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +delete_batch = bb.Route( + 'delete_batch', + 1, + False, + DeleteBatchArg_validator, + DeleteBatchLaunch_validator, + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) +delete_batch_check = bb.Route( + 'delete_batch/check', + 1, + False, + async_.PollArg_validator, + DeleteBatchJobStatus_validator, + async_.PollError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +download = bb.Route( + 'download', + 1, + False, + DownloadArg_validator, + FileMetadata_validator, + DownloadError_validator, + {'host': u'content', + 'style': u'download'}, +) +download_zip = bb.Route( + 'download_zip', + 1, + False, + DownloadZipArg_validator, + DownloadZipResult_validator, + DownloadZipError_validator, + {'host': u'content', + 'style': u'download'}, +) +get_metadata = bb.Route( + 'get_metadata', + 1, + False, + GetMetadataArg_validator, + Metadata_validator, + GetMetadataError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +get_preview = bb.Route( + 'get_preview', + 1, + False, + PreviewArg_validator, + FileMetadata_validator, + PreviewError_validator, + {'host': u'content', + 'style': u'download'}, +) +get_temporary_link = bb.Route( + 'get_temporary_link', + 1, + False, + GetTemporaryLinkArg_validator, + GetTemporaryLinkResult_validator, + GetTemporaryLinkError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +get_temporary_upload_link = bb.Route( + 'get_temporary_upload_link', + 1, + False, + GetTemporaryUploadLinkArg_validator, + GetTemporaryUploadLinkResult_validator, + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) +get_thumbnail = bb.Route( + 'get_thumbnail', + 1, + False, + ThumbnailArg_validator, + FileMetadata_validator, + ThumbnailError_validator, + {'host': u'content', + 'style': u'download'}, +) +get_thumbnail_batch = bb.Route( + 'get_thumbnail_batch', + 1, + False, + GetThumbnailBatchArg_validator, + GetThumbnailBatchResult_validator, + GetThumbnailBatchError_validator, + {'host': u'content', + 'style': u'rpc'}, +) +list_folder = bb.Route( + 'list_folder', + 1, + False, + ListFolderArg_validator, + ListFolderResult_validator, + ListFolderError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +list_folder_continue = bb.Route( + 'list_folder/continue', + 1, + False, + ListFolderContinueArg_validator, + ListFolderResult_validator, + ListFolderContinueError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +list_folder_get_latest_cursor = bb.Route( + 'list_folder/get_latest_cursor', + 1, + False, + ListFolderArg_validator, + ListFolderGetLatestCursorResult_validator, + ListFolderError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +list_folder_longpoll = bb.Route( + 'list_folder/longpoll', + 1, + False, + ListFolderLongpollArg_validator, + ListFolderLongpollResult_validator, + ListFolderLongpollError_validator, + {'host': u'notify', + 'style': u'rpc'}, +) +list_revisions = bb.Route( + 'list_revisions', + 1, + False, + ListRevisionsArg_validator, + ListRevisionsResult_validator, + ListRevisionsError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +move_v2 = bb.Route( + 'move', + 2, + False, + RelocationArg_validator, + RelocationResult_validator, + RelocationError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +move = bb.Route( + 'move', + 1, + True, + RelocationArg_validator, + Metadata_validator, + RelocationError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +move_batch_v2 = bb.Route( + 'move_batch', + 2, + False, + MoveBatchArg_validator, + RelocationBatchV2Launch_validator, + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) +move_batch = bb.Route( + 'move_batch', + 1, + False, + RelocationBatchArg_validator, + RelocationBatchLaunch_validator, + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) +move_batch_check_v2 = bb.Route( + 'move_batch/check', + 2, + False, + async_.PollArg_validator, + RelocationBatchV2JobStatus_validator, + async_.PollError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +move_batch_check = bb.Route( + 'move_batch/check', + 1, + False, + async_.PollArg_validator, + RelocationBatchJobStatus_validator, + async_.PollError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +permanently_delete = bb.Route( + 'permanently_delete', + 1, + False, + DeleteArg_validator, + bv.Void(), + DeleteError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +properties_add = bb.Route( + 'properties/add', + 1, + True, + file_properties.AddPropertiesArg_validator, + bv.Void(), + file_properties.AddPropertiesError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +properties_overwrite = bb.Route( + 'properties/overwrite', + 1, + True, + file_properties.OverwritePropertyGroupArg_validator, + bv.Void(), + file_properties.InvalidPropertyGroupError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +properties_remove = bb.Route( + 'properties/remove', + 1, + True, + file_properties.RemovePropertiesArg_validator, + bv.Void(), + file_properties.RemovePropertiesError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +properties_template_get = bb.Route( + 'properties/template/get', + 1, + True, + file_properties.GetTemplateArg_validator, + file_properties.GetTemplateResult_validator, + file_properties.TemplateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +properties_template_list = bb.Route( + 'properties/template/list', + 1, + True, + bv.Void(), + file_properties.ListTemplateResult_validator, + file_properties.TemplateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +properties_update = bb.Route( + 'properties/update', + 1, + True, + file_properties.UpdatePropertiesArg_validator, + bv.Void(), + file_properties.UpdatePropertiesError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +restore = bb.Route( + 'restore', + 1, + False, + RestoreArg_validator, + FileMetadata_validator, + RestoreError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +save_url = bb.Route( + 'save_url', + 1, + False, + SaveUrlArg_validator, + SaveUrlResult_validator, + SaveUrlError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +save_url_check_job_status = bb.Route( + 'save_url/check_job_status', + 1, + False, + async_.PollArg_validator, + SaveUrlJobStatus_validator, + async_.PollError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +search = bb.Route( + 'search', + 1, + False, + SearchArg_validator, + SearchResult_validator, + SearchError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +upload = bb.Route( + 'upload', + 1, + False, + CommitInfo_validator, + FileMetadata_validator, + UploadError_validator, + {'host': u'content', + 'style': u'upload'}, +) +upload_session_append_v2 = bb.Route( + 'upload_session/append', + 2, + False, + UploadSessionAppendArg_validator, + bv.Void(), + UploadSessionLookupError_validator, + {'host': u'content', + 'style': u'upload'}, +) +upload_session_append = bb.Route( + 'upload_session/append', + 1, + True, + UploadSessionCursor_validator, + bv.Void(), + UploadSessionLookupError_validator, + {'host': u'content', + 'style': u'upload'}, +) +upload_session_finish = bb.Route( + 'upload_session/finish', + 1, + False, + UploadSessionFinishArg_validator, + FileMetadata_validator, + UploadSessionFinishError_validator, + {'host': u'content', + 'style': u'upload'}, +) +upload_session_finish_batch = bb.Route( + 'upload_session/finish_batch', + 1, + False, + UploadSessionFinishBatchArg_validator, + UploadSessionFinishBatchLaunch_validator, + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) +upload_session_finish_batch_check = bb.Route( + 'upload_session/finish_batch/check', + 1, + False, + async_.PollArg_validator, + UploadSessionFinishBatchJobStatus_validator, + async_.PollError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +upload_session_start = bb.Route( + 'upload_session/start', + 1, + False, + UploadSessionStartArg_validator, + UploadSessionStartResult_validator, + bv.Void(), + {'host': u'content', + 'style': u'upload'}, +) + +ROUTES = { + 'alpha/get_metadata': alpha_get_metadata, + 'alpha/upload': alpha_upload, + 'copy:2': copy_v2, + 'copy': copy, + 'copy_batch:2': copy_batch_v2, + 'copy_batch': copy_batch, + 'copy_batch/check:2': copy_batch_check_v2, + 'copy_batch/check': copy_batch_check, + 'copy_reference/get': copy_reference_get, + 'copy_reference/save': copy_reference_save, + 'create_folder:2': create_folder_v2, + 'create_folder': create_folder, + 'create_folder_batch': create_folder_batch, + 'create_folder_batch/check': create_folder_batch_check, + 'delete:2': delete_v2, + 'delete': delete, + 'delete_batch': delete_batch, + 'delete_batch/check': delete_batch_check, + 'download': download, + 'download_zip': download_zip, + 'get_metadata': get_metadata, + 'get_preview': get_preview, + 'get_temporary_link': get_temporary_link, + 'get_temporary_upload_link': get_temporary_upload_link, + 'get_thumbnail': get_thumbnail, + 'get_thumbnail_batch': get_thumbnail_batch, + 'list_folder': list_folder, + 'list_folder/continue': list_folder_continue, + 'list_folder/get_latest_cursor': list_folder_get_latest_cursor, + 'list_folder/longpoll': list_folder_longpoll, + 'list_revisions': list_revisions, + 'move:2': move_v2, + 'move': move, + 'move_batch:2': move_batch_v2, + 'move_batch': move_batch, + 'move_batch/check:2': move_batch_check_v2, + 'move_batch/check': move_batch_check, + 'permanently_delete': permanently_delete, + 'properties/add': properties_add, + 'properties/overwrite': properties_overwrite, + 'properties/remove': properties_remove, + 'properties/template/get': properties_template_get, + 'properties/template/list': properties_template_list, + 'properties/update': properties_update, + 'restore': restore, + 'save_url': save_url, + 'save_url/check_job_status': save_url_check_job_status, + 'search': search, + 'upload': upload, + 'upload_session/append:2': upload_session_append_v2, + 'upload_session/append': upload_session_append, + 'upload_session/finish': upload_session_finish, + 'upload_session/finish_batch': upload_session_finish_batch, + 'upload_session/finish_batch/check': upload_session_finish_batch_check, + 'upload_session/start': upload_session_start, +} + diff --git a/dropbox-script/dropbox/oauth.py b/dropbox-script/dropbox/oauth.py new file mode 100644 index 0000000..c51f870 --- /dev/null +++ b/dropbox-script/dropbox/oauth.py @@ -0,0 +1,515 @@ +__all__ = [ + 'BadRequestException', + 'BadStateException', + 'CsrfException', + 'DropboxOAuth2Flow', + 'DropboxOAuth2FlowNoRedirect', + 'NotApprovedException', + 'OAuth2FlowNoRedirectResult', + 'OAuth2FlowResult', + 'ProviderException', +] + +import base64 +import os +import six +import urllib + +from .session import ( + API_HOST, + WEB_HOST, + pinned_session, +) + +if six.PY3: + url_path_quote = urllib.parse.quote # pylint: disable=no-member,useless-suppression + url_encode = urllib.parse.urlencode # pylint: disable=no-member,useless-suppression +else: + url_path_quote = urllib.quote # pylint: disable=no-member,useless-suppression + url_encode = urllib.urlencode # pylint: disable=no-member,useless-suppression + + +class OAuth2FlowNoRedirectResult(object): + """ + Authorization information for an OAuth2Flow performed with no redirect. + """ + + def __init__(self, access_token, account_id, user_id): + """ + Args: + access_token (str): Token to be used to authenticate later + requests. + account_id (str): The Dropbox user's account ID. + user_id (str): Deprecated (use account_id instead). + """ + self.access_token = access_token + self.account_id = account_id + self.user_id = user_id + + def __repr__(self): + return 'OAuth2FlowNoRedirectResult(%r, %r, %r)' % ( + self.access_token, + self.account_id, + self.user_id, + ) + + +class OAuth2FlowResult(OAuth2FlowNoRedirectResult): + """ + Authorization information for an OAuth2Flow with redirect. + """ + + def __init__(self, access_token, account_id, user_id, url_state): + """ + Same as OAuth2FlowNoRedirectResult but with url_state. + + Args: + url_state (str): The url state that was set by + :meth:`DropboxOAuth2Flow.start`. + """ + super(OAuth2FlowResult, self).__init__( + access_token, account_id, user_id) + self.url_state = url_state + + @classmethod + def from_no_redirect_result(cls, result, url_state): + assert isinstance(result, OAuth2FlowNoRedirectResult) + return cls( + result.access_token, result.account_id, result.user_id, url_state) + + def __repr__(self): + return 'OAuth2FlowResult(%r, %r, %r, %r)' % ( + self.access_token, + self.account_id, + self.user_id, + self.url_state, + ) + + +class DropboxOAuth2FlowBase(object): + + def __init__(self, consumer_key, consumer_secret, locale=None): + self.consumer_key = consumer_key + self.consumer_secret = consumer_secret + self.locale = locale + self.requests_session = pinned_session() + + def _get_authorize_url(self, redirect_uri, state): + params = dict(response_type='code', + client_id=self.consumer_key) + if redirect_uri is not None: + params['redirect_uri'] = redirect_uri + if state is not None: + params['state'] = state + + return self.build_url('/oauth2/authorize', params, WEB_HOST) + + def _finish(self, code, redirect_uri): + url = self.build_url('/oauth2/token') + params = {'grant_type': 'authorization_code', + 'code': code, + 'client_id': self.consumer_key, + 'client_secret': self.consumer_secret, + } + if self.locale is not None: + params['locale'] = self.locale + if redirect_uri is not None: + params['redirect_uri'] = redirect_uri + + resp = self.requests_session.post(url, data=params) + resp.raise_for_status() + + d = resp.json() + + if 'team_id' in d: + account_id = d['team_id'] + else: + account_id = d['account_id'] + + access_token = d['access_token'] + uid = d['uid'] + + return OAuth2FlowNoRedirectResult( + access_token, + account_id, + uid) + + def build_path(self, target, params=None): + """Build the path component for an API URL. + + This method urlencodes the parameters, adds them + to the end of the target url, and puts a marker for the API + version in front. + + :param str target: A target url (e.g. '/files') to build upon. + :param dict params: Optional dictionary of parameters (name to value). + :return: The path and parameters components of an API URL. + :rtype: str + """ + if six.PY2 and isinstance(target, six.text_type): + target = target.encode('utf8') + + target_path = url_path_quote(target) + + params = params or {} + params = params.copy() + + if self.locale: + params['locale'] = self.locale + + if params: + query_string = _params_to_urlencoded(params) + return "%s?%s" % (target_path, query_string) + else: + return target_path + + def build_url(self, target, params=None, host=API_HOST): + """Build an API URL. + + This method adds scheme and hostname to the path + returned from build_path. + + :param str target: A target url (e.g. '/files') to build upon. + :param dict params: Optional dictionary of parameters (name to value). + :return: The full API URL. + :rtype: str + """ + return "https://%s%s" % (host, self.build_path(target, params)) + + +class DropboxOAuth2FlowNoRedirect(DropboxOAuth2FlowBase): + """ + OAuth 2 authorization helper for apps that can't provide a redirect URI + (such as the command-line example apps). + + Example:: + + from dropbox import DropboxOAuth2FlowNoRedirect + + auth_flow = DropboxOAuth2FlowNoRedirect(APP_KEY, APP_SECRET) + + authorize_url = auth_flow.start() + print "1. Go to: " + authorize_url + print "2. Click \\"Allow\\" (you might have to log in first)." + print "3. Copy the authorization code." + auth_code = raw_input("Enter the authorization code here: ").strip() + + try: + oauth_result = auth_flow.finish(auth_code) + except Exception, e: + print('Error: %s' % (e,)) + return + + dbx = Dropbox(oauth_result.access_token) + """ + + def __init__(self, consumer_key, consumer_secret, locale=None): # noqa: E501; pylint: disable=useless-super-delegation + """ + Construct an instance. + + Parameters + :param str consumer_key: Your API app's "app key". + :param str consumer_secret: Your API app's "app secret". + :param str locale: The locale of the user of your application. For + example "en" or "en_US". Some API calls return localized data and + error messages; this setting tells the server which locale to use. + By default, the server uses "en_US". + """ + # pylint: disable=useless-super-delegation + super(DropboxOAuth2FlowNoRedirect, self).__init__( + consumer_key, + consumer_secret, + locale, + ) + + def start(self): + """ + Starts the OAuth 2 authorization process. + + :return: The URL for a page on Dropbox's website. This page will let + the user "approve" your app, which gives your app permission to + access the user's Dropbox account. Tell the user to visit this URL + and approve your app. + """ + return self._get_authorize_url(None, None) + + def finish(self, code): + """ + If the user approves your app, they will be presented with an + "authorization code". Have the user copy/paste that authorization code + into your app and then call this method to get an access token. + + :param str code: The authorization code shown to the user when they + approved your app. + :rtype: OAuth2FlowNoRedirectResult + :raises: The same exceptions as :meth:`DropboxOAuth2Flow.finish()`. + """ + return self._finish(code, None) + + +class DropboxOAuth2Flow(DropboxOAuth2FlowBase): + """ + OAuth 2 authorization helper. Use this for web apps. + + OAuth 2 has a two-step authorization process. The first step is having the + user authorize your app. The second involves getting an OAuth 2 access + token from Dropbox. + + Example:: + + from dropbox import DropboxOAuth2Flow + + def get_dropbox_auth_flow(web_app_session): + redirect_uri = "https://my-web-server.org/dropbox-auth-finish" + return DropboxOAuth2Flow( + APP_KEY, APP_SECRET, redirect_uri, web_app_session, + "dropbox-auth-csrf-token") + + # URL handler for /dropbox-auth-start + def dropbox_auth_start(web_app_session, request): + authorize_url = get_dropbox_auth_flow(web_app_session).start() + redirect_to(authorize_url) + + # URL handler for /dropbox-auth-finish + def dropbox_auth_finish(web_app_session, request): + try: + oauth_result = \\ + get_dropbox_auth_flow(web_app_session).finish( + request.query_params) + except BadRequestException, e: + http_status(400) + except BadStateException, e: + # Start the auth flow again. + redirect_to("/dropbox-auth-start") + except CsrfException, e: + http_status(403) + except NotApprovedException, e: + flash('Not approved? Why not?') + return redirect_to("/home") + except ProviderException, e: + logger.log("Auth error: %s" % (e,)) + http_status(403) + + """ + + def __init__(self, consumer_key, consumer_secret, redirect_uri, session, + csrf_token_session_key, locale=None): + """ + Construct an instance. + + :param str consumer_key: Your API app's "app key". + :param str consumer_secret: Your API app's "app secret". + :param str redirect_uri: The URI that the Dropbox server will redirect + the user to after the user finishes authorizing your app. This URI + must be HTTPS-based and pre-registered with the Dropbox servers, + though localhost URIs are allowed without pre-registration and can + be either HTTP or HTTPS. + :param dict session: A dict-like object that represents the current + user's web session (will be used to save the CSRF token). + :param str csrf_token_session_key: The key to use when storing the CSRF + token in the session (for example: "dropbox-auth-csrf-token"). + :param str locale: The locale of the user of your application. For + example "en" or "en_US". Some API calls return localized data and + error messages; this setting tells the server which locale to use. + By default, the server uses "en_US". + """ + super(DropboxOAuth2Flow, self).__init__(consumer_key, consumer_secret, locale) + self.redirect_uri = redirect_uri + self.session = session + self.csrf_token_session_key = csrf_token_session_key + + def start(self, url_state=None): + """ + Starts the OAuth 2 authorization process. + + This function builds an "authorization URL". You should redirect your + user's browser to this URL, which will give them an opportunity to + grant your app access to their Dropbox account. When the user + completes this process, they will be automatically redirected to the + ``redirect_uri`` you passed in to the constructor. + + This function will also save a CSRF token to + ``session[csrf_token_session_key]`` (as provided to the constructor). + This CSRF token will be checked on :meth:`finish()` to prevent request + forgery. + + :param str url_state: Any data that you would like to keep in the URL + through the authorization process. This exact value will be + returned to you by :meth:`finish()`. + :return: The URL for a page on Dropbox's website. This page will let + the user "approve" your app, which gives your app permission to + access the user's Dropbox account. Tell the user to visit this URL + and approve your app. + """ + csrf_token = base64.urlsafe_b64encode(os.urandom(16)).decode('ascii') + state = csrf_token + if url_state is not None: + state += "|" + url_state + self.session[self.csrf_token_session_key] = csrf_token + + return self._get_authorize_url(self.redirect_uri, state) + + def finish(self, query_params): + """ + Call this after the user has visited the authorize URL (see + :meth:`start()`), approved your app and was redirected to your redirect + URI. + + :param dict query_params: The query parameters on the GET request to + your redirect URI. + :rtype: OAuth2FlowResult + :raises: :class:`BadRequestException` If the redirect URL was missing + parameters or if the given parameters were not valid. + :raises: :class:`BadStateException` If there's no CSRF token in the + session. + :raises: :class:`CsrfException` If the ``state`` query parameter + doesn't contain the CSRF token from the user's session. + :raises: :class:`NotApprovedException` If the user chose not to + approve your app. + :raises: :class:`ProviderException` If Dropbox redirected to your + redirect URI with some unexpected error identifier and error message. + """ + # Check well-formedness of request. + + state = query_params.get('state') + if state is None: + raise BadRequestException("Missing query parameter 'state'.") + + error = query_params.get('error') + error_description = query_params.get('error_description') + code = query_params.get('code') + + if error is not None and code is not None: + raise BadRequestException( + "Query parameters 'code' and 'error' are both set; " + "only one must be set.") + if error is None and code is None: + raise BadRequestException( + "Neither query parameter 'code' or 'error' is set.") + + # Check CSRF token + + if self.csrf_token_session_key not in self.session: + raise BadStateException('Missing CSRF token in session.') + csrf_token_from_session = self.session[self.csrf_token_session_key] + if len(csrf_token_from_session) <= 20: + raise AssertionError('CSRF token unexpectedly short: %r' % + csrf_token_from_session) + + split_pos = state.find('|') + if split_pos < 0: + given_csrf_token = state + url_state = None + else: + given_csrf_token = state[0:split_pos] + url_state = state[split_pos + 1:] + + if not _safe_equals(csrf_token_from_session, given_csrf_token): + raise CsrfException('expected %r, got %r' % + (csrf_token_from_session, given_csrf_token)) + + del self.session[self.csrf_token_session_key] + + # Check for error identifier + + if error is not None: + if error == 'access_denied': + # The user clicked "Deny" + if error_description is None: + raise NotApprovedException( + 'No additional description from Dropbox') + else: + raise NotApprovedException( + 'Additional description from Dropbox: %s' % + error_description) + else: + # All other errors + full_message = error + if error_description is not None: + full_message += ": " + error_description + raise ProviderException(full_message) + + # If everything went ok, make the network call to get an access token. + + no_redirect_result = self._finish(code, self.redirect_uri) + return OAuth2FlowResult.from_no_redirect_result( + no_redirect_result, url_state) + + +class BadRequestException(Exception): + """ + Thrown if the redirect URL was missing parameters or if the + given parameters were not valid. + + The recommended action is to show an HTTP 400 error page. + """ + pass + + +class BadStateException(Exception): + """ + Thrown if all the parameters are correct, but there's no CSRF token in the + session. This probably means that the session expired. + + The recommended action is to redirect the user's browser to try the + approval process again. + """ + pass + + +class CsrfException(Exception): + """ + Thrown if the given 'state' parameter doesn't contain the CSRF token from + the user's session. This is blocked to prevent CSRF attacks. + + The recommended action is to respond with an HTTP 403 error page. + """ + pass + + +class NotApprovedException(Exception): + """ + The user chose not to approve your app. + """ + pass + + +class ProviderException(Exception): + """ + Dropbox redirected to your redirect URI with some unexpected error + identifier and error message. + + The recommended action is to log the error, tell the user something went + wrong, and let them try again. + """ + pass + + +def _safe_equals(a, b): + if len(a) != len(b): + return False + res = 0 + for ca, cb in zip(a, b): + res |= ord(ca) ^ ord(cb) + return res == 0 + + +def _params_to_urlencoded(params): + """ + Returns a application/x-www-form-urlencoded ``str`` representing the + key/value pairs in ``params``. + + Keys are values are ``str()``'d before calling ``urllib.urlencode``, with + the exception of unicode objects which are utf8-encoded. + """ + def encode(o): + if isinstance(o, six.binary_type): + return o + else: + if isinstance(o, six.text_type): + return o.encode('utf-8') + else: + return str(o).encode('utf-8') + + utf8_params = {encode(k): encode(v) for k, v in six.iteritems(params)} + return url_encode(utf8_params) diff --git a/dropbox-script/dropbox/paper.py b/dropbox-script/dropbox/paper.py new file mode 100644 index 0000000..9c74ee9 --- /dev/null +++ b/dropbox-script/dropbox/paper.py @@ -0,0 +1,4528 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# @generated +# flake8: noqa +# pylint: skip-file +""" +This namespace contains endpoints and data types for managing docs and folders in Dropbox Paper. +""" + +try: + from . import stone_validators as bv + from . import stone_base as bb +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bv + import stone_base as bb + +try: + from . import ( + common, + sharing, + ) +except (ImportError, SystemError, ValueError): + import common + import sharing + +class AddMember(bb.Struct): + """ + :ivar permission_level: Permission for the user. + :ivar member: User which should be added to the Paper doc. Specify only + email address or Dropbox account ID. + """ + + __slots__ = [ + '_permission_level_value', + '_permission_level_present', + '_member_value', + '_member_present', + ] + + _has_required_fields = True + + def __init__(self, + member=None, + permission_level=None): + self._permission_level_value = None + self._permission_level_present = False + self._member_value = None + self._member_present = False + if permission_level is not None: + self.permission_level = permission_level + if member is not None: + self.member = member + + @property + def permission_level(self): + """ + Permission for the user. + + :rtype: PaperDocPermissionLevel + """ + if self._permission_level_present: + return self._permission_level_value + else: + return PaperDocPermissionLevel.edit + + @permission_level.setter + def permission_level(self, val): + self._permission_level_validator.validate_type_only(val) + self._permission_level_value = val + self._permission_level_present = True + + @permission_level.deleter + def permission_level(self): + self._permission_level_value = None + self._permission_level_present = False + + @property + def member(self): + """ + User which should be added to the Paper doc. Specify only email address + or Dropbox account ID. + + :rtype: sharing.MemberSelector + """ + if self._member_present: + return self._member_value + else: + raise AttributeError("missing required field 'member'") + + @member.setter + def member(self, val): + self._member_validator.validate_type_only(val) + self._member_value = val + self._member_present = True + + @member.deleter + def member(self): + self._member_value = None + self._member_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AddMember, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AddMember(member={!r}, permission_level={!r})'.format( + self._member_value, + self._permission_level_value, + ) + +AddMember_validator = bv.Struct(AddMember) + +class RefPaperDoc(bb.Struct): + """ + :ivar doc_id: The Paper doc ID. + """ + + __slots__ = [ + '_doc_id_value', + '_doc_id_present', + ] + + _has_required_fields = True + + def __init__(self, + doc_id=None): + self._doc_id_value = None + self._doc_id_present = False + if doc_id is not None: + self.doc_id = doc_id + + @property + def doc_id(self): + """ + The Paper doc ID. + + :rtype: str + """ + if self._doc_id_present: + return self._doc_id_value + else: + raise AttributeError("missing required field 'doc_id'") + + @doc_id.setter + def doc_id(self, val): + val = self._doc_id_validator.validate(val) + self._doc_id_value = val + self._doc_id_present = True + + @doc_id.deleter + def doc_id(self): + self._doc_id_value = None + self._doc_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RefPaperDoc, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RefPaperDoc(doc_id={!r})'.format( + self._doc_id_value, + ) + +RefPaperDoc_validator = bv.Struct(RefPaperDoc) + +class AddPaperDocUser(RefPaperDoc): + """ + :ivar members: User which should be added to the Paper doc. Specify only + email address or Dropbox account ID. + :ivar custom_message: A personal message that will be emailed to each + successfully added member. + :ivar quiet: Clients should set this to true if no email message shall be + sent to added users. + """ + + __slots__ = [ + '_members_value', + '_members_present', + '_custom_message_value', + '_custom_message_present', + '_quiet_value', + '_quiet_present', + ] + + _has_required_fields = True + + def __init__(self, + doc_id=None, + members=None, + custom_message=None, + quiet=None): + super(AddPaperDocUser, self).__init__(doc_id) + self._members_value = None + self._members_present = False + self._custom_message_value = None + self._custom_message_present = False + self._quiet_value = None + self._quiet_present = False + if members is not None: + self.members = members + if custom_message is not None: + self.custom_message = custom_message + if quiet is not None: + self.quiet = quiet + + @property + def members(self): + """ + User which should be added to the Paper doc. Specify only email address + or Dropbox account ID. + + :rtype: list of [AddMember] + """ + if self._members_present: + return self._members_value + else: + raise AttributeError("missing required field 'members'") + + @members.setter + def members(self, val): + val = self._members_validator.validate(val) + self._members_value = val + self._members_present = True + + @members.deleter + def members(self): + self._members_value = None + self._members_present = False + + @property + def custom_message(self): + """ + A personal message that will be emailed to each successfully added + member. + + :rtype: str + """ + if self._custom_message_present: + return self._custom_message_value + else: + return None + + @custom_message.setter + def custom_message(self, val): + if val is None: + del self.custom_message + return + val = self._custom_message_validator.validate(val) + self._custom_message_value = val + self._custom_message_present = True + + @custom_message.deleter + def custom_message(self): + self._custom_message_value = None + self._custom_message_present = False + + @property + def quiet(self): + """ + Clients should set this to true if no email message shall be sent to + added users. + + :rtype: bool + """ + if self._quiet_present: + return self._quiet_value + else: + return False + + @quiet.setter + def quiet(self, val): + val = self._quiet_validator.validate(val) + self._quiet_value = val + self._quiet_present = True + + @quiet.deleter + def quiet(self): + self._quiet_value = None + self._quiet_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AddPaperDocUser, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AddPaperDocUser(doc_id={!r}, members={!r}, custom_message={!r}, quiet={!r})'.format( + self._doc_id_value, + self._members_value, + self._custom_message_value, + self._quiet_value, + ) + +AddPaperDocUser_validator = bv.Struct(AddPaperDocUser) + +class AddPaperDocUserMemberResult(bb.Struct): + """ + Per-member result for :meth:`dropbox.dropbox.Dropbox.paper_docs_users_add`. + + :ivar member: One of specified input members. + :ivar result: The outcome of the action on this member. + """ + + __slots__ = [ + '_member_value', + '_member_present', + '_result_value', + '_result_present', + ] + + _has_required_fields = True + + def __init__(self, + member=None, + result=None): + self._member_value = None + self._member_present = False + self._result_value = None + self._result_present = False + if member is not None: + self.member = member + if result is not None: + self.result = result + + @property + def member(self): + """ + One of specified input members. + + :rtype: sharing.MemberSelector + """ + if self._member_present: + return self._member_value + else: + raise AttributeError("missing required field 'member'") + + @member.setter + def member(self, val): + self._member_validator.validate_type_only(val) + self._member_value = val + self._member_present = True + + @member.deleter + def member(self): + self._member_value = None + self._member_present = False + + @property + def result(self): + """ + The outcome of the action on this member. + + :rtype: AddPaperDocUserResult + """ + if self._result_present: + return self._result_value + else: + raise AttributeError("missing required field 'result'") + + @result.setter + def result(self, val): + self._result_validator.validate_type_only(val) + self._result_value = val + self._result_present = True + + @result.deleter + def result(self): + self._result_value = None + self._result_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AddPaperDocUserMemberResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AddPaperDocUserMemberResult(member={!r}, result={!r})'.format( + self._member_value, + self._result_value, + ) + +AddPaperDocUserMemberResult_validator = bv.Struct(AddPaperDocUserMemberResult) + +class AddPaperDocUserResult(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar success: User was successfully added to the Paper doc. + :ivar unknown_error: Something unexpected happened when trying to add the + user to the Paper doc. + :ivar sharing_outside_team_disabled: The Paper doc can be shared only with + team members. + :ivar daily_limit_reached: The daily limit of how many users can be added to + the Paper doc was reached. + :ivar user_is_owner: Owner's permissions cannot be changed. + :ivar failed_user_data_retrieval: User data could not be retrieved. Clients + should retry. + :ivar permission_already_granted: This user already has the correct + permission to the Paper doc. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + success = None + # Attribute is overwritten below the class definition + unknown_error = None + # Attribute is overwritten below the class definition + sharing_outside_team_disabled = None + # Attribute is overwritten below the class definition + daily_limit_reached = None + # Attribute is overwritten below the class definition + user_is_owner = None + # Attribute is overwritten below the class definition + failed_user_data_retrieval = None + # Attribute is overwritten below the class definition + permission_already_granted = None + # Attribute is overwritten below the class definition + other = None + + def is_success(self): + """ + Check if the union tag is ``success``. + + :rtype: bool + """ + return self._tag == 'success' + + def is_unknown_error(self): + """ + Check if the union tag is ``unknown_error``. + + :rtype: bool + """ + return self._tag == 'unknown_error' + + def is_sharing_outside_team_disabled(self): + """ + Check if the union tag is ``sharing_outside_team_disabled``. + + :rtype: bool + """ + return self._tag == 'sharing_outside_team_disabled' + + def is_daily_limit_reached(self): + """ + Check if the union tag is ``daily_limit_reached``. + + :rtype: bool + """ + return self._tag == 'daily_limit_reached' + + def is_user_is_owner(self): + """ + Check if the union tag is ``user_is_owner``. + + :rtype: bool + """ + return self._tag == 'user_is_owner' + + def is_failed_user_data_retrieval(self): + """ + Check if the union tag is ``failed_user_data_retrieval``. + + :rtype: bool + """ + return self._tag == 'failed_user_data_retrieval' + + def is_permission_already_granted(self): + """ + Check if the union tag is ``permission_already_granted``. + + :rtype: bool + """ + return self._tag == 'permission_already_granted' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(AddPaperDocUserResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AddPaperDocUserResult(%r, %r)' % (self._tag, self._value) + +AddPaperDocUserResult_validator = bv.Union(AddPaperDocUserResult) + +class Cursor(bb.Struct): + """ + :ivar value: The actual cursor value. + :ivar expiration: Expiration time of ``value``. Some cursors might have + expiration time assigned. This is a UTC value after which the cursor is + no longer valid and the API starts returning an error. If cursor expires + a new one needs to be obtained and pagination needs to be restarted. + Some cursors might be short-lived some cursors might be long-lived. This + really depends on the sorting type and order, e.g.: 1. on one hand, + listing docs created by the user, sorted by the created time ascending + will have undefinite expiration because the results cannot change while + the iteration is happening. This cursor would be suitable for long term + polling. 2. on the other hand, listing docs sorted by the last modified + time will have a very short expiration as docs do get modified very + often and the modified time can be changed while the iteration is + happening thus altering the results. + """ + + __slots__ = [ + '_value_value', + '_value_present', + '_expiration_value', + '_expiration_present', + ] + + _has_required_fields = True + + def __init__(self, + value=None, + expiration=None): + self._value_value = None + self._value_present = False + self._expiration_value = None + self._expiration_present = False + if value is not None: + self.value = value + if expiration is not None: + self.expiration = expiration + + @property + def value(self): + """ + The actual cursor value. + + :rtype: str + """ + if self._value_present: + return self._value_value + else: + raise AttributeError("missing required field 'value'") + + @value.setter + def value(self, val): + val = self._value_validator.validate(val) + self._value_value = val + self._value_present = True + + @value.deleter + def value(self): + self._value_value = None + self._value_present = False + + @property + def expiration(self): + """ + Expiration time of ``value``. Some cursors might have expiration time + assigned. This is a UTC value after which the cursor is no longer valid + and the API starts returning an error. If cursor expires a new one needs + to be obtained and pagination needs to be restarted. Some cursors might + be short-lived some cursors might be long-lived. This really depends on + the sorting type and order, e.g.: 1. on one hand, listing docs created + by the user, sorted by the created time ascending will have undefinite + expiration because the results cannot change while the iteration is + happening. This cursor would be suitable for long term polling. 2. on + the other hand, listing docs sorted by the last modified time will have + a very short expiration as docs do get modified very often and the + modified time can be changed while the iteration is happening thus + altering the results. + + :rtype: datetime.datetime + """ + if self._expiration_present: + return self._expiration_value + else: + return None + + @expiration.setter + def expiration(self, val): + if val is None: + del self.expiration + return + val = self._expiration_validator.validate(val) + self._expiration_value = val + self._expiration_present = True + + @expiration.deleter + def expiration(self): + self._expiration_value = None + self._expiration_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(Cursor, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'Cursor(value={!r}, expiration={!r})'.format( + self._value_value, + self._expiration_value, + ) + +Cursor_validator = bv.Struct(Cursor) + +class PaperApiBaseError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar insufficient_permissions: Your account does not have permissions to + perform this action. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + insufficient_permissions = None + # Attribute is overwritten below the class definition + other = None + + def is_insufficient_permissions(self): + """ + Check if the union tag is ``insufficient_permissions``. + + :rtype: bool + """ + return self._tag == 'insufficient_permissions' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperApiBaseError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperApiBaseError(%r, %r)' % (self._tag, self._value) + +PaperApiBaseError_validator = bv.Union(PaperApiBaseError) + +class DocLookupError(PaperApiBaseError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar doc_not_found: The required doc was not found. + """ + + # Attribute is overwritten below the class definition + doc_not_found = None + + def is_doc_not_found(self): + """ + Check if the union tag is ``doc_not_found``. + + :rtype: bool + """ + return self._tag == 'doc_not_found' + + def _process_custom_annotations(self, annotation_type, processor): + super(DocLookupError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DocLookupError(%r, %r)' % (self._tag, self._value) + +DocLookupError_validator = bv.Union(DocLookupError) + +class DocSubscriptionLevel(bb.Union): + """ + The subscription level of a Paper doc. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar default: No change email messages unless you're the creator. + :ivar ignore: Ignored: Not shown in pad lists or activity and no email + message is sent. + :ivar every: Subscribed: Shown in pad lists and activity and change email + messages are sent. + :ivar no_email: Unsubscribed: Shown in pad lists, but not in activity and no + change email messages are sent. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + default = None + # Attribute is overwritten below the class definition + ignore = None + # Attribute is overwritten below the class definition + every = None + # Attribute is overwritten below the class definition + no_email = None + + def is_default(self): + """ + Check if the union tag is ``default``. + + :rtype: bool + """ + return self._tag == 'default' + + def is_ignore(self): + """ + Check if the union tag is ``ignore``. + + :rtype: bool + """ + return self._tag == 'ignore' + + def is_every(self): + """ + Check if the union tag is ``every``. + + :rtype: bool + """ + return self._tag == 'every' + + def is_no_email(self): + """ + Check if the union tag is ``no_email``. + + :rtype: bool + """ + return self._tag == 'no_email' + + def _process_custom_annotations(self, annotation_type, processor): + super(DocSubscriptionLevel, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DocSubscriptionLevel(%r, %r)' % (self._tag, self._value) + +DocSubscriptionLevel_validator = bv.Union(DocSubscriptionLevel) + +class ExportFormat(bb.Union): + """ + The desired export format of the Paper doc. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar html: The HTML export format. + :ivar markdown: The markdown export format. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + html = None + # Attribute is overwritten below the class definition + markdown = None + # Attribute is overwritten below the class definition + other = None + + def is_html(self): + """ + Check if the union tag is ``html``. + + :rtype: bool + """ + return self._tag == 'html' + + def is_markdown(self): + """ + Check if the union tag is ``markdown``. + + :rtype: bool + """ + return self._tag == 'markdown' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ExportFormat, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ExportFormat(%r, %r)' % (self._tag, self._value) + +ExportFormat_validator = bv.Union(ExportFormat) + +class Folder(bb.Struct): + """ + Data structure representing a Paper folder. + + :ivar id: Paper folder ID. This ID uniquely identifies the folder. + :ivar name: Paper folder name. + """ + + __slots__ = [ + '_id_value', + '_id_present', + '_name_value', + '_name_present', + ] + + _has_required_fields = True + + def __init__(self, + id=None, + name=None): + self._id_value = None + self._id_present = False + self._name_value = None + self._name_present = False + if id is not None: + self.id = id + if name is not None: + self.name = name + + @property + def id(self): + """ + Paper folder ID. This ID uniquely identifies the folder. + + :rtype: str + """ + if self._id_present: + return self._id_value + else: + raise AttributeError("missing required field 'id'") + + @id.setter + def id(self, val): + val = self._id_validator.validate(val) + self._id_value = val + self._id_present = True + + @id.deleter + def id(self): + self._id_value = None + self._id_present = False + + @property + def name(self): + """ + Paper folder name. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(Folder, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'Folder(id={!r}, name={!r})'.format( + self._id_value, + self._name_value, + ) + +Folder_validator = bv.Struct(Folder) + +class FolderSharingPolicyType(bb.Union): + """ + The sharing policy of a Paper folder. Note: The sharing policy of + subfolders is inherited from the root folder. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar team: Everyone in your team and anyone directly invited can access + this folder. + :ivar invite_only: Only people directly invited can access this folder. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + team = None + # Attribute is overwritten below the class definition + invite_only = None + + def is_team(self): + """ + Check if the union tag is ``team``. + + :rtype: bool + """ + return self._tag == 'team' + + def is_invite_only(self): + """ + Check if the union tag is ``invite_only``. + + :rtype: bool + """ + return self._tag == 'invite_only' + + def _process_custom_annotations(self, annotation_type, processor): + super(FolderSharingPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FolderSharingPolicyType(%r, %r)' % (self._tag, self._value) + +FolderSharingPolicyType_validator = bv.Union(FolderSharingPolicyType) + +class FolderSubscriptionLevel(bb.Union): + """ + The subscription level of a Paper folder. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar none: Not shown in activity, no email messages. + :ivar activity_only: Shown in activity, no email messages. + :ivar daily_emails: Shown in activity, daily email messages. + :ivar weekly_emails: Shown in activity, weekly email messages. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + none = None + # Attribute is overwritten below the class definition + activity_only = None + # Attribute is overwritten below the class definition + daily_emails = None + # Attribute is overwritten below the class definition + weekly_emails = None + + def is_none(self): + """ + Check if the union tag is ``none``. + + :rtype: bool + """ + return self._tag == 'none' + + def is_activity_only(self): + """ + Check if the union tag is ``activity_only``. + + :rtype: bool + """ + return self._tag == 'activity_only' + + def is_daily_emails(self): + """ + Check if the union tag is ``daily_emails``. + + :rtype: bool + """ + return self._tag == 'daily_emails' + + def is_weekly_emails(self): + """ + Check if the union tag is ``weekly_emails``. + + :rtype: bool + """ + return self._tag == 'weekly_emails' + + def _process_custom_annotations(self, annotation_type, processor): + super(FolderSubscriptionLevel, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FolderSubscriptionLevel(%r, %r)' % (self._tag, self._value) + +FolderSubscriptionLevel_validator = bv.Union(FolderSubscriptionLevel) + +class FoldersContainingPaperDoc(bb.Struct): + """ + Metadata about Paper folders containing the specififed Paper doc. + + :ivar folder_sharing_policy_type: The sharing policy of the folder + containing the Paper doc. + :ivar folders: The folder path. If present the first folder is the root + folder. + """ + + __slots__ = [ + '_folder_sharing_policy_type_value', + '_folder_sharing_policy_type_present', + '_folders_value', + '_folders_present', + ] + + _has_required_fields = False + + def __init__(self, + folder_sharing_policy_type=None, + folders=None): + self._folder_sharing_policy_type_value = None + self._folder_sharing_policy_type_present = False + self._folders_value = None + self._folders_present = False + if folder_sharing_policy_type is not None: + self.folder_sharing_policy_type = folder_sharing_policy_type + if folders is not None: + self.folders = folders + + @property + def folder_sharing_policy_type(self): + """ + The sharing policy of the folder containing the Paper doc. + + :rtype: FolderSharingPolicyType + """ + if self._folder_sharing_policy_type_present: + return self._folder_sharing_policy_type_value + else: + return None + + @folder_sharing_policy_type.setter + def folder_sharing_policy_type(self, val): + if val is None: + del self.folder_sharing_policy_type + return + self._folder_sharing_policy_type_validator.validate_type_only(val) + self._folder_sharing_policy_type_value = val + self._folder_sharing_policy_type_present = True + + @folder_sharing_policy_type.deleter + def folder_sharing_policy_type(self): + self._folder_sharing_policy_type_value = None + self._folder_sharing_policy_type_present = False + + @property + def folders(self): + """ + The folder path. If present the first folder is the root folder. + + :rtype: list of [Folder] + """ + if self._folders_present: + return self._folders_value + else: + return None + + @folders.setter + def folders(self, val): + if val is None: + del self.folders + return + val = self._folders_validator.validate(val) + self._folders_value = val + self._folders_present = True + + @folders.deleter + def folders(self): + self._folders_value = None + self._folders_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FoldersContainingPaperDoc, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FoldersContainingPaperDoc(folder_sharing_policy_type={!r}, folders={!r})'.format( + self._folder_sharing_policy_type_value, + self._folders_value, + ) + +FoldersContainingPaperDoc_validator = bv.Struct(FoldersContainingPaperDoc) + +class ImportFormat(bb.Union): + """ + The import format of the incoming data. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar html: The provided data is interpreted as standard HTML. + :ivar markdown: The provided data is interpreted as markdown. Note: The + first line of the provided document will be used as the doc title. + :ivar plain_text: The provided data is interpreted as plain text. Note: The + first line of the provided document will be used as the doc title. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + html = None + # Attribute is overwritten below the class definition + markdown = None + # Attribute is overwritten below the class definition + plain_text = None + # Attribute is overwritten below the class definition + other = None + + def is_html(self): + """ + Check if the union tag is ``html``. + + :rtype: bool + """ + return self._tag == 'html' + + def is_markdown(self): + """ + Check if the union tag is ``markdown``. + + :rtype: bool + """ + return self._tag == 'markdown' + + def is_plain_text(self): + """ + Check if the union tag is ``plain_text``. + + :rtype: bool + """ + return self._tag == 'plain_text' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ImportFormat, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ImportFormat(%r, %r)' % (self._tag, self._value) + +ImportFormat_validator = bv.Union(ImportFormat) + +class InviteeInfoWithPermissionLevel(bb.Struct): + """ + :ivar invitee: Email address invited to the Paper doc. + :ivar permission_level: Permission level for the invitee. + """ + + __slots__ = [ + '_invitee_value', + '_invitee_present', + '_permission_level_value', + '_permission_level_present', + ] + + _has_required_fields = True + + def __init__(self, + invitee=None, + permission_level=None): + self._invitee_value = None + self._invitee_present = False + self._permission_level_value = None + self._permission_level_present = False + if invitee is not None: + self.invitee = invitee + if permission_level is not None: + self.permission_level = permission_level + + @property + def invitee(self): + """ + Email address invited to the Paper doc. + + :rtype: sharing.InviteeInfo + """ + if self._invitee_present: + return self._invitee_value + else: + raise AttributeError("missing required field 'invitee'") + + @invitee.setter + def invitee(self, val): + self._invitee_validator.validate_type_only(val) + self._invitee_value = val + self._invitee_present = True + + @invitee.deleter + def invitee(self): + self._invitee_value = None + self._invitee_present = False + + @property + def permission_level(self): + """ + Permission level for the invitee. + + :rtype: PaperDocPermissionLevel + """ + if self._permission_level_present: + return self._permission_level_value + else: + raise AttributeError("missing required field 'permission_level'") + + @permission_level.setter + def permission_level(self, val): + self._permission_level_validator.validate_type_only(val) + self._permission_level_value = val + self._permission_level_present = True + + @permission_level.deleter + def permission_level(self): + self._permission_level_value = None + self._permission_level_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(InviteeInfoWithPermissionLevel, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'InviteeInfoWithPermissionLevel(invitee={!r}, permission_level={!r})'.format( + self._invitee_value, + self._permission_level_value, + ) + +InviteeInfoWithPermissionLevel_validator = bv.Struct(InviteeInfoWithPermissionLevel) + +class ListDocsCursorError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def cursor_error(cls, val): + """ + Create an instance of this class set to the ``cursor_error`` tag with + value ``val``. + + :param PaperApiCursorError val: + :rtype: ListDocsCursorError + """ + return cls('cursor_error', val) + + def is_cursor_error(self): + """ + Check if the union tag is ``cursor_error``. + + :rtype: bool + """ + return self._tag == 'cursor_error' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_cursor_error(self): + """ + Only call this if :meth:`is_cursor_error` is true. + + :rtype: PaperApiCursorError + """ + if not self.is_cursor_error(): + raise AttributeError("tag 'cursor_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ListDocsCursorError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListDocsCursorError(%r, %r)' % (self._tag, self._value) + +ListDocsCursorError_validator = bv.Union(ListDocsCursorError) + +class ListPaperDocsArgs(bb.Struct): + """ + :ivar filter_by: Allows user to specify how the Paper docs should be + filtered. + :ivar sort_by: Allows user to specify how the Paper docs should be sorted. + :ivar sort_order: Allows user to specify the sort order of the result. + :ivar limit: Size limit per batch. The maximum number of docs that can be + retrieved per batch is 1000. Higher value results in invalid arguments + error. + """ + + __slots__ = [ + '_filter_by_value', + '_filter_by_present', + '_sort_by_value', + '_sort_by_present', + '_sort_order_value', + '_sort_order_present', + '_limit_value', + '_limit_present', + ] + + _has_required_fields = False + + def __init__(self, + filter_by=None, + sort_by=None, + sort_order=None, + limit=None): + self._filter_by_value = None + self._filter_by_present = False + self._sort_by_value = None + self._sort_by_present = False + self._sort_order_value = None + self._sort_order_present = False + self._limit_value = None + self._limit_present = False + if filter_by is not None: + self.filter_by = filter_by + if sort_by is not None: + self.sort_by = sort_by + if sort_order is not None: + self.sort_order = sort_order + if limit is not None: + self.limit = limit + + @property + def filter_by(self): + """ + Allows user to specify how the Paper docs should be filtered. + + :rtype: ListPaperDocsFilterBy + """ + if self._filter_by_present: + return self._filter_by_value + else: + return ListPaperDocsFilterBy.docs_accessed + + @filter_by.setter + def filter_by(self, val): + self._filter_by_validator.validate_type_only(val) + self._filter_by_value = val + self._filter_by_present = True + + @filter_by.deleter + def filter_by(self): + self._filter_by_value = None + self._filter_by_present = False + + @property + def sort_by(self): + """ + Allows user to specify how the Paper docs should be sorted. + + :rtype: ListPaperDocsSortBy + """ + if self._sort_by_present: + return self._sort_by_value + else: + return ListPaperDocsSortBy.accessed + + @sort_by.setter + def sort_by(self, val): + self._sort_by_validator.validate_type_only(val) + self._sort_by_value = val + self._sort_by_present = True + + @sort_by.deleter + def sort_by(self): + self._sort_by_value = None + self._sort_by_present = False + + @property + def sort_order(self): + """ + Allows user to specify the sort order of the result. + + :rtype: ListPaperDocsSortOrder + """ + if self._sort_order_present: + return self._sort_order_value + else: + return ListPaperDocsSortOrder.ascending + + @sort_order.setter + def sort_order(self, val): + self._sort_order_validator.validate_type_only(val) + self._sort_order_value = val + self._sort_order_present = True + + @sort_order.deleter + def sort_order(self): + self._sort_order_value = None + self._sort_order_present = False + + @property + def limit(self): + """ + Size limit per batch. The maximum number of docs that can be retrieved + per batch is 1000. Higher value results in invalid arguments error. + + :rtype: int + """ + if self._limit_present: + return self._limit_value + else: + return 1000 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListPaperDocsArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListPaperDocsArgs(filter_by={!r}, sort_by={!r}, sort_order={!r}, limit={!r})'.format( + self._filter_by_value, + self._sort_by_value, + self._sort_order_value, + self._limit_value, + ) + +ListPaperDocsArgs_validator = bv.Struct(ListPaperDocsArgs) + +class ListPaperDocsContinueArgs(bb.Struct): + """ + :ivar cursor: The cursor obtained from + :meth:`dropbox.dropbox.Dropbox.paper_docs_list` or + :meth:`dropbox.dropbox.Dropbox.paper_docs_list_continue`. Allows for + pagination. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + The cursor obtained from :meth:`dropbox.dropbox.Dropbox.paper_docs_list` + or :meth:`dropbox.dropbox.Dropbox.paper_docs_list_continue`. Allows for + pagination. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListPaperDocsContinueArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListPaperDocsContinueArgs(cursor={!r})'.format( + self._cursor_value, + ) + +ListPaperDocsContinueArgs_validator = bv.Struct(ListPaperDocsContinueArgs) + +class ListPaperDocsFilterBy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar docs_accessed: Fetches all Paper doc IDs that the user has ever + accessed. + :ivar docs_created: Fetches only the Paper doc IDs that the user has + created. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + docs_accessed = None + # Attribute is overwritten below the class definition + docs_created = None + # Attribute is overwritten below the class definition + other = None + + def is_docs_accessed(self): + """ + Check if the union tag is ``docs_accessed``. + + :rtype: bool + """ + return self._tag == 'docs_accessed' + + def is_docs_created(self): + """ + Check if the union tag is ``docs_created``. + + :rtype: bool + """ + return self._tag == 'docs_created' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ListPaperDocsFilterBy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListPaperDocsFilterBy(%r, %r)' % (self._tag, self._value) + +ListPaperDocsFilterBy_validator = bv.Union(ListPaperDocsFilterBy) + +class ListPaperDocsResponse(bb.Struct): + """ + :ivar doc_ids: The list of Paper doc IDs that can be used to access the + given Paper docs or supplied to other API methods. The list is sorted in + the order specified by the initial call to + :meth:`dropbox.dropbox.Dropbox.paper_docs_list`. + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.paper_docs_list_continue` to paginate + through all files. The cursor preserves all properties as specified in + the original call to :meth:`dropbox.dropbox.Dropbox.paper_docs_list`. + :ivar has_more: Will be set to True if a subsequent call with the provided + cursor to :meth:`dropbox.dropbox.Dropbox.paper_docs_list_continue` + returns immediately with some results. If set to False please allow some + delay before making another call to + :meth:`dropbox.dropbox.Dropbox.paper_docs_list_continue`. + """ + + __slots__ = [ + '_doc_ids_value', + '_doc_ids_present', + '_cursor_value', + '_cursor_present', + '_has_more_value', + '_has_more_present', + ] + + _has_required_fields = True + + def __init__(self, + doc_ids=None, + cursor=None, + has_more=None): + self._doc_ids_value = None + self._doc_ids_present = False + self._cursor_value = None + self._cursor_present = False + self._has_more_value = None + self._has_more_present = False + if doc_ids is not None: + self.doc_ids = doc_ids + if cursor is not None: + self.cursor = cursor + if has_more is not None: + self.has_more = has_more + + @property + def doc_ids(self): + """ + The list of Paper doc IDs that can be used to access the given Paper + docs or supplied to other API methods. The list is sorted in the order + specified by the initial call to + :meth:`dropbox.dropbox.Dropbox.paper_docs_list`. + + :rtype: list of [str] + """ + if self._doc_ids_present: + return self._doc_ids_value + else: + raise AttributeError("missing required field 'doc_ids'") + + @doc_ids.setter + def doc_ids(self, val): + val = self._doc_ids_validator.validate(val) + self._doc_ids_value = val + self._doc_ids_present = True + + @doc_ids.deleter + def doc_ids(self): + self._doc_ids_value = None + self._doc_ids_present = False + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.paper_docs_list_continue` to paginate + through all files. The cursor preserves all properties as specified in + the original call to :meth:`dropbox.dropbox.Dropbox.paper_docs_list`. + + :rtype: Cursor + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + self._cursor_validator.validate_type_only(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def has_more(self): + """ + Will be set to True if a subsequent call with the provided cursor to + :meth:`dropbox.dropbox.Dropbox.paper_docs_list_continue` returns + immediately with some results. If set to False please allow some delay + before making another call to + :meth:`dropbox.dropbox.Dropbox.paper_docs_list_continue`. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListPaperDocsResponse, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListPaperDocsResponse(doc_ids={!r}, cursor={!r}, has_more={!r})'.format( + self._doc_ids_value, + self._cursor_value, + self._has_more_value, + ) + +ListPaperDocsResponse_validator = bv.Struct(ListPaperDocsResponse) + +class ListPaperDocsSortBy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar accessed: Sorts the Paper docs by the time they were last accessed. + :ivar modified: Sorts the Paper docs by the time they were last modified. + :ivar created: Sorts the Paper docs by the creation time. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + accessed = None + # Attribute is overwritten below the class definition + modified = None + # Attribute is overwritten below the class definition + created = None + # Attribute is overwritten below the class definition + other = None + + def is_accessed(self): + """ + Check if the union tag is ``accessed``. + + :rtype: bool + """ + return self._tag == 'accessed' + + def is_modified(self): + """ + Check if the union tag is ``modified``. + + :rtype: bool + """ + return self._tag == 'modified' + + def is_created(self): + """ + Check if the union tag is ``created``. + + :rtype: bool + """ + return self._tag == 'created' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ListPaperDocsSortBy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListPaperDocsSortBy(%r, %r)' % (self._tag, self._value) + +ListPaperDocsSortBy_validator = bv.Union(ListPaperDocsSortBy) + +class ListPaperDocsSortOrder(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar ascending: Sorts the search result in ascending order. + :ivar descending: Sorts the search result in descending order. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + ascending = None + # Attribute is overwritten below the class definition + descending = None + # Attribute is overwritten below the class definition + other = None + + def is_ascending(self): + """ + Check if the union tag is ``ascending``. + + :rtype: bool + """ + return self._tag == 'ascending' + + def is_descending(self): + """ + Check if the union tag is ``descending``. + + :rtype: bool + """ + return self._tag == 'descending' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ListPaperDocsSortOrder, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListPaperDocsSortOrder(%r, %r)' % (self._tag, self._value) + +ListPaperDocsSortOrder_validator = bv.Union(ListPaperDocsSortOrder) + +class ListUsersCursorError(PaperApiBaseError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar doc_not_found: The required doc was not found. + """ + + # Attribute is overwritten below the class definition + doc_not_found = None + + @classmethod + def cursor_error(cls, val): + """ + Create an instance of this class set to the ``cursor_error`` tag with + value ``val``. + + :param PaperApiCursorError val: + :rtype: ListUsersCursorError + """ + return cls('cursor_error', val) + + def is_doc_not_found(self): + """ + Check if the union tag is ``doc_not_found``. + + :rtype: bool + """ + return self._tag == 'doc_not_found' + + def is_cursor_error(self): + """ + Check if the union tag is ``cursor_error``. + + :rtype: bool + """ + return self._tag == 'cursor_error' + + def get_cursor_error(self): + """ + Only call this if :meth:`is_cursor_error` is true. + + :rtype: PaperApiCursorError + """ + if not self.is_cursor_error(): + raise AttributeError("tag 'cursor_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ListUsersCursorError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListUsersCursorError(%r, %r)' % (self._tag, self._value) + +ListUsersCursorError_validator = bv.Union(ListUsersCursorError) + +class ListUsersOnFolderArgs(RefPaperDoc): + """ + :ivar limit: Size limit per batch. The maximum number of users that can be + retrieved per batch is 1000. Higher value results in invalid arguments + error. + """ + + __slots__ = [ + '_limit_value', + '_limit_present', + ] + + _has_required_fields = True + + def __init__(self, + doc_id=None, + limit=None): + super(ListUsersOnFolderArgs, self).__init__(doc_id) + self._limit_value = None + self._limit_present = False + if limit is not None: + self.limit = limit + + @property + def limit(self): + """ + Size limit per batch. The maximum number of users that can be retrieved + per batch is 1000. Higher value results in invalid arguments error. + + :rtype: int + """ + if self._limit_present: + return self._limit_value + else: + return 1000 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListUsersOnFolderArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListUsersOnFolderArgs(doc_id={!r}, limit={!r})'.format( + self._doc_id_value, + self._limit_value, + ) + +ListUsersOnFolderArgs_validator = bv.Struct(ListUsersOnFolderArgs) + +class ListUsersOnFolderContinueArgs(RefPaperDoc): + """ + :ivar cursor: The cursor obtained from + :meth:`dropbox.dropbox.Dropbox.paper_docs_folder_users_list` or + :meth:`dropbox.dropbox.Dropbox.paper_docs_folder_users_list_continue`. + Allows for pagination. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + doc_id=None, + cursor=None): + super(ListUsersOnFolderContinueArgs, self).__init__(doc_id) + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + The cursor obtained from + :meth:`dropbox.dropbox.Dropbox.paper_docs_folder_users_list` or + :meth:`dropbox.dropbox.Dropbox.paper_docs_folder_users_list_continue`. + Allows for pagination. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListUsersOnFolderContinueArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListUsersOnFolderContinueArgs(doc_id={!r}, cursor={!r})'.format( + self._doc_id_value, + self._cursor_value, + ) + +ListUsersOnFolderContinueArgs_validator = bv.Struct(ListUsersOnFolderContinueArgs) + +class ListUsersOnFolderResponse(bb.Struct): + """ + :ivar invitees: List of email addresses that are invited on the Paper + folder. + :ivar users: List of users that are invited on the Paper folder. + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.paper_docs_folder_users_list_continue` to + paginate through all users. The cursor preserves all properties as + specified in the original call to + :meth:`dropbox.dropbox.Dropbox.paper_docs_folder_users_list`. + :ivar has_more: Will be set to True if a subsequent call with the provided + cursor to + :meth:`dropbox.dropbox.Dropbox.paper_docs_folder_users_list_continue` + returns immediately with some results. If set to False please allow some + delay before making another call to + :meth:`dropbox.dropbox.Dropbox.paper_docs_folder_users_list_continue`. + """ + + __slots__ = [ + '_invitees_value', + '_invitees_present', + '_users_value', + '_users_present', + '_cursor_value', + '_cursor_present', + '_has_more_value', + '_has_more_present', + ] + + _has_required_fields = True + + def __init__(self, + invitees=None, + users=None, + cursor=None, + has_more=None): + self._invitees_value = None + self._invitees_present = False + self._users_value = None + self._users_present = False + self._cursor_value = None + self._cursor_present = False + self._has_more_value = None + self._has_more_present = False + if invitees is not None: + self.invitees = invitees + if users is not None: + self.users = users + if cursor is not None: + self.cursor = cursor + if has_more is not None: + self.has_more = has_more + + @property + def invitees(self): + """ + List of email addresses that are invited on the Paper folder. + + :rtype: list of [sharing.InviteeInfo] + """ + if self._invitees_present: + return self._invitees_value + else: + raise AttributeError("missing required field 'invitees'") + + @invitees.setter + def invitees(self, val): + val = self._invitees_validator.validate(val) + self._invitees_value = val + self._invitees_present = True + + @invitees.deleter + def invitees(self): + self._invitees_value = None + self._invitees_present = False + + @property + def users(self): + """ + List of users that are invited on the Paper folder. + + :rtype: list of [sharing.UserInfo] + """ + if self._users_present: + return self._users_value + else: + raise AttributeError("missing required field 'users'") + + @users.setter + def users(self, val): + val = self._users_validator.validate(val) + self._users_value = val + self._users_present = True + + @users.deleter + def users(self): + self._users_value = None + self._users_present = False + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.paper_docs_folder_users_list_continue` to + paginate through all users. The cursor preserves all properties as + specified in the original call to + :meth:`dropbox.dropbox.Dropbox.paper_docs_folder_users_list`. + + :rtype: Cursor + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + self._cursor_validator.validate_type_only(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def has_more(self): + """ + Will be set to True if a subsequent call with the provided cursor to + :meth:`dropbox.dropbox.Dropbox.paper_docs_folder_users_list_continue` + returns immediately with some results. If set to False please allow some + delay before making another call to + :meth:`dropbox.dropbox.Dropbox.paper_docs_folder_users_list_continue`. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListUsersOnFolderResponse, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListUsersOnFolderResponse(invitees={!r}, users={!r}, cursor={!r}, has_more={!r})'.format( + self._invitees_value, + self._users_value, + self._cursor_value, + self._has_more_value, + ) + +ListUsersOnFolderResponse_validator = bv.Struct(ListUsersOnFolderResponse) + +class ListUsersOnPaperDocArgs(RefPaperDoc): + """ + :ivar limit: Size limit per batch. The maximum number of users that can be + retrieved per batch is 1000. Higher value results in invalid arguments + error. + :ivar filter_by: Specify this attribute if you want to obtain users that + have already accessed the Paper doc. + """ + + __slots__ = [ + '_limit_value', + '_limit_present', + '_filter_by_value', + '_filter_by_present', + ] + + _has_required_fields = True + + def __init__(self, + doc_id=None, + limit=None, + filter_by=None): + super(ListUsersOnPaperDocArgs, self).__init__(doc_id) + self._limit_value = None + self._limit_present = False + self._filter_by_value = None + self._filter_by_present = False + if limit is not None: + self.limit = limit + if filter_by is not None: + self.filter_by = filter_by + + @property + def limit(self): + """ + Size limit per batch. The maximum number of users that can be retrieved + per batch is 1000. Higher value results in invalid arguments error. + + :rtype: int + """ + if self._limit_present: + return self._limit_value + else: + return 1000 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + @property + def filter_by(self): + """ + Specify this attribute if you want to obtain users that have already + accessed the Paper doc. + + :rtype: UserOnPaperDocFilter + """ + if self._filter_by_present: + return self._filter_by_value + else: + return UserOnPaperDocFilter.shared + + @filter_by.setter + def filter_by(self, val): + self._filter_by_validator.validate_type_only(val) + self._filter_by_value = val + self._filter_by_present = True + + @filter_by.deleter + def filter_by(self): + self._filter_by_value = None + self._filter_by_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListUsersOnPaperDocArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListUsersOnPaperDocArgs(doc_id={!r}, limit={!r}, filter_by={!r})'.format( + self._doc_id_value, + self._limit_value, + self._filter_by_value, + ) + +ListUsersOnPaperDocArgs_validator = bv.Struct(ListUsersOnPaperDocArgs) + +class ListUsersOnPaperDocContinueArgs(RefPaperDoc): + """ + :ivar cursor: The cursor obtained from + :meth:`dropbox.dropbox.Dropbox.paper_docs_users_list` or + :meth:`dropbox.dropbox.Dropbox.paper_docs_users_list_continue`. Allows + for pagination. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + doc_id=None, + cursor=None): + super(ListUsersOnPaperDocContinueArgs, self).__init__(doc_id) + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + The cursor obtained from + :meth:`dropbox.dropbox.Dropbox.paper_docs_users_list` or + :meth:`dropbox.dropbox.Dropbox.paper_docs_users_list_continue`. Allows + for pagination. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListUsersOnPaperDocContinueArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListUsersOnPaperDocContinueArgs(doc_id={!r}, cursor={!r})'.format( + self._doc_id_value, + self._cursor_value, + ) + +ListUsersOnPaperDocContinueArgs_validator = bv.Struct(ListUsersOnPaperDocContinueArgs) + +class ListUsersOnPaperDocResponse(bb.Struct): + """ + :ivar invitees: List of email addresses with their respective permission + levels that are invited on the Paper doc. + :ivar users: List of users with their respective permission levels that are + invited on the Paper folder. + :ivar doc_owner: The Paper doc owner. This field is populated on every + single response. + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.paper_docs_users_list_continue` to + paginate through all users. The cursor preserves all properties as + specified in the original call to + :meth:`dropbox.dropbox.Dropbox.paper_docs_users_list`. + :ivar has_more: Will be set to True if a subsequent call with the provided + cursor to :meth:`dropbox.dropbox.Dropbox.paper_docs_users_list_continue` + returns immediately with some results. If set to False please allow some + delay before making another call to + :meth:`dropbox.dropbox.Dropbox.paper_docs_users_list_continue`. + """ + + __slots__ = [ + '_invitees_value', + '_invitees_present', + '_users_value', + '_users_present', + '_doc_owner_value', + '_doc_owner_present', + '_cursor_value', + '_cursor_present', + '_has_more_value', + '_has_more_present', + ] + + _has_required_fields = True + + def __init__(self, + invitees=None, + users=None, + doc_owner=None, + cursor=None, + has_more=None): + self._invitees_value = None + self._invitees_present = False + self._users_value = None + self._users_present = False + self._doc_owner_value = None + self._doc_owner_present = False + self._cursor_value = None + self._cursor_present = False + self._has_more_value = None + self._has_more_present = False + if invitees is not None: + self.invitees = invitees + if users is not None: + self.users = users + if doc_owner is not None: + self.doc_owner = doc_owner + if cursor is not None: + self.cursor = cursor + if has_more is not None: + self.has_more = has_more + + @property + def invitees(self): + """ + List of email addresses with their respective permission levels that are + invited on the Paper doc. + + :rtype: list of [InviteeInfoWithPermissionLevel] + """ + if self._invitees_present: + return self._invitees_value + else: + raise AttributeError("missing required field 'invitees'") + + @invitees.setter + def invitees(self, val): + val = self._invitees_validator.validate(val) + self._invitees_value = val + self._invitees_present = True + + @invitees.deleter + def invitees(self): + self._invitees_value = None + self._invitees_present = False + + @property + def users(self): + """ + List of users with their respective permission levels that are invited + on the Paper folder. + + :rtype: list of [UserInfoWithPermissionLevel] + """ + if self._users_present: + return self._users_value + else: + raise AttributeError("missing required field 'users'") + + @users.setter + def users(self, val): + val = self._users_validator.validate(val) + self._users_value = val + self._users_present = True + + @users.deleter + def users(self): + self._users_value = None + self._users_present = False + + @property + def doc_owner(self): + """ + The Paper doc owner. This field is populated on every single response. + + :rtype: sharing.UserInfo + """ + if self._doc_owner_present: + return self._doc_owner_value + else: + raise AttributeError("missing required field 'doc_owner'") + + @doc_owner.setter + def doc_owner(self, val): + self._doc_owner_validator.validate_type_only(val) + self._doc_owner_value = val + self._doc_owner_present = True + + @doc_owner.deleter + def doc_owner(self): + self._doc_owner_value = None + self._doc_owner_present = False + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.paper_docs_users_list_continue` to + paginate through all users. The cursor preserves all properties as + specified in the original call to + :meth:`dropbox.dropbox.Dropbox.paper_docs_users_list`. + + :rtype: Cursor + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + self._cursor_validator.validate_type_only(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def has_more(self): + """ + Will be set to True if a subsequent call with the provided cursor to + :meth:`dropbox.dropbox.Dropbox.paper_docs_users_list_continue` returns + immediately with some results. If set to False please allow some delay + before making another call to + :meth:`dropbox.dropbox.Dropbox.paper_docs_users_list_continue`. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListUsersOnPaperDocResponse, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListUsersOnPaperDocResponse(invitees={!r}, users={!r}, doc_owner={!r}, cursor={!r}, has_more={!r})'.format( + self._invitees_value, + self._users_value, + self._doc_owner_value, + self._cursor_value, + self._has_more_value, + ) + +ListUsersOnPaperDocResponse_validator = bv.Struct(ListUsersOnPaperDocResponse) + +class PaperApiCursorError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar expired_cursor: The provided cursor is expired. + :ivar invalid_cursor: The provided cursor is invalid. + :ivar wrong_user_in_cursor: The provided cursor contains invalid user. + :ivar reset: Indicates that the cursor has been invalidated. Call the + corresponding non-continue endpoint to obtain a new cursor. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + expired_cursor = None + # Attribute is overwritten below the class definition + invalid_cursor = None + # Attribute is overwritten below the class definition + wrong_user_in_cursor = None + # Attribute is overwritten below the class definition + reset = None + # Attribute is overwritten below the class definition + other = None + + def is_expired_cursor(self): + """ + Check if the union tag is ``expired_cursor``. + + :rtype: bool + """ + return self._tag == 'expired_cursor' + + def is_invalid_cursor(self): + """ + Check if the union tag is ``invalid_cursor``. + + :rtype: bool + """ + return self._tag == 'invalid_cursor' + + def is_wrong_user_in_cursor(self): + """ + Check if the union tag is ``wrong_user_in_cursor``. + + :rtype: bool + """ + return self._tag == 'wrong_user_in_cursor' + + def is_reset(self): + """ + Check if the union tag is ``reset``. + + :rtype: bool + """ + return self._tag == 'reset' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperApiCursorError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperApiCursorError(%r, %r)' % (self._tag, self._value) + +PaperApiCursorError_validator = bv.Union(PaperApiCursorError) + +class PaperDocCreateArgs(bb.Struct): + """ + :ivar parent_folder_id: The Paper folder ID where the Paper document should + be created. The API user has to have write access to this folder or + error is thrown. + :ivar import_format: The format of provided data. + """ + + __slots__ = [ + '_parent_folder_id_value', + '_parent_folder_id_present', + '_import_format_value', + '_import_format_present', + ] + + _has_required_fields = True + + def __init__(self, + import_format=None, + parent_folder_id=None): + self._parent_folder_id_value = None + self._parent_folder_id_present = False + self._import_format_value = None + self._import_format_present = False + if parent_folder_id is not None: + self.parent_folder_id = parent_folder_id + if import_format is not None: + self.import_format = import_format + + @property + def parent_folder_id(self): + """ + The Paper folder ID where the Paper document should be created. The API + user has to have write access to this folder or error is thrown. + + :rtype: str + """ + if self._parent_folder_id_present: + return self._parent_folder_id_value + else: + return None + + @parent_folder_id.setter + def parent_folder_id(self, val): + if val is None: + del self.parent_folder_id + return + val = self._parent_folder_id_validator.validate(val) + self._parent_folder_id_value = val + self._parent_folder_id_present = True + + @parent_folder_id.deleter + def parent_folder_id(self): + self._parent_folder_id_value = None + self._parent_folder_id_present = False + + @property + def import_format(self): + """ + The format of provided data. + + :rtype: ImportFormat + """ + if self._import_format_present: + return self._import_format_value + else: + raise AttributeError("missing required field 'import_format'") + + @import_format.setter + def import_format(self, val): + self._import_format_validator.validate_type_only(val) + self._import_format_value = val + self._import_format_present = True + + @import_format.deleter + def import_format(self): + self._import_format_value = None + self._import_format_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocCreateArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocCreateArgs(import_format={!r}, parent_folder_id={!r})'.format( + self._import_format_value, + self._parent_folder_id_value, + ) + +PaperDocCreateArgs_validator = bv.Struct(PaperDocCreateArgs) + +class PaperDocCreateError(PaperApiBaseError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar content_malformed: The provided content was malformed and cannot be + imported to Paper. + :ivar folder_not_found: The specified Paper folder is cannot be found. + :ivar doc_length_exceeded: The newly created Paper doc would be too large. + Please split the content into multiple docs. + :ivar image_size_exceeded: The imported document contains an image that is + too large. The current limit is 1MB. Note: This only applies to HTML + with data uri. + """ + + # Attribute is overwritten below the class definition + content_malformed = None + # Attribute is overwritten below the class definition + folder_not_found = None + # Attribute is overwritten below the class definition + doc_length_exceeded = None + # Attribute is overwritten below the class definition + image_size_exceeded = None + + def is_content_malformed(self): + """ + Check if the union tag is ``content_malformed``. + + :rtype: bool + """ + return self._tag == 'content_malformed' + + def is_folder_not_found(self): + """ + Check if the union tag is ``folder_not_found``. + + :rtype: bool + """ + return self._tag == 'folder_not_found' + + def is_doc_length_exceeded(self): + """ + Check if the union tag is ``doc_length_exceeded``. + + :rtype: bool + """ + return self._tag == 'doc_length_exceeded' + + def is_image_size_exceeded(self): + """ + Check if the union tag is ``image_size_exceeded``. + + :rtype: bool + """ + return self._tag == 'image_size_exceeded' + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocCreateError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocCreateError(%r, %r)' % (self._tag, self._value) + +PaperDocCreateError_validator = bv.Union(PaperDocCreateError) + +class PaperDocCreateUpdateResult(bb.Struct): + """ + :ivar doc_id: Doc ID of the newly created doc. + :ivar revision: The Paper doc revision. Simply an ever increasing number. + :ivar title: The Paper doc title. + """ + + __slots__ = [ + '_doc_id_value', + '_doc_id_present', + '_revision_value', + '_revision_present', + '_title_value', + '_title_present', + ] + + _has_required_fields = True + + def __init__(self, + doc_id=None, + revision=None, + title=None): + self._doc_id_value = None + self._doc_id_present = False + self._revision_value = None + self._revision_present = False + self._title_value = None + self._title_present = False + if doc_id is not None: + self.doc_id = doc_id + if revision is not None: + self.revision = revision + if title is not None: + self.title = title + + @property + def doc_id(self): + """ + Doc ID of the newly created doc. + + :rtype: str + """ + if self._doc_id_present: + return self._doc_id_value + else: + raise AttributeError("missing required field 'doc_id'") + + @doc_id.setter + def doc_id(self, val): + val = self._doc_id_validator.validate(val) + self._doc_id_value = val + self._doc_id_present = True + + @doc_id.deleter + def doc_id(self): + self._doc_id_value = None + self._doc_id_present = False + + @property + def revision(self): + """ + The Paper doc revision. Simply an ever increasing number. + + :rtype: int + """ + if self._revision_present: + return self._revision_value + else: + raise AttributeError("missing required field 'revision'") + + @revision.setter + def revision(self, val): + val = self._revision_validator.validate(val) + self._revision_value = val + self._revision_present = True + + @revision.deleter + def revision(self): + self._revision_value = None + self._revision_present = False + + @property + def title(self): + """ + The Paper doc title. + + :rtype: str + """ + if self._title_present: + return self._title_value + else: + raise AttributeError("missing required field 'title'") + + @title.setter + def title(self, val): + val = self._title_validator.validate(val) + self._title_value = val + self._title_present = True + + @title.deleter + def title(self): + self._title_value = None + self._title_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocCreateUpdateResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocCreateUpdateResult(doc_id={!r}, revision={!r}, title={!r})'.format( + self._doc_id_value, + self._revision_value, + self._title_value, + ) + +PaperDocCreateUpdateResult_validator = bv.Struct(PaperDocCreateUpdateResult) + +class PaperDocExport(RefPaperDoc): + + __slots__ = [ + '_export_format_value', + '_export_format_present', + ] + + _has_required_fields = True + + def __init__(self, + doc_id=None, + export_format=None): + super(PaperDocExport, self).__init__(doc_id) + self._export_format_value = None + self._export_format_present = False + if export_format is not None: + self.export_format = export_format + + @property + def export_format(self): + """ + :rtype: ExportFormat + """ + if self._export_format_present: + return self._export_format_value + else: + raise AttributeError("missing required field 'export_format'") + + @export_format.setter + def export_format(self, val): + self._export_format_validator.validate_type_only(val) + self._export_format_value = val + self._export_format_present = True + + @export_format.deleter + def export_format(self): + self._export_format_value = None + self._export_format_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocExport, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocExport(doc_id={!r}, export_format={!r})'.format( + self._doc_id_value, + self._export_format_value, + ) + +PaperDocExport_validator = bv.Struct(PaperDocExport) + +class PaperDocExportResult(bb.Struct): + """ + :ivar owner: The Paper doc owner's email address. + :ivar title: The Paper doc title. + :ivar revision: The Paper doc revision. Simply an ever increasing number. + :ivar mime_type: MIME type of the export. This corresponds to + :class:`ExportFormat` specified in the request. + """ + + __slots__ = [ + '_owner_value', + '_owner_present', + '_title_value', + '_title_present', + '_revision_value', + '_revision_present', + '_mime_type_value', + '_mime_type_present', + ] + + _has_required_fields = True + + def __init__(self, + owner=None, + title=None, + revision=None, + mime_type=None): + self._owner_value = None + self._owner_present = False + self._title_value = None + self._title_present = False + self._revision_value = None + self._revision_present = False + self._mime_type_value = None + self._mime_type_present = False + if owner is not None: + self.owner = owner + if title is not None: + self.title = title + if revision is not None: + self.revision = revision + if mime_type is not None: + self.mime_type = mime_type + + @property + def owner(self): + """ + The Paper doc owner's email address. + + :rtype: str + """ + if self._owner_present: + return self._owner_value + else: + raise AttributeError("missing required field 'owner'") + + @owner.setter + def owner(self, val): + val = self._owner_validator.validate(val) + self._owner_value = val + self._owner_present = True + + @owner.deleter + def owner(self): + self._owner_value = None + self._owner_present = False + + @property + def title(self): + """ + The Paper doc title. + + :rtype: str + """ + if self._title_present: + return self._title_value + else: + raise AttributeError("missing required field 'title'") + + @title.setter + def title(self, val): + val = self._title_validator.validate(val) + self._title_value = val + self._title_present = True + + @title.deleter + def title(self): + self._title_value = None + self._title_present = False + + @property + def revision(self): + """ + The Paper doc revision. Simply an ever increasing number. + + :rtype: int + """ + if self._revision_present: + return self._revision_value + else: + raise AttributeError("missing required field 'revision'") + + @revision.setter + def revision(self, val): + val = self._revision_validator.validate(val) + self._revision_value = val + self._revision_present = True + + @revision.deleter + def revision(self): + self._revision_value = None + self._revision_present = False + + @property + def mime_type(self): + """ + MIME type of the export. This corresponds to :class:`ExportFormat` + specified in the request. + + :rtype: str + """ + if self._mime_type_present: + return self._mime_type_value + else: + raise AttributeError("missing required field 'mime_type'") + + @mime_type.setter + def mime_type(self, val): + val = self._mime_type_validator.validate(val) + self._mime_type_value = val + self._mime_type_present = True + + @mime_type.deleter + def mime_type(self): + self._mime_type_value = None + self._mime_type_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocExportResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocExportResult(owner={!r}, title={!r}, revision={!r}, mime_type={!r})'.format( + self._owner_value, + self._title_value, + self._revision_value, + self._mime_type_value, + ) + +PaperDocExportResult_validator = bv.Struct(PaperDocExportResult) + +class PaperDocPermissionLevel(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar edit: User will be granted edit permissions. + :ivar view_and_comment: User will be granted view and comment permissions. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + edit = None + # Attribute is overwritten below the class definition + view_and_comment = None + # Attribute is overwritten below the class definition + other = None + + def is_edit(self): + """ + Check if the union tag is ``edit``. + + :rtype: bool + """ + return self._tag == 'edit' + + def is_view_and_comment(self): + """ + Check if the union tag is ``view_and_comment``. + + :rtype: bool + """ + return self._tag == 'view_and_comment' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocPermissionLevel, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocPermissionLevel(%r, %r)' % (self._tag, self._value) + +PaperDocPermissionLevel_validator = bv.Union(PaperDocPermissionLevel) + +class PaperDocSharingPolicy(RefPaperDoc): + """ + :ivar sharing_policy: The default sharing policy to be set for the Paper + doc. + """ + + __slots__ = [ + '_sharing_policy_value', + '_sharing_policy_present', + ] + + _has_required_fields = True + + def __init__(self, + doc_id=None, + sharing_policy=None): + super(PaperDocSharingPolicy, self).__init__(doc_id) + self._sharing_policy_value = None + self._sharing_policy_present = False + if sharing_policy is not None: + self.sharing_policy = sharing_policy + + @property + def sharing_policy(self): + """ + The default sharing policy to be set for the Paper doc. + + :rtype: SharingPolicy + """ + if self._sharing_policy_present: + return self._sharing_policy_value + else: + raise AttributeError("missing required field 'sharing_policy'") + + @sharing_policy.setter + def sharing_policy(self, val): + self._sharing_policy_validator.validate_type_only(val) + self._sharing_policy_value = val + self._sharing_policy_present = True + + @sharing_policy.deleter + def sharing_policy(self): + self._sharing_policy_value = None + self._sharing_policy_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocSharingPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocSharingPolicy(doc_id={!r}, sharing_policy={!r})'.format( + self._doc_id_value, + self._sharing_policy_value, + ) + +PaperDocSharingPolicy_validator = bv.Struct(PaperDocSharingPolicy) + +class PaperDocUpdateArgs(RefPaperDoc): + """ + :ivar doc_update_policy: The policy used for the current update call. + :ivar revision: The latest doc revision. This value must match the head + revision or an error code will be returned. This is to prevent colliding + writes. + :ivar import_format: The format of provided data. + """ + + __slots__ = [ + '_doc_update_policy_value', + '_doc_update_policy_present', + '_revision_value', + '_revision_present', + '_import_format_value', + '_import_format_present', + ] + + _has_required_fields = True + + def __init__(self, + doc_id=None, + doc_update_policy=None, + revision=None, + import_format=None): + super(PaperDocUpdateArgs, self).__init__(doc_id) + self._doc_update_policy_value = None + self._doc_update_policy_present = False + self._revision_value = None + self._revision_present = False + self._import_format_value = None + self._import_format_present = False + if doc_update_policy is not None: + self.doc_update_policy = doc_update_policy + if revision is not None: + self.revision = revision + if import_format is not None: + self.import_format = import_format + + @property + def doc_update_policy(self): + """ + The policy used for the current update call. + + :rtype: PaperDocUpdatePolicy + """ + if self._doc_update_policy_present: + return self._doc_update_policy_value + else: + raise AttributeError("missing required field 'doc_update_policy'") + + @doc_update_policy.setter + def doc_update_policy(self, val): + self._doc_update_policy_validator.validate_type_only(val) + self._doc_update_policy_value = val + self._doc_update_policy_present = True + + @doc_update_policy.deleter + def doc_update_policy(self): + self._doc_update_policy_value = None + self._doc_update_policy_present = False + + @property + def revision(self): + """ + The latest doc revision. This value must match the head revision or an + error code will be returned. This is to prevent colliding writes. + + :rtype: int + """ + if self._revision_present: + return self._revision_value + else: + raise AttributeError("missing required field 'revision'") + + @revision.setter + def revision(self, val): + val = self._revision_validator.validate(val) + self._revision_value = val + self._revision_present = True + + @revision.deleter + def revision(self): + self._revision_value = None + self._revision_present = False + + @property + def import_format(self): + """ + The format of provided data. + + :rtype: ImportFormat + """ + if self._import_format_present: + return self._import_format_value + else: + raise AttributeError("missing required field 'import_format'") + + @import_format.setter + def import_format(self, val): + self._import_format_validator.validate_type_only(val) + self._import_format_value = val + self._import_format_present = True + + @import_format.deleter + def import_format(self): + self._import_format_value = None + self._import_format_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocUpdateArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocUpdateArgs(doc_id={!r}, doc_update_policy={!r}, revision={!r}, import_format={!r})'.format( + self._doc_id_value, + self._doc_update_policy_value, + self._revision_value, + self._import_format_value, + ) + +PaperDocUpdateArgs_validator = bv.Struct(PaperDocUpdateArgs) + +class PaperDocUpdateError(DocLookupError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar content_malformed: The provided content was malformed and cannot be + imported to Paper. + :ivar revision_mismatch: The provided revision does not match the document + head. + :ivar doc_length_exceeded: The newly created Paper doc would be too large, + split the content into multiple docs. + :ivar image_size_exceeded: The imported document contains an image that is + too large. The current limit is 1MB. Note: This only applies to HTML + with data uri. + :ivar doc_archived: This operation is not allowed on archived Paper docs. + :ivar doc_deleted: This operation is not allowed on deleted Paper docs. + """ + + # Attribute is overwritten below the class definition + content_malformed = None + # Attribute is overwritten below the class definition + revision_mismatch = None + # Attribute is overwritten below the class definition + doc_length_exceeded = None + # Attribute is overwritten below the class definition + image_size_exceeded = None + # Attribute is overwritten below the class definition + doc_archived = None + # Attribute is overwritten below the class definition + doc_deleted = None + + def is_content_malformed(self): + """ + Check if the union tag is ``content_malformed``. + + :rtype: bool + """ + return self._tag == 'content_malformed' + + def is_revision_mismatch(self): + """ + Check if the union tag is ``revision_mismatch``. + + :rtype: bool + """ + return self._tag == 'revision_mismatch' + + def is_doc_length_exceeded(self): + """ + Check if the union tag is ``doc_length_exceeded``. + + :rtype: bool + """ + return self._tag == 'doc_length_exceeded' + + def is_image_size_exceeded(self): + """ + Check if the union tag is ``image_size_exceeded``. + + :rtype: bool + """ + return self._tag == 'image_size_exceeded' + + def is_doc_archived(self): + """ + Check if the union tag is ``doc_archived``. + + :rtype: bool + """ + return self._tag == 'doc_archived' + + def is_doc_deleted(self): + """ + Check if the union tag is ``doc_deleted``. + + :rtype: bool + """ + return self._tag == 'doc_deleted' + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocUpdateError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocUpdateError(%r, %r)' % (self._tag, self._value) + +PaperDocUpdateError_validator = bv.Union(PaperDocUpdateError) + +class PaperDocUpdatePolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar append: The content will be appended to the doc. + :ivar prepend: The content will be prepended to the doc. Note: the doc title + will not be affected. + :ivar overwrite_all: The document will be overwitten at the head with the + provided content. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + append = None + # Attribute is overwritten below the class definition + prepend = None + # Attribute is overwritten below the class definition + overwrite_all = None + # Attribute is overwritten below the class definition + other = None + + def is_append(self): + """ + Check if the union tag is ``append``. + + :rtype: bool + """ + return self._tag == 'append' + + def is_prepend(self): + """ + Check if the union tag is ``prepend``. + + :rtype: bool + """ + return self._tag == 'prepend' + + def is_overwrite_all(self): + """ + Check if the union tag is ``overwrite_all``. + + :rtype: bool + """ + return self._tag == 'overwrite_all' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocUpdatePolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocUpdatePolicy(%r, %r)' % (self._tag, self._value) + +PaperDocUpdatePolicy_validator = bv.Union(PaperDocUpdatePolicy) + +class RemovePaperDocUser(RefPaperDoc): + """ + :ivar member: User which should be removed from the Paper doc. Specify only + email address or Dropbox account ID. + """ + + __slots__ = [ + '_member_value', + '_member_present', + ] + + _has_required_fields = True + + def __init__(self, + doc_id=None, + member=None): + super(RemovePaperDocUser, self).__init__(doc_id) + self._member_value = None + self._member_present = False + if member is not None: + self.member = member + + @property + def member(self): + """ + User which should be removed from the Paper doc. Specify only email + address or Dropbox account ID. + + :rtype: sharing.MemberSelector + """ + if self._member_present: + return self._member_value + else: + raise AttributeError("missing required field 'member'") + + @member.setter + def member(self, val): + self._member_validator.validate_type_only(val) + self._member_value = val + self._member_present = True + + @member.deleter + def member(self): + self._member_value = None + self._member_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RemovePaperDocUser, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RemovePaperDocUser(doc_id={!r}, member={!r})'.format( + self._doc_id_value, + self._member_value, + ) + +RemovePaperDocUser_validator = bv.Struct(RemovePaperDocUser) + +class SharingPolicy(bb.Struct): + """ + Sharing policy of Paper doc. + + :ivar public_sharing_policy: This value applies to the non-team members. + :ivar team_sharing_policy: This value applies to the team members only. The + value is null for all personal accounts. + """ + + __slots__ = [ + '_public_sharing_policy_value', + '_public_sharing_policy_present', + '_team_sharing_policy_value', + '_team_sharing_policy_present', + ] + + _has_required_fields = False + + def __init__(self, + public_sharing_policy=None, + team_sharing_policy=None): + self._public_sharing_policy_value = None + self._public_sharing_policy_present = False + self._team_sharing_policy_value = None + self._team_sharing_policy_present = False + if public_sharing_policy is not None: + self.public_sharing_policy = public_sharing_policy + if team_sharing_policy is not None: + self.team_sharing_policy = team_sharing_policy + + @property + def public_sharing_policy(self): + """ + This value applies to the non-team members. + + :rtype: SharingPublicPolicyType + """ + if self._public_sharing_policy_present: + return self._public_sharing_policy_value + else: + return None + + @public_sharing_policy.setter + def public_sharing_policy(self, val): + if val is None: + del self.public_sharing_policy + return + self._public_sharing_policy_validator.validate_type_only(val) + self._public_sharing_policy_value = val + self._public_sharing_policy_present = True + + @public_sharing_policy.deleter + def public_sharing_policy(self): + self._public_sharing_policy_value = None + self._public_sharing_policy_present = False + + @property + def team_sharing_policy(self): + """ + This value applies to the team members only. The value is null for all + personal accounts. + + :rtype: SharingTeamPolicyType + """ + if self._team_sharing_policy_present: + return self._team_sharing_policy_value + else: + return None + + @team_sharing_policy.setter + def team_sharing_policy(self, val): + if val is None: + del self.team_sharing_policy + return + self._team_sharing_policy_validator.validate_type_only(val) + self._team_sharing_policy_value = val + self._team_sharing_policy_present = True + + @team_sharing_policy.deleter + def team_sharing_policy(self): + self._team_sharing_policy_value = None + self._team_sharing_policy_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharingPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharingPolicy(public_sharing_policy={!r}, team_sharing_policy={!r})'.format( + self._public_sharing_policy_value, + self._team_sharing_policy_value, + ) + +SharingPolicy_validator = bv.Struct(SharingPolicy) + +class SharingTeamPolicyType(bb.Union): + """ + The sharing policy type of the Paper doc. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar people_with_link_can_edit: Users who have a link to this doc can edit + it. + :ivar people_with_link_can_view_and_comment: Users who have a link to this + doc can view and comment on it. + :ivar invite_only: Users must be explicitly invited to this doc. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + people_with_link_can_edit = None + # Attribute is overwritten below the class definition + people_with_link_can_view_and_comment = None + # Attribute is overwritten below the class definition + invite_only = None + + def is_people_with_link_can_edit(self): + """ + Check if the union tag is ``people_with_link_can_edit``. + + :rtype: bool + """ + return self._tag == 'people_with_link_can_edit' + + def is_people_with_link_can_view_and_comment(self): + """ + Check if the union tag is ``people_with_link_can_view_and_comment``. + + :rtype: bool + """ + return self._tag == 'people_with_link_can_view_and_comment' + + def is_invite_only(self): + """ + Check if the union tag is ``invite_only``. + + :rtype: bool + """ + return self._tag == 'invite_only' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharingTeamPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharingTeamPolicyType(%r, %r)' % (self._tag, self._value) + +SharingTeamPolicyType_validator = bv.Union(SharingTeamPolicyType) + +class SharingPublicPolicyType(SharingTeamPolicyType): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar disabled: Value used to indicate that doc sharing is enabled only + within team. + """ + + # Attribute is overwritten below the class definition + disabled = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharingPublicPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharingPublicPolicyType(%r, %r)' % (self._tag, self._value) + +SharingPublicPolicyType_validator = bv.Union(SharingPublicPolicyType) + +class UserInfoWithPermissionLevel(bb.Struct): + """ + :ivar user: User shared on the Paper doc. + :ivar permission_level: Permission level for the user. + """ + + __slots__ = [ + '_user_value', + '_user_present', + '_permission_level_value', + '_permission_level_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None, + permission_level=None): + self._user_value = None + self._user_present = False + self._permission_level_value = None + self._permission_level_present = False + if user is not None: + self.user = user + if permission_level is not None: + self.permission_level = permission_level + + @property + def user(self): + """ + User shared on the Paper doc. + + :rtype: sharing.UserInfo + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + @property + def permission_level(self): + """ + Permission level for the user. + + :rtype: PaperDocPermissionLevel + """ + if self._permission_level_present: + return self._permission_level_value + else: + raise AttributeError("missing required field 'permission_level'") + + @permission_level.setter + def permission_level(self, val): + self._permission_level_validator.validate_type_only(val) + self._permission_level_value = val + self._permission_level_present = True + + @permission_level.deleter + def permission_level(self): + self._permission_level_value = None + self._permission_level_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UserInfoWithPermissionLevel, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UserInfoWithPermissionLevel(user={!r}, permission_level={!r})'.format( + self._user_value, + self._permission_level_value, + ) + +UserInfoWithPermissionLevel_validator = bv.Struct(UserInfoWithPermissionLevel) + +class UserOnPaperDocFilter(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar visited: all users who have visited the Paper doc. + :ivar shared: All uses who are shared on the Paper doc. This includes all + users who have visited the Paper doc as well as those who have not. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + visited = None + # Attribute is overwritten below the class definition + shared = None + # Attribute is overwritten below the class definition + other = None + + def is_visited(self): + """ + Check if the union tag is ``visited``. + + :rtype: bool + """ + return self._tag == 'visited' + + def is_shared(self): + """ + Check if the union tag is ``shared``. + + :rtype: bool + """ + return self._tag == 'shared' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(UserOnPaperDocFilter, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UserOnPaperDocFilter(%r, %r)' % (self._tag, self._value) + +UserOnPaperDocFilter_validator = bv.Union(UserOnPaperDocFilter) + +# Paper doc ID. +PaperDocId_validator = bv.String() +AddMember._permission_level_validator = PaperDocPermissionLevel_validator +AddMember._member_validator = sharing.MemberSelector_validator +AddMember._all_field_names_ = set([ + 'permission_level', + 'member', +]) +AddMember._all_fields_ = [ + ('permission_level', AddMember._permission_level_validator), + ('member', AddMember._member_validator), +] + +RefPaperDoc._doc_id_validator = PaperDocId_validator +RefPaperDoc._all_field_names_ = set(['doc_id']) +RefPaperDoc._all_fields_ = [('doc_id', RefPaperDoc._doc_id_validator)] + +AddPaperDocUser._members_validator = bv.List(AddMember_validator, max_items=20) +AddPaperDocUser._custom_message_validator = bv.Nullable(bv.String()) +AddPaperDocUser._quiet_validator = bv.Boolean() +AddPaperDocUser._all_field_names_ = RefPaperDoc._all_field_names_.union(set([ + 'members', + 'custom_message', + 'quiet', +])) +AddPaperDocUser._all_fields_ = RefPaperDoc._all_fields_ + [ + ('members', AddPaperDocUser._members_validator), + ('custom_message', AddPaperDocUser._custom_message_validator), + ('quiet', AddPaperDocUser._quiet_validator), +] + +AddPaperDocUserMemberResult._member_validator = sharing.MemberSelector_validator +AddPaperDocUserMemberResult._result_validator = AddPaperDocUserResult_validator +AddPaperDocUserMemberResult._all_field_names_ = set([ + 'member', + 'result', +]) +AddPaperDocUserMemberResult._all_fields_ = [ + ('member', AddPaperDocUserMemberResult._member_validator), + ('result', AddPaperDocUserMemberResult._result_validator), +] + +AddPaperDocUserResult._success_validator = bv.Void() +AddPaperDocUserResult._unknown_error_validator = bv.Void() +AddPaperDocUserResult._sharing_outside_team_disabled_validator = bv.Void() +AddPaperDocUserResult._daily_limit_reached_validator = bv.Void() +AddPaperDocUserResult._user_is_owner_validator = bv.Void() +AddPaperDocUserResult._failed_user_data_retrieval_validator = bv.Void() +AddPaperDocUserResult._permission_already_granted_validator = bv.Void() +AddPaperDocUserResult._other_validator = bv.Void() +AddPaperDocUserResult._tagmap = { + 'success': AddPaperDocUserResult._success_validator, + 'unknown_error': AddPaperDocUserResult._unknown_error_validator, + 'sharing_outside_team_disabled': AddPaperDocUserResult._sharing_outside_team_disabled_validator, + 'daily_limit_reached': AddPaperDocUserResult._daily_limit_reached_validator, + 'user_is_owner': AddPaperDocUserResult._user_is_owner_validator, + 'failed_user_data_retrieval': AddPaperDocUserResult._failed_user_data_retrieval_validator, + 'permission_already_granted': AddPaperDocUserResult._permission_already_granted_validator, + 'other': AddPaperDocUserResult._other_validator, +} + +AddPaperDocUserResult.success = AddPaperDocUserResult('success') +AddPaperDocUserResult.unknown_error = AddPaperDocUserResult('unknown_error') +AddPaperDocUserResult.sharing_outside_team_disabled = AddPaperDocUserResult('sharing_outside_team_disabled') +AddPaperDocUserResult.daily_limit_reached = AddPaperDocUserResult('daily_limit_reached') +AddPaperDocUserResult.user_is_owner = AddPaperDocUserResult('user_is_owner') +AddPaperDocUserResult.failed_user_data_retrieval = AddPaperDocUserResult('failed_user_data_retrieval') +AddPaperDocUserResult.permission_already_granted = AddPaperDocUserResult('permission_already_granted') +AddPaperDocUserResult.other = AddPaperDocUserResult('other') + +Cursor._value_validator = bv.String() +Cursor._expiration_validator = bv.Nullable(common.DropboxTimestamp_validator) +Cursor._all_field_names_ = set([ + 'value', + 'expiration', +]) +Cursor._all_fields_ = [ + ('value', Cursor._value_validator), + ('expiration', Cursor._expiration_validator), +] + +PaperApiBaseError._insufficient_permissions_validator = bv.Void() +PaperApiBaseError._other_validator = bv.Void() +PaperApiBaseError._tagmap = { + 'insufficient_permissions': PaperApiBaseError._insufficient_permissions_validator, + 'other': PaperApiBaseError._other_validator, +} + +PaperApiBaseError.insufficient_permissions = PaperApiBaseError('insufficient_permissions') +PaperApiBaseError.other = PaperApiBaseError('other') + +DocLookupError._doc_not_found_validator = bv.Void() +DocLookupError._tagmap = { + 'doc_not_found': DocLookupError._doc_not_found_validator, +} +DocLookupError._tagmap.update(PaperApiBaseError._tagmap) + +DocLookupError.doc_not_found = DocLookupError('doc_not_found') + +DocSubscriptionLevel._default_validator = bv.Void() +DocSubscriptionLevel._ignore_validator = bv.Void() +DocSubscriptionLevel._every_validator = bv.Void() +DocSubscriptionLevel._no_email_validator = bv.Void() +DocSubscriptionLevel._tagmap = { + 'default': DocSubscriptionLevel._default_validator, + 'ignore': DocSubscriptionLevel._ignore_validator, + 'every': DocSubscriptionLevel._every_validator, + 'no_email': DocSubscriptionLevel._no_email_validator, +} + +DocSubscriptionLevel.default = DocSubscriptionLevel('default') +DocSubscriptionLevel.ignore = DocSubscriptionLevel('ignore') +DocSubscriptionLevel.every = DocSubscriptionLevel('every') +DocSubscriptionLevel.no_email = DocSubscriptionLevel('no_email') + +ExportFormat._html_validator = bv.Void() +ExportFormat._markdown_validator = bv.Void() +ExportFormat._other_validator = bv.Void() +ExportFormat._tagmap = { + 'html': ExportFormat._html_validator, + 'markdown': ExportFormat._markdown_validator, + 'other': ExportFormat._other_validator, +} + +ExportFormat.html = ExportFormat('html') +ExportFormat.markdown = ExportFormat('markdown') +ExportFormat.other = ExportFormat('other') + +Folder._id_validator = bv.String() +Folder._name_validator = bv.String() +Folder._all_field_names_ = set([ + 'id', + 'name', +]) +Folder._all_fields_ = [ + ('id', Folder._id_validator), + ('name', Folder._name_validator), +] + +FolderSharingPolicyType._team_validator = bv.Void() +FolderSharingPolicyType._invite_only_validator = bv.Void() +FolderSharingPolicyType._tagmap = { + 'team': FolderSharingPolicyType._team_validator, + 'invite_only': FolderSharingPolicyType._invite_only_validator, +} + +FolderSharingPolicyType.team = FolderSharingPolicyType('team') +FolderSharingPolicyType.invite_only = FolderSharingPolicyType('invite_only') + +FolderSubscriptionLevel._none_validator = bv.Void() +FolderSubscriptionLevel._activity_only_validator = bv.Void() +FolderSubscriptionLevel._daily_emails_validator = bv.Void() +FolderSubscriptionLevel._weekly_emails_validator = bv.Void() +FolderSubscriptionLevel._tagmap = { + 'none': FolderSubscriptionLevel._none_validator, + 'activity_only': FolderSubscriptionLevel._activity_only_validator, + 'daily_emails': FolderSubscriptionLevel._daily_emails_validator, + 'weekly_emails': FolderSubscriptionLevel._weekly_emails_validator, +} + +FolderSubscriptionLevel.none = FolderSubscriptionLevel('none') +FolderSubscriptionLevel.activity_only = FolderSubscriptionLevel('activity_only') +FolderSubscriptionLevel.daily_emails = FolderSubscriptionLevel('daily_emails') +FolderSubscriptionLevel.weekly_emails = FolderSubscriptionLevel('weekly_emails') + +FoldersContainingPaperDoc._folder_sharing_policy_type_validator = bv.Nullable(FolderSharingPolicyType_validator) +FoldersContainingPaperDoc._folders_validator = bv.Nullable(bv.List(Folder_validator)) +FoldersContainingPaperDoc._all_field_names_ = set([ + 'folder_sharing_policy_type', + 'folders', +]) +FoldersContainingPaperDoc._all_fields_ = [ + ('folder_sharing_policy_type', FoldersContainingPaperDoc._folder_sharing_policy_type_validator), + ('folders', FoldersContainingPaperDoc._folders_validator), +] + +ImportFormat._html_validator = bv.Void() +ImportFormat._markdown_validator = bv.Void() +ImportFormat._plain_text_validator = bv.Void() +ImportFormat._other_validator = bv.Void() +ImportFormat._tagmap = { + 'html': ImportFormat._html_validator, + 'markdown': ImportFormat._markdown_validator, + 'plain_text': ImportFormat._plain_text_validator, + 'other': ImportFormat._other_validator, +} + +ImportFormat.html = ImportFormat('html') +ImportFormat.markdown = ImportFormat('markdown') +ImportFormat.plain_text = ImportFormat('plain_text') +ImportFormat.other = ImportFormat('other') + +InviteeInfoWithPermissionLevel._invitee_validator = sharing.InviteeInfo_validator +InviteeInfoWithPermissionLevel._permission_level_validator = PaperDocPermissionLevel_validator +InviteeInfoWithPermissionLevel._all_field_names_ = set([ + 'invitee', + 'permission_level', +]) +InviteeInfoWithPermissionLevel._all_fields_ = [ + ('invitee', InviteeInfoWithPermissionLevel._invitee_validator), + ('permission_level', InviteeInfoWithPermissionLevel._permission_level_validator), +] + +ListDocsCursorError._cursor_error_validator = PaperApiCursorError_validator +ListDocsCursorError._other_validator = bv.Void() +ListDocsCursorError._tagmap = { + 'cursor_error': ListDocsCursorError._cursor_error_validator, + 'other': ListDocsCursorError._other_validator, +} + +ListDocsCursorError.other = ListDocsCursorError('other') + +ListPaperDocsArgs._filter_by_validator = ListPaperDocsFilterBy_validator +ListPaperDocsArgs._sort_by_validator = ListPaperDocsSortBy_validator +ListPaperDocsArgs._sort_order_validator = ListPaperDocsSortOrder_validator +ListPaperDocsArgs._limit_validator = bv.Int32(min_value=1, max_value=1000) +ListPaperDocsArgs._all_field_names_ = set([ + 'filter_by', + 'sort_by', + 'sort_order', + 'limit', +]) +ListPaperDocsArgs._all_fields_ = [ + ('filter_by', ListPaperDocsArgs._filter_by_validator), + ('sort_by', ListPaperDocsArgs._sort_by_validator), + ('sort_order', ListPaperDocsArgs._sort_order_validator), + ('limit', ListPaperDocsArgs._limit_validator), +] + +ListPaperDocsContinueArgs._cursor_validator = bv.String() +ListPaperDocsContinueArgs._all_field_names_ = set(['cursor']) +ListPaperDocsContinueArgs._all_fields_ = [('cursor', ListPaperDocsContinueArgs._cursor_validator)] + +ListPaperDocsFilterBy._docs_accessed_validator = bv.Void() +ListPaperDocsFilterBy._docs_created_validator = bv.Void() +ListPaperDocsFilterBy._other_validator = bv.Void() +ListPaperDocsFilterBy._tagmap = { + 'docs_accessed': ListPaperDocsFilterBy._docs_accessed_validator, + 'docs_created': ListPaperDocsFilterBy._docs_created_validator, + 'other': ListPaperDocsFilterBy._other_validator, +} + +ListPaperDocsFilterBy.docs_accessed = ListPaperDocsFilterBy('docs_accessed') +ListPaperDocsFilterBy.docs_created = ListPaperDocsFilterBy('docs_created') +ListPaperDocsFilterBy.other = ListPaperDocsFilterBy('other') + +ListPaperDocsResponse._doc_ids_validator = bv.List(PaperDocId_validator) +ListPaperDocsResponse._cursor_validator = Cursor_validator +ListPaperDocsResponse._has_more_validator = bv.Boolean() +ListPaperDocsResponse._all_field_names_ = set([ + 'doc_ids', + 'cursor', + 'has_more', +]) +ListPaperDocsResponse._all_fields_ = [ + ('doc_ids', ListPaperDocsResponse._doc_ids_validator), + ('cursor', ListPaperDocsResponse._cursor_validator), + ('has_more', ListPaperDocsResponse._has_more_validator), +] + +ListPaperDocsSortBy._accessed_validator = bv.Void() +ListPaperDocsSortBy._modified_validator = bv.Void() +ListPaperDocsSortBy._created_validator = bv.Void() +ListPaperDocsSortBy._other_validator = bv.Void() +ListPaperDocsSortBy._tagmap = { + 'accessed': ListPaperDocsSortBy._accessed_validator, + 'modified': ListPaperDocsSortBy._modified_validator, + 'created': ListPaperDocsSortBy._created_validator, + 'other': ListPaperDocsSortBy._other_validator, +} + +ListPaperDocsSortBy.accessed = ListPaperDocsSortBy('accessed') +ListPaperDocsSortBy.modified = ListPaperDocsSortBy('modified') +ListPaperDocsSortBy.created = ListPaperDocsSortBy('created') +ListPaperDocsSortBy.other = ListPaperDocsSortBy('other') + +ListPaperDocsSortOrder._ascending_validator = bv.Void() +ListPaperDocsSortOrder._descending_validator = bv.Void() +ListPaperDocsSortOrder._other_validator = bv.Void() +ListPaperDocsSortOrder._tagmap = { + 'ascending': ListPaperDocsSortOrder._ascending_validator, + 'descending': ListPaperDocsSortOrder._descending_validator, + 'other': ListPaperDocsSortOrder._other_validator, +} + +ListPaperDocsSortOrder.ascending = ListPaperDocsSortOrder('ascending') +ListPaperDocsSortOrder.descending = ListPaperDocsSortOrder('descending') +ListPaperDocsSortOrder.other = ListPaperDocsSortOrder('other') + +ListUsersCursorError._doc_not_found_validator = bv.Void() +ListUsersCursorError._cursor_error_validator = PaperApiCursorError_validator +ListUsersCursorError._tagmap = { + 'doc_not_found': ListUsersCursorError._doc_not_found_validator, + 'cursor_error': ListUsersCursorError._cursor_error_validator, +} +ListUsersCursorError._tagmap.update(PaperApiBaseError._tagmap) + +ListUsersCursorError.doc_not_found = ListUsersCursorError('doc_not_found') + +ListUsersOnFolderArgs._limit_validator = bv.Int32(min_value=1, max_value=1000) +ListUsersOnFolderArgs._all_field_names_ = RefPaperDoc._all_field_names_.union(set(['limit'])) +ListUsersOnFolderArgs._all_fields_ = RefPaperDoc._all_fields_ + [('limit', ListUsersOnFolderArgs._limit_validator)] + +ListUsersOnFolderContinueArgs._cursor_validator = bv.String() +ListUsersOnFolderContinueArgs._all_field_names_ = RefPaperDoc._all_field_names_.union(set(['cursor'])) +ListUsersOnFolderContinueArgs._all_fields_ = RefPaperDoc._all_fields_ + [('cursor', ListUsersOnFolderContinueArgs._cursor_validator)] + +ListUsersOnFolderResponse._invitees_validator = bv.List(sharing.InviteeInfo_validator) +ListUsersOnFolderResponse._users_validator = bv.List(sharing.UserInfo_validator) +ListUsersOnFolderResponse._cursor_validator = Cursor_validator +ListUsersOnFolderResponse._has_more_validator = bv.Boolean() +ListUsersOnFolderResponse._all_field_names_ = set([ + 'invitees', + 'users', + 'cursor', + 'has_more', +]) +ListUsersOnFolderResponse._all_fields_ = [ + ('invitees', ListUsersOnFolderResponse._invitees_validator), + ('users', ListUsersOnFolderResponse._users_validator), + ('cursor', ListUsersOnFolderResponse._cursor_validator), + ('has_more', ListUsersOnFolderResponse._has_more_validator), +] + +ListUsersOnPaperDocArgs._limit_validator = bv.Int32(min_value=1, max_value=1000) +ListUsersOnPaperDocArgs._filter_by_validator = UserOnPaperDocFilter_validator +ListUsersOnPaperDocArgs._all_field_names_ = RefPaperDoc._all_field_names_.union(set([ + 'limit', + 'filter_by', +])) +ListUsersOnPaperDocArgs._all_fields_ = RefPaperDoc._all_fields_ + [ + ('limit', ListUsersOnPaperDocArgs._limit_validator), + ('filter_by', ListUsersOnPaperDocArgs._filter_by_validator), +] + +ListUsersOnPaperDocContinueArgs._cursor_validator = bv.String() +ListUsersOnPaperDocContinueArgs._all_field_names_ = RefPaperDoc._all_field_names_.union(set(['cursor'])) +ListUsersOnPaperDocContinueArgs._all_fields_ = RefPaperDoc._all_fields_ + [('cursor', ListUsersOnPaperDocContinueArgs._cursor_validator)] + +ListUsersOnPaperDocResponse._invitees_validator = bv.List(InviteeInfoWithPermissionLevel_validator) +ListUsersOnPaperDocResponse._users_validator = bv.List(UserInfoWithPermissionLevel_validator) +ListUsersOnPaperDocResponse._doc_owner_validator = sharing.UserInfo_validator +ListUsersOnPaperDocResponse._cursor_validator = Cursor_validator +ListUsersOnPaperDocResponse._has_more_validator = bv.Boolean() +ListUsersOnPaperDocResponse._all_field_names_ = set([ + 'invitees', + 'users', + 'doc_owner', + 'cursor', + 'has_more', +]) +ListUsersOnPaperDocResponse._all_fields_ = [ + ('invitees', ListUsersOnPaperDocResponse._invitees_validator), + ('users', ListUsersOnPaperDocResponse._users_validator), + ('doc_owner', ListUsersOnPaperDocResponse._doc_owner_validator), + ('cursor', ListUsersOnPaperDocResponse._cursor_validator), + ('has_more', ListUsersOnPaperDocResponse._has_more_validator), +] + +PaperApiCursorError._expired_cursor_validator = bv.Void() +PaperApiCursorError._invalid_cursor_validator = bv.Void() +PaperApiCursorError._wrong_user_in_cursor_validator = bv.Void() +PaperApiCursorError._reset_validator = bv.Void() +PaperApiCursorError._other_validator = bv.Void() +PaperApiCursorError._tagmap = { + 'expired_cursor': PaperApiCursorError._expired_cursor_validator, + 'invalid_cursor': PaperApiCursorError._invalid_cursor_validator, + 'wrong_user_in_cursor': PaperApiCursorError._wrong_user_in_cursor_validator, + 'reset': PaperApiCursorError._reset_validator, + 'other': PaperApiCursorError._other_validator, +} + +PaperApiCursorError.expired_cursor = PaperApiCursorError('expired_cursor') +PaperApiCursorError.invalid_cursor = PaperApiCursorError('invalid_cursor') +PaperApiCursorError.wrong_user_in_cursor = PaperApiCursorError('wrong_user_in_cursor') +PaperApiCursorError.reset = PaperApiCursorError('reset') +PaperApiCursorError.other = PaperApiCursorError('other') + +PaperDocCreateArgs._parent_folder_id_validator = bv.Nullable(bv.String()) +PaperDocCreateArgs._import_format_validator = ImportFormat_validator +PaperDocCreateArgs._all_field_names_ = set([ + 'parent_folder_id', + 'import_format', +]) +PaperDocCreateArgs._all_fields_ = [ + ('parent_folder_id', PaperDocCreateArgs._parent_folder_id_validator), + ('import_format', PaperDocCreateArgs._import_format_validator), +] + +PaperDocCreateError._content_malformed_validator = bv.Void() +PaperDocCreateError._folder_not_found_validator = bv.Void() +PaperDocCreateError._doc_length_exceeded_validator = bv.Void() +PaperDocCreateError._image_size_exceeded_validator = bv.Void() +PaperDocCreateError._tagmap = { + 'content_malformed': PaperDocCreateError._content_malformed_validator, + 'folder_not_found': PaperDocCreateError._folder_not_found_validator, + 'doc_length_exceeded': PaperDocCreateError._doc_length_exceeded_validator, + 'image_size_exceeded': PaperDocCreateError._image_size_exceeded_validator, +} +PaperDocCreateError._tagmap.update(PaperApiBaseError._tagmap) + +PaperDocCreateError.content_malformed = PaperDocCreateError('content_malformed') +PaperDocCreateError.folder_not_found = PaperDocCreateError('folder_not_found') +PaperDocCreateError.doc_length_exceeded = PaperDocCreateError('doc_length_exceeded') +PaperDocCreateError.image_size_exceeded = PaperDocCreateError('image_size_exceeded') + +PaperDocCreateUpdateResult._doc_id_validator = bv.String() +PaperDocCreateUpdateResult._revision_validator = bv.Int64() +PaperDocCreateUpdateResult._title_validator = bv.String() +PaperDocCreateUpdateResult._all_field_names_ = set([ + 'doc_id', + 'revision', + 'title', +]) +PaperDocCreateUpdateResult._all_fields_ = [ + ('doc_id', PaperDocCreateUpdateResult._doc_id_validator), + ('revision', PaperDocCreateUpdateResult._revision_validator), + ('title', PaperDocCreateUpdateResult._title_validator), +] + +PaperDocExport._export_format_validator = ExportFormat_validator +PaperDocExport._all_field_names_ = RefPaperDoc._all_field_names_.union(set(['export_format'])) +PaperDocExport._all_fields_ = RefPaperDoc._all_fields_ + [('export_format', PaperDocExport._export_format_validator)] + +PaperDocExportResult._owner_validator = bv.String() +PaperDocExportResult._title_validator = bv.String() +PaperDocExportResult._revision_validator = bv.Int64() +PaperDocExportResult._mime_type_validator = bv.String() +PaperDocExportResult._all_field_names_ = set([ + 'owner', + 'title', + 'revision', + 'mime_type', +]) +PaperDocExportResult._all_fields_ = [ + ('owner', PaperDocExportResult._owner_validator), + ('title', PaperDocExportResult._title_validator), + ('revision', PaperDocExportResult._revision_validator), + ('mime_type', PaperDocExportResult._mime_type_validator), +] + +PaperDocPermissionLevel._edit_validator = bv.Void() +PaperDocPermissionLevel._view_and_comment_validator = bv.Void() +PaperDocPermissionLevel._other_validator = bv.Void() +PaperDocPermissionLevel._tagmap = { + 'edit': PaperDocPermissionLevel._edit_validator, + 'view_and_comment': PaperDocPermissionLevel._view_and_comment_validator, + 'other': PaperDocPermissionLevel._other_validator, +} + +PaperDocPermissionLevel.edit = PaperDocPermissionLevel('edit') +PaperDocPermissionLevel.view_and_comment = PaperDocPermissionLevel('view_and_comment') +PaperDocPermissionLevel.other = PaperDocPermissionLevel('other') + +PaperDocSharingPolicy._sharing_policy_validator = SharingPolicy_validator +PaperDocSharingPolicy._all_field_names_ = RefPaperDoc._all_field_names_.union(set(['sharing_policy'])) +PaperDocSharingPolicy._all_fields_ = RefPaperDoc._all_fields_ + [('sharing_policy', PaperDocSharingPolicy._sharing_policy_validator)] + +PaperDocUpdateArgs._doc_update_policy_validator = PaperDocUpdatePolicy_validator +PaperDocUpdateArgs._revision_validator = bv.Int64() +PaperDocUpdateArgs._import_format_validator = ImportFormat_validator +PaperDocUpdateArgs._all_field_names_ = RefPaperDoc._all_field_names_.union(set([ + 'doc_update_policy', + 'revision', + 'import_format', +])) +PaperDocUpdateArgs._all_fields_ = RefPaperDoc._all_fields_ + [ + ('doc_update_policy', PaperDocUpdateArgs._doc_update_policy_validator), + ('revision', PaperDocUpdateArgs._revision_validator), + ('import_format', PaperDocUpdateArgs._import_format_validator), +] + +PaperDocUpdateError._content_malformed_validator = bv.Void() +PaperDocUpdateError._revision_mismatch_validator = bv.Void() +PaperDocUpdateError._doc_length_exceeded_validator = bv.Void() +PaperDocUpdateError._image_size_exceeded_validator = bv.Void() +PaperDocUpdateError._doc_archived_validator = bv.Void() +PaperDocUpdateError._doc_deleted_validator = bv.Void() +PaperDocUpdateError._tagmap = { + 'content_malformed': PaperDocUpdateError._content_malformed_validator, + 'revision_mismatch': PaperDocUpdateError._revision_mismatch_validator, + 'doc_length_exceeded': PaperDocUpdateError._doc_length_exceeded_validator, + 'image_size_exceeded': PaperDocUpdateError._image_size_exceeded_validator, + 'doc_archived': PaperDocUpdateError._doc_archived_validator, + 'doc_deleted': PaperDocUpdateError._doc_deleted_validator, +} +PaperDocUpdateError._tagmap.update(DocLookupError._tagmap) + +PaperDocUpdateError.content_malformed = PaperDocUpdateError('content_malformed') +PaperDocUpdateError.revision_mismatch = PaperDocUpdateError('revision_mismatch') +PaperDocUpdateError.doc_length_exceeded = PaperDocUpdateError('doc_length_exceeded') +PaperDocUpdateError.image_size_exceeded = PaperDocUpdateError('image_size_exceeded') +PaperDocUpdateError.doc_archived = PaperDocUpdateError('doc_archived') +PaperDocUpdateError.doc_deleted = PaperDocUpdateError('doc_deleted') + +PaperDocUpdatePolicy._append_validator = bv.Void() +PaperDocUpdatePolicy._prepend_validator = bv.Void() +PaperDocUpdatePolicy._overwrite_all_validator = bv.Void() +PaperDocUpdatePolicy._other_validator = bv.Void() +PaperDocUpdatePolicy._tagmap = { + 'append': PaperDocUpdatePolicy._append_validator, + 'prepend': PaperDocUpdatePolicy._prepend_validator, + 'overwrite_all': PaperDocUpdatePolicy._overwrite_all_validator, + 'other': PaperDocUpdatePolicy._other_validator, +} + +PaperDocUpdatePolicy.append = PaperDocUpdatePolicy('append') +PaperDocUpdatePolicy.prepend = PaperDocUpdatePolicy('prepend') +PaperDocUpdatePolicy.overwrite_all = PaperDocUpdatePolicy('overwrite_all') +PaperDocUpdatePolicy.other = PaperDocUpdatePolicy('other') + +RemovePaperDocUser._member_validator = sharing.MemberSelector_validator +RemovePaperDocUser._all_field_names_ = RefPaperDoc._all_field_names_.union(set(['member'])) +RemovePaperDocUser._all_fields_ = RefPaperDoc._all_fields_ + [('member', RemovePaperDocUser._member_validator)] + +SharingPolicy._public_sharing_policy_validator = bv.Nullable(SharingPublicPolicyType_validator) +SharingPolicy._team_sharing_policy_validator = bv.Nullable(SharingTeamPolicyType_validator) +SharingPolicy._all_field_names_ = set([ + 'public_sharing_policy', + 'team_sharing_policy', +]) +SharingPolicy._all_fields_ = [ + ('public_sharing_policy', SharingPolicy._public_sharing_policy_validator), + ('team_sharing_policy', SharingPolicy._team_sharing_policy_validator), +] + +SharingTeamPolicyType._people_with_link_can_edit_validator = bv.Void() +SharingTeamPolicyType._people_with_link_can_view_and_comment_validator = bv.Void() +SharingTeamPolicyType._invite_only_validator = bv.Void() +SharingTeamPolicyType._tagmap = { + 'people_with_link_can_edit': SharingTeamPolicyType._people_with_link_can_edit_validator, + 'people_with_link_can_view_and_comment': SharingTeamPolicyType._people_with_link_can_view_and_comment_validator, + 'invite_only': SharingTeamPolicyType._invite_only_validator, +} + +SharingTeamPolicyType.people_with_link_can_edit = SharingTeamPolicyType('people_with_link_can_edit') +SharingTeamPolicyType.people_with_link_can_view_and_comment = SharingTeamPolicyType('people_with_link_can_view_and_comment') +SharingTeamPolicyType.invite_only = SharingTeamPolicyType('invite_only') + +SharingPublicPolicyType._disabled_validator = bv.Void() +SharingPublicPolicyType._tagmap = { + 'disabled': SharingPublicPolicyType._disabled_validator, +} +SharingPublicPolicyType._tagmap.update(SharingTeamPolicyType._tagmap) + +SharingPublicPolicyType.disabled = SharingPublicPolicyType('disabled') + +UserInfoWithPermissionLevel._user_validator = sharing.UserInfo_validator +UserInfoWithPermissionLevel._permission_level_validator = PaperDocPermissionLevel_validator +UserInfoWithPermissionLevel._all_field_names_ = set([ + 'user', + 'permission_level', +]) +UserInfoWithPermissionLevel._all_fields_ = [ + ('user', UserInfoWithPermissionLevel._user_validator), + ('permission_level', UserInfoWithPermissionLevel._permission_level_validator), +] + +UserOnPaperDocFilter._visited_validator = bv.Void() +UserOnPaperDocFilter._shared_validator = bv.Void() +UserOnPaperDocFilter._other_validator = bv.Void() +UserOnPaperDocFilter._tagmap = { + 'visited': UserOnPaperDocFilter._visited_validator, + 'shared': UserOnPaperDocFilter._shared_validator, + 'other': UserOnPaperDocFilter._other_validator, +} + +UserOnPaperDocFilter.visited = UserOnPaperDocFilter('visited') +UserOnPaperDocFilter.shared = UserOnPaperDocFilter('shared') +UserOnPaperDocFilter.other = UserOnPaperDocFilter('other') + +docs_archive = bb.Route( + 'docs/archive', + 1, + False, + RefPaperDoc_validator, + bv.Void(), + DocLookupError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +docs_create = bb.Route( + 'docs/create', + 1, + False, + PaperDocCreateArgs_validator, + PaperDocCreateUpdateResult_validator, + PaperDocCreateError_validator, + {'host': u'api', + 'style': u'upload'}, +) +docs_download = bb.Route( + 'docs/download', + 1, + False, + PaperDocExport_validator, + PaperDocExportResult_validator, + DocLookupError_validator, + {'host': u'api', + 'style': u'download'}, +) +docs_folder_users_list = bb.Route( + 'docs/folder_users/list', + 1, + False, + ListUsersOnFolderArgs_validator, + ListUsersOnFolderResponse_validator, + DocLookupError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +docs_folder_users_list_continue = bb.Route( + 'docs/folder_users/list/continue', + 1, + False, + ListUsersOnFolderContinueArgs_validator, + ListUsersOnFolderResponse_validator, + ListUsersCursorError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +docs_get_folder_info = bb.Route( + 'docs/get_folder_info', + 1, + False, + RefPaperDoc_validator, + FoldersContainingPaperDoc_validator, + DocLookupError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +docs_list = bb.Route( + 'docs/list', + 1, + False, + ListPaperDocsArgs_validator, + ListPaperDocsResponse_validator, + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) +docs_list_continue = bb.Route( + 'docs/list/continue', + 1, + False, + ListPaperDocsContinueArgs_validator, + ListPaperDocsResponse_validator, + ListDocsCursorError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +docs_permanently_delete = bb.Route( + 'docs/permanently_delete', + 1, + False, + RefPaperDoc_validator, + bv.Void(), + DocLookupError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +docs_sharing_policy_get = bb.Route( + 'docs/sharing_policy/get', + 1, + False, + RefPaperDoc_validator, + SharingPolicy_validator, + DocLookupError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +docs_sharing_policy_set = bb.Route( + 'docs/sharing_policy/set', + 1, + False, + PaperDocSharingPolicy_validator, + bv.Void(), + DocLookupError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +docs_update = bb.Route( + 'docs/update', + 1, + False, + PaperDocUpdateArgs_validator, + PaperDocCreateUpdateResult_validator, + PaperDocUpdateError_validator, + {'host': u'api', + 'style': u'upload'}, +) +docs_users_add = bb.Route( + 'docs/users/add', + 1, + False, + AddPaperDocUser_validator, + bv.List(AddPaperDocUserMemberResult_validator), + DocLookupError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +docs_users_list = bb.Route( + 'docs/users/list', + 1, + False, + ListUsersOnPaperDocArgs_validator, + ListUsersOnPaperDocResponse_validator, + DocLookupError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +docs_users_list_continue = bb.Route( + 'docs/users/list/continue', + 1, + False, + ListUsersOnPaperDocContinueArgs_validator, + ListUsersOnPaperDocResponse_validator, + ListUsersCursorError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +docs_users_remove = bb.Route( + 'docs/users/remove', + 1, + False, + RemovePaperDocUser_validator, + bv.Void(), + DocLookupError_validator, + {'host': u'api', + 'style': u'rpc'}, +) + +ROUTES = { + 'docs/archive': docs_archive, + 'docs/create': docs_create, + 'docs/download': docs_download, + 'docs/folder_users/list': docs_folder_users_list, + 'docs/folder_users/list/continue': docs_folder_users_list_continue, + 'docs/get_folder_info': docs_get_folder_info, + 'docs/list': docs_list, + 'docs/list/continue': docs_list_continue, + 'docs/permanently_delete': docs_permanently_delete, + 'docs/sharing_policy/get': docs_sharing_policy_get, + 'docs/sharing_policy/set': docs_sharing_policy_set, + 'docs/update': docs_update, + 'docs/users/add': docs_users_add, + 'docs/users/list': docs_users_list, + 'docs/users/list/continue': docs_users_list_continue, + 'docs/users/remove': docs_users_remove, +} + diff --git a/dropbox-script/dropbox/seen_state.py b/dropbox-script/dropbox/seen_state.py new file mode 100644 index 0000000..c1853d4 --- /dev/null +++ b/dropbox-script/dropbox/seen_state.py @@ -0,0 +1,110 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# @generated +# flake8: noqa +# pylint: skip-file +try: + from . import stone_validators as bv + from . import stone_base as bb +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bv + import stone_base as bb + +class PlatformType(bb.Union): + """ + Possible platforms on which a user may view content. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar web: The content was viewed on the web. + :ivar mobile: The content was viewed on a mobile client. + :ivar desktop: The content was viewed on a desktop client. + :ivar unknown: The content was viewed on an unknown platform. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + web = None + # Attribute is overwritten below the class definition + mobile = None + # Attribute is overwritten below the class definition + desktop = None + # Attribute is overwritten below the class definition + unknown = None + # Attribute is overwritten below the class definition + other = None + + def is_web(self): + """ + Check if the union tag is ``web``. + + :rtype: bool + """ + return self._tag == 'web' + + def is_mobile(self): + """ + Check if the union tag is ``mobile``. + + :rtype: bool + """ + return self._tag == 'mobile' + + def is_desktop(self): + """ + Check if the union tag is ``desktop``. + + :rtype: bool + """ + return self._tag == 'desktop' + + def is_unknown(self): + """ + Check if the union tag is ``unknown``. + + :rtype: bool + """ + return self._tag == 'unknown' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(PlatformType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PlatformType(%r, %r)' % (self._tag, self._value) + +PlatformType_validator = bv.Union(PlatformType) + +PlatformType._web_validator = bv.Void() +PlatformType._mobile_validator = bv.Void() +PlatformType._desktop_validator = bv.Void() +PlatformType._unknown_validator = bv.Void() +PlatformType._other_validator = bv.Void() +PlatformType._tagmap = { + 'web': PlatformType._web_validator, + 'mobile': PlatformType._mobile_validator, + 'desktop': PlatformType._desktop_validator, + 'unknown': PlatformType._unknown_validator, + 'other': PlatformType._other_validator, +} + +PlatformType.web = PlatformType('web') +PlatformType.mobile = PlatformType('mobile') +PlatformType.desktop = PlatformType('desktop') +PlatformType.unknown = PlatformType('unknown') +PlatformType.other = PlatformType('other') + +ROUTES = { +} + diff --git a/dropbox-script/dropbox/session.py b/dropbox-script/dropbox/session.py new file mode 100644 index 0000000..7092f2a --- /dev/null +++ b/dropbox-script/dropbox/session.py @@ -0,0 +1,51 @@ +import pkg_resources +import os +import ssl + +import requests +from requests.adapters import HTTPAdapter +from urllib3.poolmanager import PoolManager + +API_DOMAIN = os.environ.get('DROPBOX_API_DOMAIN', + os.environ.get('DROPBOX_DOMAIN', '.dropboxapi.com')) + +WEB_DOMAIN = os.environ.get('DROPBOX_WEB_DOMAIN', + os.environ.get('DROPBOX_DOMAIN', '.dropbox.com')) + +# Default short hostname for RPC-style routes. +HOST_API = 'api' + +# Default short hostname for upload and download-style routes. +HOST_CONTENT = 'content' + +# Default short hostname for longpoll routes. +HOST_NOTIFY = 'notify' + +# Default short hostname for the Drobox website. +HOST_WWW = 'www' + +API_HOST = os.environ.get('DROPBOX_API_HOST', HOST_API + API_DOMAIN) +API_CONTENT_HOST = os.environ.get('DROPBOX_API_CONTENT_HOST', HOST_CONTENT + API_DOMAIN) +API_NOTIFICATION_HOST = os.environ.get('DROPBOX_API_NOTIFY_HOST', HOST_NOTIFY + API_DOMAIN) +WEB_HOST = os.environ.get('DROPBOX_WEB_HOST', HOST_WWW + WEB_DOMAIN) + +_TRUSTED_CERT_FILE = pkg_resources.resource_filename(__name__, 'trusted-certs.crt') + +# TODO(kelkabany): We probably only want to instantiate this once so that even +# if multiple Dropbox objects are instantiated, they all share the same pool. +class _SSLAdapter(HTTPAdapter): + def init_poolmanager(self, connections, maxsize, block=False, **_): + self.poolmanager = PoolManager( + num_pools=connections, + maxsize=maxsize, + block=block, + cert_reqs=ssl.CERT_REQUIRED, + ca_certs=_TRUSTED_CERT_FILE, + ) + +def pinned_session(pool_maxsize=8): + http_adapter = _SSLAdapter(pool_connections=4, pool_maxsize=pool_maxsize) + _session = requests.session() + _session.mount('https://', http_adapter) + + return _session diff --git a/dropbox-script/dropbox/sharing.py b/dropbox-script/dropbox/sharing.py new file mode 100644 index 0000000..e87a81f --- /dev/null +++ b/dropbox-script/dropbox/sharing.py @@ -0,0 +1,19227 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# @generated +# flake8: noqa +# pylint: skip-file +""" +This namespace contains endpoints and data types for creating and managing shared links and shared folders. +""" + +try: + from . import stone_validators as bv + from . import stone_base as bb +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bv + import stone_base as bb + +try: + from . import ( + async_, + common, + files, + seen_state, + team_common, + users, + users_common, + ) +except (ImportError, SystemError, ValueError): + import async_ + import common + import files + import seen_state + import team_common + import users + import users_common + +class AccessInheritance(bb.Union): + """ + Information about the inheritance policy of a shared folder. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar inherit: The shared folder inherits its members from the parent + folder. + :ivar no_inherit: The shared folder does not inherit its members from the + parent folder. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + inherit = None + # Attribute is overwritten below the class definition + no_inherit = None + # Attribute is overwritten below the class definition + other = None + + def is_inherit(self): + """ + Check if the union tag is ``inherit``. + + :rtype: bool + """ + return self._tag == 'inherit' + + def is_no_inherit(self): + """ + Check if the union tag is ``no_inherit``. + + :rtype: bool + """ + return self._tag == 'no_inherit' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(AccessInheritance, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AccessInheritance(%r, %r)' % (self._tag, self._value) + +AccessInheritance_validator = bv.Union(AccessInheritance) + +class AccessLevel(bb.Union): + """ + Defines the access levels for collaborators. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar owner: The collaborator is the owner of the shared folder. Owners can + view and edit the shared folder as well as set the folder's policies + using :meth:`dropbox.dropbox.Dropbox.sharing_update_folder_policy`. + :ivar editor: The collaborator can both view and edit the shared folder. + :ivar viewer: The collaborator can only view the shared folder. + :ivar viewer_no_comment: The collaborator can only view the shared folder + and does not have any access to comments. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + owner = None + # Attribute is overwritten below the class definition + editor = None + # Attribute is overwritten below the class definition + viewer = None + # Attribute is overwritten below the class definition + viewer_no_comment = None + # Attribute is overwritten below the class definition + other = None + + def is_owner(self): + """ + Check if the union tag is ``owner``. + + :rtype: bool + """ + return self._tag == 'owner' + + def is_editor(self): + """ + Check if the union tag is ``editor``. + + :rtype: bool + """ + return self._tag == 'editor' + + def is_viewer(self): + """ + Check if the union tag is ``viewer``. + + :rtype: bool + """ + return self._tag == 'viewer' + + def is_viewer_no_comment(self): + """ + Check if the union tag is ``viewer_no_comment``. + + :rtype: bool + """ + return self._tag == 'viewer_no_comment' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(AccessLevel, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AccessLevel(%r, %r)' % (self._tag, self._value) + +AccessLevel_validator = bv.Union(AccessLevel) + +class AclUpdatePolicy(bb.Union): + """ + Who can change a shared folder's access control list (ACL). In other words, + who can add, remove, or change the privileges of members. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar owner: Only the owner can update the ACL. + :ivar editors: Any editor can update the ACL. This may be further restricted + to editors on the same team. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + owner = None + # Attribute is overwritten below the class definition + editors = None + # Attribute is overwritten below the class definition + other = None + + def is_owner(self): + """ + Check if the union tag is ``owner``. + + :rtype: bool + """ + return self._tag == 'owner' + + def is_editors(self): + """ + Check if the union tag is ``editors``. + + :rtype: bool + """ + return self._tag == 'editors' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(AclUpdatePolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AclUpdatePolicy(%r, %r)' % (self._tag, self._value) + +AclUpdatePolicy_validator = bv.Union(AclUpdatePolicy) + +class AddFileMemberArgs(bb.Struct): + """ + Arguments for :meth:`dropbox.dropbox.Dropbox.sharing_add_file_member`. + + :ivar file: File to which to add members. + :ivar members: Members to add. Note that even an email address is given, + this may result in a user being directy added to the membership if that + email is the user's main account email. + :ivar custom_message: Message to send to added members in their invitation. + :ivar quiet: Whether added members should be notified via device + notifications of their invitation. + :ivar access_level: AccessLevel union object, describing what access level + we want to give new members. + :ivar add_message_as_comment: If the custom message should be added as a + comment on the file. + """ + + __slots__ = [ + '_file_value', + '_file_present', + '_members_value', + '_members_present', + '_custom_message_value', + '_custom_message_present', + '_quiet_value', + '_quiet_present', + '_access_level_value', + '_access_level_present', + '_add_message_as_comment_value', + '_add_message_as_comment_present', + ] + + _has_required_fields = True + + def __init__(self, + file=None, + members=None, + custom_message=None, + quiet=None, + access_level=None, + add_message_as_comment=None): + self._file_value = None + self._file_present = False + self._members_value = None + self._members_present = False + self._custom_message_value = None + self._custom_message_present = False + self._quiet_value = None + self._quiet_present = False + self._access_level_value = None + self._access_level_present = False + self._add_message_as_comment_value = None + self._add_message_as_comment_present = False + if file is not None: + self.file = file + if members is not None: + self.members = members + if custom_message is not None: + self.custom_message = custom_message + if quiet is not None: + self.quiet = quiet + if access_level is not None: + self.access_level = access_level + if add_message_as_comment is not None: + self.add_message_as_comment = add_message_as_comment + + @property + def file(self): + """ + File to which to add members. + + :rtype: str + """ + if self._file_present: + return self._file_value + else: + raise AttributeError("missing required field 'file'") + + @file.setter + def file(self, val): + val = self._file_validator.validate(val) + self._file_value = val + self._file_present = True + + @file.deleter + def file(self): + self._file_value = None + self._file_present = False + + @property + def members(self): + """ + Members to add. Note that even an email address is given, this may + result in a user being directy added to the membership if that email is + the user's main account email. + + :rtype: list of [MemberSelector] + """ + if self._members_present: + return self._members_value + else: + raise AttributeError("missing required field 'members'") + + @members.setter + def members(self, val): + val = self._members_validator.validate(val) + self._members_value = val + self._members_present = True + + @members.deleter + def members(self): + self._members_value = None + self._members_present = False + + @property + def custom_message(self): + """ + Message to send to added members in their invitation. + + :rtype: str + """ + if self._custom_message_present: + return self._custom_message_value + else: + return None + + @custom_message.setter + def custom_message(self, val): + if val is None: + del self.custom_message + return + val = self._custom_message_validator.validate(val) + self._custom_message_value = val + self._custom_message_present = True + + @custom_message.deleter + def custom_message(self): + self._custom_message_value = None + self._custom_message_present = False + + @property + def quiet(self): + """ + Whether added members should be notified via device notifications of + their invitation. + + :rtype: bool + """ + if self._quiet_present: + return self._quiet_value + else: + return False + + @quiet.setter + def quiet(self, val): + val = self._quiet_validator.validate(val) + self._quiet_value = val + self._quiet_present = True + + @quiet.deleter + def quiet(self): + self._quiet_value = None + self._quiet_present = False + + @property + def access_level(self): + """ + AccessLevel union object, describing what access level we want to give + new members. + + :rtype: AccessLevel + """ + if self._access_level_present: + return self._access_level_value + else: + return AccessLevel.viewer + + @access_level.setter + def access_level(self, val): + self._access_level_validator.validate_type_only(val) + self._access_level_value = val + self._access_level_present = True + + @access_level.deleter + def access_level(self): + self._access_level_value = None + self._access_level_present = False + + @property + def add_message_as_comment(self): + """ + If the custom message should be added as a comment on the file. + + :rtype: bool + """ + if self._add_message_as_comment_present: + return self._add_message_as_comment_value + else: + return False + + @add_message_as_comment.setter + def add_message_as_comment(self, val): + val = self._add_message_as_comment_validator.validate(val) + self._add_message_as_comment_value = val + self._add_message_as_comment_present = True + + @add_message_as_comment.deleter + def add_message_as_comment(self): + self._add_message_as_comment_value = None + self._add_message_as_comment_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AddFileMemberArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AddFileMemberArgs(file={!r}, members={!r}, custom_message={!r}, quiet={!r}, access_level={!r}, add_message_as_comment={!r})'.format( + self._file_value, + self._members_value, + self._custom_message_value, + self._quiet_value, + self._access_level_value, + self._add_message_as_comment_value, + ) + +AddFileMemberArgs_validator = bv.Struct(AddFileMemberArgs) + +class AddFileMemberError(bb.Union): + """ + Errors for :meth:`dropbox.dropbox.Dropbox.sharing_add_file_member`. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar rate_limit: The user has reached the rate limit for invitations. + :ivar invalid_comment: The custom message did not pass comment permissions + checks. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + rate_limit = None + # Attribute is overwritten below the class definition + invalid_comment = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def user_error(cls, val): + """ + Create an instance of this class set to the ``user_error`` tag with + value ``val``. + + :param SharingUserError val: + :rtype: AddFileMemberError + """ + return cls('user_error', val) + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharingFileAccessError val: + :rtype: AddFileMemberError + """ + return cls('access_error', val) + + def is_user_error(self): + """ + Check if the union tag is ``user_error``. + + :rtype: bool + """ + return self._tag == 'user_error' + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_rate_limit(self): + """ + Check if the union tag is ``rate_limit``. + + :rtype: bool + """ + return self._tag == 'rate_limit' + + def is_invalid_comment(self): + """ + Check if the union tag is ``invalid_comment``. + + :rtype: bool + """ + return self._tag == 'invalid_comment' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_user_error(self): + """ + Only call this if :meth:`is_user_error` is true. + + :rtype: SharingUserError + """ + if not self.is_user_error(): + raise AttributeError("tag 'user_error' not set") + return self._value + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharingFileAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(AddFileMemberError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AddFileMemberError(%r, %r)' % (self._tag, self._value) + +AddFileMemberError_validator = bv.Union(AddFileMemberError) + +class AddFolderMemberArg(bb.Struct): + """ + :ivar shared_folder_id: The ID for the shared folder. + :ivar members: The intended list of members to add. Added members will + receive invites to join the shared folder. + :ivar quiet: Whether added members should be notified via email and device + notifications of their invite. + :ivar custom_message: Optional message to display to added members in their + invitation. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + '_members_value', + '_members_present', + '_quiet_value', + '_quiet_present', + '_custom_message_value', + '_custom_message_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None, + members=None, + quiet=None, + custom_message=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._members_value = None + self._members_present = False + self._quiet_value = None + self._quiet_present = False + self._custom_message_value = None + self._custom_message_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if members is not None: + self.members = members + if quiet is not None: + self.quiet = quiet + if custom_message is not None: + self.custom_message = custom_message + + @property + def shared_folder_id(self): + """ + The ID for the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def members(self): + """ + The intended list of members to add. Added members will receive invites + to join the shared folder. + + :rtype: list of [AddMember] + """ + if self._members_present: + return self._members_value + else: + raise AttributeError("missing required field 'members'") + + @members.setter + def members(self, val): + val = self._members_validator.validate(val) + self._members_value = val + self._members_present = True + + @members.deleter + def members(self): + self._members_value = None + self._members_present = False + + @property + def quiet(self): + """ + Whether added members should be notified via email and device + notifications of their invite. + + :rtype: bool + """ + if self._quiet_present: + return self._quiet_value + else: + return False + + @quiet.setter + def quiet(self, val): + val = self._quiet_validator.validate(val) + self._quiet_value = val + self._quiet_present = True + + @quiet.deleter + def quiet(self): + self._quiet_value = None + self._quiet_present = False + + @property + def custom_message(self): + """ + Optional message to display to added members in their invitation. + + :rtype: str + """ + if self._custom_message_present: + return self._custom_message_value + else: + return None + + @custom_message.setter + def custom_message(self, val): + if val is None: + del self.custom_message + return + val = self._custom_message_validator.validate(val) + self._custom_message_value = val + self._custom_message_present = True + + @custom_message.deleter + def custom_message(self): + self._custom_message_value = None + self._custom_message_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AddFolderMemberArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AddFolderMemberArg(shared_folder_id={!r}, members={!r}, quiet={!r}, custom_message={!r})'.format( + self._shared_folder_id_value, + self._members_value, + self._quiet_value, + self._custom_message_value, + ) + +AddFolderMemberArg_validator = bv.Struct(AddFolderMemberArg) + +class AddFolderMemberError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar SharedFolderAccessError access_error: Unable to access shared folder. + :ivar email_unverified: The current user's e-mail address is unverified. + :ivar AddMemberSelectorError bad_member: ``AddFolderMemberArg.members`` + contains a bad invitation recipient. + :ivar cant_share_outside_team: Your team policy does not allow sharing + outside of the team. + :ivar int too_many_members: The value is the member limit that was reached. + :ivar int too_many_pending_invites: The value is the pending invite limit + that was reached. + :ivar rate_limit: The current user has hit the limit of invites they can + send per day. Try again in 24 hours. + :ivar too_many_invitees: The current user is trying to share with too many + people at once. + :ivar insufficient_plan: The current user's account doesn't support this + action. An example of this is when adding a read-only member. This + action can only be performed by users that have upgraded to a Pro or + Business plan. + :ivar team_folder: This action cannot be performed on a team shared folder. + :ivar no_permission: The current user does not have permission to perform + this action. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + email_unverified = None + # Attribute is overwritten below the class definition + cant_share_outside_team = None + # Attribute is overwritten below the class definition + rate_limit = None + # Attribute is overwritten below the class definition + too_many_invitees = None + # Attribute is overwritten below the class definition + insufficient_plan = None + # Attribute is overwritten below the class definition + team_folder = None + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharedFolderAccessError val: + :rtype: AddFolderMemberError + """ + return cls('access_error', val) + + @classmethod + def bad_member(cls, val): + """ + Create an instance of this class set to the ``bad_member`` tag with + value ``val``. + + :param AddMemberSelectorError val: + :rtype: AddFolderMemberError + """ + return cls('bad_member', val) + + @classmethod + def too_many_members(cls, val): + """ + Create an instance of this class set to the ``too_many_members`` tag + with value ``val``. + + :param int val: + :rtype: AddFolderMemberError + """ + return cls('too_many_members', val) + + @classmethod + def too_many_pending_invites(cls, val): + """ + Create an instance of this class set to the ``too_many_pending_invites`` + tag with value ``val``. + + :param int val: + :rtype: AddFolderMemberError + """ + return cls('too_many_pending_invites', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_email_unverified(self): + """ + Check if the union tag is ``email_unverified``. + + :rtype: bool + """ + return self._tag == 'email_unverified' + + def is_bad_member(self): + """ + Check if the union tag is ``bad_member``. + + :rtype: bool + """ + return self._tag == 'bad_member' + + def is_cant_share_outside_team(self): + """ + Check if the union tag is ``cant_share_outside_team``. + + :rtype: bool + """ + return self._tag == 'cant_share_outside_team' + + def is_too_many_members(self): + """ + Check if the union tag is ``too_many_members``. + + :rtype: bool + """ + return self._tag == 'too_many_members' + + def is_too_many_pending_invites(self): + """ + Check if the union tag is ``too_many_pending_invites``. + + :rtype: bool + """ + return self._tag == 'too_many_pending_invites' + + def is_rate_limit(self): + """ + Check if the union tag is ``rate_limit``. + + :rtype: bool + """ + return self._tag == 'rate_limit' + + def is_too_many_invitees(self): + """ + Check if the union tag is ``too_many_invitees``. + + :rtype: bool + """ + return self._tag == 'too_many_invitees' + + def is_insufficient_plan(self): + """ + Check if the union tag is ``insufficient_plan``. + + :rtype: bool + """ + return self._tag == 'insufficient_plan' + + def is_team_folder(self): + """ + Check if the union tag is ``team_folder``. + + :rtype: bool + """ + return self._tag == 'team_folder' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Unable to access shared folder. + + Only call this if :meth:`is_access_error` is true. + + :rtype: SharedFolderAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def get_bad_member(self): + """ + ``AddFolderMemberArg.members`` contains a bad invitation recipient. + + Only call this if :meth:`is_bad_member` is true. + + :rtype: AddMemberSelectorError + """ + if not self.is_bad_member(): + raise AttributeError("tag 'bad_member' not set") + return self._value + + def get_too_many_members(self): + """ + The value is the member limit that was reached. + + Only call this if :meth:`is_too_many_members` is true. + + :rtype: int + """ + if not self.is_too_many_members(): + raise AttributeError("tag 'too_many_members' not set") + return self._value + + def get_too_many_pending_invites(self): + """ + The value is the pending invite limit that was reached. + + Only call this if :meth:`is_too_many_pending_invites` is true. + + :rtype: int + """ + if not self.is_too_many_pending_invites(): + raise AttributeError("tag 'too_many_pending_invites' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(AddFolderMemberError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AddFolderMemberError(%r, %r)' % (self._tag, self._value) + +AddFolderMemberError_validator = bv.Union(AddFolderMemberError) + +class AddMember(bb.Struct): + """ + The member and type of access the member should have when added to a shared + folder. + + :ivar member: The member to add to the shared folder. + :ivar access_level: The access level to grant ``member`` to the shared + folder. ``AccessLevel.owner`` is disallowed. + """ + + __slots__ = [ + '_member_value', + '_member_present', + '_access_level_value', + '_access_level_present', + ] + + _has_required_fields = True + + def __init__(self, + member=None, + access_level=None): + self._member_value = None + self._member_present = False + self._access_level_value = None + self._access_level_present = False + if member is not None: + self.member = member + if access_level is not None: + self.access_level = access_level + + @property + def member(self): + """ + The member to add to the shared folder. + + :rtype: MemberSelector + """ + if self._member_present: + return self._member_value + else: + raise AttributeError("missing required field 'member'") + + @member.setter + def member(self, val): + self._member_validator.validate_type_only(val) + self._member_value = val + self._member_present = True + + @member.deleter + def member(self): + self._member_value = None + self._member_present = False + + @property + def access_level(self): + """ + The access level to grant ``member`` to the shared folder. + ``AccessLevel.owner`` is disallowed. + + :rtype: AccessLevel + """ + if self._access_level_present: + return self._access_level_value + else: + return AccessLevel.viewer + + @access_level.setter + def access_level(self, val): + self._access_level_validator.validate_type_only(val) + self._access_level_value = val + self._access_level_present = True + + @access_level.deleter + def access_level(self): + self._access_level_value = None + self._access_level_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AddMember, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AddMember(member={!r}, access_level={!r})'.format( + self._member_value, + self._access_level_value, + ) + +AddMember_validator = bv.Struct(AddMember) + +class AddMemberSelectorError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar automatic_group: Automatically created groups can only be added to + team folders. + :ivar str invalid_dropbox_id: The value is the ID that could not be + identified. + :ivar str invalid_email: The value is the e-email address that is malformed. + :ivar str unverified_dropbox_id: The value is the ID of the Dropbox user + with an unverified e-mail address. Invite unverified users by e-mail + address instead of by their Dropbox ID. + :ivar group_deleted: At least one of the specified groups in + ``AddFolderMemberArg.members`` is deleted. + :ivar group_not_on_team: Sharing to a group that is not on the current + user's team. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + automatic_group = None + # Attribute is overwritten below the class definition + group_deleted = None + # Attribute is overwritten below the class definition + group_not_on_team = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def invalid_dropbox_id(cls, val): + """ + Create an instance of this class set to the ``invalid_dropbox_id`` tag + with value ``val``. + + :param str val: + :rtype: AddMemberSelectorError + """ + return cls('invalid_dropbox_id', val) + + @classmethod + def invalid_email(cls, val): + """ + Create an instance of this class set to the ``invalid_email`` tag with + value ``val``. + + :param str val: + :rtype: AddMemberSelectorError + """ + return cls('invalid_email', val) + + @classmethod + def unverified_dropbox_id(cls, val): + """ + Create an instance of this class set to the ``unverified_dropbox_id`` + tag with value ``val``. + + :param str val: + :rtype: AddMemberSelectorError + """ + return cls('unverified_dropbox_id', val) + + def is_automatic_group(self): + """ + Check if the union tag is ``automatic_group``. + + :rtype: bool + """ + return self._tag == 'automatic_group' + + def is_invalid_dropbox_id(self): + """ + Check if the union tag is ``invalid_dropbox_id``. + + :rtype: bool + """ + return self._tag == 'invalid_dropbox_id' + + def is_invalid_email(self): + """ + Check if the union tag is ``invalid_email``. + + :rtype: bool + """ + return self._tag == 'invalid_email' + + def is_unverified_dropbox_id(self): + """ + Check if the union tag is ``unverified_dropbox_id``. + + :rtype: bool + """ + return self._tag == 'unverified_dropbox_id' + + def is_group_deleted(self): + """ + Check if the union tag is ``group_deleted``. + + :rtype: bool + """ + return self._tag == 'group_deleted' + + def is_group_not_on_team(self): + """ + Check if the union tag is ``group_not_on_team``. + + :rtype: bool + """ + return self._tag == 'group_not_on_team' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_invalid_dropbox_id(self): + """ + The value is the ID that could not be identified. + + Only call this if :meth:`is_invalid_dropbox_id` is true. + + :rtype: str + """ + if not self.is_invalid_dropbox_id(): + raise AttributeError("tag 'invalid_dropbox_id' not set") + return self._value + + def get_invalid_email(self): + """ + The value is the e-email address that is malformed. + + Only call this if :meth:`is_invalid_email` is true. + + :rtype: str + """ + if not self.is_invalid_email(): + raise AttributeError("tag 'invalid_email' not set") + return self._value + + def get_unverified_dropbox_id(self): + """ + The value is the ID of the Dropbox user with an unverified e-mail + address. Invite unverified users by e-mail address instead of by their + Dropbox ID. + + Only call this if :meth:`is_unverified_dropbox_id` is true. + + :rtype: str + """ + if not self.is_unverified_dropbox_id(): + raise AttributeError("tag 'unverified_dropbox_id' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(AddMemberSelectorError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AddMemberSelectorError(%r, %r)' % (self._tag, self._value) + +AddMemberSelectorError_validator = bv.Union(AddMemberSelectorError) + +class AudienceExceptionContentInfo(bb.Struct): + """ + Information about the content that has a link audience different than that + of this folder. + + :ivar name: The name of the content, which is either a file or a folder. + """ + + __slots__ = [ + '_name_value', + '_name_present', + ] + + _has_required_fields = True + + def __init__(self, + name=None): + self._name_value = None + self._name_present = False + if name is not None: + self.name = name + + @property + def name(self): + """ + The name of the content, which is either a file or a folder. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AudienceExceptionContentInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AudienceExceptionContentInfo(name={!r})'.format( + self._name_value, + ) + +AudienceExceptionContentInfo_validator = bv.Struct(AudienceExceptionContentInfo) + +class AudienceExceptions(bb.Struct): + """ + The total count and truncated list of information of content inside this + folder that has a different audience than the link on this folder. This is + only returned for folders. + + :ivar exceptions: A truncated list of some of the content that is an + exception. The length of this list could be smaller than the count since + it is only a sample but will not be empty as long as count is not 0. + """ + + __slots__ = [ + '_count_value', + '_count_present', + '_exceptions_value', + '_exceptions_present', + ] + + _has_required_fields = True + + def __init__(self, + count=None, + exceptions=None): + self._count_value = None + self._count_present = False + self._exceptions_value = None + self._exceptions_present = False + if count is not None: + self.count = count + if exceptions is not None: + self.exceptions = exceptions + + @property + def count(self): + """ + :rtype: int + """ + if self._count_present: + return self._count_value + else: + raise AttributeError("missing required field 'count'") + + @count.setter + def count(self, val): + val = self._count_validator.validate(val) + self._count_value = val + self._count_present = True + + @count.deleter + def count(self): + self._count_value = None + self._count_present = False + + @property + def exceptions(self): + """ + A truncated list of some of the content that is an exception. The length + of this list could be smaller than the count since it is only a sample + but will not be empty as long as count is not 0. + + :rtype: list of [AudienceExceptionContentInfo] + """ + if self._exceptions_present: + return self._exceptions_value + else: + raise AttributeError("missing required field 'exceptions'") + + @exceptions.setter + def exceptions(self, val): + val = self._exceptions_validator.validate(val) + self._exceptions_value = val + self._exceptions_present = True + + @exceptions.deleter + def exceptions(self): + self._exceptions_value = None + self._exceptions_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AudienceExceptions, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AudienceExceptions(count={!r}, exceptions={!r})'.format( + self._count_value, + self._exceptions_value, + ) + +AudienceExceptions_validator = bv.Struct(AudienceExceptions) + +class AudienceRestrictingSharedFolder(bb.Struct): + """ + Information about the shared folder that prevents the link audience for this + link from being more restrictive. + + :ivar shared_folder_id: The ID of the shared folder. + :ivar name: The name of the shared folder. + :ivar audience: The link audience of the shared folder. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + '_name_value', + '_name_present', + '_audience_value', + '_audience_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None, + name=None, + audience=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._name_value = None + self._name_present = False + self._audience_value = None + self._audience_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if name is not None: + self.name = name + if audience is not None: + self.audience = audience + + @property + def shared_folder_id(self): + """ + The ID of the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def name(self): + """ + The name of the shared folder. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def audience(self): + """ + The link audience of the shared folder. + + :rtype: LinkAudience + """ + if self._audience_present: + return self._audience_value + else: + raise AttributeError("missing required field 'audience'") + + @audience.setter + def audience(self, val): + self._audience_validator.validate_type_only(val) + self._audience_value = val + self._audience_present = True + + @audience.deleter + def audience(self): + self._audience_value = None + self._audience_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AudienceRestrictingSharedFolder, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AudienceRestrictingSharedFolder(shared_folder_id={!r}, name={!r}, audience={!r})'.format( + self._shared_folder_id_value, + self._name_value, + self._audience_value, + ) + +AudienceRestrictingSharedFolder_validator = bv.Struct(AudienceRestrictingSharedFolder) + +class ChangeFileMemberAccessArgs(bb.Struct): + """ + Arguments for + :meth:`dropbox.dropbox.Dropbox.sharing_change_file_member_access`. + + :ivar file: File for which we are changing a member's access. + :ivar member: The member whose access we are changing. + :ivar access_level: The new access level for the member. + """ + + __slots__ = [ + '_file_value', + '_file_present', + '_member_value', + '_member_present', + '_access_level_value', + '_access_level_present', + ] + + _has_required_fields = True + + def __init__(self, + file=None, + member=None, + access_level=None): + self._file_value = None + self._file_present = False + self._member_value = None + self._member_present = False + self._access_level_value = None + self._access_level_present = False + if file is not None: + self.file = file + if member is not None: + self.member = member + if access_level is not None: + self.access_level = access_level + + @property + def file(self): + """ + File for which we are changing a member's access. + + :rtype: str + """ + if self._file_present: + return self._file_value + else: + raise AttributeError("missing required field 'file'") + + @file.setter + def file(self, val): + val = self._file_validator.validate(val) + self._file_value = val + self._file_present = True + + @file.deleter + def file(self): + self._file_value = None + self._file_present = False + + @property + def member(self): + """ + The member whose access we are changing. + + :rtype: MemberSelector + """ + if self._member_present: + return self._member_value + else: + raise AttributeError("missing required field 'member'") + + @member.setter + def member(self, val): + self._member_validator.validate_type_only(val) + self._member_value = val + self._member_present = True + + @member.deleter + def member(self): + self._member_value = None + self._member_present = False + + @property + def access_level(self): + """ + The new access level for the member. + + :rtype: AccessLevel + """ + if self._access_level_present: + return self._access_level_value + else: + raise AttributeError("missing required field 'access_level'") + + @access_level.setter + def access_level(self, val): + self._access_level_validator.validate_type_only(val) + self._access_level_value = val + self._access_level_present = True + + @access_level.deleter + def access_level(self): + self._access_level_value = None + self._access_level_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ChangeFileMemberAccessArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ChangeFileMemberAccessArgs(file={!r}, member={!r}, access_level={!r})'.format( + self._file_value, + self._member_value, + self._access_level_value, + ) + +ChangeFileMemberAccessArgs_validator = bv.Struct(ChangeFileMemberAccessArgs) + +class LinkMetadata(bb.Struct): + """ + Metadata for a shared link. This can be either a :class:`PathLinkMetadata` + or :class:`CollectionLinkMetadata`. + + :ivar url: URL of the shared link. + :ivar visibility: Who can access the link. + :ivar expires: Expiration time, if set. By default the link won't expire. + """ + + __slots__ = [ + '_url_value', + '_url_present', + '_visibility_value', + '_visibility_present', + '_expires_value', + '_expires_present', + ] + + _has_required_fields = True + + def __init__(self, + url=None, + visibility=None, + expires=None): + self._url_value = None + self._url_present = False + self._visibility_value = None + self._visibility_present = False + self._expires_value = None + self._expires_present = False + if url is not None: + self.url = url + if visibility is not None: + self.visibility = visibility + if expires is not None: + self.expires = expires + + @property + def url(self): + """ + URL of the shared link. + + :rtype: str + """ + if self._url_present: + return self._url_value + else: + raise AttributeError("missing required field 'url'") + + @url.setter + def url(self, val): + val = self._url_validator.validate(val) + self._url_value = val + self._url_present = True + + @url.deleter + def url(self): + self._url_value = None + self._url_present = False + + @property + def visibility(self): + """ + Who can access the link. + + :rtype: Visibility + """ + if self._visibility_present: + return self._visibility_value + else: + raise AttributeError("missing required field 'visibility'") + + @visibility.setter + def visibility(self, val): + self._visibility_validator.validate_type_only(val) + self._visibility_value = val + self._visibility_present = True + + @visibility.deleter + def visibility(self): + self._visibility_value = None + self._visibility_present = False + + @property + def expires(self): + """ + Expiration time, if set. By default the link won't expire. + + :rtype: datetime.datetime + """ + if self._expires_present: + return self._expires_value + else: + return None + + @expires.setter + def expires(self, val): + if val is None: + del self.expires + return + val = self._expires_validator.validate(val) + self._expires_value = val + self._expires_present = True + + @expires.deleter + def expires(self): + self._expires_value = None + self._expires_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(LinkMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LinkMetadata(url={!r}, visibility={!r}, expires={!r})'.format( + self._url_value, + self._visibility_value, + self._expires_value, + ) + +LinkMetadata_validator = bv.StructTree(LinkMetadata) + +class CollectionLinkMetadata(LinkMetadata): + """ + Metadata for a collection-based shared link. + """ + + __slots__ = [ + ] + + _has_required_fields = True + + def __init__(self, + url=None, + visibility=None, + expires=None): + super(CollectionLinkMetadata, self).__init__(url, + visibility, + expires) + + def _process_custom_annotations(self, annotation_type, processor): + super(CollectionLinkMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CollectionLinkMetadata(url={!r}, visibility={!r}, expires={!r})'.format( + self._url_value, + self._visibility_value, + self._expires_value, + ) + +CollectionLinkMetadata_validator = bv.Struct(CollectionLinkMetadata) + +class CreateSharedLinkArg(bb.Struct): + """ + :ivar path: The path to share. + :ivar short_url: Whether to return a shortened URL. + :ivar pending_upload: If it's okay to share a path that does not yet exist, + set this to either ``PendingUploadMode.file`` or + ``PendingUploadMode.folder`` to indicate whether to assume it's a file + or folder. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_short_url_value', + '_short_url_present', + '_pending_upload_value', + '_pending_upload_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + short_url=None, + pending_upload=None): + self._path_value = None + self._path_present = False + self._short_url_value = None + self._short_url_present = False + self._pending_upload_value = None + self._pending_upload_present = False + if path is not None: + self.path = path + if short_url is not None: + self.short_url = short_url + if pending_upload is not None: + self.pending_upload = pending_upload + + @property + def path(self): + """ + The path to share. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def short_url(self): + """ + Whether to return a shortened URL. + + :rtype: bool + """ + if self._short_url_present: + return self._short_url_value + else: + return False + + @short_url.setter + def short_url(self, val): + val = self._short_url_validator.validate(val) + self._short_url_value = val + self._short_url_present = True + + @short_url.deleter + def short_url(self): + self._short_url_value = None + self._short_url_present = False + + @property + def pending_upload(self): + """ + If it's okay to share a path that does not yet exist, set this to either + ``PendingUploadMode.file`` or ``PendingUploadMode.folder`` to indicate + whether to assume it's a file or folder. + + :rtype: PendingUploadMode + """ + if self._pending_upload_present: + return self._pending_upload_value + else: + return None + + @pending_upload.setter + def pending_upload(self, val): + if val is None: + del self.pending_upload + return + self._pending_upload_validator.validate_type_only(val) + self._pending_upload_value = val + self._pending_upload_present = True + + @pending_upload.deleter + def pending_upload(self): + self._pending_upload_value = None + self._pending_upload_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateSharedLinkArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateSharedLinkArg(path={!r}, short_url={!r}, pending_upload={!r})'.format( + self._path_value, + self._short_url_value, + self._pending_upload_value, + ) + +CreateSharedLinkArg_validator = bv.Struct(CreateSharedLinkArg) + +class CreateSharedLinkError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param files.LookupError val: + :rtype: CreateSharedLinkError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: files.LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateSharedLinkError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateSharedLinkError(%r, %r)' % (self._tag, self._value) + +CreateSharedLinkError_validator = bv.Union(CreateSharedLinkError) + +class CreateSharedLinkWithSettingsArg(bb.Struct): + """ + :ivar path: The path to be shared by the shared link. + :ivar settings: The requested settings for the newly created shared link. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_settings_value', + '_settings_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + settings=None): + self._path_value = None + self._path_present = False + self._settings_value = None + self._settings_present = False + if path is not None: + self.path = path + if settings is not None: + self.settings = settings + + @property + def path(self): + """ + The path to be shared by the shared link. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def settings(self): + """ + The requested settings for the newly created shared link. + + :rtype: SharedLinkSettings + """ + if self._settings_present: + return self._settings_value + else: + return None + + @settings.setter + def settings(self, val): + if val is None: + del self.settings + return + self._settings_validator.validate_type_only(val) + self._settings_value = val + self._settings_present = True + + @settings.deleter + def settings(self): + self._settings_value = None + self._settings_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateSharedLinkWithSettingsArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateSharedLinkWithSettingsArg(path={!r}, settings={!r})'.format( + self._path_value, + self._settings_value, + ) + +CreateSharedLinkWithSettingsArg_validator = bv.Struct(CreateSharedLinkWithSettingsArg) + +class CreateSharedLinkWithSettingsError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar email_not_verified: User's email should be verified. + :ivar shared_link_already_exists: The shared link already exists. You can + call :meth:`dropbox.dropbox.Dropbox.sharing_list_shared_links` to get + the existing link. + :ivar SharedLinkSettingsError settings_error: There is an error with the + given settings. + :ivar access_denied: Access to the requested path is forbidden. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + email_not_verified = None + # Attribute is overwritten below the class definition + shared_link_already_exists = None + # Attribute is overwritten below the class definition + access_denied = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param files.LookupError val: + :rtype: CreateSharedLinkWithSettingsError + """ + return cls('path', val) + + @classmethod + def settings_error(cls, val): + """ + Create an instance of this class set to the ``settings_error`` tag with + value ``val``. + + :param SharedLinkSettingsError val: + :rtype: CreateSharedLinkWithSettingsError + """ + return cls('settings_error', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_email_not_verified(self): + """ + Check if the union tag is ``email_not_verified``. + + :rtype: bool + """ + return self._tag == 'email_not_verified' + + def is_shared_link_already_exists(self): + """ + Check if the union tag is ``shared_link_already_exists``. + + :rtype: bool + """ + return self._tag == 'shared_link_already_exists' + + def is_settings_error(self): + """ + Check if the union tag is ``settings_error``. + + :rtype: bool + """ + return self._tag == 'settings_error' + + def is_access_denied(self): + """ + Check if the union tag is ``access_denied``. + + :rtype: bool + """ + return self._tag == 'access_denied' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: files.LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def get_settings_error(self): + """ + There is an error with the given settings. + + Only call this if :meth:`is_settings_error` is true. + + :rtype: SharedLinkSettingsError + """ + if not self.is_settings_error(): + raise AttributeError("tag 'settings_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateSharedLinkWithSettingsError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateSharedLinkWithSettingsError(%r, %r)' % (self._tag, self._value) + +CreateSharedLinkWithSettingsError_validator = bv.Union(CreateSharedLinkWithSettingsError) + +class SharedContentLinkMetadataBase(bb.Struct): + """ + :ivar access_level: The access level on the link for this file. + :ivar audience_options: The audience options that are available for the + content. Some audience options may be unavailable. For example, + team_only may be unavailable if the content is not owned by a user on a + team. The 'default' audience option is always available if the user can + modify link settings. + :ivar audience_restricting_shared_folder: The shared folder that prevents + the link audience for this link from being more restrictive. + :ivar current_audience: The current audience of the link. + :ivar expiry: Whether the link has an expiry set on it. A link with an + expiry will have its audience changed to members when the expiry is + reached. + :ivar link_permissions: A list of permissions for actions you can perform on + the link. + :ivar password_protected: Whether the link is protected by a password. + """ + + __slots__ = [ + '_access_level_value', + '_access_level_present', + '_audience_options_value', + '_audience_options_present', + '_audience_restricting_shared_folder_value', + '_audience_restricting_shared_folder_present', + '_current_audience_value', + '_current_audience_present', + '_expiry_value', + '_expiry_present', + '_link_permissions_value', + '_link_permissions_present', + '_password_protected_value', + '_password_protected_present', + ] + + _has_required_fields = True + + def __init__(self, + audience_options=None, + current_audience=None, + link_permissions=None, + password_protected=None, + access_level=None, + audience_restricting_shared_folder=None, + expiry=None): + self._access_level_value = None + self._access_level_present = False + self._audience_options_value = None + self._audience_options_present = False + self._audience_restricting_shared_folder_value = None + self._audience_restricting_shared_folder_present = False + self._current_audience_value = None + self._current_audience_present = False + self._expiry_value = None + self._expiry_present = False + self._link_permissions_value = None + self._link_permissions_present = False + self._password_protected_value = None + self._password_protected_present = False + if access_level is not None: + self.access_level = access_level + if audience_options is not None: + self.audience_options = audience_options + if audience_restricting_shared_folder is not None: + self.audience_restricting_shared_folder = audience_restricting_shared_folder + if current_audience is not None: + self.current_audience = current_audience + if expiry is not None: + self.expiry = expiry + if link_permissions is not None: + self.link_permissions = link_permissions + if password_protected is not None: + self.password_protected = password_protected + + @property + def access_level(self): + """ + The access level on the link for this file. + + :rtype: AccessLevel + """ + if self._access_level_present: + return self._access_level_value + else: + return None + + @access_level.setter + def access_level(self, val): + if val is None: + del self.access_level + return + self._access_level_validator.validate_type_only(val) + self._access_level_value = val + self._access_level_present = True + + @access_level.deleter + def access_level(self): + self._access_level_value = None + self._access_level_present = False + + @property + def audience_options(self): + """ + The audience options that are available for the content. Some audience + options may be unavailable. For example, team_only may be unavailable if + the content is not owned by a user on a team. The 'default' audience + option is always available if the user can modify link settings. + + :rtype: list of [LinkAudience] + """ + if self._audience_options_present: + return self._audience_options_value + else: + raise AttributeError("missing required field 'audience_options'") + + @audience_options.setter + def audience_options(self, val): + val = self._audience_options_validator.validate(val) + self._audience_options_value = val + self._audience_options_present = True + + @audience_options.deleter + def audience_options(self): + self._audience_options_value = None + self._audience_options_present = False + + @property + def audience_restricting_shared_folder(self): + """ + The shared folder that prevents the link audience for this link from + being more restrictive. + + :rtype: AudienceRestrictingSharedFolder + """ + if self._audience_restricting_shared_folder_present: + return self._audience_restricting_shared_folder_value + else: + return None + + @audience_restricting_shared_folder.setter + def audience_restricting_shared_folder(self, val): + if val is None: + del self.audience_restricting_shared_folder + return + self._audience_restricting_shared_folder_validator.validate_type_only(val) + self._audience_restricting_shared_folder_value = val + self._audience_restricting_shared_folder_present = True + + @audience_restricting_shared_folder.deleter + def audience_restricting_shared_folder(self): + self._audience_restricting_shared_folder_value = None + self._audience_restricting_shared_folder_present = False + + @property + def current_audience(self): + """ + The current audience of the link. + + :rtype: LinkAudience + """ + if self._current_audience_present: + return self._current_audience_value + else: + raise AttributeError("missing required field 'current_audience'") + + @current_audience.setter + def current_audience(self, val): + self._current_audience_validator.validate_type_only(val) + self._current_audience_value = val + self._current_audience_present = True + + @current_audience.deleter + def current_audience(self): + self._current_audience_value = None + self._current_audience_present = False + + @property + def expiry(self): + """ + Whether the link has an expiry set on it. A link with an expiry will + have its audience changed to members when the expiry is reached. + + :rtype: datetime.datetime + """ + if self._expiry_present: + return self._expiry_value + else: + return None + + @expiry.setter + def expiry(self, val): + if val is None: + del self.expiry + return + val = self._expiry_validator.validate(val) + self._expiry_value = val + self._expiry_present = True + + @expiry.deleter + def expiry(self): + self._expiry_value = None + self._expiry_present = False + + @property + def link_permissions(self): + """ + A list of permissions for actions you can perform on the link. + + :rtype: list of [LinkPermission] + """ + if self._link_permissions_present: + return self._link_permissions_value + else: + raise AttributeError("missing required field 'link_permissions'") + + @link_permissions.setter + def link_permissions(self, val): + val = self._link_permissions_validator.validate(val) + self._link_permissions_value = val + self._link_permissions_present = True + + @link_permissions.deleter + def link_permissions(self): + self._link_permissions_value = None + self._link_permissions_present = False + + @property + def password_protected(self): + """ + Whether the link is protected by a password. + + :rtype: bool + """ + if self._password_protected_present: + return self._password_protected_value + else: + raise AttributeError("missing required field 'password_protected'") + + @password_protected.setter + def password_protected(self, val): + val = self._password_protected_validator.validate(val) + self._password_protected_value = val + self._password_protected_present = True + + @password_protected.deleter + def password_protected(self): + self._password_protected_value = None + self._password_protected_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentLinkMetadataBase, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentLinkMetadataBase(audience_options={!r}, current_audience={!r}, link_permissions={!r}, password_protected={!r}, access_level={!r}, audience_restricting_shared_folder={!r}, expiry={!r})'.format( + self._audience_options_value, + self._current_audience_value, + self._link_permissions_value, + self._password_protected_value, + self._access_level_value, + self._audience_restricting_shared_folder_value, + self._expiry_value, + ) + +SharedContentLinkMetadataBase_validator = bv.Struct(SharedContentLinkMetadataBase) + +class ExpectedSharedContentLinkMetadata(SharedContentLinkMetadataBase): + """ + The expected metadata of a shared link for a file or folder when a link is + first created for the content. Absent if the link already exists. + """ + + __slots__ = [ + ] + + _has_required_fields = True + + def __init__(self, + audience_options=None, + current_audience=None, + link_permissions=None, + password_protected=None, + access_level=None, + audience_restricting_shared_folder=None, + expiry=None): + super(ExpectedSharedContentLinkMetadata, self).__init__(audience_options, + current_audience, + link_permissions, + password_protected, + access_level, + audience_restricting_shared_folder, + expiry) + + def _process_custom_annotations(self, annotation_type, processor): + super(ExpectedSharedContentLinkMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ExpectedSharedContentLinkMetadata(audience_options={!r}, current_audience={!r}, link_permissions={!r}, password_protected={!r}, access_level={!r}, audience_restricting_shared_folder={!r}, expiry={!r})'.format( + self._audience_options_value, + self._current_audience_value, + self._link_permissions_value, + self._password_protected_value, + self._access_level_value, + self._audience_restricting_shared_folder_value, + self._expiry_value, + ) + +ExpectedSharedContentLinkMetadata_validator = bv.Struct(ExpectedSharedContentLinkMetadata) + +class FileAction(bb.Union): + """ + Sharing actions that may be taken on files. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar disable_viewer_info: Disable viewer information on the file. + :ivar edit_contents: Change or edit contents of the file. + :ivar enable_viewer_info: Enable viewer information on the file. + :ivar invite_viewer: Add a member with view permissions. + :ivar invite_viewer_no_comment: Add a member with view permissions but no + comment permissions. + :ivar invite_editor: Add a member with edit permissions. + :ivar unshare: Stop sharing this file. + :ivar relinquish_membership: Relinquish one's own membership to the file. + :ivar share_link: Use create_link instead. + :ivar create_link: Create a shared link to the file. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disable_viewer_info = None + # Attribute is overwritten below the class definition + edit_contents = None + # Attribute is overwritten below the class definition + enable_viewer_info = None + # Attribute is overwritten below the class definition + invite_viewer = None + # Attribute is overwritten below the class definition + invite_viewer_no_comment = None + # Attribute is overwritten below the class definition + invite_editor = None + # Attribute is overwritten below the class definition + unshare = None + # Attribute is overwritten below the class definition + relinquish_membership = None + # Attribute is overwritten below the class definition + share_link = None + # Attribute is overwritten below the class definition + create_link = None + # Attribute is overwritten below the class definition + other = None + + def is_disable_viewer_info(self): + """ + Check if the union tag is ``disable_viewer_info``. + + :rtype: bool + """ + return self._tag == 'disable_viewer_info' + + def is_edit_contents(self): + """ + Check if the union tag is ``edit_contents``. + + :rtype: bool + """ + return self._tag == 'edit_contents' + + def is_enable_viewer_info(self): + """ + Check if the union tag is ``enable_viewer_info``. + + :rtype: bool + """ + return self._tag == 'enable_viewer_info' + + def is_invite_viewer(self): + """ + Check if the union tag is ``invite_viewer``. + + :rtype: bool + """ + return self._tag == 'invite_viewer' + + def is_invite_viewer_no_comment(self): + """ + Check if the union tag is ``invite_viewer_no_comment``. + + :rtype: bool + """ + return self._tag == 'invite_viewer_no_comment' + + def is_invite_editor(self): + """ + Check if the union tag is ``invite_editor``. + + :rtype: bool + """ + return self._tag == 'invite_editor' + + def is_unshare(self): + """ + Check if the union tag is ``unshare``. + + :rtype: bool + """ + return self._tag == 'unshare' + + def is_relinquish_membership(self): + """ + Check if the union tag is ``relinquish_membership``. + + :rtype: bool + """ + return self._tag == 'relinquish_membership' + + def is_share_link(self): + """ + Check if the union tag is ``share_link``. + + :rtype: bool + """ + return self._tag == 'share_link' + + def is_create_link(self): + """ + Check if the union tag is ``create_link``. + + :rtype: bool + """ + return self._tag == 'create_link' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(FileAction, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileAction(%r, %r)' % (self._tag, self._value) + +FileAction_validator = bv.Union(FileAction) + +class FileErrorResult(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar str file_not_found_error: File specified by id was not found. + :ivar str invalid_file_action_error: User does not have permission to take + the specified action on the file. + :ivar str permission_denied_error: User does not have permission to access + file specified by file.Id. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def file_not_found_error(cls, val): + """ + Create an instance of this class set to the ``file_not_found_error`` tag + with value ``val``. + + :param str val: + :rtype: FileErrorResult + """ + return cls('file_not_found_error', val) + + @classmethod + def invalid_file_action_error(cls, val): + """ + Create an instance of this class set to the + ``invalid_file_action_error`` tag with value ``val``. + + :param str val: + :rtype: FileErrorResult + """ + return cls('invalid_file_action_error', val) + + @classmethod + def permission_denied_error(cls, val): + """ + Create an instance of this class set to the ``permission_denied_error`` + tag with value ``val``. + + :param str val: + :rtype: FileErrorResult + """ + return cls('permission_denied_error', val) + + def is_file_not_found_error(self): + """ + Check if the union tag is ``file_not_found_error``. + + :rtype: bool + """ + return self._tag == 'file_not_found_error' + + def is_invalid_file_action_error(self): + """ + Check if the union tag is ``invalid_file_action_error``. + + :rtype: bool + """ + return self._tag == 'invalid_file_action_error' + + def is_permission_denied_error(self): + """ + Check if the union tag is ``permission_denied_error``. + + :rtype: bool + """ + return self._tag == 'permission_denied_error' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_file_not_found_error(self): + """ + File specified by id was not found. + + Only call this if :meth:`is_file_not_found_error` is true. + + :rtype: str + """ + if not self.is_file_not_found_error(): + raise AttributeError("tag 'file_not_found_error' not set") + return self._value + + def get_invalid_file_action_error(self): + """ + User does not have permission to take the specified action on the file. + + Only call this if :meth:`is_invalid_file_action_error` is true. + + :rtype: str + """ + if not self.is_invalid_file_action_error(): + raise AttributeError("tag 'invalid_file_action_error' not set") + return self._value + + def get_permission_denied_error(self): + """ + User does not have permission to access file specified by file.Id. + + Only call this if :meth:`is_permission_denied_error` is true. + + :rtype: str + """ + if not self.is_permission_denied_error(): + raise AttributeError("tag 'permission_denied_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(FileErrorResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileErrorResult(%r, %r)' % (self._tag, self._value) + +FileErrorResult_validator = bv.Union(FileErrorResult) + +class SharedLinkMetadata(bb.Struct): + """ + The metadata of a shared link. + + :ivar url: URL of the shared link. + :ivar id: A unique identifier for the linked file. + :ivar name: The linked file name (including extension). This never contains + a slash. + :ivar expires: Expiration time, if set. By default the link won't expire. + :ivar path_lower: The lowercased full path in the user's Dropbox. This + always starts with a slash. This field will only be present only if the + linked file is in the authenticated user's dropbox. + :ivar link_permissions: The link's access permissions. + :ivar team_member_info: The team membership information of the link's owner. + This field will only be present if the link's owner is a team member. + :ivar content_owner_team_info: The team information of the content's owner. + This field will only be present if the content's owner is a team member + and the content's owner team is different from the link's owner team. + """ + + __slots__ = [ + '_url_value', + '_url_present', + '_id_value', + '_id_present', + '_name_value', + '_name_present', + '_expires_value', + '_expires_present', + '_path_lower_value', + '_path_lower_present', + '_link_permissions_value', + '_link_permissions_present', + '_team_member_info_value', + '_team_member_info_present', + '_content_owner_team_info_value', + '_content_owner_team_info_present', + ] + + _has_required_fields = True + + def __init__(self, + url=None, + name=None, + link_permissions=None, + id=None, + expires=None, + path_lower=None, + team_member_info=None, + content_owner_team_info=None): + self._url_value = None + self._url_present = False + self._id_value = None + self._id_present = False + self._name_value = None + self._name_present = False + self._expires_value = None + self._expires_present = False + self._path_lower_value = None + self._path_lower_present = False + self._link_permissions_value = None + self._link_permissions_present = False + self._team_member_info_value = None + self._team_member_info_present = False + self._content_owner_team_info_value = None + self._content_owner_team_info_present = False + if url is not None: + self.url = url + if id is not None: + self.id = id + if name is not None: + self.name = name + if expires is not None: + self.expires = expires + if path_lower is not None: + self.path_lower = path_lower + if link_permissions is not None: + self.link_permissions = link_permissions + if team_member_info is not None: + self.team_member_info = team_member_info + if content_owner_team_info is not None: + self.content_owner_team_info = content_owner_team_info + + @property + def url(self): + """ + URL of the shared link. + + :rtype: str + """ + if self._url_present: + return self._url_value + else: + raise AttributeError("missing required field 'url'") + + @url.setter + def url(self, val): + val = self._url_validator.validate(val) + self._url_value = val + self._url_present = True + + @url.deleter + def url(self): + self._url_value = None + self._url_present = False + + @property + def id(self): + """ + A unique identifier for the linked file. + + :rtype: str + """ + if self._id_present: + return self._id_value + else: + return None + + @id.setter + def id(self, val): + if val is None: + del self.id + return + val = self._id_validator.validate(val) + self._id_value = val + self._id_present = True + + @id.deleter + def id(self): + self._id_value = None + self._id_present = False + + @property + def name(self): + """ + The linked file name (including extension). This never contains a slash. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def expires(self): + """ + Expiration time, if set. By default the link won't expire. + + :rtype: datetime.datetime + """ + if self._expires_present: + return self._expires_value + else: + return None + + @expires.setter + def expires(self, val): + if val is None: + del self.expires + return + val = self._expires_validator.validate(val) + self._expires_value = val + self._expires_present = True + + @expires.deleter + def expires(self): + self._expires_value = None + self._expires_present = False + + @property + def path_lower(self): + """ + The lowercased full path in the user's Dropbox. This always starts with + a slash. This field will only be present only if the linked file is in + the authenticated user's dropbox. + + :rtype: str + """ + if self._path_lower_present: + return self._path_lower_value + else: + return None + + @path_lower.setter + def path_lower(self, val): + if val is None: + del self.path_lower + return + val = self._path_lower_validator.validate(val) + self._path_lower_value = val + self._path_lower_present = True + + @path_lower.deleter + def path_lower(self): + self._path_lower_value = None + self._path_lower_present = False + + @property + def link_permissions(self): + """ + The link's access permissions. + + :rtype: LinkPermissions + """ + if self._link_permissions_present: + return self._link_permissions_value + else: + raise AttributeError("missing required field 'link_permissions'") + + @link_permissions.setter + def link_permissions(self, val): + self._link_permissions_validator.validate_type_only(val) + self._link_permissions_value = val + self._link_permissions_present = True + + @link_permissions.deleter + def link_permissions(self): + self._link_permissions_value = None + self._link_permissions_present = False + + @property + def team_member_info(self): + """ + The team membership information of the link's owner. This field will + only be present if the link's owner is a team member. + + :rtype: TeamMemberInfo + """ + if self._team_member_info_present: + return self._team_member_info_value + else: + return None + + @team_member_info.setter + def team_member_info(self, val): + if val is None: + del self.team_member_info + return + self._team_member_info_validator.validate_type_only(val) + self._team_member_info_value = val + self._team_member_info_present = True + + @team_member_info.deleter + def team_member_info(self): + self._team_member_info_value = None + self._team_member_info_present = False + + @property + def content_owner_team_info(self): + """ + The team information of the content's owner. This field will only be + present if the content's owner is a team member and the content's owner + team is different from the link's owner team. + + :rtype: users.Team + """ + if self._content_owner_team_info_present: + return self._content_owner_team_info_value + else: + return None + + @content_owner_team_info.setter + def content_owner_team_info(self, val): + if val is None: + del self.content_owner_team_info + return + val = self._content_owner_team_info_validator.validate(val) + self._content_owner_team_info_value = val + self._content_owner_team_info_present = True + + @content_owner_team_info.deleter + def content_owner_team_info(self): + self._content_owner_team_info_value = None + self._content_owner_team_info_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkMetadata(url={!r}, name={!r}, link_permissions={!r}, id={!r}, expires={!r}, path_lower={!r}, team_member_info={!r}, content_owner_team_info={!r})'.format( + self._url_value, + self._name_value, + self._link_permissions_value, + self._id_value, + self._expires_value, + self._path_lower_value, + self._team_member_info_value, + self._content_owner_team_info_value, + ) + +SharedLinkMetadata_validator = bv.StructTree(SharedLinkMetadata) + +class FileLinkMetadata(SharedLinkMetadata): + """ + The metadata of a file shared link. + + :ivar client_modified: The modification time set by the desktop client when + the file was added to Dropbox. Since this time is not verified (the + Dropbox server stores whatever the desktop client sends up), this should + only be used for display purposes (such as sorting) and not, for + example, to determine if a file has changed or not. + :ivar server_modified: The last time the file was modified on Dropbox. + :ivar rev: A unique identifier for the current revision of a file. This + field is the same rev as elsewhere in the API and can be used to detect + changes and avoid conflicts. + :ivar size: The file size in bytes. + """ + + __slots__ = [ + '_client_modified_value', + '_client_modified_present', + '_server_modified_value', + '_server_modified_present', + '_rev_value', + '_rev_present', + '_size_value', + '_size_present', + ] + + _has_required_fields = True + + def __init__(self, + url=None, + name=None, + link_permissions=None, + client_modified=None, + server_modified=None, + rev=None, + size=None, + id=None, + expires=None, + path_lower=None, + team_member_info=None, + content_owner_team_info=None): + super(FileLinkMetadata, self).__init__(url, + name, + link_permissions, + id, + expires, + path_lower, + team_member_info, + content_owner_team_info) + self._client_modified_value = None + self._client_modified_present = False + self._server_modified_value = None + self._server_modified_present = False + self._rev_value = None + self._rev_present = False + self._size_value = None + self._size_present = False + if client_modified is not None: + self.client_modified = client_modified + if server_modified is not None: + self.server_modified = server_modified + if rev is not None: + self.rev = rev + if size is not None: + self.size = size + + @property + def client_modified(self): + """ + The modification time set by the desktop client when the file was added + to Dropbox. Since this time is not verified (the Dropbox server stores + whatever the desktop client sends up), this should only be used for + display purposes (such as sorting) and not, for example, to determine if + a file has changed or not. + + :rtype: datetime.datetime + """ + if self._client_modified_present: + return self._client_modified_value + else: + raise AttributeError("missing required field 'client_modified'") + + @client_modified.setter + def client_modified(self, val): + val = self._client_modified_validator.validate(val) + self._client_modified_value = val + self._client_modified_present = True + + @client_modified.deleter + def client_modified(self): + self._client_modified_value = None + self._client_modified_present = False + + @property + def server_modified(self): + """ + The last time the file was modified on Dropbox. + + :rtype: datetime.datetime + """ + if self._server_modified_present: + return self._server_modified_value + else: + raise AttributeError("missing required field 'server_modified'") + + @server_modified.setter + def server_modified(self, val): + val = self._server_modified_validator.validate(val) + self._server_modified_value = val + self._server_modified_present = True + + @server_modified.deleter + def server_modified(self): + self._server_modified_value = None + self._server_modified_present = False + + @property + def rev(self): + """ + A unique identifier for the current revision of a file. This field is + the same rev as elsewhere in the API and can be used to detect changes + and avoid conflicts. + + :rtype: str + """ + if self._rev_present: + return self._rev_value + else: + raise AttributeError("missing required field 'rev'") + + @rev.setter + def rev(self, val): + val = self._rev_validator.validate(val) + self._rev_value = val + self._rev_present = True + + @rev.deleter + def rev(self): + self._rev_value = None + self._rev_present = False + + @property + def size(self): + """ + The file size in bytes. + + :rtype: int + """ + if self._size_present: + return self._size_value + else: + raise AttributeError("missing required field 'size'") + + @size.setter + def size(self, val): + val = self._size_validator.validate(val) + self._size_value = val + self._size_present = True + + @size.deleter + def size(self): + self._size_value = None + self._size_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileLinkMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileLinkMetadata(url={!r}, name={!r}, link_permissions={!r}, client_modified={!r}, server_modified={!r}, rev={!r}, size={!r}, id={!r}, expires={!r}, path_lower={!r}, team_member_info={!r}, content_owner_team_info={!r})'.format( + self._url_value, + self._name_value, + self._link_permissions_value, + self._client_modified_value, + self._server_modified_value, + self._rev_value, + self._size_value, + self._id_value, + self._expires_value, + self._path_lower_value, + self._team_member_info_value, + self._content_owner_team_info_value, + ) + +FileLinkMetadata_validator = bv.Struct(FileLinkMetadata) + +class FileMemberActionError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_member: Specified member was not found. + :ivar no_permission: User does not have permission to perform this action on + this member. + :ivar SharingFileAccessError access_error: Specified file was invalid or + user does not have access. + :ivar MemberAccessLevelResult no_explicit_access: The action cannot be + completed because the target member does not have explicit access to the + file. The return value is the access that the member has to the file + from a parent folder. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_member = None + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharingFileAccessError val: + :rtype: FileMemberActionError + """ + return cls('access_error', val) + + @classmethod + def no_explicit_access(cls, val): + """ + Create an instance of this class set to the ``no_explicit_access`` tag + with value ``val``. + + :param MemberAccessLevelResult val: + :rtype: FileMemberActionError + """ + return cls('no_explicit_access', val) + + def is_invalid_member(self): + """ + Check if the union tag is ``invalid_member``. + + :rtype: bool + """ + return self._tag == 'invalid_member' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_no_explicit_access(self): + """ + Check if the union tag is ``no_explicit_access``. + + :rtype: bool + """ + return self._tag == 'no_explicit_access' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Specified file was invalid or user does not have access. + + Only call this if :meth:`is_access_error` is true. + + :rtype: SharingFileAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def get_no_explicit_access(self): + """ + The action cannot be completed because the target member does not have + explicit access to the file. The return value is the access that the + member has to the file from a parent folder. + + Only call this if :meth:`is_no_explicit_access` is true. + + :rtype: MemberAccessLevelResult + """ + if not self.is_no_explicit_access(): + raise AttributeError("tag 'no_explicit_access' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(FileMemberActionError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileMemberActionError(%r, %r)' % (self._tag, self._value) + +FileMemberActionError_validator = bv.Union(FileMemberActionError) + +class FileMemberActionIndividualResult(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar Optional[AccessLevel] success: Member was successfully removed from + this file. If AccessLevel is given, the member still has access via a + parent shared folder. + :ivar FileMemberActionError member_error: User was not able to perform this + action. + """ + + _catch_all = None + + @classmethod + def success(cls, val): + """ + Create an instance of this class set to the ``success`` tag with value + ``val``. + + :param AccessLevel val: + :rtype: FileMemberActionIndividualResult + """ + return cls('success', val) + + @classmethod + def member_error(cls, val): + """ + Create an instance of this class set to the ``member_error`` tag with + value ``val``. + + :param FileMemberActionError val: + :rtype: FileMemberActionIndividualResult + """ + return cls('member_error', val) + + def is_success(self): + """ + Check if the union tag is ``success``. + + :rtype: bool + """ + return self._tag == 'success' + + def is_member_error(self): + """ + Check if the union tag is ``member_error``. + + :rtype: bool + """ + return self._tag == 'member_error' + + def get_success(self): + """ + Member was successfully removed from this file. If AccessLevel is given, + the member still has access via a parent shared folder. + + Only call this if :meth:`is_success` is true. + + :rtype: AccessLevel + """ + if not self.is_success(): + raise AttributeError("tag 'success' not set") + return self._value + + def get_member_error(self): + """ + User was not able to perform this action. + + Only call this if :meth:`is_member_error` is true. + + :rtype: FileMemberActionError + """ + if not self.is_member_error(): + raise AttributeError("tag 'member_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(FileMemberActionIndividualResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileMemberActionIndividualResult(%r, %r)' % (self._tag, self._value) + +FileMemberActionIndividualResult_validator = bv.Union(FileMemberActionIndividualResult) + +class FileMemberActionResult(bb.Struct): + """ + Per-member result for + :meth:`dropbox.dropbox.Dropbox.sharing_add_file_member` or + :meth:`dropbox.dropbox.Dropbox.sharing_change_file_member_access`. + + :ivar member: One of specified input members. + :ivar result: The outcome of the action on this member. + """ + + __slots__ = [ + '_member_value', + '_member_present', + '_result_value', + '_result_present', + ] + + _has_required_fields = True + + def __init__(self, + member=None, + result=None): + self._member_value = None + self._member_present = False + self._result_value = None + self._result_present = False + if member is not None: + self.member = member + if result is not None: + self.result = result + + @property + def member(self): + """ + One of specified input members. + + :rtype: MemberSelector + """ + if self._member_present: + return self._member_value + else: + raise AttributeError("missing required field 'member'") + + @member.setter + def member(self, val): + self._member_validator.validate_type_only(val) + self._member_value = val + self._member_present = True + + @member.deleter + def member(self): + self._member_value = None + self._member_present = False + + @property + def result(self): + """ + The outcome of the action on this member. + + :rtype: FileMemberActionIndividualResult + """ + if self._result_present: + return self._result_value + else: + raise AttributeError("missing required field 'result'") + + @result.setter + def result(self, val): + self._result_validator.validate_type_only(val) + self._result_value = val + self._result_present = True + + @result.deleter + def result(self): + self._result_value = None + self._result_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileMemberActionResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileMemberActionResult(member={!r}, result={!r})'.format( + self._member_value, + self._result_value, + ) + +FileMemberActionResult_validator = bv.Struct(FileMemberActionResult) + +class FileMemberRemoveActionResult(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar MemberAccessLevelResult success: Member was successfully removed from + this file. + :ivar FileMemberActionError member_error: User was not able to remove this + member. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def success(cls, val): + """ + Create an instance of this class set to the ``success`` tag with value + ``val``. + + :param MemberAccessLevelResult val: + :rtype: FileMemberRemoveActionResult + """ + return cls('success', val) + + @classmethod + def member_error(cls, val): + """ + Create an instance of this class set to the ``member_error`` tag with + value ``val``. + + :param FileMemberActionError val: + :rtype: FileMemberRemoveActionResult + """ + return cls('member_error', val) + + def is_success(self): + """ + Check if the union tag is ``success``. + + :rtype: bool + """ + return self._tag == 'success' + + def is_member_error(self): + """ + Check if the union tag is ``member_error``. + + :rtype: bool + """ + return self._tag == 'member_error' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_success(self): + """ + Member was successfully removed from this file. + + Only call this if :meth:`is_success` is true. + + :rtype: MemberAccessLevelResult + """ + if not self.is_success(): + raise AttributeError("tag 'success' not set") + return self._value + + def get_member_error(self): + """ + User was not able to remove this member. + + Only call this if :meth:`is_member_error` is true. + + :rtype: FileMemberActionError + """ + if not self.is_member_error(): + raise AttributeError("tag 'member_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(FileMemberRemoveActionResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileMemberRemoveActionResult(%r, %r)' % (self._tag, self._value) + +FileMemberRemoveActionResult_validator = bv.Union(FileMemberRemoveActionResult) + +class FilePermission(bb.Struct): + """ + Whether the user is allowed to take the sharing action on the file. + + :ivar action: The action that the user may wish to take on the file. + :ivar allow: True if the user is allowed to take the action. + :ivar reason: The reason why the user is denied the permission. Not present + if the action is allowed. + """ + + __slots__ = [ + '_action_value', + '_action_present', + '_allow_value', + '_allow_present', + '_reason_value', + '_reason_present', + ] + + _has_required_fields = True + + def __init__(self, + action=None, + allow=None, + reason=None): + self._action_value = None + self._action_present = False + self._allow_value = None + self._allow_present = False + self._reason_value = None + self._reason_present = False + if action is not None: + self.action = action + if allow is not None: + self.allow = allow + if reason is not None: + self.reason = reason + + @property + def action(self): + """ + The action that the user may wish to take on the file. + + :rtype: FileAction + """ + if self._action_present: + return self._action_value + else: + raise AttributeError("missing required field 'action'") + + @action.setter + def action(self, val): + self._action_validator.validate_type_only(val) + self._action_value = val + self._action_present = True + + @action.deleter + def action(self): + self._action_value = None + self._action_present = False + + @property + def allow(self): + """ + True if the user is allowed to take the action. + + :rtype: bool + """ + if self._allow_present: + return self._allow_value + else: + raise AttributeError("missing required field 'allow'") + + @allow.setter + def allow(self, val): + val = self._allow_validator.validate(val) + self._allow_value = val + self._allow_present = True + + @allow.deleter + def allow(self): + self._allow_value = None + self._allow_present = False + + @property + def reason(self): + """ + The reason why the user is denied the permission. Not present if the + action is allowed. + + :rtype: PermissionDeniedReason + """ + if self._reason_present: + return self._reason_value + else: + return None + + @reason.setter + def reason(self, val): + if val is None: + del self.reason + return + self._reason_validator.validate_type_only(val) + self._reason_value = val + self._reason_present = True + + @reason.deleter + def reason(self): + self._reason_value = None + self._reason_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FilePermission, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FilePermission(action={!r}, allow={!r}, reason={!r})'.format( + self._action_value, + self._allow_value, + self._reason_value, + ) + +FilePermission_validator = bv.Struct(FilePermission) + +class FolderAction(bb.Union): + """ + Actions that may be taken on shared folders. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar change_options: Change folder options, such as who can be invited to + join the folder. + :ivar disable_viewer_info: Disable viewer information for this folder. + :ivar edit_contents: Change or edit contents of the folder. + :ivar enable_viewer_info: Enable viewer information on the folder. + :ivar invite_editor: Invite a user or group to join the folder with read and + write permission. + :ivar invite_viewer: Invite a user or group to join the folder with read + permission. + :ivar invite_viewer_no_comment: Invite a user or group to join the folder + with read permission but no comment permissions. + :ivar relinquish_membership: Relinquish one's own membership in the folder. + :ivar unmount: Unmount the folder. + :ivar unshare: Stop sharing this folder. + :ivar leave_a_copy: Keep a copy of the contents upon leaving or being kicked + from the folder. + :ivar share_link: Use create_link instead. + :ivar create_link: Create a shared link for folder. + :ivar set_access_inheritance: Set whether the folder inherits permissions + from its parent. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + change_options = None + # Attribute is overwritten below the class definition + disable_viewer_info = None + # Attribute is overwritten below the class definition + edit_contents = None + # Attribute is overwritten below the class definition + enable_viewer_info = None + # Attribute is overwritten below the class definition + invite_editor = None + # Attribute is overwritten below the class definition + invite_viewer = None + # Attribute is overwritten below the class definition + invite_viewer_no_comment = None + # Attribute is overwritten below the class definition + relinquish_membership = None + # Attribute is overwritten below the class definition + unmount = None + # Attribute is overwritten below the class definition + unshare = None + # Attribute is overwritten below the class definition + leave_a_copy = None + # Attribute is overwritten below the class definition + share_link = None + # Attribute is overwritten below the class definition + create_link = None + # Attribute is overwritten below the class definition + set_access_inheritance = None + # Attribute is overwritten below the class definition + other = None + + def is_change_options(self): + """ + Check if the union tag is ``change_options``. + + :rtype: bool + """ + return self._tag == 'change_options' + + def is_disable_viewer_info(self): + """ + Check if the union tag is ``disable_viewer_info``. + + :rtype: bool + """ + return self._tag == 'disable_viewer_info' + + def is_edit_contents(self): + """ + Check if the union tag is ``edit_contents``. + + :rtype: bool + """ + return self._tag == 'edit_contents' + + def is_enable_viewer_info(self): + """ + Check if the union tag is ``enable_viewer_info``. + + :rtype: bool + """ + return self._tag == 'enable_viewer_info' + + def is_invite_editor(self): + """ + Check if the union tag is ``invite_editor``. + + :rtype: bool + """ + return self._tag == 'invite_editor' + + def is_invite_viewer(self): + """ + Check if the union tag is ``invite_viewer``. + + :rtype: bool + """ + return self._tag == 'invite_viewer' + + def is_invite_viewer_no_comment(self): + """ + Check if the union tag is ``invite_viewer_no_comment``. + + :rtype: bool + """ + return self._tag == 'invite_viewer_no_comment' + + def is_relinquish_membership(self): + """ + Check if the union tag is ``relinquish_membership``. + + :rtype: bool + """ + return self._tag == 'relinquish_membership' + + def is_unmount(self): + """ + Check if the union tag is ``unmount``. + + :rtype: bool + """ + return self._tag == 'unmount' + + def is_unshare(self): + """ + Check if the union tag is ``unshare``. + + :rtype: bool + """ + return self._tag == 'unshare' + + def is_leave_a_copy(self): + """ + Check if the union tag is ``leave_a_copy``. + + :rtype: bool + """ + return self._tag == 'leave_a_copy' + + def is_share_link(self): + """ + Check if the union tag is ``share_link``. + + :rtype: bool + """ + return self._tag == 'share_link' + + def is_create_link(self): + """ + Check if the union tag is ``create_link``. + + :rtype: bool + """ + return self._tag == 'create_link' + + def is_set_access_inheritance(self): + """ + Check if the union tag is ``set_access_inheritance``. + + :rtype: bool + """ + return self._tag == 'set_access_inheritance' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(FolderAction, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FolderAction(%r, %r)' % (self._tag, self._value) + +FolderAction_validator = bv.Union(FolderAction) + +class FolderLinkMetadata(SharedLinkMetadata): + """ + The metadata of a folder shared link. + """ + + __slots__ = [ + ] + + _has_required_fields = True + + def __init__(self, + url=None, + name=None, + link_permissions=None, + id=None, + expires=None, + path_lower=None, + team_member_info=None, + content_owner_team_info=None): + super(FolderLinkMetadata, self).__init__(url, + name, + link_permissions, + id, + expires, + path_lower, + team_member_info, + content_owner_team_info) + + def _process_custom_annotations(self, annotation_type, processor): + super(FolderLinkMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FolderLinkMetadata(url={!r}, name={!r}, link_permissions={!r}, id={!r}, expires={!r}, path_lower={!r}, team_member_info={!r}, content_owner_team_info={!r})'.format( + self._url_value, + self._name_value, + self._link_permissions_value, + self._id_value, + self._expires_value, + self._path_lower_value, + self._team_member_info_value, + self._content_owner_team_info_value, + ) + +FolderLinkMetadata_validator = bv.Struct(FolderLinkMetadata) + +class FolderPermission(bb.Struct): + """ + Whether the user is allowed to take the action on the shared folder. + + :ivar action: The action that the user may wish to take on the folder. + :ivar allow: True if the user is allowed to take the action. + :ivar reason: The reason why the user is denied the permission. Not present + if the action is allowed, or if no reason is available. + """ + + __slots__ = [ + '_action_value', + '_action_present', + '_allow_value', + '_allow_present', + '_reason_value', + '_reason_present', + ] + + _has_required_fields = True + + def __init__(self, + action=None, + allow=None, + reason=None): + self._action_value = None + self._action_present = False + self._allow_value = None + self._allow_present = False + self._reason_value = None + self._reason_present = False + if action is not None: + self.action = action + if allow is not None: + self.allow = allow + if reason is not None: + self.reason = reason + + @property + def action(self): + """ + The action that the user may wish to take on the folder. + + :rtype: FolderAction + """ + if self._action_present: + return self._action_value + else: + raise AttributeError("missing required field 'action'") + + @action.setter + def action(self, val): + self._action_validator.validate_type_only(val) + self._action_value = val + self._action_present = True + + @action.deleter + def action(self): + self._action_value = None + self._action_present = False + + @property + def allow(self): + """ + True if the user is allowed to take the action. + + :rtype: bool + """ + if self._allow_present: + return self._allow_value + else: + raise AttributeError("missing required field 'allow'") + + @allow.setter + def allow(self, val): + val = self._allow_validator.validate(val) + self._allow_value = val + self._allow_present = True + + @allow.deleter + def allow(self): + self._allow_value = None + self._allow_present = False + + @property + def reason(self): + """ + The reason why the user is denied the permission. Not present if the + action is allowed, or if no reason is available. + + :rtype: PermissionDeniedReason + """ + if self._reason_present: + return self._reason_value + else: + return None + + @reason.setter + def reason(self, val): + if val is None: + del self.reason + return + self._reason_validator.validate_type_only(val) + self._reason_value = val + self._reason_present = True + + @reason.deleter + def reason(self): + self._reason_value = None + self._reason_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FolderPermission, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FolderPermission(action={!r}, allow={!r}, reason={!r})'.format( + self._action_value, + self._allow_value, + self._reason_value, + ) + +FolderPermission_validator = bv.Struct(FolderPermission) + +class FolderPolicy(bb.Struct): + """ + A set of policies governing membership and privileges for a shared folder. + + :ivar member_policy: Who can be a member of this shared folder, as set on + the folder itself. The effective policy may differ from this value if + the team-wide policy is more restrictive. Present only if the folder is + owned by a team. + :ivar resolved_member_policy: Who can be a member of this shared folder, + taking into account both the folder and the team-wide policy. This value + may differ from that of member_policy if the team-wide policy is more + restrictive than the folder policy. Present only if the folder is owned + by a team. + :ivar acl_update_policy: Who can add and remove members from this shared + folder. + :ivar shared_link_policy: Who links can be shared with. + :ivar viewer_info_policy: Who can enable/disable viewer info for this shared + folder. + """ + + __slots__ = [ + '_member_policy_value', + '_member_policy_present', + '_resolved_member_policy_value', + '_resolved_member_policy_present', + '_acl_update_policy_value', + '_acl_update_policy_present', + '_shared_link_policy_value', + '_shared_link_policy_present', + '_viewer_info_policy_value', + '_viewer_info_policy_present', + ] + + _has_required_fields = True + + def __init__(self, + acl_update_policy=None, + shared_link_policy=None, + member_policy=None, + resolved_member_policy=None, + viewer_info_policy=None): + self._member_policy_value = None + self._member_policy_present = False + self._resolved_member_policy_value = None + self._resolved_member_policy_present = False + self._acl_update_policy_value = None + self._acl_update_policy_present = False + self._shared_link_policy_value = None + self._shared_link_policy_present = False + self._viewer_info_policy_value = None + self._viewer_info_policy_present = False + if member_policy is not None: + self.member_policy = member_policy + if resolved_member_policy is not None: + self.resolved_member_policy = resolved_member_policy + if acl_update_policy is not None: + self.acl_update_policy = acl_update_policy + if shared_link_policy is not None: + self.shared_link_policy = shared_link_policy + if viewer_info_policy is not None: + self.viewer_info_policy = viewer_info_policy + + @property + def member_policy(self): + """ + Who can be a member of this shared folder, as set on the folder itself. + The effective policy may differ from this value if the team-wide policy + is more restrictive. Present only if the folder is owned by a team. + + :rtype: MemberPolicy + """ + if self._member_policy_present: + return self._member_policy_value + else: + return None + + @member_policy.setter + def member_policy(self, val): + if val is None: + del self.member_policy + return + self._member_policy_validator.validate_type_only(val) + self._member_policy_value = val + self._member_policy_present = True + + @member_policy.deleter + def member_policy(self): + self._member_policy_value = None + self._member_policy_present = False + + @property + def resolved_member_policy(self): + """ + Who can be a member of this shared folder, taking into account both the + folder and the team-wide policy. This value may differ from that of + member_policy if the team-wide policy is more restrictive than the + folder policy. Present only if the folder is owned by a team. + + :rtype: MemberPolicy + """ + if self._resolved_member_policy_present: + return self._resolved_member_policy_value + else: + return None + + @resolved_member_policy.setter + def resolved_member_policy(self, val): + if val is None: + del self.resolved_member_policy + return + self._resolved_member_policy_validator.validate_type_only(val) + self._resolved_member_policy_value = val + self._resolved_member_policy_present = True + + @resolved_member_policy.deleter + def resolved_member_policy(self): + self._resolved_member_policy_value = None + self._resolved_member_policy_present = False + + @property + def acl_update_policy(self): + """ + Who can add and remove members from this shared folder. + + :rtype: AclUpdatePolicy + """ + if self._acl_update_policy_present: + return self._acl_update_policy_value + else: + raise AttributeError("missing required field 'acl_update_policy'") + + @acl_update_policy.setter + def acl_update_policy(self, val): + self._acl_update_policy_validator.validate_type_only(val) + self._acl_update_policy_value = val + self._acl_update_policy_present = True + + @acl_update_policy.deleter + def acl_update_policy(self): + self._acl_update_policy_value = None + self._acl_update_policy_present = False + + @property + def shared_link_policy(self): + """ + Who links can be shared with. + + :rtype: SharedLinkPolicy + """ + if self._shared_link_policy_present: + return self._shared_link_policy_value + else: + raise AttributeError("missing required field 'shared_link_policy'") + + @shared_link_policy.setter + def shared_link_policy(self, val): + self._shared_link_policy_validator.validate_type_only(val) + self._shared_link_policy_value = val + self._shared_link_policy_present = True + + @shared_link_policy.deleter + def shared_link_policy(self): + self._shared_link_policy_value = None + self._shared_link_policy_present = False + + @property + def viewer_info_policy(self): + """ + Who can enable/disable viewer info for this shared folder. + + :rtype: ViewerInfoPolicy + """ + if self._viewer_info_policy_present: + return self._viewer_info_policy_value + else: + return None + + @viewer_info_policy.setter + def viewer_info_policy(self, val): + if val is None: + del self.viewer_info_policy + return + self._viewer_info_policy_validator.validate_type_only(val) + self._viewer_info_policy_value = val + self._viewer_info_policy_present = True + + @viewer_info_policy.deleter + def viewer_info_policy(self): + self._viewer_info_policy_value = None + self._viewer_info_policy_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FolderPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FolderPolicy(acl_update_policy={!r}, shared_link_policy={!r}, member_policy={!r}, resolved_member_policy={!r}, viewer_info_policy={!r})'.format( + self._acl_update_policy_value, + self._shared_link_policy_value, + self._member_policy_value, + self._resolved_member_policy_value, + self._viewer_info_policy_value, + ) + +FolderPolicy_validator = bv.Struct(FolderPolicy) + +class GetFileMetadataArg(bb.Struct): + """ + Arguments of :meth:`dropbox.dropbox.Dropbox.sharing_get_file_metadata`. + + :ivar file: The file to query. + :ivar actions: A list of `FileAction`s corresponding to `FilePermission`s + that should appear in the response's ``SharedFileMetadata.permissions`` + field describing the actions the authenticated user can perform on the + file. + """ + + __slots__ = [ + '_file_value', + '_file_present', + '_actions_value', + '_actions_present', + ] + + _has_required_fields = True + + def __init__(self, + file=None, + actions=None): + self._file_value = None + self._file_present = False + self._actions_value = None + self._actions_present = False + if file is not None: + self.file = file + if actions is not None: + self.actions = actions + + @property + def file(self): + """ + The file to query. + + :rtype: str + """ + if self._file_present: + return self._file_value + else: + raise AttributeError("missing required field 'file'") + + @file.setter + def file(self, val): + val = self._file_validator.validate(val) + self._file_value = val + self._file_present = True + + @file.deleter + def file(self): + self._file_value = None + self._file_present = False + + @property + def actions(self): + """ + A list of `FileAction`s corresponding to `FilePermission`s that should + appear in the response's ``SharedFileMetadata.permissions`` field + describing the actions the authenticated user can perform on the file. + + :rtype: list of [FileAction] + """ + if self._actions_present: + return self._actions_value + else: + return None + + @actions.setter + def actions(self, val): + if val is None: + del self.actions + return + val = self._actions_validator.validate(val) + self._actions_value = val + self._actions_present = True + + @actions.deleter + def actions(self): + self._actions_value = None + self._actions_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetFileMetadataArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetFileMetadataArg(file={!r}, actions={!r})'.format( + self._file_value, + self._actions_value, + ) + +GetFileMetadataArg_validator = bv.Struct(GetFileMetadataArg) + +class GetFileMetadataBatchArg(bb.Struct): + """ + Arguments of + :meth:`dropbox.dropbox.Dropbox.sharing_get_file_metadata_batch`. + + :ivar files: The files to query. + :ivar actions: A list of `FileAction`s corresponding to `FilePermission`s + that should appear in the response's ``SharedFileMetadata.permissions`` + field describing the actions the authenticated user can perform on the + file. + """ + + __slots__ = [ + '_files_value', + '_files_present', + '_actions_value', + '_actions_present', + ] + + _has_required_fields = True + + def __init__(self, + files=None, + actions=None): + self._files_value = None + self._files_present = False + self._actions_value = None + self._actions_present = False + if files is not None: + self.files = files + if actions is not None: + self.actions = actions + + @property + def files(self): + """ + The files to query. + + :rtype: list of [str] + """ + if self._files_present: + return self._files_value + else: + raise AttributeError("missing required field 'files'") + + @files.setter + def files(self, val): + val = self._files_validator.validate(val) + self._files_value = val + self._files_present = True + + @files.deleter + def files(self): + self._files_value = None + self._files_present = False + + @property + def actions(self): + """ + A list of `FileAction`s corresponding to `FilePermission`s that should + appear in the response's ``SharedFileMetadata.permissions`` field + describing the actions the authenticated user can perform on the file. + + :rtype: list of [FileAction] + """ + if self._actions_present: + return self._actions_value + else: + return None + + @actions.setter + def actions(self, val): + if val is None: + del self.actions + return + val = self._actions_validator.validate(val) + self._actions_value = val + self._actions_present = True + + @actions.deleter + def actions(self): + self._actions_value = None + self._actions_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetFileMetadataBatchArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetFileMetadataBatchArg(files={!r}, actions={!r})'.format( + self._files_value, + self._actions_value, + ) + +GetFileMetadataBatchArg_validator = bv.Struct(GetFileMetadataBatchArg) + +class GetFileMetadataBatchResult(bb.Struct): + """ + Per file results of + :meth:`dropbox.dropbox.Dropbox.sharing_get_file_metadata_batch`. + + :ivar file: This is the input file identifier corresponding to one of + ``GetFileMetadataBatchArg.files``. + :ivar result: The result for this particular file. + """ + + __slots__ = [ + '_file_value', + '_file_present', + '_result_value', + '_result_present', + ] + + _has_required_fields = True + + def __init__(self, + file=None, + result=None): + self._file_value = None + self._file_present = False + self._result_value = None + self._result_present = False + if file is not None: + self.file = file + if result is not None: + self.result = result + + @property + def file(self): + """ + This is the input file identifier corresponding to one of + ``GetFileMetadataBatchArg.files``. + + :rtype: str + """ + if self._file_present: + return self._file_value + else: + raise AttributeError("missing required field 'file'") + + @file.setter + def file(self, val): + val = self._file_validator.validate(val) + self._file_value = val + self._file_present = True + + @file.deleter + def file(self): + self._file_value = None + self._file_present = False + + @property + def result(self): + """ + The result for this particular file. + + :rtype: GetFileMetadataIndividualResult + """ + if self._result_present: + return self._result_value + else: + raise AttributeError("missing required field 'result'") + + @result.setter + def result(self, val): + self._result_validator.validate_type_only(val) + self._result_value = val + self._result_present = True + + @result.deleter + def result(self): + self._result_value = None + self._result_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetFileMetadataBatchResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetFileMetadataBatchResult(file={!r}, result={!r})'.format( + self._file_value, + self._result_value, + ) + +GetFileMetadataBatchResult_validator = bv.Struct(GetFileMetadataBatchResult) + +class GetFileMetadataError(bb.Union): + """ + Error result for :meth:`dropbox.dropbox.Dropbox.sharing_get_file_metadata`. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def user_error(cls, val): + """ + Create an instance of this class set to the ``user_error`` tag with + value ``val``. + + :param SharingUserError val: + :rtype: GetFileMetadataError + """ + return cls('user_error', val) + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharingFileAccessError val: + :rtype: GetFileMetadataError + """ + return cls('access_error', val) + + def is_user_error(self): + """ + Check if the union tag is ``user_error``. + + :rtype: bool + """ + return self._tag == 'user_error' + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_user_error(self): + """ + Only call this if :meth:`is_user_error` is true. + + :rtype: SharingUserError + """ + if not self.is_user_error(): + raise AttributeError("tag 'user_error' not set") + return self._value + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharingFileAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(GetFileMetadataError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetFileMetadataError(%r, %r)' % (self._tag, self._value) + +GetFileMetadataError_validator = bv.Union(GetFileMetadataError) + +class GetFileMetadataIndividualResult(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar SharedFileMetadata metadata: The result for this file if it was + successful. + :ivar SharingFileAccessError access_error: The result for this file if it + was an error. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def metadata(cls, val): + """ + Create an instance of this class set to the ``metadata`` tag with value + ``val``. + + :param SharedFileMetadata val: + :rtype: GetFileMetadataIndividualResult + """ + return cls('metadata', val) + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharingFileAccessError val: + :rtype: GetFileMetadataIndividualResult + """ + return cls('access_error', val) + + def is_metadata(self): + """ + Check if the union tag is ``metadata``. + + :rtype: bool + """ + return self._tag == 'metadata' + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_metadata(self): + """ + The result for this file if it was successful. + + Only call this if :meth:`is_metadata` is true. + + :rtype: SharedFileMetadata + """ + if not self.is_metadata(): + raise AttributeError("tag 'metadata' not set") + return self._value + + def get_access_error(self): + """ + The result for this file if it was an error. + + Only call this if :meth:`is_access_error` is true. + + :rtype: SharingFileAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(GetFileMetadataIndividualResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetFileMetadataIndividualResult(%r, %r)' % (self._tag, self._value) + +GetFileMetadataIndividualResult_validator = bv.Union(GetFileMetadataIndividualResult) + +class GetMetadataArgs(bb.Struct): + """ + :ivar shared_folder_id: The ID for the shared folder. + :ivar actions: A list of `FolderAction`s corresponding to + `FolderPermission`s that should appear in the response's + ``SharedFolderMetadata.permissions`` field describing the actions the + authenticated user can perform on the folder. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + '_actions_value', + '_actions_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None, + actions=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._actions_value = None + self._actions_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if actions is not None: + self.actions = actions + + @property + def shared_folder_id(self): + """ + The ID for the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def actions(self): + """ + A list of `FolderAction`s corresponding to `FolderPermission`s that + should appear in the response's ``SharedFolderMetadata.permissions`` + field describing the actions the authenticated user can perform on the + folder. + + :rtype: list of [FolderAction] + """ + if self._actions_present: + return self._actions_value + else: + return None + + @actions.setter + def actions(self, val): + if val is None: + del self.actions + return + val = self._actions_validator.validate(val) + self._actions_value = val + self._actions_present = True + + @actions.deleter + def actions(self): + self._actions_value = None + self._actions_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetMetadataArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetMetadataArgs(shared_folder_id={!r}, actions={!r})'.format( + self._shared_folder_id_value, + self._actions_value, + ) + +GetMetadataArgs_validator = bv.Struct(GetMetadataArgs) + +class SharedLinkError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar shared_link_not_found: The shared link wasn't found. + :ivar shared_link_access_denied: The caller is not allowed to access this + shared link. + :ivar unsupported_link_type: This type of link is not supported. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + shared_link_not_found = None + # Attribute is overwritten below the class definition + shared_link_access_denied = None + # Attribute is overwritten below the class definition + unsupported_link_type = None + # Attribute is overwritten below the class definition + other = None + + def is_shared_link_not_found(self): + """ + Check if the union tag is ``shared_link_not_found``. + + :rtype: bool + """ + return self._tag == 'shared_link_not_found' + + def is_shared_link_access_denied(self): + """ + Check if the union tag is ``shared_link_access_denied``. + + :rtype: bool + """ + return self._tag == 'shared_link_access_denied' + + def is_unsupported_link_type(self): + """ + Check if the union tag is ``unsupported_link_type``. + + :rtype: bool + """ + return self._tag == 'unsupported_link_type' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkError(%r, %r)' % (self._tag, self._value) + +SharedLinkError_validator = bv.Union(SharedLinkError) + +class GetSharedLinkFileError(SharedLinkError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar shared_link_is_directory: Directories cannot be retrieved by this + endpoint. + """ + + # Attribute is overwritten below the class definition + shared_link_is_directory = None + + def is_shared_link_is_directory(self): + """ + Check if the union tag is ``shared_link_is_directory``. + + :rtype: bool + """ + return self._tag == 'shared_link_is_directory' + + def _process_custom_annotations(self, annotation_type, processor): + super(GetSharedLinkFileError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetSharedLinkFileError(%r, %r)' % (self._tag, self._value) + +GetSharedLinkFileError_validator = bv.Union(GetSharedLinkFileError) + +class GetSharedLinkMetadataArg(bb.Struct): + """ + :ivar url: URL of the shared link. + :ivar path: If the shared link is to a folder, this parameter can be used to + retrieve the metadata for a specific file or sub-folder in this folder. + A relative path should be used. + :ivar link_password: If the shared link has a password, this parameter can + be used. + """ + + __slots__ = [ + '_url_value', + '_url_present', + '_path_value', + '_path_present', + '_link_password_value', + '_link_password_present', + ] + + _has_required_fields = True + + def __init__(self, + url=None, + path=None, + link_password=None): + self._url_value = None + self._url_present = False + self._path_value = None + self._path_present = False + self._link_password_value = None + self._link_password_present = False + if url is not None: + self.url = url + if path is not None: + self.path = path + if link_password is not None: + self.link_password = link_password + + @property + def url(self): + """ + URL of the shared link. + + :rtype: str + """ + if self._url_present: + return self._url_value + else: + raise AttributeError("missing required field 'url'") + + @url.setter + def url(self, val): + val = self._url_validator.validate(val) + self._url_value = val + self._url_present = True + + @url.deleter + def url(self): + self._url_value = None + self._url_present = False + + @property + def path(self): + """ + If the shared link is to a folder, this parameter can be used to + retrieve the metadata for a specific file or sub-folder in this folder. + A relative path should be used. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + return None + + @path.setter + def path(self, val): + if val is None: + del self.path + return + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def link_password(self): + """ + If the shared link has a password, this parameter can be used. + + :rtype: str + """ + if self._link_password_present: + return self._link_password_value + else: + return None + + @link_password.setter + def link_password(self, val): + if val is None: + del self.link_password + return + val = self._link_password_validator.validate(val) + self._link_password_value = val + self._link_password_present = True + + @link_password.deleter + def link_password(self): + self._link_password_value = None + self._link_password_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetSharedLinkMetadataArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetSharedLinkMetadataArg(url={!r}, path={!r}, link_password={!r})'.format( + self._url_value, + self._path_value, + self._link_password_value, + ) + +GetSharedLinkMetadataArg_validator = bv.Struct(GetSharedLinkMetadataArg) + +class GetSharedLinksArg(bb.Struct): + """ + :ivar path: See :meth:`dropbox.dropbox.Dropbox.sharing_get_shared_links` + description. + """ + + __slots__ = [ + '_path_value', + '_path_present', + ] + + _has_required_fields = False + + def __init__(self, + path=None): + self._path_value = None + self._path_present = False + if path is not None: + self.path = path + + @property + def path(self): + """ + See :meth:`dropbox.dropbox.Dropbox.sharing_get_shared_links` + description. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + return None + + @path.setter + def path(self, val): + if val is None: + del self.path + return + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetSharedLinksArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetSharedLinksArg(path={!r})'.format( + self._path_value, + ) + +GetSharedLinksArg_validator = bv.Struct(GetSharedLinksArg) + +class GetSharedLinksError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param Optional[str] val: + :rtype: GetSharedLinksError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: Optional[str] + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(GetSharedLinksError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetSharedLinksError(%r, %r)' % (self._tag, self._value) + +GetSharedLinksError_validator = bv.Union(GetSharedLinksError) + +class GetSharedLinksResult(bb.Struct): + """ + :ivar links: Shared links applicable to the path argument. + """ + + __slots__ = [ + '_links_value', + '_links_present', + ] + + _has_required_fields = True + + def __init__(self, + links=None): + self._links_value = None + self._links_present = False + if links is not None: + self.links = links + + @property + def links(self): + """ + Shared links applicable to the path argument. + + :rtype: list of [LinkMetadata] + """ + if self._links_present: + return self._links_value + else: + raise AttributeError("missing required field 'links'") + + @links.setter + def links(self, val): + val = self._links_validator.validate(val) + self._links_value = val + self._links_present = True + + @links.deleter + def links(self): + self._links_value = None + self._links_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetSharedLinksResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetSharedLinksResult(links={!r})'.format( + self._links_value, + ) + +GetSharedLinksResult_validator = bv.Struct(GetSharedLinksResult) + +class GroupInfo(team_common.GroupSummary): + """ + The information about a group. Groups is a way to manage a list of users + who need same access permission to the shared folder. + + :ivar group_type: The type of group. + :ivar is_member: If the current user is a member of the group. + :ivar is_owner: If the current user is an owner of the group. + :ivar same_team: If the group is owned by the current user's team. + """ + + __slots__ = [ + '_group_type_value', + '_group_type_present', + '_is_member_value', + '_is_member_present', + '_is_owner_value', + '_is_owner_present', + '_same_team_value', + '_same_team_present', + ] + + _has_required_fields = True + + def __init__(self, + group_name=None, + group_id=None, + group_management_type=None, + group_type=None, + is_member=None, + is_owner=None, + same_team=None, + group_external_id=None, + member_count=None): + super(GroupInfo, self).__init__(group_name, + group_id, + group_management_type, + group_external_id, + member_count) + self._group_type_value = None + self._group_type_present = False + self._is_member_value = None + self._is_member_present = False + self._is_owner_value = None + self._is_owner_present = False + self._same_team_value = None + self._same_team_present = False + if group_type is not None: + self.group_type = group_type + if is_member is not None: + self.is_member = is_member + if is_owner is not None: + self.is_owner = is_owner + if same_team is not None: + self.same_team = same_team + + @property + def group_type(self): + """ + The type of group. + + :rtype: team_common.GroupType + """ + if self._group_type_present: + return self._group_type_value + else: + raise AttributeError("missing required field 'group_type'") + + @group_type.setter + def group_type(self, val): + self._group_type_validator.validate_type_only(val) + self._group_type_value = val + self._group_type_present = True + + @group_type.deleter + def group_type(self): + self._group_type_value = None + self._group_type_present = False + + @property + def is_member(self): + """ + If the current user is a member of the group. + + :rtype: bool + """ + if self._is_member_present: + return self._is_member_value + else: + raise AttributeError("missing required field 'is_member'") + + @is_member.setter + def is_member(self, val): + val = self._is_member_validator.validate(val) + self._is_member_value = val + self._is_member_present = True + + @is_member.deleter + def is_member(self): + self._is_member_value = None + self._is_member_present = False + + @property + def is_owner(self): + """ + If the current user is an owner of the group. + + :rtype: bool + """ + if self._is_owner_present: + return self._is_owner_value + else: + raise AttributeError("missing required field 'is_owner'") + + @is_owner.setter + def is_owner(self, val): + val = self._is_owner_validator.validate(val) + self._is_owner_value = val + self._is_owner_present = True + + @is_owner.deleter + def is_owner(self): + self._is_owner_value = None + self._is_owner_present = False + + @property + def same_team(self): + """ + If the group is owned by the current user's team. + + :rtype: bool + """ + if self._same_team_present: + return self._same_team_value + else: + raise AttributeError("missing required field 'same_team'") + + @same_team.setter + def same_team(self, val): + val = self._same_team_validator.validate(val) + self._same_team_value = val + self._same_team_present = True + + @same_team.deleter + def same_team(self): + self._same_team_value = None + self._same_team_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupInfo(group_name={!r}, group_id={!r}, group_management_type={!r}, group_type={!r}, is_member={!r}, is_owner={!r}, same_team={!r}, group_external_id={!r}, member_count={!r})'.format( + self._group_name_value, + self._group_id_value, + self._group_management_type_value, + self._group_type_value, + self._is_member_value, + self._is_owner_value, + self._same_team_value, + self._group_external_id_value, + self._member_count_value, + ) + +GroupInfo_validator = bv.Struct(GroupInfo) + +class MembershipInfo(bb.Struct): + """ + The information about a member of the shared content. + + :ivar access_type: The access type for this member. It contains inherited + access type from parent folder, and acquired access type from this + folder. + :ivar permissions: The permissions that requesting user has on this member. + The set of permissions corresponds to the MemberActions in the request. + :ivar initials: Never set. + :ivar is_inherited: True if the member has access from a parent folder. + """ + + __slots__ = [ + '_access_type_value', + '_access_type_present', + '_permissions_value', + '_permissions_present', + '_initials_value', + '_initials_present', + '_is_inherited_value', + '_is_inherited_present', + ] + + _has_required_fields = True + + def __init__(self, + access_type=None, + permissions=None, + initials=None, + is_inherited=None): + self._access_type_value = None + self._access_type_present = False + self._permissions_value = None + self._permissions_present = False + self._initials_value = None + self._initials_present = False + self._is_inherited_value = None + self._is_inherited_present = False + if access_type is not None: + self.access_type = access_type + if permissions is not None: + self.permissions = permissions + if initials is not None: + self.initials = initials + if is_inherited is not None: + self.is_inherited = is_inherited + + @property + def access_type(self): + """ + The access type for this member. It contains inherited access type from + parent folder, and acquired access type from this folder. + + :rtype: AccessLevel + """ + if self._access_type_present: + return self._access_type_value + else: + raise AttributeError("missing required field 'access_type'") + + @access_type.setter + def access_type(self, val): + self._access_type_validator.validate_type_only(val) + self._access_type_value = val + self._access_type_present = True + + @access_type.deleter + def access_type(self): + self._access_type_value = None + self._access_type_present = False + + @property + def permissions(self): + """ + The permissions that requesting user has on this member. The set of + permissions corresponds to the MemberActions in the request. + + :rtype: list of [MemberPermission] + """ + if self._permissions_present: + return self._permissions_value + else: + return None + + @permissions.setter + def permissions(self, val): + if val is None: + del self.permissions + return + val = self._permissions_validator.validate(val) + self._permissions_value = val + self._permissions_present = True + + @permissions.deleter + def permissions(self): + self._permissions_value = None + self._permissions_present = False + + @property + def initials(self): + """ + Never set. + + :rtype: str + """ + if self._initials_present: + return self._initials_value + else: + return None + + @initials.setter + def initials(self, val): + if val is None: + del self.initials + return + val = self._initials_validator.validate(val) + self._initials_value = val + self._initials_present = True + + @initials.deleter + def initials(self): + self._initials_value = None + self._initials_present = False + + @property + def is_inherited(self): + """ + True if the member has access from a parent folder. + + :rtype: bool + """ + if self._is_inherited_present: + return self._is_inherited_value + else: + return False + + @is_inherited.setter + def is_inherited(self, val): + val = self._is_inherited_validator.validate(val) + self._is_inherited_value = val + self._is_inherited_present = True + + @is_inherited.deleter + def is_inherited(self): + self._is_inherited_value = None + self._is_inherited_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MembershipInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembershipInfo(access_type={!r}, permissions={!r}, initials={!r}, is_inherited={!r})'.format( + self._access_type_value, + self._permissions_value, + self._initials_value, + self._is_inherited_value, + ) + +MembershipInfo_validator = bv.Struct(MembershipInfo) + +class GroupMembershipInfo(MembershipInfo): + """ + The information about a group member of the shared content. + + :ivar group: The information about the membership group. + """ + + __slots__ = [ + '_group_value', + '_group_present', + ] + + _has_required_fields = True + + def __init__(self, + access_type=None, + group=None, + permissions=None, + initials=None, + is_inherited=None): + super(GroupMembershipInfo, self).__init__(access_type, + permissions, + initials, + is_inherited) + self._group_value = None + self._group_present = False + if group is not None: + self.group = group + + @property + def group(self): + """ + The information about the membership group. + + :rtype: GroupInfo + """ + if self._group_present: + return self._group_value + else: + raise AttributeError("missing required field 'group'") + + @group.setter + def group(self, val): + self._group_validator.validate_type_only(val) + self._group_value = val + self._group_present = True + + @group.deleter + def group(self): + self._group_value = None + self._group_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupMembershipInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupMembershipInfo(access_type={!r}, group={!r}, permissions={!r}, initials={!r}, is_inherited={!r})'.format( + self._access_type_value, + self._group_value, + self._permissions_value, + self._initials_value, + self._is_inherited_value, + ) + +GroupMembershipInfo_validator = bv.Struct(GroupMembershipInfo) + +class InsufficientPlan(bb.Struct): + """ + :ivar message: A message to tell the user to upgrade in order to support + expected action. + :ivar upsell_url: A URL to send the user to in order to obtain the account + type they need, e.g. upgrading. Absent if there is no action the user + can take to upgrade. + """ + + __slots__ = [ + '_message_value', + '_message_present', + '_upsell_url_value', + '_upsell_url_present', + ] + + _has_required_fields = True + + def __init__(self, + message=None, + upsell_url=None): + self._message_value = None + self._message_present = False + self._upsell_url_value = None + self._upsell_url_present = False + if message is not None: + self.message = message + if upsell_url is not None: + self.upsell_url = upsell_url + + @property + def message(self): + """ + A message to tell the user to upgrade in order to support expected + action. + + :rtype: str + """ + if self._message_present: + return self._message_value + else: + raise AttributeError("missing required field 'message'") + + @message.setter + def message(self, val): + val = self._message_validator.validate(val) + self._message_value = val + self._message_present = True + + @message.deleter + def message(self): + self._message_value = None + self._message_present = False + + @property + def upsell_url(self): + """ + A URL to send the user to in order to obtain the account type they need, + e.g. upgrading. Absent if there is no action the user can take to + upgrade. + + :rtype: str + """ + if self._upsell_url_present: + return self._upsell_url_value + else: + return None + + @upsell_url.setter + def upsell_url(self, val): + if val is None: + del self.upsell_url + return + val = self._upsell_url_validator.validate(val) + self._upsell_url_value = val + self._upsell_url_present = True + + @upsell_url.deleter + def upsell_url(self): + self._upsell_url_value = None + self._upsell_url_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(InsufficientPlan, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'InsufficientPlan(message={!r}, upsell_url={!r})'.format( + self._message_value, + self._upsell_url_value, + ) + +InsufficientPlan_validator = bv.Struct(InsufficientPlan) + +class InsufficientQuotaAmounts(bb.Struct): + """ + :ivar space_needed: The amount of space needed to add the item (the size of + the item). + :ivar space_shortage: The amount of extra space needed to add the item. + :ivar space_left: The amount of space left in the user's Dropbox, less than + space_needed. + """ + + __slots__ = [ + '_space_needed_value', + '_space_needed_present', + '_space_shortage_value', + '_space_shortage_present', + '_space_left_value', + '_space_left_present', + ] + + _has_required_fields = True + + def __init__(self, + space_needed=None, + space_shortage=None, + space_left=None): + self._space_needed_value = None + self._space_needed_present = False + self._space_shortage_value = None + self._space_shortage_present = False + self._space_left_value = None + self._space_left_present = False + if space_needed is not None: + self.space_needed = space_needed + if space_shortage is not None: + self.space_shortage = space_shortage + if space_left is not None: + self.space_left = space_left + + @property + def space_needed(self): + """ + The amount of space needed to add the item (the size of the item). + + :rtype: int + """ + if self._space_needed_present: + return self._space_needed_value + else: + raise AttributeError("missing required field 'space_needed'") + + @space_needed.setter + def space_needed(self, val): + val = self._space_needed_validator.validate(val) + self._space_needed_value = val + self._space_needed_present = True + + @space_needed.deleter + def space_needed(self): + self._space_needed_value = None + self._space_needed_present = False + + @property + def space_shortage(self): + """ + The amount of extra space needed to add the item. + + :rtype: int + """ + if self._space_shortage_present: + return self._space_shortage_value + else: + raise AttributeError("missing required field 'space_shortage'") + + @space_shortage.setter + def space_shortage(self, val): + val = self._space_shortage_validator.validate(val) + self._space_shortage_value = val + self._space_shortage_present = True + + @space_shortage.deleter + def space_shortage(self): + self._space_shortage_value = None + self._space_shortage_present = False + + @property + def space_left(self): + """ + The amount of space left in the user's Dropbox, less than space_needed. + + :rtype: int + """ + if self._space_left_present: + return self._space_left_value + else: + raise AttributeError("missing required field 'space_left'") + + @space_left.setter + def space_left(self, val): + val = self._space_left_validator.validate(val) + self._space_left_value = val + self._space_left_present = True + + @space_left.deleter + def space_left(self): + self._space_left_value = None + self._space_left_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(InsufficientQuotaAmounts, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'InsufficientQuotaAmounts(space_needed={!r}, space_shortage={!r}, space_left={!r})'.format( + self._space_needed_value, + self._space_shortage_value, + self._space_left_value, + ) + +InsufficientQuotaAmounts_validator = bv.Struct(InsufficientQuotaAmounts) + +class InviteeInfo(bb.Union): + """ + Information about the recipient of a shared content invitation. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar str email: E-mail address of invited user. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def email(cls, val): + """ + Create an instance of this class set to the ``email`` tag with value + ``val``. + + :param str val: + :rtype: InviteeInfo + """ + return cls('email', val) + + def is_email(self): + """ + Check if the union tag is ``email``. + + :rtype: bool + """ + return self._tag == 'email' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_email(self): + """ + E-mail address of invited user. + + Only call this if :meth:`is_email` is true. + + :rtype: str + """ + if not self.is_email(): + raise AttributeError("tag 'email' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(InviteeInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'InviteeInfo(%r, %r)' % (self._tag, self._value) + +InviteeInfo_validator = bv.Union(InviteeInfo) + +class InviteeMembershipInfo(MembershipInfo): + """ + Information about an invited member of a shared content. + + :ivar invitee: Recipient of the invitation. + :ivar user: The user this invitation is tied to, if available. + """ + + __slots__ = [ + '_invitee_value', + '_invitee_present', + '_user_value', + '_user_present', + ] + + _has_required_fields = True + + def __init__(self, + access_type=None, + invitee=None, + permissions=None, + initials=None, + is_inherited=None, + user=None): + super(InviteeMembershipInfo, self).__init__(access_type, + permissions, + initials, + is_inherited) + self._invitee_value = None + self._invitee_present = False + self._user_value = None + self._user_present = False + if invitee is not None: + self.invitee = invitee + if user is not None: + self.user = user + + @property + def invitee(self): + """ + Recipient of the invitation. + + :rtype: InviteeInfo + """ + if self._invitee_present: + return self._invitee_value + else: + raise AttributeError("missing required field 'invitee'") + + @invitee.setter + def invitee(self, val): + self._invitee_validator.validate_type_only(val) + self._invitee_value = val + self._invitee_present = True + + @invitee.deleter + def invitee(self): + self._invitee_value = None + self._invitee_present = False + + @property + def user(self): + """ + The user this invitation is tied to, if available. + + :rtype: UserInfo + """ + if self._user_present: + return self._user_value + else: + return None + + @user.setter + def user(self, val): + if val is None: + del self.user + return + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(InviteeMembershipInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'InviteeMembershipInfo(access_type={!r}, invitee={!r}, permissions={!r}, initials={!r}, is_inherited={!r}, user={!r})'.format( + self._access_type_value, + self._invitee_value, + self._permissions_value, + self._initials_value, + self._is_inherited_value, + self._user_value, + ) + +InviteeMembershipInfo_validator = bv.Struct(InviteeMembershipInfo) + +class JobError(bb.Union): + """ + Error occurred while performing an asynchronous job from + :meth:`dropbox.dropbox.Dropbox.sharing_unshare_folder` or + :meth:`dropbox.dropbox.Dropbox.sharing_remove_folder_member`. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar UnshareFolderError unshare_folder_error: Error occurred while + performing :meth:`dropbox.dropbox.Dropbox.sharing_unshare_folder` + action. + :ivar RemoveFolderMemberError remove_folder_member_error: Error occurred + while performing + :meth:`dropbox.dropbox.Dropbox.sharing_remove_folder_member` action. + :ivar RelinquishFolderMembershipError relinquish_folder_membership_error: + Error occurred while performing + :meth:`dropbox.dropbox.Dropbox.sharing_relinquish_folder_membership` + action. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def unshare_folder_error(cls, val): + """ + Create an instance of this class set to the ``unshare_folder_error`` tag + with value ``val``. + + :param UnshareFolderError val: + :rtype: JobError + """ + return cls('unshare_folder_error', val) + + @classmethod + def remove_folder_member_error(cls, val): + """ + Create an instance of this class set to the + ``remove_folder_member_error`` tag with value ``val``. + + :param RemoveFolderMemberError val: + :rtype: JobError + """ + return cls('remove_folder_member_error', val) + + @classmethod + def relinquish_folder_membership_error(cls, val): + """ + Create an instance of this class set to the + ``relinquish_folder_membership_error`` tag with value ``val``. + + :param RelinquishFolderMembershipError val: + :rtype: JobError + """ + return cls('relinquish_folder_membership_error', val) + + def is_unshare_folder_error(self): + """ + Check if the union tag is ``unshare_folder_error``. + + :rtype: bool + """ + return self._tag == 'unshare_folder_error' + + def is_remove_folder_member_error(self): + """ + Check if the union tag is ``remove_folder_member_error``. + + :rtype: bool + """ + return self._tag == 'remove_folder_member_error' + + def is_relinquish_folder_membership_error(self): + """ + Check if the union tag is ``relinquish_folder_membership_error``. + + :rtype: bool + """ + return self._tag == 'relinquish_folder_membership_error' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_unshare_folder_error(self): + """ + Error occurred while performing + :meth:`dropbox.dropbox.Dropbox.sharing_unshare_folder` action. + + Only call this if :meth:`is_unshare_folder_error` is true. + + :rtype: UnshareFolderError + """ + if not self.is_unshare_folder_error(): + raise AttributeError("tag 'unshare_folder_error' not set") + return self._value + + def get_remove_folder_member_error(self): + """ + Error occurred while performing + :meth:`dropbox.dropbox.Dropbox.sharing_remove_folder_member` action. + + Only call this if :meth:`is_remove_folder_member_error` is true. + + :rtype: RemoveFolderMemberError + """ + if not self.is_remove_folder_member_error(): + raise AttributeError("tag 'remove_folder_member_error' not set") + return self._value + + def get_relinquish_folder_membership_error(self): + """ + Error occurred while performing + :meth:`dropbox.dropbox.Dropbox.sharing_relinquish_folder_membership` + action. + + Only call this if :meth:`is_relinquish_folder_membership_error` is true. + + :rtype: RelinquishFolderMembershipError + """ + if not self.is_relinquish_folder_membership_error(): + raise AttributeError("tag 'relinquish_folder_membership_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(JobError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'JobError(%r, %r)' % (self._tag, self._value) + +JobError_validator = bv.Union(JobError) + +class JobStatus(async_.PollResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar complete: The asynchronous job has finished. + :ivar JobError failed: The asynchronous job returned an error. + """ + + # Attribute is overwritten below the class definition + complete = None + + @classmethod + def failed(cls, val): + """ + Create an instance of this class set to the ``failed`` tag with value + ``val``. + + :param JobError val: + :rtype: JobStatus + """ + return cls('failed', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def is_failed(self): + """ + Check if the union tag is ``failed``. + + :rtype: bool + """ + return self._tag == 'failed' + + def get_failed(self): + """ + The asynchronous job returned an error. + + Only call this if :meth:`is_failed` is true. + + :rtype: JobError + """ + if not self.is_failed(): + raise AttributeError("tag 'failed' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(JobStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'JobStatus(%r, %r)' % (self._tag, self._value) + +JobStatus_validator = bv.Union(JobStatus) + +class LinkAction(bb.Union): + """ + Actions that can be performed on a link. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar change_access_level: Change the access level of the link. + :ivar change_audience: Change the audience of the link. + :ivar remove_expiry: Remove the expiry date of the link. + :ivar remove_password: Remove the password of the link. + :ivar set_expiry: Create or modify the expiry date of the link. + :ivar set_password: Create or modify the password of the link. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + change_access_level = None + # Attribute is overwritten below the class definition + change_audience = None + # Attribute is overwritten below the class definition + remove_expiry = None + # Attribute is overwritten below the class definition + remove_password = None + # Attribute is overwritten below the class definition + set_expiry = None + # Attribute is overwritten below the class definition + set_password = None + # Attribute is overwritten below the class definition + other = None + + def is_change_access_level(self): + """ + Check if the union tag is ``change_access_level``. + + :rtype: bool + """ + return self._tag == 'change_access_level' + + def is_change_audience(self): + """ + Check if the union tag is ``change_audience``. + + :rtype: bool + """ + return self._tag == 'change_audience' + + def is_remove_expiry(self): + """ + Check if the union tag is ``remove_expiry``. + + :rtype: bool + """ + return self._tag == 'remove_expiry' + + def is_remove_password(self): + """ + Check if the union tag is ``remove_password``. + + :rtype: bool + """ + return self._tag == 'remove_password' + + def is_set_expiry(self): + """ + Check if the union tag is ``set_expiry``. + + :rtype: bool + """ + return self._tag == 'set_expiry' + + def is_set_password(self): + """ + Check if the union tag is ``set_password``. + + :rtype: bool + """ + return self._tag == 'set_password' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(LinkAction, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LinkAction(%r, %r)' % (self._tag, self._value) + +LinkAction_validator = bv.Union(LinkAction) + +class LinkAudience(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar public: Link is accessible by anyone. + :ivar team: Link is accessible only by team members. + :ivar no_one: The link can be used by no one. The link merely points the + user to the content, and does not grant additional rights to the user. + Members of the content who use this link can only access the content + with their pre-existing access rights. + :ivar members: Link is accessible only by members of the content. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + public = None + # Attribute is overwritten below the class definition + team = None + # Attribute is overwritten below the class definition + no_one = None + # Attribute is overwritten below the class definition + members = None + # Attribute is overwritten below the class definition + other = None + + def is_public(self): + """ + Check if the union tag is ``public``. + + :rtype: bool + """ + return self._tag == 'public' + + def is_team(self): + """ + Check if the union tag is ``team``. + + :rtype: bool + """ + return self._tag == 'team' + + def is_no_one(self): + """ + Check if the union tag is ``no_one``. + + :rtype: bool + """ + return self._tag == 'no_one' + + def is_members(self): + """ + Check if the union tag is ``members``. + + :rtype: bool + """ + return self._tag == 'members' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(LinkAudience, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LinkAudience(%r, %r)' % (self._tag, self._value) + +LinkAudience_validator = bv.Union(LinkAudience) + +class LinkExpiry(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar remove_expiry: Remove the currently set expiry for the link. + :ivar datetime.datetime set_expiry: Set a new expiry or change an existing + expiry. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + remove_expiry = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def set_expiry(cls, val): + """ + Create an instance of this class set to the ``set_expiry`` tag with + value ``val``. + + :param datetime.datetime val: + :rtype: LinkExpiry + """ + return cls('set_expiry', val) + + def is_remove_expiry(self): + """ + Check if the union tag is ``remove_expiry``. + + :rtype: bool + """ + return self._tag == 'remove_expiry' + + def is_set_expiry(self): + """ + Check if the union tag is ``set_expiry``. + + :rtype: bool + """ + return self._tag == 'set_expiry' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_set_expiry(self): + """ + Set a new expiry or change an existing expiry. + + Only call this if :meth:`is_set_expiry` is true. + + :rtype: datetime.datetime + """ + if not self.is_set_expiry(): + raise AttributeError("tag 'set_expiry' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(LinkExpiry, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LinkExpiry(%r, %r)' % (self._tag, self._value) + +LinkExpiry_validator = bv.Union(LinkExpiry) + +class LinkPassword(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar remove_password: Remove the currently set password for the link. + :ivar str set_password: Set a new password or change an existing password. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + remove_password = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def set_password(cls, val): + """ + Create an instance of this class set to the ``set_password`` tag with + value ``val``. + + :param str val: + :rtype: LinkPassword + """ + return cls('set_password', val) + + def is_remove_password(self): + """ + Check if the union tag is ``remove_password``. + + :rtype: bool + """ + return self._tag == 'remove_password' + + def is_set_password(self): + """ + Check if the union tag is ``set_password``. + + :rtype: bool + """ + return self._tag == 'set_password' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_set_password(self): + """ + Set a new password or change an existing password. + + Only call this if :meth:`is_set_password` is true. + + :rtype: str + """ + if not self.is_set_password(): + raise AttributeError("tag 'set_password' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(LinkPassword, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LinkPassword(%r, %r)' % (self._tag, self._value) + +LinkPassword_validator = bv.Union(LinkPassword) + +class LinkPermission(bb.Struct): + """ + Permissions for actions that can be performed on a link. + """ + + __slots__ = [ + '_action_value', + '_action_present', + '_allow_value', + '_allow_present', + '_reason_value', + '_reason_present', + ] + + _has_required_fields = True + + def __init__(self, + action=None, + allow=None, + reason=None): + self._action_value = None + self._action_present = False + self._allow_value = None + self._allow_present = False + self._reason_value = None + self._reason_present = False + if action is not None: + self.action = action + if allow is not None: + self.allow = allow + if reason is not None: + self.reason = reason + + @property + def action(self): + """ + :rtype: LinkAction + """ + if self._action_present: + return self._action_value + else: + raise AttributeError("missing required field 'action'") + + @action.setter + def action(self, val): + self._action_validator.validate_type_only(val) + self._action_value = val + self._action_present = True + + @action.deleter + def action(self): + self._action_value = None + self._action_present = False + + @property + def allow(self): + """ + :rtype: bool + """ + if self._allow_present: + return self._allow_value + else: + raise AttributeError("missing required field 'allow'") + + @allow.setter + def allow(self, val): + val = self._allow_validator.validate(val) + self._allow_value = val + self._allow_present = True + + @allow.deleter + def allow(self): + self._allow_value = None + self._allow_present = False + + @property + def reason(self): + """ + :rtype: PermissionDeniedReason + """ + if self._reason_present: + return self._reason_value + else: + return None + + @reason.setter + def reason(self, val): + if val is None: + del self.reason + return + self._reason_validator.validate_type_only(val) + self._reason_value = val + self._reason_present = True + + @reason.deleter + def reason(self): + self._reason_value = None + self._reason_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(LinkPermission, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LinkPermission(action={!r}, allow={!r}, reason={!r})'.format( + self._action_value, + self._allow_value, + self._reason_value, + ) + +LinkPermission_validator = bv.Struct(LinkPermission) + +class LinkPermissions(bb.Struct): + """ + :ivar resolved_visibility: The current visibility of the link after + considering the shared links policies of the the team (in case the + link's owner is part of a team) and the shared folder (in case the + linked file is part of a shared folder). This field is shown only if the + caller has access to this info (the link's owner always has access to + this data). + :ivar requested_visibility: The shared link's requested visibility. This can + be overridden by the team and shared folder policies. The final + visibility, after considering these policies, can be found in + ``resolved_visibility``. This is shown only if the caller is the link's + owner. + :ivar can_revoke: Whether the caller can revoke the shared link. + :ivar revoke_failure_reason: The failure reason for revoking the link. This + field will only be present if the ``can_revoke`` is ``False``. + """ + + __slots__ = [ + '_resolved_visibility_value', + '_resolved_visibility_present', + '_requested_visibility_value', + '_requested_visibility_present', + '_can_revoke_value', + '_can_revoke_present', + '_revoke_failure_reason_value', + '_revoke_failure_reason_present', + ] + + _has_required_fields = True + + def __init__(self, + can_revoke=None, + resolved_visibility=None, + requested_visibility=None, + revoke_failure_reason=None): + self._resolved_visibility_value = None + self._resolved_visibility_present = False + self._requested_visibility_value = None + self._requested_visibility_present = False + self._can_revoke_value = None + self._can_revoke_present = False + self._revoke_failure_reason_value = None + self._revoke_failure_reason_present = False + if resolved_visibility is not None: + self.resolved_visibility = resolved_visibility + if requested_visibility is not None: + self.requested_visibility = requested_visibility + if can_revoke is not None: + self.can_revoke = can_revoke + if revoke_failure_reason is not None: + self.revoke_failure_reason = revoke_failure_reason + + @property + def resolved_visibility(self): + """ + The current visibility of the link after considering the shared links + policies of the the team (in case the link's owner is part of a team) + and the shared folder (in case the linked file is part of a shared + folder). This field is shown only if the caller has access to this info + (the link's owner always has access to this data). + + :rtype: ResolvedVisibility + """ + if self._resolved_visibility_present: + return self._resolved_visibility_value + else: + return None + + @resolved_visibility.setter + def resolved_visibility(self, val): + if val is None: + del self.resolved_visibility + return + self._resolved_visibility_validator.validate_type_only(val) + self._resolved_visibility_value = val + self._resolved_visibility_present = True + + @resolved_visibility.deleter + def resolved_visibility(self): + self._resolved_visibility_value = None + self._resolved_visibility_present = False + + @property + def requested_visibility(self): + """ + The shared link's requested visibility. This can be overridden by the + team and shared folder policies. The final visibility, after considering + these policies, can be found in ``resolved_visibility``. This is shown + only if the caller is the link's owner. + + :rtype: RequestedVisibility + """ + if self._requested_visibility_present: + return self._requested_visibility_value + else: + return None + + @requested_visibility.setter + def requested_visibility(self, val): + if val is None: + del self.requested_visibility + return + self._requested_visibility_validator.validate_type_only(val) + self._requested_visibility_value = val + self._requested_visibility_present = True + + @requested_visibility.deleter + def requested_visibility(self): + self._requested_visibility_value = None + self._requested_visibility_present = False + + @property + def can_revoke(self): + """ + Whether the caller can revoke the shared link. + + :rtype: bool + """ + if self._can_revoke_present: + return self._can_revoke_value + else: + raise AttributeError("missing required field 'can_revoke'") + + @can_revoke.setter + def can_revoke(self, val): + val = self._can_revoke_validator.validate(val) + self._can_revoke_value = val + self._can_revoke_present = True + + @can_revoke.deleter + def can_revoke(self): + self._can_revoke_value = None + self._can_revoke_present = False + + @property + def revoke_failure_reason(self): + """ + The failure reason for revoking the link. This field will only be + present if the ``can_revoke`` is ``False``. + + :rtype: SharedLinkAccessFailureReason + """ + if self._revoke_failure_reason_present: + return self._revoke_failure_reason_value + else: + return None + + @revoke_failure_reason.setter + def revoke_failure_reason(self, val): + if val is None: + del self.revoke_failure_reason + return + self._revoke_failure_reason_validator.validate_type_only(val) + self._revoke_failure_reason_value = val + self._revoke_failure_reason_present = True + + @revoke_failure_reason.deleter + def revoke_failure_reason(self): + self._revoke_failure_reason_value = None + self._revoke_failure_reason_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(LinkPermissions, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LinkPermissions(can_revoke={!r}, resolved_visibility={!r}, requested_visibility={!r}, revoke_failure_reason={!r})'.format( + self._can_revoke_value, + self._resolved_visibility_value, + self._requested_visibility_value, + self._revoke_failure_reason_value, + ) + +LinkPermissions_validator = bv.Struct(LinkPermissions) + +class LinkSettings(bb.Struct): + """ + Settings that apply to a link. + + :ivar access_level: The access level on the link for this file. Currently, + it only accepts 'viewer' and 'viewer_no_comment'. + :ivar audience: The type of audience on the link for this file. + :ivar expiry: An expiry timestamp to set on a link. + :ivar password: The password for the link. + """ + + __slots__ = [ + '_access_level_value', + '_access_level_present', + '_audience_value', + '_audience_present', + '_expiry_value', + '_expiry_present', + '_password_value', + '_password_present', + ] + + _has_required_fields = False + + def __init__(self, + access_level=None, + audience=None, + expiry=None, + password=None): + self._access_level_value = None + self._access_level_present = False + self._audience_value = None + self._audience_present = False + self._expiry_value = None + self._expiry_present = False + self._password_value = None + self._password_present = False + if access_level is not None: + self.access_level = access_level + if audience is not None: + self.audience = audience + if expiry is not None: + self.expiry = expiry + if password is not None: + self.password = password + + @property + def access_level(self): + """ + The access level on the link for this file. Currently, it only accepts + 'viewer' and 'viewer_no_comment'. + + :rtype: AccessLevel + """ + if self._access_level_present: + return self._access_level_value + else: + return None + + @access_level.setter + def access_level(self, val): + if val is None: + del self.access_level + return + self._access_level_validator.validate_type_only(val) + self._access_level_value = val + self._access_level_present = True + + @access_level.deleter + def access_level(self): + self._access_level_value = None + self._access_level_present = False + + @property + def audience(self): + """ + The type of audience on the link for this file. + + :rtype: LinkAudience + """ + if self._audience_present: + return self._audience_value + else: + return None + + @audience.setter + def audience(self, val): + if val is None: + del self.audience + return + self._audience_validator.validate_type_only(val) + self._audience_value = val + self._audience_present = True + + @audience.deleter + def audience(self): + self._audience_value = None + self._audience_present = False + + @property + def expiry(self): + """ + An expiry timestamp to set on a link. + + :rtype: LinkExpiry + """ + if self._expiry_present: + return self._expiry_value + else: + return None + + @expiry.setter + def expiry(self, val): + if val is None: + del self.expiry + return + self._expiry_validator.validate_type_only(val) + self._expiry_value = val + self._expiry_present = True + + @expiry.deleter + def expiry(self): + self._expiry_value = None + self._expiry_present = False + + @property + def password(self): + """ + The password for the link. + + :rtype: LinkPassword + """ + if self._password_present: + return self._password_value + else: + return None + + @password.setter + def password(self, val): + if val is None: + del self.password + return + self._password_validator.validate_type_only(val) + self._password_value = val + self._password_present = True + + @password.deleter + def password(self): + self._password_value = None + self._password_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(LinkSettings, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LinkSettings(access_level={!r}, audience={!r}, expiry={!r}, password={!r})'.format( + self._access_level_value, + self._audience_value, + self._expiry_value, + self._password_value, + ) + +LinkSettings_validator = bv.Struct(LinkSettings) + +class ListFileMembersArg(bb.Struct): + """ + Arguments for :meth:`dropbox.dropbox.Dropbox.sharing_list_file_members`. + + :ivar file: The file for which you want to see members. + :ivar actions: The actions for which to return permissions on a member. + :ivar include_inherited: Whether to include members who only have access + from a parent shared folder. + :ivar limit: Number of members to return max per query. Defaults to 100 if + no limit is specified. + """ + + __slots__ = [ + '_file_value', + '_file_present', + '_actions_value', + '_actions_present', + '_include_inherited_value', + '_include_inherited_present', + '_limit_value', + '_limit_present', + ] + + _has_required_fields = True + + def __init__(self, + file=None, + actions=None, + include_inherited=None, + limit=None): + self._file_value = None + self._file_present = False + self._actions_value = None + self._actions_present = False + self._include_inherited_value = None + self._include_inherited_present = False + self._limit_value = None + self._limit_present = False + if file is not None: + self.file = file + if actions is not None: + self.actions = actions + if include_inherited is not None: + self.include_inherited = include_inherited + if limit is not None: + self.limit = limit + + @property + def file(self): + """ + The file for which you want to see members. + + :rtype: str + """ + if self._file_present: + return self._file_value + else: + raise AttributeError("missing required field 'file'") + + @file.setter + def file(self, val): + val = self._file_validator.validate(val) + self._file_value = val + self._file_present = True + + @file.deleter + def file(self): + self._file_value = None + self._file_present = False + + @property + def actions(self): + """ + The actions for which to return permissions on a member. + + :rtype: list of [MemberAction] + """ + if self._actions_present: + return self._actions_value + else: + return None + + @actions.setter + def actions(self, val): + if val is None: + del self.actions + return + val = self._actions_validator.validate(val) + self._actions_value = val + self._actions_present = True + + @actions.deleter + def actions(self): + self._actions_value = None + self._actions_present = False + + @property + def include_inherited(self): + """ + Whether to include members who only have access from a parent shared + folder. + + :rtype: bool + """ + if self._include_inherited_present: + return self._include_inherited_value + else: + return True + + @include_inherited.setter + def include_inherited(self, val): + val = self._include_inherited_validator.validate(val) + self._include_inherited_value = val + self._include_inherited_present = True + + @include_inherited.deleter + def include_inherited(self): + self._include_inherited_value = None + self._include_inherited_present = False + + @property + def limit(self): + """ + Number of members to return max per query. Defaults to 100 if no limit + is specified. + + :rtype: int + """ + if self._limit_present: + return self._limit_value + else: + return 100 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFileMembersArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFileMembersArg(file={!r}, actions={!r}, include_inherited={!r}, limit={!r})'.format( + self._file_value, + self._actions_value, + self._include_inherited_value, + self._limit_value, + ) + +ListFileMembersArg_validator = bv.Struct(ListFileMembersArg) + +class ListFileMembersBatchArg(bb.Struct): + """ + Arguments for + :meth:`dropbox.dropbox.Dropbox.sharing_list_file_members_batch`. + + :ivar files: Files for which to return members. + :ivar limit: Number of members to return max per query. Defaults to 10 if no + limit is specified. + """ + + __slots__ = [ + '_files_value', + '_files_present', + '_limit_value', + '_limit_present', + ] + + _has_required_fields = True + + def __init__(self, + files=None, + limit=None): + self._files_value = None + self._files_present = False + self._limit_value = None + self._limit_present = False + if files is not None: + self.files = files + if limit is not None: + self.limit = limit + + @property + def files(self): + """ + Files for which to return members. + + :rtype: list of [str] + """ + if self._files_present: + return self._files_value + else: + raise AttributeError("missing required field 'files'") + + @files.setter + def files(self, val): + val = self._files_validator.validate(val) + self._files_value = val + self._files_present = True + + @files.deleter + def files(self): + self._files_value = None + self._files_present = False + + @property + def limit(self): + """ + Number of members to return max per query. Defaults to 10 if no limit is + specified. + + :rtype: int + """ + if self._limit_present: + return self._limit_value + else: + return 10 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFileMembersBatchArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFileMembersBatchArg(files={!r}, limit={!r})'.format( + self._files_value, + self._limit_value, + ) + +ListFileMembersBatchArg_validator = bv.Struct(ListFileMembersBatchArg) + +class ListFileMembersBatchResult(bb.Struct): + """ + Per-file result for + :meth:`dropbox.dropbox.Dropbox.sharing_list_file_members_batch`. + + :ivar file: This is the input file identifier, whether an ID or a path. + :ivar result: The result for this particular file. + """ + + __slots__ = [ + '_file_value', + '_file_present', + '_result_value', + '_result_present', + ] + + _has_required_fields = True + + def __init__(self, + file=None, + result=None): + self._file_value = None + self._file_present = False + self._result_value = None + self._result_present = False + if file is not None: + self.file = file + if result is not None: + self.result = result + + @property + def file(self): + """ + This is the input file identifier, whether an ID or a path. + + :rtype: str + """ + if self._file_present: + return self._file_value + else: + raise AttributeError("missing required field 'file'") + + @file.setter + def file(self, val): + val = self._file_validator.validate(val) + self._file_value = val + self._file_present = True + + @file.deleter + def file(self): + self._file_value = None + self._file_present = False + + @property + def result(self): + """ + The result for this particular file. + + :rtype: ListFileMembersIndividualResult + """ + if self._result_present: + return self._result_value + else: + raise AttributeError("missing required field 'result'") + + @result.setter + def result(self, val): + self._result_validator.validate_type_only(val) + self._result_value = val + self._result_present = True + + @result.deleter + def result(self): + self._result_value = None + self._result_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFileMembersBatchResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFileMembersBatchResult(file={!r}, result={!r})'.format( + self._file_value, + self._result_value, + ) + +ListFileMembersBatchResult_validator = bv.Struct(ListFileMembersBatchResult) + +class ListFileMembersContinueArg(bb.Struct): + """ + Arguments for + :meth:`dropbox.dropbox.Dropbox.sharing_list_file_members_continue`. + + :ivar cursor: The cursor returned by your last call to + :meth:`dropbox.dropbox.Dropbox.sharing_list_file_members`, + :meth:`dropbox.dropbox.Dropbox.sharing_list_file_members_continue`, or + :meth:`dropbox.dropbox.Dropbox.sharing_list_file_members_batch`. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + The cursor returned by your last call to + :meth:`dropbox.dropbox.Dropbox.sharing_list_file_members`, + :meth:`dropbox.dropbox.Dropbox.sharing_list_file_members_continue`, or + :meth:`dropbox.dropbox.Dropbox.sharing_list_file_members_batch`. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFileMembersContinueArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFileMembersContinueArg(cursor={!r})'.format( + self._cursor_value, + ) + +ListFileMembersContinueArg_validator = bv.Struct(ListFileMembersContinueArg) + +class ListFileMembersContinueError(bb.Union): + """ + Error for + :meth:`dropbox.dropbox.Dropbox.sharing_list_file_members_continue`. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_cursor: ``ListFileMembersContinueArg.cursor`` is invalid. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_cursor = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def user_error(cls, val): + """ + Create an instance of this class set to the ``user_error`` tag with + value ``val``. + + :param SharingUserError val: + :rtype: ListFileMembersContinueError + """ + return cls('user_error', val) + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharingFileAccessError val: + :rtype: ListFileMembersContinueError + """ + return cls('access_error', val) + + def is_user_error(self): + """ + Check if the union tag is ``user_error``. + + :rtype: bool + """ + return self._tag == 'user_error' + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_invalid_cursor(self): + """ + Check if the union tag is ``invalid_cursor``. + + :rtype: bool + """ + return self._tag == 'invalid_cursor' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_user_error(self): + """ + Only call this if :meth:`is_user_error` is true. + + :rtype: SharingUserError + """ + if not self.is_user_error(): + raise AttributeError("tag 'user_error' not set") + return self._value + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharingFileAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFileMembersContinueError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFileMembersContinueError(%r, %r)' % (self._tag, self._value) + +ListFileMembersContinueError_validator = bv.Union(ListFileMembersContinueError) + +class ListFileMembersCountResult(bb.Struct): + """ + :ivar members: A list of members on this file. + :ivar member_count: The number of members on this file. This does not + include inherited members. + """ + + __slots__ = [ + '_members_value', + '_members_present', + '_member_count_value', + '_member_count_present', + ] + + _has_required_fields = True + + def __init__(self, + members=None, + member_count=None): + self._members_value = None + self._members_present = False + self._member_count_value = None + self._member_count_present = False + if members is not None: + self.members = members + if member_count is not None: + self.member_count = member_count + + @property + def members(self): + """ + A list of members on this file. + + :rtype: SharedFileMembers + """ + if self._members_present: + return self._members_value + else: + raise AttributeError("missing required field 'members'") + + @members.setter + def members(self, val): + self._members_validator.validate_type_only(val) + self._members_value = val + self._members_present = True + + @members.deleter + def members(self): + self._members_value = None + self._members_present = False + + @property + def member_count(self): + """ + The number of members on this file. This does not include inherited + members. + + :rtype: int + """ + if self._member_count_present: + return self._member_count_value + else: + raise AttributeError("missing required field 'member_count'") + + @member_count.setter + def member_count(self, val): + val = self._member_count_validator.validate(val) + self._member_count_value = val + self._member_count_present = True + + @member_count.deleter + def member_count(self): + self._member_count_value = None + self._member_count_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFileMembersCountResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFileMembersCountResult(members={!r}, member_count={!r})'.format( + self._members_value, + self._member_count_value, + ) + +ListFileMembersCountResult_validator = bv.Struct(ListFileMembersCountResult) + +class ListFileMembersError(bb.Union): + """ + Error for :meth:`dropbox.dropbox.Dropbox.sharing_list_file_members`. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def user_error(cls, val): + """ + Create an instance of this class set to the ``user_error`` tag with + value ``val``. + + :param SharingUserError val: + :rtype: ListFileMembersError + """ + return cls('user_error', val) + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharingFileAccessError val: + :rtype: ListFileMembersError + """ + return cls('access_error', val) + + def is_user_error(self): + """ + Check if the union tag is ``user_error``. + + :rtype: bool + """ + return self._tag == 'user_error' + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_user_error(self): + """ + Only call this if :meth:`is_user_error` is true. + + :rtype: SharingUserError + """ + if not self.is_user_error(): + raise AttributeError("tag 'user_error' not set") + return self._value + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharingFileAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFileMembersError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFileMembersError(%r, %r)' % (self._tag, self._value) + +ListFileMembersError_validator = bv.Union(ListFileMembersError) + +class ListFileMembersIndividualResult(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar ListFileMembersCountResult result: The results of the query for this + file if it was successful. + :ivar SharingFileAccessError access_error: The result of the query for this + file if it was an error. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def result(cls, val): + """ + Create an instance of this class set to the ``result`` tag with value + ``val``. + + :param ListFileMembersCountResult val: + :rtype: ListFileMembersIndividualResult + """ + return cls('result', val) + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharingFileAccessError val: + :rtype: ListFileMembersIndividualResult + """ + return cls('access_error', val) + + def is_result(self): + """ + Check if the union tag is ``result``. + + :rtype: bool + """ + return self._tag == 'result' + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_result(self): + """ + The results of the query for this file if it was successful. + + Only call this if :meth:`is_result` is true. + + :rtype: ListFileMembersCountResult + """ + if not self.is_result(): + raise AttributeError("tag 'result' not set") + return self._value + + def get_access_error(self): + """ + The result of the query for this file if it was an error. + + Only call this if :meth:`is_access_error` is true. + + :rtype: SharingFileAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFileMembersIndividualResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFileMembersIndividualResult(%r, %r)' % (self._tag, self._value) + +ListFileMembersIndividualResult_validator = bv.Union(ListFileMembersIndividualResult) + +class ListFilesArg(bb.Struct): + """ + Arguments for :meth:`dropbox.dropbox.Dropbox.sharing_list_received_files`. + + :ivar limit: Number of files to return max per query. Defaults to 100 if no + limit is specified. + :ivar actions: A list of `FileAction`s corresponding to `FilePermission`s + that should appear in the response's ``SharedFileMetadata.permissions`` + field describing the actions the authenticated user can perform on the + file. + """ + + __slots__ = [ + '_limit_value', + '_limit_present', + '_actions_value', + '_actions_present', + ] + + _has_required_fields = False + + def __init__(self, + limit=None, + actions=None): + self._limit_value = None + self._limit_present = False + self._actions_value = None + self._actions_present = False + if limit is not None: + self.limit = limit + if actions is not None: + self.actions = actions + + @property + def limit(self): + """ + Number of files to return max per query. Defaults to 100 if no limit is + specified. + + :rtype: int + """ + if self._limit_present: + return self._limit_value + else: + return 100 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + @property + def actions(self): + """ + A list of `FileAction`s corresponding to `FilePermission`s that should + appear in the response's ``SharedFileMetadata.permissions`` field + describing the actions the authenticated user can perform on the file. + + :rtype: list of [FileAction] + """ + if self._actions_present: + return self._actions_value + else: + return None + + @actions.setter + def actions(self, val): + if val is None: + del self.actions + return + val = self._actions_validator.validate(val) + self._actions_value = val + self._actions_present = True + + @actions.deleter + def actions(self): + self._actions_value = None + self._actions_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFilesArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFilesArg(limit={!r}, actions={!r})'.format( + self._limit_value, + self._actions_value, + ) + +ListFilesArg_validator = bv.Struct(ListFilesArg) + +class ListFilesContinueArg(bb.Struct): + """ + Arguments for + :meth:`dropbox.dropbox.Dropbox.sharing_list_received_files_continue`. + + :ivar cursor: Cursor in ``ListFilesResult.cursor``. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + Cursor in ``ListFilesResult.cursor``. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFilesContinueArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFilesContinueArg(cursor={!r})'.format( + self._cursor_value, + ) + +ListFilesContinueArg_validator = bv.Struct(ListFilesContinueArg) + +class ListFilesContinueError(bb.Union): + """ + Error results for + :meth:`dropbox.dropbox.Dropbox.sharing_list_received_files_continue`. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar SharingUserError user_error: User account had a problem. + :ivar invalid_cursor: ``ListFilesContinueArg.cursor`` is invalid. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_cursor = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def user_error(cls, val): + """ + Create an instance of this class set to the ``user_error`` tag with + value ``val``. + + :param SharingUserError val: + :rtype: ListFilesContinueError + """ + return cls('user_error', val) + + def is_user_error(self): + """ + Check if the union tag is ``user_error``. + + :rtype: bool + """ + return self._tag == 'user_error' + + def is_invalid_cursor(self): + """ + Check if the union tag is ``invalid_cursor``. + + :rtype: bool + """ + return self._tag == 'invalid_cursor' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_user_error(self): + """ + User account had a problem. + + Only call this if :meth:`is_user_error` is true. + + :rtype: SharingUserError + """ + if not self.is_user_error(): + raise AttributeError("tag 'user_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFilesContinueError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFilesContinueError(%r, %r)' % (self._tag, self._value) + +ListFilesContinueError_validator = bv.Union(ListFilesContinueError) + +class ListFilesResult(bb.Struct): + """ + Success results for + :meth:`dropbox.dropbox.Dropbox.sharing_list_received_files`. + + :ivar entries: Information about the files shared with current user. + :ivar cursor: Cursor used to obtain additional shared files. + """ + + __slots__ = [ + '_entries_value', + '_entries_present', + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + entries=None, + cursor=None): + self._entries_value = None + self._entries_present = False + self._cursor_value = None + self._cursor_present = False + if entries is not None: + self.entries = entries + if cursor is not None: + self.cursor = cursor + + @property + def entries(self): + """ + Information about the files shared with current user. + + :rtype: list of [SharedFileMetadata] + """ + if self._entries_present: + return self._entries_value + else: + raise AttributeError("missing required field 'entries'") + + @entries.setter + def entries(self, val): + val = self._entries_validator.validate(val) + self._entries_value = val + self._entries_present = True + + @entries.deleter + def entries(self): + self._entries_value = None + self._entries_present = False + + @property + def cursor(self): + """ + Cursor used to obtain additional shared files. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFilesResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFilesResult(entries={!r}, cursor={!r})'.format( + self._entries_value, + self._cursor_value, + ) + +ListFilesResult_validator = bv.Struct(ListFilesResult) + +class ListFolderMembersCursorArg(bb.Struct): + """ + :ivar actions: This is a list indicating whether each returned member will + include a boolean value ``MemberPermission.allow`` that describes + whether the current user can perform the MemberAction on the member. + :ivar limit: The maximum number of results that include members, groups and + invitees to return per request. + """ + + __slots__ = [ + '_actions_value', + '_actions_present', + '_limit_value', + '_limit_present', + ] + + _has_required_fields = False + + def __init__(self, + actions=None, + limit=None): + self._actions_value = None + self._actions_present = False + self._limit_value = None + self._limit_present = False + if actions is not None: + self.actions = actions + if limit is not None: + self.limit = limit + + @property + def actions(self): + """ + This is a list indicating whether each returned member will include a + boolean value ``MemberPermission.allow`` that describes whether the + current user can perform the MemberAction on the member. + + :rtype: list of [MemberAction] + """ + if self._actions_present: + return self._actions_value + else: + return None + + @actions.setter + def actions(self, val): + if val is None: + del self.actions + return + val = self._actions_validator.validate(val) + self._actions_value = val + self._actions_present = True + + @actions.deleter + def actions(self): + self._actions_value = None + self._actions_present = False + + @property + def limit(self): + """ + The maximum number of results that include members, groups and invitees + to return per request. + + :rtype: int + """ + if self._limit_present: + return self._limit_value + else: + return 1000 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFolderMembersCursorArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFolderMembersCursorArg(actions={!r}, limit={!r})'.format( + self._actions_value, + self._limit_value, + ) + +ListFolderMembersCursorArg_validator = bv.Struct(ListFolderMembersCursorArg) + +class ListFolderMembersArgs(ListFolderMembersCursorArg): + """ + :ivar shared_folder_id: The ID for the shared folder. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None, + actions=None, + limit=None): + super(ListFolderMembersArgs, self).__init__(actions, + limit) + self._shared_folder_id_value = None + self._shared_folder_id_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + + @property + def shared_folder_id(self): + """ + The ID for the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFolderMembersArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFolderMembersArgs(shared_folder_id={!r}, actions={!r}, limit={!r})'.format( + self._shared_folder_id_value, + self._actions_value, + self._limit_value, + ) + +ListFolderMembersArgs_validator = bv.Struct(ListFolderMembersArgs) + +class ListFolderMembersContinueArg(bb.Struct): + """ + :ivar cursor: The cursor returned by your last call to + :meth:`dropbox.dropbox.Dropbox.sharing_list_folder_members` or + :meth:`dropbox.dropbox.Dropbox.sharing_list_folder_members_continue`. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + The cursor returned by your last call to + :meth:`dropbox.dropbox.Dropbox.sharing_list_folder_members` or + :meth:`dropbox.dropbox.Dropbox.sharing_list_folder_members_continue`. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFolderMembersContinueArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFolderMembersContinueArg(cursor={!r})'.format( + self._cursor_value, + ) + +ListFolderMembersContinueArg_validator = bv.Struct(ListFolderMembersContinueArg) + +class ListFolderMembersContinueError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_cursor: ``ListFolderMembersContinueArg.cursor`` is invalid. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_cursor = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharedFolderAccessError val: + :rtype: ListFolderMembersContinueError + """ + return cls('access_error', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_invalid_cursor(self): + """ + Check if the union tag is ``invalid_cursor``. + + :rtype: bool + """ + return self._tag == 'invalid_cursor' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharedFolderAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFolderMembersContinueError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFolderMembersContinueError(%r, %r)' % (self._tag, self._value) + +ListFolderMembersContinueError_validator = bv.Union(ListFolderMembersContinueError) + +class ListFoldersArgs(bb.Struct): + """ + :ivar limit: The maximum number of results to return per request. + :ivar actions: A list of `FolderAction`s corresponding to + `FolderPermission`s that should appear in the response's + ``SharedFolderMetadata.permissions`` field describing the actions the + authenticated user can perform on the folder. + """ + + __slots__ = [ + '_limit_value', + '_limit_present', + '_actions_value', + '_actions_present', + ] + + _has_required_fields = False + + def __init__(self, + limit=None, + actions=None): + self._limit_value = None + self._limit_present = False + self._actions_value = None + self._actions_present = False + if limit is not None: + self.limit = limit + if actions is not None: + self.actions = actions + + @property + def limit(self): + """ + The maximum number of results to return per request. + + :rtype: int + """ + if self._limit_present: + return self._limit_value + else: + return 1000 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + @property + def actions(self): + """ + A list of `FolderAction`s corresponding to `FolderPermission`s that + should appear in the response's ``SharedFolderMetadata.permissions`` + field describing the actions the authenticated user can perform on the + folder. + + :rtype: list of [FolderAction] + """ + if self._actions_present: + return self._actions_value + else: + return None + + @actions.setter + def actions(self, val): + if val is None: + del self.actions + return + val = self._actions_validator.validate(val) + self._actions_value = val + self._actions_present = True + + @actions.deleter + def actions(self): + self._actions_value = None + self._actions_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFoldersArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFoldersArgs(limit={!r}, actions={!r})'.format( + self._limit_value, + self._actions_value, + ) + +ListFoldersArgs_validator = bv.Struct(ListFoldersArgs) + +class ListFoldersContinueArg(bb.Struct): + """ + :ivar cursor: The cursor returned by the previous API call specified in the + endpoint description. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + The cursor returned by the previous API call specified in the endpoint + description. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFoldersContinueArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFoldersContinueArg(cursor={!r})'.format( + self._cursor_value, + ) + +ListFoldersContinueArg_validator = bv.Struct(ListFoldersContinueArg) + +class ListFoldersContinueError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_cursor: ``ListFoldersContinueArg.cursor`` is invalid. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_cursor = None + # Attribute is overwritten below the class definition + other = None + + def is_invalid_cursor(self): + """ + Check if the union tag is ``invalid_cursor``. + + :rtype: bool + """ + return self._tag == 'invalid_cursor' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFoldersContinueError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFoldersContinueError(%r, %r)' % (self._tag, self._value) + +ListFoldersContinueError_validator = bv.Union(ListFoldersContinueError) + +class ListFoldersResult(bb.Struct): + """ + Result for :meth:`dropbox.dropbox.Dropbox.sharing_list_folders` or + :meth:`dropbox.dropbox.Dropbox.sharing_list_mountable_folders`, depending on + which endpoint was requested. Unmounted shared folders can be identified by + the absence of ``SharedFolderMetadata.path_lower``. + + :ivar entries: List of all shared folders the authenticated user has access + to. + :ivar cursor: Present if there are additional shared folders that have not + been returned yet. Pass the cursor into the corresponding continue + endpoint (either + :meth:`dropbox.dropbox.Dropbox.sharing_list_folders_continue` or + :meth:`dropbox.dropbox.Dropbox.sharing_list_mountable_folders_continue`) + to list additional folders. + """ + + __slots__ = [ + '_entries_value', + '_entries_present', + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + entries=None, + cursor=None): + self._entries_value = None + self._entries_present = False + self._cursor_value = None + self._cursor_present = False + if entries is not None: + self.entries = entries + if cursor is not None: + self.cursor = cursor + + @property + def entries(self): + """ + List of all shared folders the authenticated user has access to. + + :rtype: list of [SharedFolderMetadata] + """ + if self._entries_present: + return self._entries_value + else: + raise AttributeError("missing required field 'entries'") + + @entries.setter + def entries(self, val): + val = self._entries_validator.validate(val) + self._entries_value = val + self._entries_present = True + + @entries.deleter + def entries(self): + self._entries_value = None + self._entries_present = False + + @property + def cursor(self): + """ + Present if there are additional shared folders that have not been + returned yet. Pass the cursor into the corresponding continue endpoint + (either :meth:`dropbox.dropbox.Dropbox.sharing_list_folders_continue` or + :meth:`dropbox.dropbox.Dropbox.sharing_list_mountable_folders_continue`) + to list additional folders. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListFoldersResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListFoldersResult(entries={!r}, cursor={!r})'.format( + self._entries_value, + self._cursor_value, + ) + +ListFoldersResult_validator = bv.Struct(ListFoldersResult) + +class ListSharedLinksArg(bb.Struct): + """ + :ivar path: See :meth:`dropbox.dropbox.Dropbox.sharing_list_shared_links` + description. + :ivar cursor: The cursor returned by your last call to + :meth:`dropbox.dropbox.Dropbox.sharing_list_shared_links`. + :ivar direct_only: See + :meth:`dropbox.dropbox.Dropbox.sharing_list_shared_links` description. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_cursor_value', + '_cursor_present', + '_direct_only_value', + '_direct_only_present', + ] + + _has_required_fields = False + + def __init__(self, + path=None, + cursor=None, + direct_only=None): + self._path_value = None + self._path_present = False + self._cursor_value = None + self._cursor_present = False + self._direct_only_value = None + self._direct_only_present = False + if path is not None: + self.path = path + if cursor is not None: + self.cursor = cursor + if direct_only is not None: + self.direct_only = direct_only + + @property + def path(self): + """ + See :meth:`dropbox.dropbox.Dropbox.sharing_list_shared_links` + description. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + return None + + @path.setter + def path(self, val): + if val is None: + del self.path + return + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def cursor(self): + """ + The cursor returned by your last call to + :meth:`dropbox.dropbox.Dropbox.sharing_list_shared_links`. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def direct_only(self): + """ + See :meth:`dropbox.dropbox.Dropbox.sharing_list_shared_links` + description. + + :rtype: bool + """ + if self._direct_only_present: + return self._direct_only_value + else: + return None + + @direct_only.setter + def direct_only(self, val): + if val is None: + del self.direct_only + return + val = self._direct_only_validator.validate(val) + self._direct_only_value = val + self._direct_only_present = True + + @direct_only.deleter + def direct_only(self): + self._direct_only_value = None + self._direct_only_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListSharedLinksArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListSharedLinksArg(path={!r}, cursor={!r}, direct_only={!r})'.format( + self._path_value, + self._cursor_value, + self._direct_only_value, + ) + +ListSharedLinksArg_validator = bv.Struct(ListSharedLinksArg) + +class ListSharedLinksError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar reset: Indicates that the cursor has been invalidated. Call + :meth:`dropbox.dropbox.Dropbox.sharing_list_shared_links` to obtain a + new cursor. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + reset = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def path(cls, val): + """ + Create an instance of this class set to the ``path`` tag with value + ``val``. + + :param files.LookupError val: + :rtype: ListSharedLinksError + """ + return cls('path', val) + + def is_path(self): + """ + Check if the union tag is ``path``. + + :rtype: bool + """ + return self._tag == 'path' + + def is_reset(self): + """ + Check if the union tag is ``reset``. + + :rtype: bool + """ + return self._tag == 'reset' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_path(self): + """ + Only call this if :meth:`is_path` is true. + + :rtype: files.LookupError + """ + if not self.is_path(): + raise AttributeError("tag 'path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ListSharedLinksError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListSharedLinksError(%r, %r)' % (self._tag, self._value) + +ListSharedLinksError_validator = bv.Union(ListSharedLinksError) + +class ListSharedLinksResult(bb.Struct): + """ + :ivar links: Shared links applicable to the path argument. + :ivar has_more: Is true if there are additional shared links that have not + been returned yet. Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.sharing_list_shared_links` to retrieve + them. + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.sharing_list_shared_links` to obtain the + additional links. Cursor is returned only if no path is given. + """ + + __slots__ = [ + '_links_value', + '_links_present', + '_has_more_value', + '_has_more_present', + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + links=None, + has_more=None, + cursor=None): + self._links_value = None + self._links_present = False + self._has_more_value = None + self._has_more_present = False + self._cursor_value = None + self._cursor_present = False + if links is not None: + self.links = links + if has_more is not None: + self.has_more = has_more + if cursor is not None: + self.cursor = cursor + + @property + def links(self): + """ + Shared links applicable to the path argument. + + :rtype: list of [SharedLinkMetadata] + """ + if self._links_present: + return self._links_value + else: + raise AttributeError("missing required field 'links'") + + @links.setter + def links(self, val): + val = self._links_validator.validate(val) + self._links_value = val + self._links_present = True + + @links.deleter + def links(self): + self._links_value = None + self._links_present = False + + @property + def has_more(self): + """ + Is true if there are additional shared links that have not been returned + yet. Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.sharing_list_shared_links` to retrieve + them. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.sharing_list_shared_links` to obtain the + additional links. Cursor is returned only if no path is given. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListSharedLinksResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListSharedLinksResult(links={!r}, has_more={!r}, cursor={!r})'.format( + self._links_value, + self._has_more_value, + self._cursor_value, + ) + +ListSharedLinksResult_validator = bv.Struct(ListSharedLinksResult) + +class MemberAccessLevelResult(bb.Struct): + """ + Contains information about a member's access level to content after an + operation. + + :ivar access_level: The member still has this level of access to the content + through a parent folder. + :ivar warning: A localized string with additional information about why the + user has this access level to the content. + :ivar access_details: The parent folders that a member has access to. The + field is present if the user has access to the first parent folder where + the member gains access. + """ + + __slots__ = [ + '_access_level_value', + '_access_level_present', + '_warning_value', + '_warning_present', + '_access_details_value', + '_access_details_present', + ] + + _has_required_fields = False + + def __init__(self, + access_level=None, + warning=None, + access_details=None): + self._access_level_value = None + self._access_level_present = False + self._warning_value = None + self._warning_present = False + self._access_details_value = None + self._access_details_present = False + if access_level is not None: + self.access_level = access_level + if warning is not None: + self.warning = warning + if access_details is not None: + self.access_details = access_details + + @property + def access_level(self): + """ + The member still has this level of access to the content through a + parent folder. + + :rtype: AccessLevel + """ + if self._access_level_present: + return self._access_level_value + else: + return None + + @access_level.setter + def access_level(self, val): + if val is None: + del self.access_level + return + self._access_level_validator.validate_type_only(val) + self._access_level_value = val + self._access_level_present = True + + @access_level.deleter + def access_level(self): + self._access_level_value = None + self._access_level_present = False + + @property + def warning(self): + """ + A localized string with additional information about why the user has + this access level to the content. + + :rtype: str + """ + if self._warning_present: + return self._warning_value + else: + return None + + @warning.setter + def warning(self, val): + if val is None: + del self.warning + return + val = self._warning_validator.validate(val) + self._warning_value = val + self._warning_present = True + + @warning.deleter + def warning(self): + self._warning_value = None + self._warning_present = False + + @property + def access_details(self): + """ + The parent folders that a member has access to. The field is present if + the user has access to the first parent folder where the member gains + access. + + :rtype: list of [ParentFolderAccessInfo] + """ + if self._access_details_present: + return self._access_details_value + else: + return None + + @access_details.setter + def access_details(self, val): + if val is None: + del self.access_details + return + val = self._access_details_validator.validate(val) + self._access_details_value = val + self._access_details_present = True + + @access_details.deleter + def access_details(self): + self._access_details_value = None + self._access_details_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberAccessLevelResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberAccessLevelResult(access_level={!r}, warning={!r}, access_details={!r})'.format( + self._access_level_value, + self._warning_value, + self._access_details_value, + ) + +MemberAccessLevelResult_validator = bv.Struct(MemberAccessLevelResult) + +class MemberAction(bb.Union): + """ + Actions that may be taken on members of a shared folder. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar leave_a_copy: Allow the member to keep a copy of the folder when + removing. + :ivar make_editor: Make the member an editor of the folder. + :ivar make_owner: Make the member an owner of the folder. + :ivar make_viewer: Make the member a viewer of the folder. + :ivar make_viewer_no_comment: Make the member a viewer of the folder without + commenting permissions. + :ivar remove: Remove the member from the folder. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + leave_a_copy = None + # Attribute is overwritten below the class definition + make_editor = None + # Attribute is overwritten below the class definition + make_owner = None + # Attribute is overwritten below the class definition + make_viewer = None + # Attribute is overwritten below the class definition + make_viewer_no_comment = None + # Attribute is overwritten below the class definition + remove = None + # Attribute is overwritten below the class definition + other = None + + def is_leave_a_copy(self): + """ + Check if the union tag is ``leave_a_copy``. + + :rtype: bool + """ + return self._tag == 'leave_a_copy' + + def is_make_editor(self): + """ + Check if the union tag is ``make_editor``. + + :rtype: bool + """ + return self._tag == 'make_editor' + + def is_make_owner(self): + """ + Check if the union tag is ``make_owner``. + + :rtype: bool + """ + return self._tag == 'make_owner' + + def is_make_viewer(self): + """ + Check if the union tag is ``make_viewer``. + + :rtype: bool + """ + return self._tag == 'make_viewer' + + def is_make_viewer_no_comment(self): + """ + Check if the union tag is ``make_viewer_no_comment``. + + :rtype: bool + """ + return self._tag == 'make_viewer_no_comment' + + def is_remove(self): + """ + Check if the union tag is ``remove``. + + :rtype: bool + """ + return self._tag == 'remove' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberAction, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberAction(%r, %r)' % (self._tag, self._value) + +MemberAction_validator = bv.Union(MemberAction) + +class MemberPermission(bb.Struct): + """ + Whether the user is allowed to take the action on the associated member. + + :ivar action: The action that the user may wish to take on the member. + :ivar allow: True if the user is allowed to take the action. + :ivar reason: The reason why the user is denied the permission. Not present + if the action is allowed. + """ + + __slots__ = [ + '_action_value', + '_action_present', + '_allow_value', + '_allow_present', + '_reason_value', + '_reason_present', + ] + + _has_required_fields = True + + def __init__(self, + action=None, + allow=None, + reason=None): + self._action_value = None + self._action_present = False + self._allow_value = None + self._allow_present = False + self._reason_value = None + self._reason_present = False + if action is not None: + self.action = action + if allow is not None: + self.allow = allow + if reason is not None: + self.reason = reason + + @property + def action(self): + """ + The action that the user may wish to take on the member. + + :rtype: MemberAction + """ + if self._action_present: + return self._action_value + else: + raise AttributeError("missing required field 'action'") + + @action.setter + def action(self, val): + self._action_validator.validate_type_only(val) + self._action_value = val + self._action_present = True + + @action.deleter + def action(self): + self._action_value = None + self._action_present = False + + @property + def allow(self): + """ + True if the user is allowed to take the action. + + :rtype: bool + """ + if self._allow_present: + return self._allow_value + else: + raise AttributeError("missing required field 'allow'") + + @allow.setter + def allow(self, val): + val = self._allow_validator.validate(val) + self._allow_value = val + self._allow_present = True + + @allow.deleter + def allow(self): + self._allow_value = None + self._allow_present = False + + @property + def reason(self): + """ + The reason why the user is denied the permission. Not present if the + action is allowed. + + :rtype: PermissionDeniedReason + """ + if self._reason_present: + return self._reason_value + else: + return None + + @reason.setter + def reason(self, val): + if val is None: + del self.reason + return + self._reason_validator.validate_type_only(val) + self._reason_value = val + self._reason_present = True + + @reason.deleter + def reason(self): + self._reason_value = None + self._reason_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberPermission, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberPermission(action={!r}, allow={!r}, reason={!r})'.format( + self._action_value, + self._allow_value, + self._reason_value, + ) + +MemberPermission_validator = bv.Struct(MemberPermission) + +class MemberPolicy(bb.Union): + """ + Policy governing who can be a member of a shared folder. Only applicable to + folders owned by a user on a team. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar team: Only a teammate can become a member. + :ivar anyone: Anyone can become a member. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + team = None + # Attribute is overwritten below the class definition + anyone = None + # Attribute is overwritten below the class definition + other = None + + def is_team(self): + """ + Check if the union tag is ``team``. + + :rtype: bool + """ + return self._tag == 'team' + + def is_anyone(self): + """ + Check if the union tag is ``anyone``. + + :rtype: bool + """ + return self._tag == 'anyone' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberPolicy(%r, %r)' % (self._tag, self._value) + +MemberPolicy_validator = bv.Union(MemberPolicy) + +class MemberSelector(bb.Union): + """ + Includes different ways to identify a member of a shared folder. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar str dropbox_id: Dropbox account, team member, or group ID of member. + :ivar str email: E-mail address of member. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def dropbox_id(cls, val): + """ + Create an instance of this class set to the ``dropbox_id`` tag with + value ``val``. + + :param str val: + :rtype: MemberSelector + """ + return cls('dropbox_id', val) + + @classmethod + def email(cls, val): + """ + Create an instance of this class set to the ``email`` tag with value + ``val``. + + :param str val: + :rtype: MemberSelector + """ + return cls('email', val) + + def is_dropbox_id(self): + """ + Check if the union tag is ``dropbox_id``. + + :rtype: bool + """ + return self._tag == 'dropbox_id' + + def is_email(self): + """ + Check if the union tag is ``email``. + + :rtype: bool + """ + return self._tag == 'email' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_dropbox_id(self): + """ + Dropbox account, team member, or group ID of member. + + Only call this if :meth:`is_dropbox_id` is true. + + :rtype: str + """ + if not self.is_dropbox_id(): + raise AttributeError("tag 'dropbox_id' not set") + return self._value + + def get_email(self): + """ + E-mail address of member. + + Only call this if :meth:`is_email` is true. + + :rtype: str + """ + if not self.is_email(): + raise AttributeError("tag 'email' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSelector, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSelector(%r, %r)' % (self._tag, self._value) + +MemberSelector_validator = bv.Union(MemberSelector) + +class ModifySharedLinkSettingsArgs(bb.Struct): + """ + :ivar url: URL of the shared link to change its settings. + :ivar settings: Set of settings for the shared link. + :ivar remove_expiration: If set to true, removes the expiration of the + shared link. + """ + + __slots__ = [ + '_url_value', + '_url_present', + '_settings_value', + '_settings_present', + '_remove_expiration_value', + '_remove_expiration_present', + ] + + _has_required_fields = True + + def __init__(self, + url=None, + settings=None, + remove_expiration=None): + self._url_value = None + self._url_present = False + self._settings_value = None + self._settings_present = False + self._remove_expiration_value = None + self._remove_expiration_present = False + if url is not None: + self.url = url + if settings is not None: + self.settings = settings + if remove_expiration is not None: + self.remove_expiration = remove_expiration + + @property + def url(self): + """ + URL of the shared link to change its settings. + + :rtype: str + """ + if self._url_present: + return self._url_value + else: + raise AttributeError("missing required field 'url'") + + @url.setter + def url(self, val): + val = self._url_validator.validate(val) + self._url_value = val + self._url_present = True + + @url.deleter + def url(self): + self._url_value = None + self._url_present = False + + @property + def settings(self): + """ + Set of settings for the shared link. + + :rtype: SharedLinkSettings + """ + if self._settings_present: + return self._settings_value + else: + raise AttributeError("missing required field 'settings'") + + @settings.setter + def settings(self, val): + self._settings_validator.validate_type_only(val) + self._settings_value = val + self._settings_present = True + + @settings.deleter + def settings(self): + self._settings_value = None + self._settings_present = False + + @property + def remove_expiration(self): + """ + If set to true, removes the expiration of the shared link. + + :rtype: bool + """ + if self._remove_expiration_present: + return self._remove_expiration_value + else: + return False + + @remove_expiration.setter + def remove_expiration(self, val): + val = self._remove_expiration_validator.validate(val) + self._remove_expiration_value = val + self._remove_expiration_present = True + + @remove_expiration.deleter + def remove_expiration(self): + self._remove_expiration_value = None + self._remove_expiration_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ModifySharedLinkSettingsArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ModifySharedLinkSettingsArgs(url={!r}, settings={!r}, remove_expiration={!r})'.format( + self._url_value, + self._settings_value, + self._remove_expiration_value, + ) + +ModifySharedLinkSettingsArgs_validator = bv.Struct(ModifySharedLinkSettingsArgs) + +class ModifySharedLinkSettingsError(SharedLinkError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar SharedLinkSettingsError settings_error: There is an error with the + given settings. + :ivar email_not_verified: The caller's email should be verified. + """ + + # Attribute is overwritten below the class definition + email_not_verified = None + + @classmethod + def settings_error(cls, val): + """ + Create an instance of this class set to the ``settings_error`` tag with + value ``val``. + + :param SharedLinkSettingsError val: + :rtype: ModifySharedLinkSettingsError + """ + return cls('settings_error', val) + + def is_settings_error(self): + """ + Check if the union tag is ``settings_error``. + + :rtype: bool + """ + return self._tag == 'settings_error' + + def is_email_not_verified(self): + """ + Check if the union tag is ``email_not_verified``. + + :rtype: bool + """ + return self._tag == 'email_not_verified' + + def get_settings_error(self): + """ + There is an error with the given settings. + + Only call this if :meth:`is_settings_error` is true. + + :rtype: SharedLinkSettingsError + """ + if not self.is_settings_error(): + raise AttributeError("tag 'settings_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ModifySharedLinkSettingsError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ModifySharedLinkSettingsError(%r, %r)' % (self._tag, self._value) + +ModifySharedLinkSettingsError_validator = bv.Union(ModifySharedLinkSettingsError) + +class MountFolderArg(bb.Struct): + """ + :ivar shared_folder_id: The ID of the shared folder to mount. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + + @property + def shared_folder_id(self): + """ + The ID of the shared folder to mount. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MountFolderArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MountFolderArg(shared_folder_id={!r})'.format( + self._shared_folder_id_value, + ) + +MountFolderArg_validator = bv.Struct(MountFolderArg) + +class MountFolderError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar inside_shared_folder: Mounting would cause a shared folder to be + inside another, which is disallowed. + :ivar InsufficientQuotaAmounts insufficient_quota: The current user does not + have enough space to mount the shared folder. + :ivar already_mounted: The shared folder is already mounted. + :ivar no_permission: The current user does not have permission to perform + this action. + :ivar not_mountable: The shared folder is not mountable. One example where + this can occur is when the shared folder belongs within a team folder in + the user's Dropbox. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + inside_shared_folder = None + # Attribute is overwritten below the class definition + already_mounted = None + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + not_mountable = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharedFolderAccessError val: + :rtype: MountFolderError + """ + return cls('access_error', val) + + @classmethod + def insufficient_quota(cls, val): + """ + Create an instance of this class set to the ``insufficient_quota`` tag + with value ``val``. + + :param InsufficientQuotaAmounts val: + :rtype: MountFolderError + """ + return cls('insufficient_quota', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_inside_shared_folder(self): + """ + Check if the union tag is ``inside_shared_folder``. + + :rtype: bool + """ + return self._tag == 'inside_shared_folder' + + def is_insufficient_quota(self): + """ + Check if the union tag is ``insufficient_quota``. + + :rtype: bool + """ + return self._tag == 'insufficient_quota' + + def is_already_mounted(self): + """ + Check if the union tag is ``already_mounted``. + + :rtype: bool + """ + return self._tag == 'already_mounted' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_not_mountable(self): + """ + Check if the union tag is ``not_mountable``. + + :rtype: bool + """ + return self._tag == 'not_mountable' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharedFolderAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def get_insufficient_quota(self): + """ + The current user does not have enough space to mount the shared folder. + + Only call this if :meth:`is_insufficient_quota` is true. + + :rtype: InsufficientQuotaAmounts + """ + if not self.is_insufficient_quota(): + raise AttributeError("tag 'insufficient_quota' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(MountFolderError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MountFolderError(%r, %r)' % (self._tag, self._value) + +MountFolderError_validator = bv.Union(MountFolderError) + +class ParentFolderAccessInfo(bb.Struct): + """ + Contains information about a parent folder that a member has access to. + + :ivar folder_name: Display name for the folder. + :ivar shared_folder_id: The identifier of the parent shared folder. + :ivar permissions: The user's permissions for the parent shared folder. + :ivar path: The full path to the parent shared folder relative to the acting + user's root. + """ + + __slots__ = [ + '_folder_name_value', + '_folder_name_present', + '_shared_folder_id_value', + '_shared_folder_id_present', + '_permissions_value', + '_permissions_present', + '_path_value', + '_path_present', + ] + + _has_required_fields = True + + def __init__(self, + folder_name=None, + shared_folder_id=None, + permissions=None, + path=None): + self._folder_name_value = None + self._folder_name_present = False + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._permissions_value = None + self._permissions_present = False + self._path_value = None + self._path_present = False + if folder_name is not None: + self.folder_name = folder_name + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if permissions is not None: + self.permissions = permissions + if path is not None: + self.path = path + + @property + def folder_name(self): + """ + Display name for the folder. + + :rtype: str + """ + if self._folder_name_present: + return self._folder_name_value + else: + raise AttributeError("missing required field 'folder_name'") + + @folder_name.setter + def folder_name(self, val): + val = self._folder_name_validator.validate(val) + self._folder_name_value = val + self._folder_name_present = True + + @folder_name.deleter + def folder_name(self): + self._folder_name_value = None + self._folder_name_present = False + + @property + def shared_folder_id(self): + """ + The identifier of the parent shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def permissions(self): + """ + The user's permissions for the parent shared folder. + + :rtype: list of [MemberPermission] + """ + if self._permissions_present: + return self._permissions_value + else: + raise AttributeError("missing required field 'permissions'") + + @permissions.setter + def permissions(self, val): + val = self._permissions_validator.validate(val) + self._permissions_value = val + self._permissions_present = True + + @permissions.deleter + def permissions(self): + self._permissions_value = None + self._permissions_present = False + + @property + def path(self): + """ + The full path to the parent shared folder relative to the acting user's + root. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ParentFolderAccessInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ParentFolderAccessInfo(folder_name={!r}, shared_folder_id={!r}, permissions={!r}, path={!r})'.format( + self._folder_name_value, + self._shared_folder_id_value, + self._permissions_value, + self._path_value, + ) + +ParentFolderAccessInfo_validator = bv.Struct(ParentFolderAccessInfo) + +class PathLinkMetadata(LinkMetadata): + """ + Metadata for a path-based shared link. + + :ivar path: Path in user's Dropbox. + """ + + __slots__ = [ + '_path_value', + '_path_present', + ] + + _has_required_fields = True + + def __init__(self, + url=None, + visibility=None, + path=None, + expires=None): + super(PathLinkMetadata, self).__init__(url, + visibility, + expires) + self._path_value = None + self._path_present = False + if path is not None: + self.path = path + + @property + def path(self): + """ + Path in user's Dropbox. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PathLinkMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PathLinkMetadata(url={!r}, visibility={!r}, path={!r}, expires={!r})'.format( + self._url_value, + self._visibility_value, + self._path_value, + self._expires_value, + ) + +PathLinkMetadata_validator = bv.Struct(PathLinkMetadata) + +class PendingUploadMode(bb.Union): + """ + Flag to indicate pending upload default (for linking to not-yet-existing + paths). + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar file: Assume pending uploads are files. + :ivar folder: Assume pending uploads are folders. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + file = None + # Attribute is overwritten below the class definition + folder = None + + def is_file(self): + """ + Check if the union tag is ``file``. + + :rtype: bool + """ + return self._tag == 'file' + + def is_folder(self): + """ + Check if the union tag is ``folder``. + + :rtype: bool + """ + return self._tag == 'folder' + + def _process_custom_annotations(self, annotation_type, processor): + super(PendingUploadMode, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PendingUploadMode(%r, %r)' % (self._tag, self._value) + +PendingUploadMode_validator = bv.Union(PendingUploadMode) + +class PermissionDeniedReason(bb.Union): + """ + Possible reasons the user is denied a permission. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar user_not_same_team_as_owner: User is not on the same team as the + folder owner. + :ivar user_not_allowed_by_owner: User is prohibited by the owner from taking + the action. + :ivar target_is_indirect_member: Target is indirectly a member of the + folder, for example by being part of a group. + :ivar target_is_owner: Target is the owner of the folder. + :ivar target_is_self: Target is the user itself. + :ivar target_not_active: Target is not an active member of the team. + :ivar folder_is_limited_team_folder: Folder is team folder for a limited + team. + :ivar owner_not_on_team: The content owner needs to be on a Dropbox team to + perform this action. + :ivar permission_denied: The user does not have permission to perform this + action on the link. + :ivar restricted_by_team: The user's team policy prevents performing this + action on the link. + :ivar user_account_type: The user's account type does not support this + action. + :ivar user_not_on_team: The user needs to be on a Dropbox team to perform + this action. + :ivar folder_is_inside_shared_folder: Folder is inside of another shared + folder. + :ivar restricted_by_parent_folder: Policy cannot be changed due to + restrictions from parent folder. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + user_not_same_team_as_owner = None + # Attribute is overwritten below the class definition + user_not_allowed_by_owner = None + # Attribute is overwritten below the class definition + target_is_indirect_member = None + # Attribute is overwritten below the class definition + target_is_owner = None + # Attribute is overwritten below the class definition + target_is_self = None + # Attribute is overwritten below the class definition + target_not_active = None + # Attribute is overwritten below the class definition + folder_is_limited_team_folder = None + # Attribute is overwritten below the class definition + owner_not_on_team = None + # Attribute is overwritten below the class definition + permission_denied = None + # Attribute is overwritten below the class definition + restricted_by_team = None + # Attribute is overwritten below the class definition + user_account_type = None + # Attribute is overwritten below the class definition + user_not_on_team = None + # Attribute is overwritten below the class definition + folder_is_inside_shared_folder = None + # Attribute is overwritten below the class definition + restricted_by_parent_folder = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def insufficient_plan(cls, val): + """ + Create an instance of this class set to the ``insufficient_plan`` tag + with value ``val``. + + :param InsufficientPlan val: + :rtype: PermissionDeniedReason + """ + return cls('insufficient_plan', val) + + def is_user_not_same_team_as_owner(self): + """ + Check if the union tag is ``user_not_same_team_as_owner``. + + :rtype: bool + """ + return self._tag == 'user_not_same_team_as_owner' + + def is_user_not_allowed_by_owner(self): + """ + Check if the union tag is ``user_not_allowed_by_owner``. + + :rtype: bool + """ + return self._tag == 'user_not_allowed_by_owner' + + def is_target_is_indirect_member(self): + """ + Check if the union tag is ``target_is_indirect_member``. + + :rtype: bool + """ + return self._tag == 'target_is_indirect_member' + + def is_target_is_owner(self): + """ + Check if the union tag is ``target_is_owner``. + + :rtype: bool + """ + return self._tag == 'target_is_owner' + + def is_target_is_self(self): + """ + Check if the union tag is ``target_is_self``. + + :rtype: bool + """ + return self._tag == 'target_is_self' + + def is_target_not_active(self): + """ + Check if the union tag is ``target_not_active``. + + :rtype: bool + """ + return self._tag == 'target_not_active' + + def is_folder_is_limited_team_folder(self): + """ + Check if the union tag is ``folder_is_limited_team_folder``. + + :rtype: bool + """ + return self._tag == 'folder_is_limited_team_folder' + + def is_owner_not_on_team(self): + """ + Check if the union tag is ``owner_not_on_team``. + + :rtype: bool + """ + return self._tag == 'owner_not_on_team' + + def is_permission_denied(self): + """ + Check if the union tag is ``permission_denied``. + + :rtype: bool + """ + return self._tag == 'permission_denied' + + def is_restricted_by_team(self): + """ + Check if the union tag is ``restricted_by_team``. + + :rtype: bool + """ + return self._tag == 'restricted_by_team' + + def is_user_account_type(self): + """ + Check if the union tag is ``user_account_type``. + + :rtype: bool + """ + return self._tag == 'user_account_type' + + def is_user_not_on_team(self): + """ + Check if the union tag is ``user_not_on_team``. + + :rtype: bool + """ + return self._tag == 'user_not_on_team' + + def is_folder_is_inside_shared_folder(self): + """ + Check if the union tag is ``folder_is_inside_shared_folder``. + + :rtype: bool + """ + return self._tag == 'folder_is_inside_shared_folder' + + def is_restricted_by_parent_folder(self): + """ + Check if the union tag is ``restricted_by_parent_folder``. + + :rtype: bool + """ + return self._tag == 'restricted_by_parent_folder' + + def is_insufficient_plan(self): + """ + Check if the union tag is ``insufficient_plan``. + + :rtype: bool + """ + return self._tag == 'insufficient_plan' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_insufficient_plan(self): + """ + Only call this if :meth:`is_insufficient_plan` is true. + + :rtype: InsufficientPlan + """ + if not self.is_insufficient_plan(): + raise AttributeError("tag 'insufficient_plan' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(PermissionDeniedReason, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PermissionDeniedReason(%r, %r)' % (self._tag, self._value) + +PermissionDeniedReason_validator = bv.Union(PermissionDeniedReason) + +class RelinquishFileMembershipArg(bb.Struct): + """ + :ivar file: The path or id for the file. + """ + + __slots__ = [ + '_file_value', + '_file_present', + ] + + _has_required_fields = True + + def __init__(self, + file=None): + self._file_value = None + self._file_present = False + if file is not None: + self.file = file + + @property + def file(self): + """ + The path or id for the file. + + :rtype: str + """ + if self._file_present: + return self._file_value + else: + raise AttributeError("missing required field 'file'") + + @file.setter + def file(self, val): + val = self._file_validator.validate(val) + self._file_value = val + self._file_present = True + + @file.deleter + def file(self): + self._file_value = None + self._file_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RelinquishFileMembershipArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelinquishFileMembershipArg(file={!r})'.format( + self._file_value, + ) + +RelinquishFileMembershipArg_validator = bv.Struct(RelinquishFileMembershipArg) + +class RelinquishFileMembershipError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar group_access: The current user has access to the shared file via a + group. You can't relinquish membership to a file shared via groups. + :ivar no_permission: The current user does not have permission to perform + this action. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + group_access = None + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharingFileAccessError val: + :rtype: RelinquishFileMembershipError + """ + return cls('access_error', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_group_access(self): + """ + Check if the union tag is ``group_access``. + + :rtype: bool + """ + return self._tag == 'group_access' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharingFileAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(RelinquishFileMembershipError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelinquishFileMembershipError(%r, %r)' % (self._tag, self._value) + +RelinquishFileMembershipError_validator = bv.Union(RelinquishFileMembershipError) + +class RelinquishFolderMembershipArg(bb.Struct): + """ + :ivar shared_folder_id: The ID for the shared folder. + :ivar leave_a_copy: Keep a copy of the folder's contents upon relinquishing + membership. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + '_leave_a_copy_value', + '_leave_a_copy_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None, + leave_a_copy=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._leave_a_copy_value = None + self._leave_a_copy_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if leave_a_copy is not None: + self.leave_a_copy = leave_a_copy + + @property + def shared_folder_id(self): + """ + The ID for the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def leave_a_copy(self): + """ + Keep a copy of the folder's contents upon relinquishing membership. + + :rtype: bool + """ + if self._leave_a_copy_present: + return self._leave_a_copy_value + else: + return False + + @leave_a_copy.setter + def leave_a_copy(self, val): + val = self._leave_a_copy_validator.validate(val) + self._leave_a_copy_value = val + self._leave_a_copy_present = True + + @leave_a_copy.deleter + def leave_a_copy(self): + self._leave_a_copy_value = None + self._leave_a_copy_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RelinquishFolderMembershipArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelinquishFolderMembershipArg(shared_folder_id={!r}, leave_a_copy={!r})'.format( + self._shared_folder_id_value, + self._leave_a_copy_value, + ) + +RelinquishFolderMembershipArg_validator = bv.Struct(RelinquishFolderMembershipArg) + +class RelinquishFolderMembershipError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar folder_owner: The current user is the owner of the shared folder. + Owners cannot relinquish membership to their own folders. Try unsharing + or transferring ownership first. + :ivar mounted: The shared folder is currently mounted. Unmount the shared + folder before relinquishing membership. + :ivar group_access: The current user has access to the shared folder via a + group. You can't relinquish membership to folders shared via groups. + :ivar team_folder: This action cannot be performed on a team shared folder. + :ivar no_permission: The current user does not have permission to perform + this action. + :ivar no_explicit_access: The current user only has inherited access to the + shared folder. You can't relinquish inherited membership to folders. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + folder_owner = None + # Attribute is overwritten below the class definition + mounted = None + # Attribute is overwritten below the class definition + group_access = None + # Attribute is overwritten below the class definition + team_folder = None + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + no_explicit_access = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharedFolderAccessError val: + :rtype: RelinquishFolderMembershipError + """ + return cls('access_error', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_folder_owner(self): + """ + Check if the union tag is ``folder_owner``. + + :rtype: bool + """ + return self._tag == 'folder_owner' + + def is_mounted(self): + """ + Check if the union tag is ``mounted``. + + :rtype: bool + """ + return self._tag == 'mounted' + + def is_group_access(self): + """ + Check if the union tag is ``group_access``. + + :rtype: bool + """ + return self._tag == 'group_access' + + def is_team_folder(self): + """ + Check if the union tag is ``team_folder``. + + :rtype: bool + """ + return self._tag == 'team_folder' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_no_explicit_access(self): + """ + Check if the union tag is ``no_explicit_access``. + + :rtype: bool + """ + return self._tag == 'no_explicit_access' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharedFolderAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(RelinquishFolderMembershipError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelinquishFolderMembershipError(%r, %r)' % (self._tag, self._value) + +RelinquishFolderMembershipError_validator = bv.Union(RelinquishFolderMembershipError) + +class RemoveFileMemberArg(bb.Struct): + """ + Arguments for :meth:`dropbox.dropbox.Dropbox.sharing_remove_file_member_2`. + + :ivar file: File from which to remove members. + :ivar member: Member to remove from this file. Note that even if an email is + specified, it may result in the removal of a user (not an invitee) if + the user's main account corresponds to that email address. + """ + + __slots__ = [ + '_file_value', + '_file_present', + '_member_value', + '_member_present', + ] + + _has_required_fields = True + + def __init__(self, + file=None, + member=None): + self._file_value = None + self._file_present = False + self._member_value = None + self._member_present = False + if file is not None: + self.file = file + if member is not None: + self.member = member + + @property + def file(self): + """ + File from which to remove members. + + :rtype: str + """ + if self._file_present: + return self._file_value + else: + raise AttributeError("missing required field 'file'") + + @file.setter + def file(self, val): + val = self._file_validator.validate(val) + self._file_value = val + self._file_present = True + + @file.deleter + def file(self): + self._file_value = None + self._file_present = False + + @property + def member(self): + """ + Member to remove from this file. Note that even if an email is + specified, it may result in the removal of a user (not an invitee) if + the user's main account corresponds to that email address. + + :rtype: MemberSelector + """ + if self._member_present: + return self._member_value + else: + raise AttributeError("missing required field 'member'") + + @member.setter + def member(self, val): + self._member_validator.validate_type_only(val) + self._member_value = val + self._member_present = True + + @member.deleter + def member(self): + self._member_value = None + self._member_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RemoveFileMemberArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RemoveFileMemberArg(file={!r}, member={!r})'.format( + self._file_value, + self._member_value, + ) + +RemoveFileMemberArg_validator = bv.Struct(RemoveFileMemberArg) + +class RemoveFileMemberError(bb.Union): + """ + Errors for :meth:`dropbox.dropbox.Dropbox.sharing_remove_file_member_2`. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar MemberAccessLevelResult no_explicit_access: This member does not have + explicit access to the file and therefore cannot be removed. The return + value is the access that a user might have to the file from a parent + folder. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def user_error(cls, val): + """ + Create an instance of this class set to the ``user_error`` tag with + value ``val``. + + :param SharingUserError val: + :rtype: RemoveFileMemberError + """ + return cls('user_error', val) + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharingFileAccessError val: + :rtype: RemoveFileMemberError + """ + return cls('access_error', val) + + @classmethod + def no_explicit_access(cls, val): + """ + Create an instance of this class set to the ``no_explicit_access`` tag + with value ``val``. + + :param MemberAccessLevelResult val: + :rtype: RemoveFileMemberError + """ + return cls('no_explicit_access', val) + + def is_user_error(self): + """ + Check if the union tag is ``user_error``. + + :rtype: bool + """ + return self._tag == 'user_error' + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_no_explicit_access(self): + """ + Check if the union tag is ``no_explicit_access``. + + :rtype: bool + """ + return self._tag == 'no_explicit_access' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_user_error(self): + """ + Only call this if :meth:`is_user_error` is true. + + :rtype: SharingUserError + """ + if not self.is_user_error(): + raise AttributeError("tag 'user_error' not set") + return self._value + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharingFileAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def get_no_explicit_access(self): + """ + This member does not have explicit access to the file and therefore + cannot be removed. The return value is the access that a user might have + to the file from a parent folder. + + Only call this if :meth:`is_no_explicit_access` is true. + + :rtype: MemberAccessLevelResult + """ + if not self.is_no_explicit_access(): + raise AttributeError("tag 'no_explicit_access' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(RemoveFileMemberError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RemoveFileMemberError(%r, %r)' % (self._tag, self._value) + +RemoveFileMemberError_validator = bv.Union(RemoveFileMemberError) + +class RemoveFolderMemberArg(bb.Struct): + """ + :ivar shared_folder_id: The ID for the shared folder. + :ivar member: The member to remove from the folder. + :ivar leave_a_copy: If true, the removed user will keep their copy of the + folder after it's unshared, assuming it was mounted. Otherwise, it will + be removed from their Dropbox. Also, this must be set to false when + kicking a group. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + '_member_value', + '_member_present', + '_leave_a_copy_value', + '_leave_a_copy_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None, + member=None, + leave_a_copy=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._member_value = None + self._member_present = False + self._leave_a_copy_value = None + self._leave_a_copy_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if member is not None: + self.member = member + if leave_a_copy is not None: + self.leave_a_copy = leave_a_copy + + @property + def shared_folder_id(self): + """ + The ID for the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def member(self): + """ + The member to remove from the folder. + + :rtype: MemberSelector + """ + if self._member_present: + return self._member_value + else: + raise AttributeError("missing required field 'member'") + + @member.setter + def member(self, val): + self._member_validator.validate_type_only(val) + self._member_value = val + self._member_present = True + + @member.deleter + def member(self): + self._member_value = None + self._member_present = False + + @property + def leave_a_copy(self): + """ + If true, the removed user will keep their copy of the folder after it's + unshared, assuming it was mounted. Otherwise, it will be removed from + their Dropbox. Also, this must be set to false when kicking a group. + + :rtype: bool + """ + if self._leave_a_copy_present: + return self._leave_a_copy_value + else: + raise AttributeError("missing required field 'leave_a_copy'") + + @leave_a_copy.setter + def leave_a_copy(self, val): + val = self._leave_a_copy_validator.validate(val) + self._leave_a_copy_value = val + self._leave_a_copy_present = True + + @leave_a_copy.deleter + def leave_a_copy(self): + self._leave_a_copy_value = None + self._leave_a_copy_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RemoveFolderMemberArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RemoveFolderMemberArg(shared_folder_id={!r}, member={!r}, leave_a_copy={!r})'.format( + self._shared_folder_id_value, + self._member_value, + self._leave_a_copy_value, + ) + +RemoveFolderMemberArg_validator = bv.Struct(RemoveFolderMemberArg) + +class RemoveFolderMemberError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar folder_owner: The target user is the owner of the shared folder. You + can't remove this user until ownership has been transferred to another + member. + :ivar group_access: The target user has access to the shared folder via a + group. + :ivar team_folder: This action cannot be performed on a team shared folder. + :ivar no_permission: The current user does not have permission to perform + this action. + :ivar too_many_files: This shared folder has too many files for leaving a + copy. You can still remove this user without leaving a copy. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + folder_owner = None + # Attribute is overwritten below the class definition + group_access = None + # Attribute is overwritten below the class definition + team_folder = None + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + too_many_files = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharedFolderAccessError val: + :rtype: RemoveFolderMemberError + """ + return cls('access_error', val) + + @classmethod + def member_error(cls, val): + """ + Create an instance of this class set to the ``member_error`` tag with + value ``val``. + + :param SharedFolderMemberError val: + :rtype: RemoveFolderMemberError + """ + return cls('member_error', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_member_error(self): + """ + Check if the union tag is ``member_error``. + + :rtype: bool + """ + return self._tag == 'member_error' + + def is_folder_owner(self): + """ + Check if the union tag is ``folder_owner``. + + :rtype: bool + """ + return self._tag == 'folder_owner' + + def is_group_access(self): + """ + Check if the union tag is ``group_access``. + + :rtype: bool + """ + return self._tag == 'group_access' + + def is_team_folder(self): + """ + Check if the union tag is ``team_folder``. + + :rtype: bool + """ + return self._tag == 'team_folder' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_too_many_files(self): + """ + Check if the union tag is ``too_many_files``. + + :rtype: bool + """ + return self._tag == 'too_many_files' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharedFolderAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def get_member_error(self): + """ + Only call this if :meth:`is_member_error` is true. + + :rtype: SharedFolderMemberError + """ + if not self.is_member_error(): + raise AttributeError("tag 'member_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(RemoveFolderMemberError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RemoveFolderMemberError(%r, %r)' % (self._tag, self._value) + +RemoveFolderMemberError_validator = bv.Union(RemoveFolderMemberError) + +class RemoveMemberJobStatus(async_.PollResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar MemberAccessLevelResult complete: Removing the folder member has + finished. The value is information about whether the member has another + form of access. + """ + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param MemberAccessLevelResult val: + :rtype: RemoveMemberJobStatus + """ + return cls('complete', val) + + @classmethod + def failed(cls, val): + """ + Create an instance of this class set to the ``failed`` tag with value + ``val``. + + :param RemoveFolderMemberError val: + :rtype: RemoveMemberJobStatus + """ + return cls('failed', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def is_failed(self): + """ + Check if the union tag is ``failed``. + + :rtype: bool + """ + return self._tag == 'failed' + + def get_complete(self): + """ + Removing the folder member has finished. The value is information about + whether the member has another form of access. + + Only call this if :meth:`is_complete` is true. + + :rtype: MemberAccessLevelResult + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def get_failed(self): + """ + Only call this if :meth:`is_failed` is true. + + :rtype: RemoveFolderMemberError + """ + if not self.is_failed(): + raise AttributeError("tag 'failed' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(RemoveMemberJobStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RemoveMemberJobStatus(%r, %r)' % (self._tag, self._value) + +RemoveMemberJobStatus_validator = bv.Union(RemoveMemberJobStatus) + +class RequestedVisibility(bb.Union): + """ + The access permission that can be requested by the caller for the shared + link. Note that the final resolved visibility of the shared link takes into + account other aspects, such as team and shared folder settings. Check the + :class:`ResolvedVisibility` for more info on the possible resolved + visibility values of shared links. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar public: Anyone who has received the link can access it. No login + required. + :ivar team_only: Only members of the same team can access the link. Login is + required. + :ivar password: A link-specific password is required to access the link. + Login is not required. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + public = None + # Attribute is overwritten below the class definition + team_only = None + # Attribute is overwritten below the class definition + password = None + + def is_public(self): + """ + Check if the union tag is ``public``. + + :rtype: bool + """ + return self._tag == 'public' + + def is_team_only(self): + """ + Check if the union tag is ``team_only``. + + :rtype: bool + """ + return self._tag == 'team_only' + + def is_password(self): + """ + Check if the union tag is ``password``. + + :rtype: bool + """ + return self._tag == 'password' + + def _process_custom_annotations(self, annotation_type, processor): + super(RequestedVisibility, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RequestedVisibility(%r, %r)' % (self._tag, self._value) + +RequestedVisibility_validator = bv.Union(RequestedVisibility) + +class ResolvedVisibility(RequestedVisibility): + """ + The actual access permissions values of shared links after taking into + account user preferences and the team and shared folder settings. Check the + :class:`RequestedVisibility` for more info on the possible visibility values + that can be set by the shared link's owner. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar team_and_password: Only members of the same team who have the + link-specific password can access the link. Login is required. + :ivar shared_folder_only: Only members of the shared folder containing the + linked file can access the link. Login is required. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + team_and_password = None + # Attribute is overwritten below the class definition + shared_folder_only = None + # Attribute is overwritten below the class definition + other = None + + def is_team_and_password(self): + """ + Check if the union tag is ``team_and_password``. + + :rtype: bool + """ + return self._tag == 'team_and_password' + + def is_shared_folder_only(self): + """ + Check if the union tag is ``shared_folder_only``. + + :rtype: bool + """ + return self._tag == 'shared_folder_only' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ResolvedVisibility, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ResolvedVisibility(%r, %r)' % (self._tag, self._value) + +ResolvedVisibility_validator = bv.Union(ResolvedVisibility) + +class RevokeSharedLinkArg(bb.Struct): + """ + :ivar url: URL of the shared link. + """ + + __slots__ = [ + '_url_value', + '_url_present', + ] + + _has_required_fields = True + + def __init__(self, + url=None): + self._url_value = None + self._url_present = False + if url is not None: + self.url = url + + @property + def url(self): + """ + URL of the shared link. + + :rtype: str + """ + if self._url_present: + return self._url_value + else: + raise AttributeError("missing required field 'url'") + + @url.setter + def url(self, val): + val = self._url_validator.validate(val) + self._url_value = val + self._url_present = True + + @url.deleter + def url(self): + self._url_value = None + self._url_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RevokeSharedLinkArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RevokeSharedLinkArg(url={!r})'.format( + self._url_value, + ) + +RevokeSharedLinkArg_validator = bv.Struct(RevokeSharedLinkArg) + +class RevokeSharedLinkError(SharedLinkError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar shared_link_malformed: Shared link is malformed. + """ + + # Attribute is overwritten below the class definition + shared_link_malformed = None + + def is_shared_link_malformed(self): + """ + Check if the union tag is ``shared_link_malformed``. + + :rtype: bool + """ + return self._tag == 'shared_link_malformed' + + def _process_custom_annotations(self, annotation_type, processor): + super(RevokeSharedLinkError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RevokeSharedLinkError(%r, %r)' % (self._tag, self._value) + +RevokeSharedLinkError_validator = bv.Union(RevokeSharedLinkError) + +class SetAccessInheritanceArg(bb.Struct): + """ + :ivar access_inheritance: The access inheritance settings for the folder. + :ivar shared_folder_id: The ID for the shared folder. + """ + + __slots__ = [ + '_access_inheritance_value', + '_access_inheritance_present', + '_shared_folder_id_value', + '_shared_folder_id_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None, + access_inheritance=None): + self._access_inheritance_value = None + self._access_inheritance_present = False + self._shared_folder_id_value = None + self._shared_folder_id_present = False + if access_inheritance is not None: + self.access_inheritance = access_inheritance + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + + @property + def access_inheritance(self): + """ + The access inheritance settings for the folder. + + :rtype: AccessInheritance + """ + if self._access_inheritance_present: + return self._access_inheritance_value + else: + return AccessInheritance.inherit + + @access_inheritance.setter + def access_inheritance(self, val): + self._access_inheritance_validator.validate_type_only(val) + self._access_inheritance_value = val + self._access_inheritance_present = True + + @access_inheritance.deleter + def access_inheritance(self): + self._access_inheritance_value = None + self._access_inheritance_present = False + + @property + def shared_folder_id(self): + """ + The ID for the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SetAccessInheritanceArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SetAccessInheritanceArg(shared_folder_id={!r}, access_inheritance={!r})'.format( + self._shared_folder_id_value, + self._access_inheritance_value, + ) + +SetAccessInheritanceArg_validator = bv.Struct(SetAccessInheritanceArg) + +class SetAccessInheritanceError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar SharedFolderAccessError access_error: Unable to access shared folder. + :ivar no_permission: The current user does not have permission to perform + this action. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharedFolderAccessError val: + :rtype: SetAccessInheritanceError + """ + return cls('access_error', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Unable to access shared folder. + + Only call this if :meth:`is_access_error` is true. + + :rtype: SharedFolderAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(SetAccessInheritanceError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SetAccessInheritanceError(%r, %r)' % (self._tag, self._value) + +SetAccessInheritanceError_validator = bv.Union(SetAccessInheritanceError) + +class ShareFolderArgBase(bb.Struct): + """ + :ivar acl_update_policy: Who can add and remove members of this shared + folder. + :ivar force_async: Whether to force the share to happen asynchronously. + :ivar member_policy: Who can be a member of this shared folder. Only + applicable if the current user is on a team. + :ivar path: The path to the folder to share. If it does not exist, then a + new one is created. + :ivar shared_link_policy: The policy to apply to shared links created for + content inside this shared folder. The current user must be on a team + to set this policy to ``SharedLinkPolicy.members``. + :ivar viewer_info_policy: Who can enable/disable viewer info for this shared + folder. + :ivar access_inheritance: The access inheritance settings for the folder. + """ + + __slots__ = [ + '_acl_update_policy_value', + '_acl_update_policy_present', + '_force_async_value', + '_force_async_present', + '_member_policy_value', + '_member_policy_present', + '_path_value', + '_path_present', + '_shared_link_policy_value', + '_shared_link_policy_present', + '_viewer_info_policy_value', + '_viewer_info_policy_present', + '_access_inheritance_value', + '_access_inheritance_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + acl_update_policy=None, + force_async=None, + member_policy=None, + shared_link_policy=None, + viewer_info_policy=None, + access_inheritance=None): + self._acl_update_policy_value = None + self._acl_update_policy_present = False + self._force_async_value = None + self._force_async_present = False + self._member_policy_value = None + self._member_policy_present = False + self._path_value = None + self._path_present = False + self._shared_link_policy_value = None + self._shared_link_policy_present = False + self._viewer_info_policy_value = None + self._viewer_info_policy_present = False + self._access_inheritance_value = None + self._access_inheritance_present = False + if acl_update_policy is not None: + self.acl_update_policy = acl_update_policy + if force_async is not None: + self.force_async = force_async + if member_policy is not None: + self.member_policy = member_policy + if path is not None: + self.path = path + if shared_link_policy is not None: + self.shared_link_policy = shared_link_policy + if viewer_info_policy is not None: + self.viewer_info_policy = viewer_info_policy + if access_inheritance is not None: + self.access_inheritance = access_inheritance + + @property + def acl_update_policy(self): + """ + Who can add and remove members of this shared folder. + + :rtype: AclUpdatePolicy + """ + if self._acl_update_policy_present: + return self._acl_update_policy_value + else: + return None + + @acl_update_policy.setter + def acl_update_policy(self, val): + if val is None: + del self.acl_update_policy + return + self._acl_update_policy_validator.validate_type_only(val) + self._acl_update_policy_value = val + self._acl_update_policy_present = True + + @acl_update_policy.deleter + def acl_update_policy(self): + self._acl_update_policy_value = None + self._acl_update_policy_present = False + + @property + def force_async(self): + """ + Whether to force the share to happen asynchronously. + + :rtype: bool + """ + if self._force_async_present: + return self._force_async_value + else: + return False + + @force_async.setter + def force_async(self, val): + val = self._force_async_validator.validate(val) + self._force_async_value = val + self._force_async_present = True + + @force_async.deleter + def force_async(self): + self._force_async_value = None + self._force_async_present = False + + @property + def member_policy(self): + """ + Who can be a member of this shared folder. Only applicable if the + current user is on a team. + + :rtype: MemberPolicy + """ + if self._member_policy_present: + return self._member_policy_value + else: + return None + + @member_policy.setter + def member_policy(self, val): + if val is None: + del self.member_policy + return + self._member_policy_validator.validate_type_only(val) + self._member_policy_value = val + self._member_policy_present = True + + @member_policy.deleter + def member_policy(self): + self._member_policy_value = None + self._member_policy_present = False + + @property + def path(self): + """ + The path to the folder to share. If it does not exist, then a new one is + created. + + :rtype: str + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + val = self._path_validator.validate(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def shared_link_policy(self): + """ + The policy to apply to shared links created for content inside this + shared folder. The current user must be on a team to set this policy to + ``SharedLinkPolicy.members``. + + :rtype: SharedLinkPolicy + """ + if self._shared_link_policy_present: + return self._shared_link_policy_value + else: + return None + + @shared_link_policy.setter + def shared_link_policy(self, val): + if val is None: + del self.shared_link_policy + return + self._shared_link_policy_validator.validate_type_only(val) + self._shared_link_policy_value = val + self._shared_link_policy_present = True + + @shared_link_policy.deleter + def shared_link_policy(self): + self._shared_link_policy_value = None + self._shared_link_policy_present = False + + @property + def viewer_info_policy(self): + """ + Who can enable/disable viewer info for this shared folder. + + :rtype: ViewerInfoPolicy + """ + if self._viewer_info_policy_present: + return self._viewer_info_policy_value + else: + return None + + @viewer_info_policy.setter + def viewer_info_policy(self, val): + if val is None: + del self.viewer_info_policy + return + self._viewer_info_policy_validator.validate_type_only(val) + self._viewer_info_policy_value = val + self._viewer_info_policy_present = True + + @viewer_info_policy.deleter + def viewer_info_policy(self): + self._viewer_info_policy_value = None + self._viewer_info_policy_present = False + + @property + def access_inheritance(self): + """ + The access inheritance settings for the folder. + + :rtype: AccessInheritance + """ + if self._access_inheritance_present: + return self._access_inheritance_value + else: + return AccessInheritance.inherit + + @access_inheritance.setter + def access_inheritance(self, val): + self._access_inheritance_validator.validate_type_only(val) + self._access_inheritance_value = val + self._access_inheritance_present = True + + @access_inheritance.deleter + def access_inheritance(self): + self._access_inheritance_value = None + self._access_inheritance_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShareFolderArgBase, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShareFolderArgBase(path={!r}, acl_update_policy={!r}, force_async={!r}, member_policy={!r}, shared_link_policy={!r}, viewer_info_policy={!r}, access_inheritance={!r})'.format( + self._path_value, + self._acl_update_policy_value, + self._force_async_value, + self._member_policy_value, + self._shared_link_policy_value, + self._viewer_info_policy_value, + self._access_inheritance_value, + ) + +ShareFolderArgBase_validator = bv.Struct(ShareFolderArgBase) + +class ShareFolderArg(ShareFolderArgBase): + """ + :ivar actions: A list of `FolderAction`s corresponding to + `FolderPermission`s that should appear in the response's + ``SharedFolderMetadata.permissions`` field describing the actions the + authenticated user can perform on the folder. + :ivar link_settings: Settings on the link for this folder. + """ + + __slots__ = [ + '_actions_value', + '_actions_present', + '_link_settings_value', + '_link_settings_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + acl_update_policy=None, + force_async=None, + member_policy=None, + shared_link_policy=None, + viewer_info_policy=None, + access_inheritance=None, + actions=None, + link_settings=None): + super(ShareFolderArg, self).__init__(path, + acl_update_policy, + force_async, + member_policy, + shared_link_policy, + viewer_info_policy, + access_inheritance) + self._actions_value = None + self._actions_present = False + self._link_settings_value = None + self._link_settings_present = False + if actions is not None: + self.actions = actions + if link_settings is not None: + self.link_settings = link_settings + + @property + def actions(self): + """ + A list of `FolderAction`s corresponding to `FolderPermission`s that + should appear in the response's ``SharedFolderMetadata.permissions`` + field describing the actions the authenticated user can perform on the + folder. + + :rtype: list of [FolderAction] + """ + if self._actions_present: + return self._actions_value + else: + return None + + @actions.setter + def actions(self, val): + if val is None: + del self.actions + return + val = self._actions_validator.validate(val) + self._actions_value = val + self._actions_present = True + + @actions.deleter + def actions(self): + self._actions_value = None + self._actions_present = False + + @property + def link_settings(self): + """ + Settings on the link for this folder. + + :rtype: LinkSettings + """ + if self._link_settings_present: + return self._link_settings_value + else: + return None + + @link_settings.setter + def link_settings(self, val): + if val is None: + del self.link_settings + return + self._link_settings_validator.validate_type_only(val) + self._link_settings_value = val + self._link_settings_present = True + + @link_settings.deleter + def link_settings(self): + self._link_settings_value = None + self._link_settings_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShareFolderArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShareFolderArg(path={!r}, acl_update_policy={!r}, force_async={!r}, member_policy={!r}, shared_link_policy={!r}, viewer_info_policy={!r}, access_inheritance={!r}, actions={!r}, link_settings={!r})'.format( + self._path_value, + self._acl_update_policy_value, + self._force_async_value, + self._member_policy_value, + self._shared_link_policy_value, + self._viewer_info_policy_value, + self._access_inheritance_value, + self._actions_value, + self._link_settings_value, + ) + +ShareFolderArg_validator = bv.Struct(ShareFolderArg) + +class ShareFolderErrorBase(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar email_unverified: The current user's e-mail address is unverified. + :ivar SharePathError bad_path: ``ShareFolderArg.path`` is invalid. + :ivar team_policy_disallows_member_policy: Team policy is more restrictive + than ``ShareFolderArg.member_policy``. + :ivar disallowed_shared_link_policy: The current user's account is not + allowed to select the specified ``ShareFolderArg.shared_link_policy``. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + email_unverified = None + # Attribute is overwritten below the class definition + team_policy_disallows_member_policy = None + # Attribute is overwritten below the class definition + disallowed_shared_link_policy = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def bad_path(cls, val): + """ + Create an instance of this class set to the ``bad_path`` tag with value + ``val``. + + :param SharePathError val: + :rtype: ShareFolderErrorBase + """ + return cls('bad_path', val) + + def is_email_unverified(self): + """ + Check if the union tag is ``email_unverified``. + + :rtype: bool + """ + return self._tag == 'email_unverified' + + def is_bad_path(self): + """ + Check if the union tag is ``bad_path``. + + :rtype: bool + """ + return self._tag == 'bad_path' + + def is_team_policy_disallows_member_policy(self): + """ + Check if the union tag is ``team_policy_disallows_member_policy``. + + :rtype: bool + """ + return self._tag == 'team_policy_disallows_member_policy' + + def is_disallowed_shared_link_policy(self): + """ + Check if the union tag is ``disallowed_shared_link_policy``. + + :rtype: bool + """ + return self._tag == 'disallowed_shared_link_policy' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_bad_path(self): + """ + ``ShareFolderArg.path`` is invalid. + + Only call this if :meth:`is_bad_path` is true. + + :rtype: SharePathError + """ + if not self.is_bad_path(): + raise AttributeError("tag 'bad_path' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ShareFolderErrorBase, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShareFolderErrorBase(%r, %r)' % (self._tag, self._value) + +ShareFolderErrorBase_validator = bv.Union(ShareFolderErrorBase) + +class ShareFolderError(ShareFolderErrorBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar no_permission: The current user does not have permission to perform + this action. + """ + + # Attribute is overwritten below the class definition + no_permission = None + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def _process_custom_annotations(self, annotation_type, processor): + super(ShareFolderError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShareFolderError(%r, %r)' % (self._tag, self._value) + +ShareFolderError_validator = bv.Union(ShareFolderError) + +class ShareFolderJobStatus(async_.PollResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar SharedFolderMetadata complete: The share job has finished. The value + is the metadata for the folder. + """ + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param SharedFolderMetadata val: + :rtype: ShareFolderJobStatus + """ + return cls('complete', val) + + @classmethod + def failed(cls, val): + """ + Create an instance of this class set to the ``failed`` tag with value + ``val``. + + :param ShareFolderError val: + :rtype: ShareFolderJobStatus + """ + return cls('failed', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def is_failed(self): + """ + Check if the union tag is ``failed``. + + :rtype: bool + """ + return self._tag == 'failed' + + def get_complete(self): + """ + The share job has finished. The value is the metadata for the folder. + + Only call this if :meth:`is_complete` is true. + + :rtype: SharedFolderMetadata + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def get_failed(self): + """ + Only call this if :meth:`is_failed` is true. + + :rtype: ShareFolderError + """ + if not self.is_failed(): + raise AttributeError("tag 'failed' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ShareFolderJobStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShareFolderJobStatus(%r, %r)' % (self._tag, self._value) + +ShareFolderJobStatus_validator = bv.Union(ShareFolderJobStatus) + +class ShareFolderLaunch(async_.LaunchResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param SharedFolderMetadata val: + :rtype: ShareFolderLaunch + """ + return cls('complete', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def get_complete(self): + """ + Only call this if :meth:`is_complete` is true. + + :rtype: SharedFolderMetadata + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ShareFolderLaunch, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShareFolderLaunch(%r, %r)' % (self._tag, self._value) + +ShareFolderLaunch_validator = bv.Union(ShareFolderLaunch) + +class SharePathError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar is_file: A file is at the specified path. + :ivar inside_shared_folder: We do not support sharing a folder inside a + shared folder. + :ivar contains_shared_folder: We do not support shared folders that contain + shared folders. + :ivar contains_app_folder: We do not support shared folders that contain app + folders. + :ivar contains_team_folder: We do not support shared folders that contain + team folders. + :ivar is_app_folder: We do not support sharing an app folder. + :ivar inside_app_folder: We do not support sharing a folder inside an app + folder. + :ivar is_public_folder: A public folder can't be shared this way. Use a + public link instead. + :ivar inside_public_folder: A folder inside a public folder can't be shared + this way. Use a public link instead. + :ivar SharedFolderMetadata already_shared: Folder is already shared. + Contains metadata about the existing shared folder. + :ivar invalid_path: Path is not valid. + :ivar is_osx_package: We do not support sharing a Mac OS X package. + :ivar inside_osx_package: We do not support sharing a folder inside a Mac OS + X package. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + is_file = None + # Attribute is overwritten below the class definition + inside_shared_folder = None + # Attribute is overwritten below the class definition + contains_shared_folder = None + # Attribute is overwritten below the class definition + contains_app_folder = None + # Attribute is overwritten below the class definition + contains_team_folder = None + # Attribute is overwritten below the class definition + is_app_folder = None + # Attribute is overwritten below the class definition + inside_app_folder = None + # Attribute is overwritten below the class definition + is_public_folder = None + # Attribute is overwritten below the class definition + inside_public_folder = None + # Attribute is overwritten below the class definition + invalid_path = None + # Attribute is overwritten below the class definition + is_osx_package = None + # Attribute is overwritten below the class definition + inside_osx_package = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def already_shared(cls, val): + """ + Create an instance of this class set to the ``already_shared`` tag with + value ``val``. + + :param SharedFolderMetadata val: + :rtype: SharePathError + """ + return cls('already_shared', val) + + def is_is_file(self): + """ + Check if the union tag is ``is_file``. + + :rtype: bool + """ + return self._tag == 'is_file' + + def is_inside_shared_folder(self): + """ + Check if the union tag is ``inside_shared_folder``. + + :rtype: bool + """ + return self._tag == 'inside_shared_folder' + + def is_contains_shared_folder(self): + """ + Check if the union tag is ``contains_shared_folder``. + + :rtype: bool + """ + return self._tag == 'contains_shared_folder' + + def is_contains_app_folder(self): + """ + Check if the union tag is ``contains_app_folder``. + + :rtype: bool + """ + return self._tag == 'contains_app_folder' + + def is_contains_team_folder(self): + """ + Check if the union tag is ``contains_team_folder``. + + :rtype: bool + """ + return self._tag == 'contains_team_folder' + + def is_is_app_folder(self): + """ + Check if the union tag is ``is_app_folder``. + + :rtype: bool + """ + return self._tag == 'is_app_folder' + + def is_inside_app_folder(self): + """ + Check if the union tag is ``inside_app_folder``. + + :rtype: bool + """ + return self._tag == 'inside_app_folder' + + def is_is_public_folder(self): + """ + Check if the union tag is ``is_public_folder``. + + :rtype: bool + """ + return self._tag == 'is_public_folder' + + def is_inside_public_folder(self): + """ + Check if the union tag is ``inside_public_folder``. + + :rtype: bool + """ + return self._tag == 'inside_public_folder' + + def is_already_shared(self): + """ + Check if the union tag is ``already_shared``. + + :rtype: bool + """ + return self._tag == 'already_shared' + + def is_invalid_path(self): + """ + Check if the union tag is ``invalid_path``. + + :rtype: bool + """ + return self._tag == 'invalid_path' + + def is_is_osx_package(self): + """ + Check if the union tag is ``is_osx_package``. + + :rtype: bool + """ + return self._tag == 'is_osx_package' + + def is_inside_osx_package(self): + """ + Check if the union tag is ``inside_osx_package``. + + :rtype: bool + """ + return self._tag == 'inside_osx_package' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_already_shared(self): + """ + Folder is already shared. Contains metadata about the existing shared + folder. + + Only call this if :meth:`is_already_shared` is true. + + :rtype: SharedFolderMetadata + """ + if not self.is_already_shared(): + raise AttributeError("tag 'already_shared' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(SharePathError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharePathError(%r, %r)' % (self._tag, self._value) + +SharePathError_validator = bv.Union(SharePathError) + +class SharedContentLinkMetadata(SharedContentLinkMetadataBase): + """ + Metadata of a shared link for a file or folder. + + :ivar audience_exceptions: The content inside this folder with link audience + different than this folder's. This is only returned when an endpoint + that returns metadata for a single shared folder is called, e.g. + /get_folder_metadata. + :ivar url: The URL of the link. + """ + + __slots__ = [ + '_audience_exceptions_value', + '_audience_exceptions_present', + '_url_value', + '_url_present', + ] + + _has_required_fields = True + + def __init__(self, + audience_options=None, + current_audience=None, + link_permissions=None, + password_protected=None, + url=None, + access_level=None, + audience_restricting_shared_folder=None, + expiry=None, + audience_exceptions=None): + super(SharedContentLinkMetadata, self).__init__(audience_options, + current_audience, + link_permissions, + password_protected, + access_level, + audience_restricting_shared_folder, + expiry) + self._audience_exceptions_value = None + self._audience_exceptions_present = False + self._url_value = None + self._url_present = False + if audience_exceptions is not None: + self.audience_exceptions = audience_exceptions + if url is not None: + self.url = url + + @property + def audience_exceptions(self): + """ + The content inside this folder with link audience different than this + folder's. This is only returned when an endpoint that returns metadata + for a single shared folder is called, e.g. /get_folder_metadata. + + :rtype: AudienceExceptions + """ + if self._audience_exceptions_present: + return self._audience_exceptions_value + else: + return None + + @audience_exceptions.setter + def audience_exceptions(self, val): + if val is None: + del self.audience_exceptions + return + self._audience_exceptions_validator.validate_type_only(val) + self._audience_exceptions_value = val + self._audience_exceptions_present = True + + @audience_exceptions.deleter + def audience_exceptions(self): + self._audience_exceptions_value = None + self._audience_exceptions_present = False + + @property + def url(self): + """ + The URL of the link. + + :rtype: str + """ + if self._url_present: + return self._url_value + else: + raise AttributeError("missing required field 'url'") + + @url.setter + def url(self, val): + val = self._url_validator.validate(val) + self._url_value = val + self._url_present = True + + @url.deleter + def url(self): + self._url_value = None + self._url_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentLinkMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentLinkMetadata(audience_options={!r}, current_audience={!r}, link_permissions={!r}, password_protected={!r}, url={!r}, access_level={!r}, audience_restricting_shared_folder={!r}, expiry={!r}, audience_exceptions={!r})'.format( + self._audience_options_value, + self._current_audience_value, + self._link_permissions_value, + self._password_protected_value, + self._url_value, + self._access_level_value, + self._audience_restricting_shared_folder_value, + self._expiry_value, + self._audience_exceptions_value, + ) + +SharedContentLinkMetadata_validator = bv.Struct(SharedContentLinkMetadata) + +class SharedFileMembers(bb.Struct): + """ + Shared file user, group, and invitee membership. Used for the results of + :meth:`dropbox.dropbox.Dropbox.sharing_list_file_members` and + :meth:`dropbox.dropbox.Dropbox.sharing_list_file_members_continue`, and used + as part of the results for + :meth:`dropbox.dropbox.Dropbox.sharing_list_file_members_batch`. + + :ivar users: The list of user members of the shared file. + :ivar groups: The list of group members of the shared file. + :ivar invitees: The list of invited members of a file, but have not logged + in and claimed this. + :ivar cursor: Present if there are additional shared file members that have + not been returned yet. Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.sharing_list_file_members_continue` to + list additional members. + """ + + __slots__ = [ + '_users_value', + '_users_present', + '_groups_value', + '_groups_present', + '_invitees_value', + '_invitees_present', + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + users=None, + groups=None, + invitees=None, + cursor=None): + self._users_value = None + self._users_present = False + self._groups_value = None + self._groups_present = False + self._invitees_value = None + self._invitees_present = False + self._cursor_value = None + self._cursor_present = False + if users is not None: + self.users = users + if groups is not None: + self.groups = groups + if invitees is not None: + self.invitees = invitees + if cursor is not None: + self.cursor = cursor + + @property + def users(self): + """ + The list of user members of the shared file. + + :rtype: list of [UserFileMembershipInfo] + """ + if self._users_present: + return self._users_value + else: + raise AttributeError("missing required field 'users'") + + @users.setter + def users(self, val): + val = self._users_validator.validate(val) + self._users_value = val + self._users_present = True + + @users.deleter + def users(self): + self._users_value = None + self._users_present = False + + @property + def groups(self): + """ + The list of group members of the shared file. + + :rtype: list of [GroupMembershipInfo] + """ + if self._groups_present: + return self._groups_value + else: + raise AttributeError("missing required field 'groups'") + + @groups.setter + def groups(self, val): + val = self._groups_validator.validate(val) + self._groups_value = val + self._groups_present = True + + @groups.deleter + def groups(self): + self._groups_value = None + self._groups_present = False + + @property + def invitees(self): + """ + The list of invited members of a file, but have not logged in and + claimed this. + + :rtype: list of [InviteeMembershipInfo] + """ + if self._invitees_present: + return self._invitees_value + else: + raise AttributeError("missing required field 'invitees'") + + @invitees.setter + def invitees(self, val): + val = self._invitees_validator.validate(val) + self._invitees_value = val + self._invitees_present = True + + @invitees.deleter + def invitees(self): + self._invitees_value = None + self._invitees_present = False + + @property + def cursor(self): + """ + Present if there are additional shared file members that have not been + returned yet. Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.sharing_list_file_members_continue` to + list additional members. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFileMembers, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFileMembers(users={!r}, groups={!r}, invitees={!r}, cursor={!r})'.format( + self._users_value, + self._groups_value, + self._invitees_value, + self._cursor_value, + ) + +SharedFileMembers_validator = bv.Struct(SharedFileMembers) + +class SharedFileMetadata(bb.Struct): + """ + Properties of the shared file. + + :ivar access_type: The current user's access level for this shared file. + :ivar id: The ID of the file. + :ivar expected_link_metadata: The expected metadata of the link associated + for the file when it is first shared. Absent if the link already exists. + This is for an unreleased feature so it may not be returned yet. + :ivar link_metadata: The metadata of the link associated for the file. This + is for an unreleased feature so it may not be returned yet. + :ivar name: The name of this file. + :ivar owner_display_names: The display names of the users that own the file. + If the file is part of a team folder, the display names of the team + admins are also included. Absent if the owner display names cannot be + fetched. + :ivar owner_team: The team that owns the file. This field is not present if + the file is not owned by a team. + :ivar parent_shared_folder_id: The ID of the parent shared folder. This + field is present only if the file is contained within a shared folder. + :ivar path_display: The cased path to be used for display purposes only. In + rare instances the casing will not correctly match the user's + filesystem, but this behavior will match the path provided in the Core + API v1. Absent for unmounted files. + :ivar path_lower: The lower-case full path of this file. Absent for + unmounted files. + :ivar permissions: The sharing permissions that requesting user has on this + file. This corresponds to the entries given in + ``GetFileMetadataBatchArg.actions`` or ``GetFileMetadataArg.actions``. + :ivar policy: Policies governing this shared file. + :ivar preview_url: URL for displaying a web preview of the shared file. + :ivar time_invited: Timestamp indicating when the current user was invited + to this shared file. If the user was not invited to the shared file, the + timestamp will indicate when the user was invited to the parent shared + folder. This value may be absent. + """ + + __slots__ = [ + '_access_type_value', + '_access_type_present', + '_id_value', + '_id_present', + '_expected_link_metadata_value', + '_expected_link_metadata_present', + '_link_metadata_value', + '_link_metadata_present', + '_name_value', + '_name_present', + '_owner_display_names_value', + '_owner_display_names_present', + '_owner_team_value', + '_owner_team_present', + '_parent_shared_folder_id_value', + '_parent_shared_folder_id_present', + '_path_display_value', + '_path_display_present', + '_path_lower_value', + '_path_lower_present', + '_permissions_value', + '_permissions_present', + '_policy_value', + '_policy_present', + '_preview_url_value', + '_preview_url_present', + '_time_invited_value', + '_time_invited_present', + ] + + _has_required_fields = True + + def __init__(self, + id=None, + name=None, + policy=None, + preview_url=None, + access_type=None, + expected_link_metadata=None, + link_metadata=None, + owner_display_names=None, + owner_team=None, + parent_shared_folder_id=None, + path_display=None, + path_lower=None, + permissions=None, + time_invited=None): + self._access_type_value = None + self._access_type_present = False + self._id_value = None + self._id_present = False + self._expected_link_metadata_value = None + self._expected_link_metadata_present = False + self._link_metadata_value = None + self._link_metadata_present = False + self._name_value = None + self._name_present = False + self._owner_display_names_value = None + self._owner_display_names_present = False + self._owner_team_value = None + self._owner_team_present = False + self._parent_shared_folder_id_value = None + self._parent_shared_folder_id_present = False + self._path_display_value = None + self._path_display_present = False + self._path_lower_value = None + self._path_lower_present = False + self._permissions_value = None + self._permissions_present = False + self._policy_value = None + self._policy_present = False + self._preview_url_value = None + self._preview_url_present = False + self._time_invited_value = None + self._time_invited_present = False + if access_type is not None: + self.access_type = access_type + if id is not None: + self.id = id + if expected_link_metadata is not None: + self.expected_link_metadata = expected_link_metadata + if link_metadata is not None: + self.link_metadata = link_metadata + if name is not None: + self.name = name + if owner_display_names is not None: + self.owner_display_names = owner_display_names + if owner_team is not None: + self.owner_team = owner_team + if parent_shared_folder_id is not None: + self.parent_shared_folder_id = parent_shared_folder_id + if path_display is not None: + self.path_display = path_display + if path_lower is not None: + self.path_lower = path_lower + if permissions is not None: + self.permissions = permissions + if policy is not None: + self.policy = policy + if preview_url is not None: + self.preview_url = preview_url + if time_invited is not None: + self.time_invited = time_invited + + @property + def access_type(self): + """ + The current user's access level for this shared file. + + :rtype: AccessLevel + """ + if self._access_type_present: + return self._access_type_value + else: + return None + + @access_type.setter + def access_type(self, val): + if val is None: + del self.access_type + return + self._access_type_validator.validate_type_only(val) + self._access_type_value = val + self._access_type_present = True + + @access_type.deleter + def access_type(self): + self._access_type_value = None + self._access_type_present = False + + @property + def id(self): + """ + The ID of the file. + + :rtype: str + """ + if self._id_present: + return self._id_value + else: + raise AttributeError("missing required field 'id'") + + @id.setter + def id(self, val): + val = self._id_validator.validate(val) + self._id_value = val + self._id_present = True + + @id.deleter + def id(self): + self._id_value = None + self._id_present = False + + @property + def expected_link_metadata(self): + """ + The expected metadata of the link associated for the file when it is + first shared. Absent if the link already exists. This is for an + unreleased feature so it may not be returned yet. + + :rtype: ExpectedSharedContentLinkMetadata + """ + if self._expected_link_metadata_present: + return self._expected_link_metadata_value + else: + return None + + @expected_link_metadata.setter + def expected_link_metadata(self, val): + if val is None: + del self.expected_link_metadata + return + self._expected_link_metadata_validator.validate_type_only(val) + self._expected_link_metadata_value = val + self._expected_link_metadata_present = True + + @expected_link_metadata.deleter + def expected_link_metadata(self): + self._expected_link_metadata_value = None + self._expected_link_metadata_present = False + + @property + def link_metadata(self): + """ + The metadata of the link associated for the file. This is for an + unreleased feature so it may not be returned yet. + + :rtype: SharedContentLinkMetadata + """ + if self._link_metadata_present: + return self._link_metadata_value + else: + return None + + @link_metadata.setter + def link_metadata(self, val): + if val is None: + del self.link_metadata + return + self._link_metadata_validator.validate_type_only(val) + self._link_metadata_value = val + self._link_metadata_present = True + + @link_metadata.deleter + def link_metadata(self): + self._link_metadata_value = None + self._link_metadata_present = False + + @property + def name(self): + """ + The name of this file. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def owner_display_names(self): + """ + The display names of the users that own the file. If the file is part of + a team folder, the display names of the team admins are also included. + Absent if the owner display names cannot be fetched. + + :rtype: list of [str] + """ + if self._owner_display_names_present: + return self._owner_display_names_value + else: + return None + + @owner_display_names.setter + def owner_display_names(self, val): + if val is None: + del self.owner_display_names + return + val = self._owner_display_names_validator.validate(val) + self._owner_display_names_value = val + self._owner_display_names_present = True + + @owner_display_names.deleter + def owner_display_names(self): + self._owner_display_names_value = None + self._owner_display_names_present = False + + @property + def owner_team(self): + """ + The team that owns the file. This field is not present if the file is + not owned by a team. + + :rtype: users.Team + """ + if self._owner_team_present: + return self._owner_team_value + else: + return None + + @owner_team.setter + def owner_team(self, val): + if val is None: + del self.owner_team + return + self._owner_team_validator.validate_type_only(val) + self._owner_team_value = val + self._owner_team_present = True + + @owner_team.deleter + def owner_team(self): + self._owner_team_value = None + self._owner_team_present = False + + @property + def parent_shared_folder_id(self): + """ + The ID of the parent shared folder. This field is present only if the + file is contained within a shared folder. + + :rtype: str + """ + if self._parent_shared_folder_id_present: + return self._parent_shared_folder_id_value + else: + return None + + @parent_shared_folder_id.setter + def parent_shared_folder_id(self, val): + if val is None: + del self.parent_shared_folder_id + return + val = self._parent_shared_folder_id_validator.validate(val) + self._parent_shared_folder_id_value = val + self._parent_shared_folder_id_present = True + + @parent_shared_folder_id.deleter + def parent_shared_folder_id(self): + self._parent_shared_folder_id_value = None + self._parent_shared_folder_id_present = False + + @property + def path_display(self): + """ + The cased path to be used for display purposes only. In rare instances + the casing will not correctly match the user's filesystem, but this + behavior will match the path provided in the Core API v1. Absent for + unmounted files. + + :rtype: str + """ + if self._path_display_present: + return self._path_display_value + else: + return None + + @path_display.setter + def path_display(self, val): + if val is None: + del self.path_display + return + val = self._path_display_validator.validate(val) + self._path_display_value = val + self._path_display_present = True + + @path_display.deleter + def path_display(self): + self._path_display_value = None + self._path_display_present = False + + @property + def path_lower(self): + """ + The lower-case full path of this file. Absent for unmounted files. + + :rtype: str + """ + if self._path_lower_present: + return self._path_lower_value + else: + return None + + @path_lower.setter + def path_lower(self, val): + if val is None: + del self.path_lower + return + val = self._path_lower_validator.validate(val) + self._path_lower_value = val + self._path_lower_present = True + + @path_lower.deleter + def path_lower(self): + self._path_lower_value = None + self._path_lower_present = False + + @property + def permissions(self): + """ + The sharing permissions that requesting user has on this file. This + corresponds to the entries given in ``GetFileMetadataBatchArg.actions`` + or ``GetFileMetadataArg.actions``. + + :rtype: list of [FilePermission] + """ + if self._permissions_present: + return self._permissions_value + else: + return None + + @permissions.setter + def permissions(self, val): + if val is None: + del self.permissions + return + val = self._permissions_validator.validate(val) + self._permissions_value = val + self._permissions_present = True + + @permissions.deleter + def permissions(self): + self._permissions_value = None + self._permissions_present = False + + @property + def policy(self): + """ + Policies governing this shared file. + + :rtype: FolderPolicy + """ + if self._policy_present: + return self._policy_value + else: + raise AttributeError("missing required field 'policy'") + + @policy.setter + def policy(self, val): + self._policy_validator.validate_type_only(val) + self._policy_value = val + self._policy_present = True + + @policy.deleter + def policy(self): + self._policy_value = None + self._policy_present = False + + @property + def preview_url(self): + """ + URL for displaying a web preview of the shared file. + + :rtype: str + """ + if self._preview_url_present: + return self._preview_url_value + else: + raise AttributeError("missing required field 'preview_url'") + + @preview_url.setter + def preview_url(self, val): + val = self._preview_url_validator.validate(val) + self._preview_url_value = val + self._preview_url_present = True + + @preview_url.deleter + def preview_url(self): + self._preview_url_value = None + self._preview_url_present = False + + @property + def time_invited(self): + """ + Timestamp indicating when the current user was invited to this shared + file. If the user was not invited to the shared file, the timestamp will + indicate when the user was invited to the parent shared folder. This + value may be absent. + + :rtype: datetime.datetime + """ + if self._time_invited_present: + return self._time_invited_value + else: + return None + + @time_invited.setter + def time_invited(self, val): + if val is None: + del self.time_invited + return + val = self._time_invited_validator.validate(val) + self._time_invited_value = val + self._time_invited_present = True + + @time_invited.deleter + def time_invited(self): + self._time_invited_value = None + self._time_invited_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFileMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFileMetadata(id={!r}, name={!r}, policy={!r}, preview_url={!r}, access_type={!r}, expected_link_metadata={!r}, link_metadata={!r}, owner_display_names={!r}, owner_team={!r}, parent_shared_folder_id={!r}, path_display={!r}, path_lower={!r}, permissions={!r}, time_invited={!r})'.format( + self._id_value, + self._name_value, + self._policy_value, + self._preview_url_value, + self._access_type_value, + self._expected_link_metadata_value, + self._link_metadata_value, + self._owner_display_names_value, + self._owner_team_value, + self._parent_shared_folder_id_value, + self._path_display_value, + self._path_lower_value, + self._permissions_value, + self._time_invited_value, + ) + +SharedFileMetadata_validator = bv.Struct(SharedFileMetadata) + +class SharedFolderAccessError(bb.Union): + """ + There is an error accessing the shared folder. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_id: This shared folder ID is invalid. + :ivar not_a_member: The user is not a member of the shared folder thus + cannot access it. + :ivar email_unverified: Never set. + :ivar unmounted: The shared folder is unmounted. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_id = None + # Attribute is overwritten below the class definition + not_a_member = None + # Attribute is overwritten below the class definition + email_unverified = None + # Attribute is overwritten below the class definition + unmounted = None + # Attribute is overwritten below the class definition + other = None + + def is_invalid_id(self): + """ + Check if the union tag is ``invalid_id``. + + :rtype: bool + """ + return self._tag == 'invalid_id' + + def is_not_a_member(self): + """ + Check if the union tag is ``not_a_member``. + + :rtype: bool + """ + return self._tag == 'not_a_member' + + def is_email_unverified(self): + """ + Check if the union tag is ``email_unverified``. + + :rtype: bool + """ + return self._tag == 'email_unverified' + + def is_unmounted(self): + """ + Check if the union tag is ``unmounted``. + + :rtype: bool + """ + return self._tag == 'unmounted' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderAccessError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderAccessError(%r, %r)' % (self._tag, self._value) + +SharedFolderAccessError_validator = bv.Union(SharedFolderAccessError) + +class SharedFolderMemberError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_dropbox_id: The target dropbox_id is invalid. + :ivar not_a_member: The target dropbox_id is not a member of the shared + folder. + :ivar MemberAccessLevelResult no_explicit_access: The target member only has + inherited access to the shared folder. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_dropbox_id = None + # Attribute is overwritten below the class definition + not_a_member = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def no_explicit_access(cls, val): + """ + Create an instance of this class set to the ``no_explicit_access`` tag + with value ``val``. + + :param MemberAccessLevelResult val: + :rtype: SharedFolderMemberError + """ + return cls('no_explicit_access', val) + + def is_invalid_dropbox_id(self): + """ + Check if the union tag is ``invalid_dropbox_id``. + + :rtype: bool + """ + return self._tag == 'invalid_dropbox_id' + + def is_not_a_member(self): + """ + Check if the union tag is ``not_a_member``. + + :rtype: bool + """ + return self._tag == 'not_a_member' + + def is_no_explicit_access(self): + """ + Check if the union tag is ``no_explicit_access``. + + :rtype: bool + """ + return self._tag == 'no_explicit_access' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_no_explicit_access(self): + """ + The target member only has inherited access to the shared folder. + + Only call this if :meth:`is_no_explicit_access` is true. + + :rtype: MemberAccessLevelResult + """ + if not self.is_no_explicit_access(): + raise AttributeError("tag 'no_explicit_access' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderMemberError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderMemberError(%r, %r)' % (self._tag, self._value) + +SharedFolderMemberError_validator = bv.Union(SharedFolderMemberError) + +class SharedFolderMembers(bb.Struct): + """ + Shared folder user and group membership. + + :ivar users: The list of user members of the shared folder. + :ivar groups: The list of group members of the shared folder. + :ivar invitees: The list of invitees to the shared folder. + :ivar cursor: Present if there are additional shared folder members that + have not been returned yet. Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.sharing_list_folder_members_continue` to + list additional members. + """ + + __slots__ = [ + '_users_value', + '_users_present', + '_groups_value', + '_groups_present', + '_invitees_value', + '_invitees_present', + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + users=None, + groups=None, + invitees=None, + cursor=None): + self._users_value = None + self._users_present = False + self._groups_value = None + self._groups_present = False + self._invitees_value = None + self._invitees_present = False + self._cursor_value = None + self._cursor_present = False + if users is not None: + self.users = users + if groups is not None: + self.groups = groups + if invitees is not None: + self.invitees = invitees + if cursor is not None: + self.cursor = cursor + + @property + def users(self): + """ + The list of user members of the shared folder. + + :rtype: list of [UserMembershipInfo] + """ + if self._users_present: + return self._users_value + else: + raise AttributeError("missing required field 'users'") + + @users.setter + def users(self, val): + val = self._users_validator.validate(val) + self._users_value = val + self._users_present = True + + @users.deleter + def users(self): + self._users_value = None + self._users_present = False + + @property + def groups(self): + """ + The list of group members of the shared folder. + + :rtype: list of [GroupMembershipInfo] + """ + if self._groups_present: + return self._groups_value + else: + raise AttributeError("missing required field 'groups'") + + @groups.setter + def groups(self, val): + val = self._groups_validator.validate(val) + self._groups_value = val + self._groups_present = True + + @groups.deleter + def groups(self): + self._groups_value = None + self._groups_present = False + + @property + def invitees(self): + """ + The list of invitees to the shared folder. + + :rtype: list of [InviteeMembershipInfo] + """ + if self._invitees_present: + return self._invitees_value + else: + raise AttributeError("missing required field 'invitees'") + + @invitees.setter + def invitees(self, val): + val = self._invitees_validator.validate(val) + self._invitees_value = val + self._invitees_present = True + + @invitees.deleter + def invitees(self): + self._invitees_value = None + self._invitees_present = False + + @property + def cursor(self): + """ + Present if there are additional shared folder members that have not been + returned yet. Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.sharing_list_folder_members_continue` to + list additional members. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderMembers, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderMembers(users={!r}, groups={!r}, invitees={!r}, cursor={!r})'.format( + self._users_value, + self._groups_value, + self._invitees_value, + self._cursor_value, + ) + +SharedFolderMembers_validator = bv.Struct(SharedFolderMembers) + +class SharedFolderMetadataBase(bb.Struct): + """ + Properties of the shared folder. + + :ivar access_type: The current user's access level for this shared folder. + :ivar is_inside_team_folder: Whether this folder is inside of a team folder. + :ivar is_team_folder: Whether this folder is a `team folder + `_. + :ivar owner_display_names: The display names of the users that own the + folder. If the folder is part of a team folder, the display names of the + team admins are also included. Absent if the owner display names cannot + be fetched. + :ivar owner_team: The team that owns the folder. This field is not present + if the folder is not owned by a team. + :ivar parent_shared_folder_id: The ID of the parent shared folder. This + field is present only if the folder is contained within another shared + folder. + :ivar path_lower: The lower-cased full path of this shared folder. Absent + for unmounted folders. + """ + + __slots__ = [ + '_access_type_value', + '_access_type_present', + '_is_inside_team_folder_value', + '_is_inside_team_folder_present', + '_is_team_folder_value', + '_is_team_folder_present', + '_owner_display_names_value', + '_owner_display_names_present', + '_owner_team_value', + '_owner_team_present', + '_parent_shared_folder_id_value', + '_parent_shared_folder_id_present', + '_path_lower_value', + '_path_lower_present', + ] + + _has_required_fields = True + + def __init__(self, + access_type=None, + is_inside_team_folder=None, + is_team_folder=None, + owner_display_names=None, + owner_team=None, + parent_shared_folder_id=None, + path_lower=None): + self._access_type_value = None + self._access_type_present = False + self._is_inside_team_folder_value = None + self._is_inside_team_folder_present = False + self._is_team_folder_value = None + self._is_team_folder_present = False + self._owner_display_names_value = None + self._owner_display_names_present = False + self._owner_team_value = None + self._owner_team_present = False + self._parent_shared_folder_id_value = None + self._parent_shared_folder_id_present = False + self._path_lower_value = None + self._path_lower_present = False + if access_type is not None: + self.access_type = access_type + if is_inside_team_folder is not None: + self.is_inside_team_folder = is_inside_team_folder + if is_team_folder is not None: + self.is_team_folder = is_team_folder + if owner_display_names is not None: + self.owner_display_names = owner_display_names + if owner_team is not None: + self.owner_team = owner_team + if parent_shared_folder_id is not None: + self.parent_shared_folder_id = parent_shared_folder_id + if path_lower is not None: + self.path_lower = path_lower + + @property + def access_type(self): + """ + The current user's access level for this shared folder. + + :rtype: AccessLevel + """ + if self._access_type_present: + return self._access_type_value + else: + raise AttributeError("missing required field 'access_type'") + + @access_type.setter + def access_type(self, val): + self._access_type_validator.validate_type_only(val) + self._access_type_value = val + self._access_type_present = True + + @access_type.deleter + def access_type(self): + self._access_type_value = None + self._access_type_present = False + + @property + def is_inside_team_folder(self): + """ + Whether this folder is inside of a team folder. + + :rtype: bool + """ + if self._is_inside_team_folder_present: + return self._is_inside_team_folder_value + else: + raise AttributeError("missing required field 'is_inside_team_folder'") + + @is_inside_team_folder.setter + def is_inside_team_folder(self, val): + val = self._is_inside_team_folder_validator.validate(val) + self._is_inside_team_folder_value = val + self._is_inside_team_folder_present = True + + @is_inside_team_folder.deleter + def is_inside_team_folder(self): + self._is_inside_team_folder_value = None + self._is_inside_team_folder_present = False + + @property + def is_team_folder(self): + """ + Whether this folder is a `team folder + `_. + + :rtype: bool + """ + if self._is_team_folder_present: + return self._is_team_folder_value + else: + raise AttributeError("missing required field 'is_team_folder'") + + @is_team_folder.setter + def is_team_folder(self, val): + val = self._is_team_folder_validator.validate(val) + self._is_team_folder_value = val + self._is_team_folder_present = True + + @is_team_folder.deleter + def is_team_folder(self): + self._is_team_folder_value = None + self._is_team_folder_present = False + + @property + def owner_display_names(self): + """ + The display names of the users that own the folder. If the folder is + part of a team folder, the display names of the team admins are also + included. Absent if the owner display names cannot be fetched. + + :rtype: list of [str] + """ + if self._owner_display_names_present: + return self._owner_display_names_value + else: + return None + + @owner_display_names.setter + def owner_display_names(self, val): + if val is None: + del self.owner_display_names + return + val = self._owner_display_names_validator.validate(val) + self._owner_display_names_value = val + self._owner_display_names_present = True + + @owner_display_names.deleter + def owner_display_names(self): + self._owner_display_names_value = None + self._owner_display_names_present = False + + @property + def owner_team(self): + """ + The team that owns the folder. This field is not present if the folder + is not owned by a team. + + :rtype: users.Team + """ + if self._owner_team_present: + return self._owner_team_value + else: + return None + + @owner_team.setter + def owner_team(self, val): + if val is None: + del self.owner_team + return + self._owner_team_validator.validate_type_only(val) + self._owner_team_value = val + self._owner_team_present = True + + @owner_team.deleter + def owner_team(self): + self._owner_team_value = None + self._owner_team_present = False + + @property + def parent_shared_folder_id(self): + """ + The ID of the parent shared folder. This field is present only if the + folder is contained within another shared folder. + + :rtype: str + """ + if self._parent_shared_folder_id_present: + return self._parent_shared_folder_id_value + else: + return None + + @parent_shared_folder_id.setter + def parent_shared_folder_id(self, val): + if val is None: + del self.parent_shared_folder_id + return + val = self._parent_shared_folder_id_validator.validate(val) + self._parent_shared_folder_id_value = val + self._parent_shared_folder_id_present = True + + @parent_shared_folder_id.deleter + def parent_shared_folder_id(self): + self._parent_shared_folder_id_value = None + self._parent_shared_folder_id_present = False + + @property + def path_lower(self): + """ + The lower-cased full path of this shared folder. Absent for unmounted + folders. + + :rtype: str + """ + if self._path_lower_present: + return self._path_lower_value + else: + return None + + @path_lower.setter + def path_lower(self, val): + if val is None: + del self.path_lower + return + val = self._path_lower_validator.validate(val) + self._path_lower_value = val + self._path_lower_present = True + + @path_lower.deleter + def path_lower(self): + self._path_lower_value = None + self._path_lower_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderMetadataBase, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderMetadataBase(access_type={!r}, is_inside_team_folder={!r}, is_team_folder={!r}, owner_display_names={!r}, owner_team={!r}, parent_shared_folder_id={!r}, path_lower={!r})'.format( + self._access_type_value, + self._is_inside_team_folder_value, + self._is_team_folder_value, + self._owner_display_names_value, + self._owner_team_value, + self._parent_shared_folder_id_value, + self._path_lower_value, + ) + +SharedFolderMetadataBase_validator = bv.Struct(SharedFolderMetadataBase) + +class SharedFolderMetadata(SharedFolderMetadataBase): + """ + The metadata which includes basic information about the shared folder. + + :ivar link_metadata: The metadata of the shared content link to this shared + folder. Absent if there is no link on the folder. This is for an + unreleased feature so it may not be returned yet. + :ivar name: The name of the this shared folder. + :ivar permissions: Actions the current user may perform on the folder and + its contents. The set of permissions corresponds to the FolderActions in + the request. + :ivar policy: Policies governing this shared folder. + :ivar preview_url: URL for displaying a web preview of the shared folder. + :ivar shared_folder_id: The ID of the shared folder. + :ivar time_invited: Timestamp indicating when the current user was invited + to this shared folder. + :ivar access_inheritance: Whether the folder inherits its members from its + parent. + """ + + __slots__ = [ + '_link_metadata_value', + '_link_metadata_present', + '_name_value', + '_name_present', + '_permissions_value', + '_permissions_present', + '_policy_value', + '_policy_present', + '_preview_url_value', + '_preview_url_present', + '_shared_folder_id_value', + '_shared_folder_id_present', + '_time_invited_value', + '_time_invited_present', + '_access_inheritance_value', + '_access_inheritance_present', + ] + + _has_required_fields = True + + def __init__(self, + access_type=None, + is_inside_team_folder=None, + is_team_folder=None, + name=None, + policy=None, + preview_url=None, + shared_folder_id=None, + time_invited=None, + owner_display_names=None, + owner_team=None, + parent_shared_folder_id=None, + path_lower=None, + link_metadata=None, + permissions=None, + access_inheritance=None): + super(SharedFolderMetadata, self).__init__(access_type, + is_inside_team_folder, + is_team_folder, + owner_display_names, + owner_team, + parent_shared_folder_id, + path_lower) + self._link_metadata_value = None + self._link_metadata_present = False + self._name_value = None + self._name_present = False + self._permissions_value = None + self._permissions_present = False + self._policy_value = None + self._policy_present = False + self._preview_url_value = None + self._preview_url_present = False + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._time_invited_value = None + self._time_invited_present = False + self._access_inheritance_value = None + self._access_inheritance_present = False + if link_metadata is not None: + self.link_metadata = link_metadata + if name is not None: + self.name = name + if permissions is not None: + self.permissions = permissions + if policy is not None: + self.policy = policy + if preview_url is not None: + self.preview_url = preview_url + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if time_invited is not None: + self.time_invited = time_invited + if access_inheritance is not None: + self.access_inheritance = access_inheritance + + @property + def link_metadata(self): + """ + The metadata of the shared content link to this shared folder. Absent if + there is no link on the folder. This is for an unreleased feature so it + may not be returned yet. + + :rtype: SharedContentLinkMetadata + """ + if self._link_metadata_present: + return self._link_metadata_value + else: + return None + + @link_metadata.setter + def link_metadata(self, val): + if val is None: + del self.link_metadata + return + self._link_metadata_validator.validate_type_only(val) + self._link_metadata_value = val + self._link_metadata_present = True + + @link_metadata.deleter + def link_metadata(self): + self._link_metadata_value = None + self._link_metadata_present = False + + @property + def name(self): + """ + The name of the this shared folder. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def permissions(self): + """ + Actions the current user may perform on the folder and its contents. The + set of permissions corresponds to the FolderActions in the request. + + :rtype: list of [FolderPermission] + """ + if self._permissions_present: + return self._permissions_value + else: + return None + + @permissions.setter + def permissions(self, val): + if val is None: + del self.permissions + return + val = self._permissions_validator.validate(val) + self._permissions_value = val + self._permissions_present = True + + @permissions.deleter + def permissions(self): + self._permissions_value = None + self._permissions_present = False + + @property + def policy(self): + """ + Policies governing this shared folder. + + :rtype: FolderPolicy + """ + if self._policy_present: + return self._policy_value + else: + raise AttributeError("missing required field 'policy'") + + @policy.setter + def policy(self, val): + self._policy_validator.validate_type_only(val) + self._policy_value = val + self._policy_present = True + + @policy.deleter + def policy(self): + self._policy_value = None + self._policy_present = False + + @property + def preview_url(self): + """ + URL for displaying a web preview of the shared folder. + + :rtype: str + """ + if self._preview_url_present: + return self._preview_url_value + else: + raise AttributeError("missing required field 'preview_url'") + + @preview_url.setter + def preview_url(self, val): + val = self._preview_url_validator.validate(val) + self._preview_url_value = val + self._preview_url_present = True + + @preview_url.deleter + def preview_url(self): + self._preview_url_value = None + self._preview_url_present = False + + @property + def shared_folder_id(self): + """ + The ID of the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def time_invited(self): + """ + Timestamp indicating when the current user was invited to this shared + folder. + + :rtype: datetime.datetime + """ + if self._time_invited_present: + return self._time_invited_value + else: + raise AttributeError("missing required field 'time_invited'") + + @time_invited.setter + def time_invited(self, val): + val = self._time_invited_validator.validate(val) + self._time_invited_value = val + self._time_invited_present = True + + @time_invited.deleter + def time_invited(self): + self._time_invited_value = None + self._time_invited_present = False + + @property + def access_inheritance(self): + """ + Whether the folder inherits its members from its parent. + + :rtype: AccessInheritance + """ + if self._access_inheritance_present: + return self._access_inheritance_value + else: + return AccessInheritance.inherit + + @access_inheritance.setter + def access_inheritance(self, val): + self._access_inheritance_validator.validate_type_only(val) + self._access_inheritance_value = val + self._access_inheritance_present = True + + @access_inheritance.deleter + def access_inheritance(self): + self._access_inheritance_value = None + self._access_inheritance_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderMetadata(access_type={!r}, is_inside_team_folder={!r}, is_team_folder={!r}, name={!r}, policy={!r}, preview_url={!r}, shared_folder_id={!r}, time_invited={!r}, owner_display_names={!r}, owner_team={!r}, parent_shared_folder_id={!r}, path_lower={!r}, link_metadata={!r}, permissions={!r}, access_inheritance={!r})'.format( + self._access_type_value, + self._is_inside_team_folder_value, + self._is_team_folder_value, + self._name_value, + self._policy_value, + self._preview_url_value, + self._shared_folder_id_value, + self._time_invited_value, + self._owner_display_names_value, + self._owner_team_value, + self._parent_shared_folder_id_value, + self._path_lower_value, + self._link_metadata_value, + self._permissions_value, + self._access_inheritance_value, + ) + +SharedFolderMetadata_validator = bv.Struct(SharedFolderMetadata) + +class SharedLinkAccessFailureReason(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar login_required: User is not logged in. + :ivar email_verify_required: User's email is not verified. + :ivar password_required: The link is password protected. + :ivar team_only: Access is allowed for team members only. + :ivar owner_only: Access is allowed for the shared link's owner only. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + login_required = None + # Attribute is overwritten below the class definition + email_verify_required = None + # Attribute is overwritten below the class definition + password_required = None + # Attribute is overwritten below the class definition + team_only = None + # Attribute is overwritten below the class definition + owner_only = None + # Attribute is overwritten below the class definition + other = None + + def is_login_required(self): + """ + Check if the union tag is ``login_required``. + + :rtype: bool + """ + return self._tag == 'login_required' + + def is_email_verify_required(self): + """ + Check if the union tag is ``email_verify_required``. + + :rtype: bool + """ + return self._tag == 'email_verify_required' + + def is_password_required(self): + """ + Check if the union tag is ``password_required``. + + :rtype: bool + """ + return self._tag == 'password_required' + + def is_team_only(self): + """ + Check if the union tag is ``team_only``. + + :rtype: bool + """ + return self._tag == 'team_only' + + def is_owner_only(self): + """ + Check if the union tag is ``owner_only``. + + :rtype: bool + """ + return self._tag == 'owner_only' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkAccessFailureReason, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkAccessFailureReason(%r, %r)' % (self._tag, self._value) + +SharedLinkAccessFailureReason_validator = bv.Union(SharedLinkAccessFailureReason) + +class SharedLinkPolicy(bb.Union): + """ + Who can view shared links in this folder. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar anyone: Links can be shared with anyone. + :ivar team: Links can be shared with anyone on the same team as the owner. + :ivar members: Links can only be shared among members of the shared folder. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + anyone = None + # Attribute is overwritten below the class definition + team = None + # Attribute is overwritten below the class definition + members = None + # Attribute is overwritten below the class definition + other = None + + def is_anyone(self): + """ + Check if the union tag is ``anyone``. + + :rtype: bool + """ + return self._tag == 'anyone' + + def is_team(self): + """ + Check if the union tag is ``team``. + + :rtype: bool + """ + return self._tag == 'team' + + def is_members(self): + """ + Check if the union tag is ``members``. + + :rtype: bool + """ + return self._tag == 'members' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkPolicy(%r, %r)' % (self._tag, self._value) + +SharedLinkPolicy_validator = bv.Union(SharedLinkPolicy) + +class SharedLinkSettings(bb.Struct): + """ + :ivar requested_visibility: The requested access for this shared link. + :ivar link_password: If ``requested_visibility`` is + ``RequestedVisibility.password`` this is needed to specify the password + to access the link. + :ivar expires: Expiration time of the shared link. By default the link won't + expire. + """ + + __slots__ = [ + '_requested_visibility_value', + '_requested_visibility_present', + '_link_password_value', + '_link_password_present', + '_expires_value', + '_expires_present', + ] + + _has_required_fields = False + + def __init__(self, + requested_visibility=None, + link_password=None, + expires=None): + self._requested_visibility_value = None + self._requested_visibility_present = False + self._link_password_value = None + self._link_password_present = False + self._expires_value = None + self._expires_present = False + if requested_visibility is not None: + self.requested_visibility = requested_visibility + if link_password is not None: + self.link_password = link_password + if expires is not None: + self.expires = expires + + @property + def requested_visibility(self): + """ + The requested access for this shared link. + + :rtype: RequestedVisibility + """ + if self._requested_visibility_present: + return self._requested_visibility_value + else: + return None + + @requested_visibility.setter + def requested_visibility(self, val): + if val is None: + del self.requested_visibility + return + self._requested_visibility_validator.validate_type_only(val) + self._requested_visibility_value = val + self._requested_visibility_present = True + + @requested_visibility.deleter + def requested_visibility(self): + self._requested_visibility_value = None + self._requested_visibility_present = False + + @property + def link_password(self): + """ + If ``requested_visibility`` is ``RequestedVisibility.password`` this is + needed to specify the password to access the link. + + :rtype: str + """ + if self._link_password_present: + return self._link_password_value + else: + return None + + @link_password.setter + def link_password(self, val): + if val is None: + del self.link_password + return + val = self._link_password_validator.validate(val) + self._link_password_value = val + self._link_password_present = True + + @link_password.deleter + def link_password(self): + self._link_password_value = None + self._link_password_present = False + + @property + def expires(self): + """ + Expiration time of the shared link. By default the link won't expire. + + :rtype: datetime.datetime + """ + if self._expires_present: + return self._expires_value + else: + return None + + @expires.setter + def expires(self, val): + if val is None: + del self.expires + return + val = self._expires_validator.validate(val) + self._expires_value = val + self._expires_present = True + + @expires.deleter + def expires(self): + self._expires_value = None + self._expires_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkSettings, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkSettings(requested_visibility={!r}, link_password={!r}, expires={!r})'.format( + self._requested_visibility_value, + self._link_password_value, + self._expires_value, + ) + +SharedLinkSettings_validator = bv.Struct(SharedLinkSettings) + +class SharedLinkSettingsError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_settings: The given settings are invalid (for example, all + attributes of the :class:`SharedLinkSettings` are empty, the requested + visibility is ``RequestedVisibility.password`` but the + ``SharedLinkSettings.link_password`` is missing, + ``SharedLinkSettings.expires`` is set to the past, etc.). + :ivar not_authorized: User is not allowed to modify the settings of this + link. Note that basic users can only set ``RequestedVisibility.public`` + as the ``SharedLinkSettings.requested_visibility`` and cannot set + ``SharedLinkSettings.expires``. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + invalid_settings = None + # Attribute is overwritten below the class definition + not_authorized = None + + def is_invalid_settings(self): + """ + Check if the union tag is ``invalid_settings``. + + :rtype: bool + """ + return self._tag == 'invalid_settings' + + def is_not_authorized(self): + """ + Check if the union tag is ``not_authorized``. + + :rtype: bool + """ + return self._tag == 'not_authorized' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkSettingsError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkSettingsError(%r, %r)' % (self._tag, self._value) + +SharedLinkSettingsError_validator = bv.Union(SharedLinkSettingsError) + +class SharingFileAccessError(bb.Union): + """ + User could not access this file. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar no_permission: Current user does not have sufficient privileges to + perform the desired action. + :ivar invalid_file: File specified was not found. + :ivar is_folder: A folder can't be shared this way. Use folder sharing or a + shared link instead. + :ivar inside_public_folder: A file inside a public folder can't be shared + this way. Use a public link instead. + :ivar inside_osx_package: A Mac OS X package can't be shared this way. Use a + shared link instead. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + invalid_file = None + # Attribute is overwritten below the class definition + is_folder = None + # Attribute is overwritten below the class definition + inside_public_folder = None + # Attribute is overwritten below the class definition + inside_osx_package = None + # Attribute is overwritten below the class definition + other = None + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_invalid_file(self): + """ + Check if the union tag is ``invalid_file``. + + :rtype: bool + """ + return self._tag == 'invalid_file' + + def is_is_folder(self): + """ + Check if the union tag is ``is_folder``. + + :rtype: bool + """ + return self._tag == 'is_folder' + + def is_inside_public_folder(self): + """ + Check if the union tag is ``inside_public_folder``. + + :rtype: bool + """ + return self._tag == 'inside_public_folder' + + def is_inside_osx_package(self): + """ + Check if the union tag is ``inside_osx_package``. + + :rtype: bool + """ + return self._tag == 'inside_osx_package' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharingFileAccessError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharingFileAccessError(%r, %r)' % (self._tag, self._value) + +SharingFileAccessError_validator = bv.Union(SharingFileAccessError) + +class SharingUserError(bb.Union): + """ + User account had a problem preventing this action. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar email_unverified: The current user must verify the account e-mail + address before performing this action. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + email_unverified = None + # Attribute is overwritten below the class definition + other = None + + def is_email_unverified(self): + """ + Check if the union tag is ``email_unverified``. + + :rtype: bool + """ + return self._tag == 'email_unverified' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharingUserError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharingUserError(%r, %r)' % (self._tag, self._value) + +SharingUserError_validator = bv.Union(SharingUserError) + +class TeamMemberInfo(bb.Struct): + """ + Information about a team member. + + :ivar team_info: Information about the member's team. + :ivar display_name: The display name of the user. + :ivar member_id: ID of user as a member of a team. This field will only be + present if the member is in the same team as current user. + """ + + __slots__ = [ + '_team_info_value', + '_team_info_present', + '_display_name_value', + '_display_name_present', + '_member_id_value', + '_member_id_present', + ] + + _has_required_fields = True + + def __init__(self, + team_info=None, + display_name=None, + member_id=None): + self._team_info_value = None + self._team_info_present = False + self._display_name_value = None + self._display_name_present = False + self._member_id_value = None + self._member_id_present = False + if team_info is not None: + self.team_info = team_info + if display_name is not None: + self.display_name = display_name + if member_id is not None: + self.member_id = member_id + + @property + def team_info(self): + """ + Information about the member's team. + + :rtype: users.Team + """ + if self._team_info_present: + return self._team_info_value + else: + raise AttributeError("missing required field 'team_info'") + + @team_info.setter + def team_info(self, val): + val = self._team_info_validator.validate(val) + self._team_info_value = val + self._team_info_present = True + + @team_info.deleter + def team_info(self): + self._team_info_value = None + self._team_info_present = False + + @property + def display_name(self): + """ + The display name of the user. + + :rtype: str + """ + if self._display_name_present: + return self._display_name_value + else: + raise AttributeError("missing required field 'display_name'") + + @display_name.setter + def display_name(self, val): + val = self._display_name_validator.validate(val) + self._display_name_value = val + self._display_name_present = True + + @display_name.deleter + def display_name(self): + self._display_name_value = None + self._display_name_present = False + + @property + def member_id(self): + """ + ID of user as a member of a team. This field will only be present if the + member is in the same team as current user. + + :rtype: str + """ + if self._member_id_present: + return self._member_id_value + else: + return None + + @member_id.setter + def member_id(self, val): + if val is None: + del self.member_id + return + val = self._member_id_validator.validate(val) + self._member_id_value = val + self._member_id_present = True + + @member_id.deleter + def member_id(self): + self._member_id_value = None + self._member_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamMemberInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamMemberInfo(team_info={!r}, display_name={!r}, member_id={!r})'.format( + self._team_info_value, + self._display_name_value, + self._member_id_value, + ) + +TeamMemberInfo_validator = bv.Struct(TeamMemberInfo) + +class TransferFolderArg(bb.Struct): + """ + :ivar shared_folder_id: The ID for the shared folder. + :ivar to_dropbox_id: A account or team member ID to transfer ownership to. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + '_to_dropbox_id_value', + '_to_dropbox_id_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None, + to_dropbox_id=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._to_dropbox_id_value = None + self._to_dropbox_id_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if to_dropbox_id is not None: + self.to_dropbox_id = to_dropbox_id + + @property + def shared_folder_id(self): + """ + The ID for the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def to_dropbox_id(self): + """ + A account or team member ID to transfer ownership to. + + :rtype: str + """ + if self._to_dropbox_id_present: + return self._to_dropbox_id_value + else: + raise AttributeError("missing required field 'to_dropbox_id'") + + @to_dropbox_id.setter + def to_dropbox_id(self, val): + val = self._to_dropbox_id_validator.validate(val) + self._to_dropbox_id_value = val + self._to_dropbox_id_present = True + + @to_dropbox_id.deleter + def to_dropbox_id(self): + self._to_dropbox_id_value = None + self._to_dropbox_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TransferFolderArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TransferFolderArg(shared_folder_id={!r}, to_dropbox_id={!r})'.format( + self._shared_folder_id_value, + self._to_dropbox_id_value, + ) + +TransferFolderArg_validator = bv.Struct(TransferFolderArg) + +class TransferFolderError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_dropbox_id: ``TransferFolderArg.to_dropbox_id`` is invalid. + :ivar new_owner_not_a_member: The new designated owner is not currently a + member of the shared folder. + :ivar new_owner_unmounted: The new designated owner has not added the folder + to their Dropbox. + :ivar new_owner_email_unverified: The new designated owner's e-mail address + is unverified. + :ivar team_folder: This action cannot be performed on a team shared folder. + :ivar no_permission: The current user does not have permission to perform + this action. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_dropbox_id = None + # Attribute is overwritten below the class definition + new_owner_not_a_member = None + # Attribute is overwritten below the class definition + new_owner_unmounted = None + # Attribute is overwritten below the class definition + new_owner_email_unverified = None + # Attribute is overwritten below the class definition + team_folder = None + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharedFolderAccessError val: + :rtype: TransferFolderError + """ + return cls('access_error', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_invalid_dropbox_id(self): + """ + Check if the union tag is ``invalid_dropbox_id``. + + :rtype: bool + """ + return self._tag == 'invalid_dropbox_id' + + def is_new_owner_not_a_member(self): + """ + Check if the union tag is ``new_owner_not_a_member``. + + :rtype: bool + """ + return self._tag == 'new_owner_not_a_member' + + def is_new_owner_unmounted(self): + """ + Check if the union tag is ``new_owner_unmounted``. + + :rtype: bool + """ + return self._tag == 'new_owner_unmounted' + + def is_new_owner_email_unverified(self): + """ + Check if the union tag is ``new_owner_email_unverified``. + + :rtype: bool + """ + return self._tag == 'new_owner_email_unverified' + + def is_team_folder(self): + """ + Check if the union tag is ``team_folder``. + + :rtype: bool + """ + return self._tag == 'team_folder' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharedFolderAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(TransferFolderError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TransferFolderError(%r, %r)' % (self._tag, self._value) + +TransferFolderError_validator = bv.Union(TransferFolderError) + +class UnmountFolderArg(bb.Struct): + """ + :ivar shared_folder_id: The ID for the shared folder. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + + @property + def shared_folder_id(self): + """ + The ID for the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UnmountFolderArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UnmountFolderArg(shared_folder_id={!r})'.format( + self._shared_folder_id_value, + ) + +UnmountFolderArg_validator = bv.Struct(UnmountFolderArg) + +class UnmountFolderError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar no_permission: The current user does not have permission to perform + this action. + :ivar not_unmountable: The shared folder can't be unmounted. One example + where this can occur is when the shared folder's parent folder is also a + shared folder that resides in the current user's Dropbox. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + not_unmountable = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharedFolderAccessError val: + :rtype: UnmountFolderError + """ + return cls('access_error', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_not_unmountable(self): + """ + Check if the union tag is ``not_unmountable``. + + :rtype: bool + """ + return self._tag == 'not_unmountable' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharedFolderAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(UnmountFolderError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UnmountFolderError(%r, %r)' % (self._tag, self._value) + +UnmountFolderError_validator = bv.Union(UnmountFolderError) + +class UnshareFileArg(bb.Struct): + """ + Arguments for :meth:`dropbox.dropbox.Dropbox.sharing_unshare_file`. + + :ivar file: The file to unshare. + """ + + __slots__ = [ + '_file_value', + '_file_present', + ] + + _has_required_fields = True + + def __init__(self, + file=None): + self._file_value = None + self._file_present = False + if file is not None: + self.file = file + + @property + def file(self): + """ + The file to unshare. + + :rtype: str + """ + if self._file_present: + return self._file_value + else: + raise AttributeError("missing required field 'file'") + + @file.setter + def file(self, val): + val = self._file_validator.validate(val) + self._file_value = val + self._file_present = True + + @file.deleter + def file(self): + self._file_value = None + self._file_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UnshareFileArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UnshareFileArg(file={!r})'.format( + self._file_value, + ) + +UnshareFileArg_validator = bv.Struct(UnshareFileArg) + +class UnshareFileError(bb.Union): + """ + Error result for :meth:`dropbox.dropbox.Dropbox.sharing_unshare_file`. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def user_error(cls, val): + """ + Create an instance of this class set to the ``user_error`` tag with + value ``val``. + + :param SharingUserError val: + :rtype: UnshareFileError + """ + return cls('user_error', val) + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharingFileAccessError val: + :rtype: UnshareFileError + """ + return cls('access_error', val) + + def is_user_error(self): + """ + Check if the union tag is ``user_error``. + + :rtype: bool + """ + return self._tag == 'user_error' + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_user_error(self): + """ + Only call this if :meth:`is_user_error` is true. + + :rtype: SharingUserError + """ + if not self.is_user_error(): + raise AttributeError("tag 'user_error' not set") + return self._value + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharingFileAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(UnshareFileError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UnshareFileError(%r, %r)' % (self._tag, self._value) + +UnshareFileError_validator = bv.Union(UnshareFileError) + +class UnshareFolderArg(bb.Struct): + """ + :ivar shared_folder_id: The ID for the shared folder. + :ivar leave_a_copy: If true, members of this shared folder will get a copy + of this folder after it's unshared. Otherwise, it will be removed from + their Dropbox. The current user, who is an owner, will always retain + their copy. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + '_leave_a_copy_value', + '_leave_a_copy_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None, + leave_a_copy=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._leave_a_copy_value = None + self._leave_a_copy_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if leave_a_copy is not None: + self.leave_a_copy = leave_a_copy + + @property + def shared_folder_id(self): + """ + The ID for the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def leave_a_copy(self): + """ + If true, members of this shared folder will get a copy of this folder + after it's unshared. Otherwise, it will be removed from their Dropbox. + The current user, who is an owner, will always retain their copy. + + :rtype: bool + """ + if self._leave_a_copy_present: + return self._leave_a_copy_value + else: + return False + + @leave_a_copy.setter + def leave_a_copy(self, val): + val = self._leave_a_copy_validator.validate(val) + self._leave_a_copy_value = val + self._leave_a_copy_present = True + + @leave_a_copy.deleter + def leave_a_copy(self): + self._leave_a_copy_value = None + self._leave_a_copy_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UnshareFolderArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UnshareFolderArg(shared_folder_id={!r}, leave_a_copy={!r})'.format( + self._shared_folder_id_value, + self._leave_a_copy_value, + ) + +UnshareFolderArg_validator = bv.Struct(UnshareFolderArg) + +class UnshareFolderError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar team_folder: This action cannot be performed on a team shared folder. + :ivar no_permission: The current user does not have permission to perform + this action. + :ivar too_many_files: This shared folder has too many files to be unshared. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + team_folder = None + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + too_many_files = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharedFolderAccessError val: + :rtype: UnshareFolderError + """ + return cls('access_error', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_team_folder(self): + """ + Check if the union tag is ``team_folder``. + + :rtype: bool + """ + return self._tag == 'team_folder' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_too_many_files(self): + """ + Check if the union tag is ``too_many_files``. + + :rtype: bool + """ + return self._tag == 'too_many_files' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharedFolderAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(UnshareFolderError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UnshareFolderError(%r, %r)' % (self._tag, self._value) + +UnshareFolderError_validator = bv.Union(UnshareFolderError) + +class UpdateFileMemberArgs(ChangeFileMemberAccessArgs): + """ + Arguments for :meth:`dropbox.dropbox.Dropbox.sharing_update_file_member`. + """ + + __slots__ = [ + ] + + _has_required_fields = True + + def __init__(self, + file=None, + member=None, + access_level=None): + super(UpdateFileMemberArgs, self).__init__(file, + member, + access_level) + + def _process_custom_annotations(self, annotation_type, processor): + super(UpdateFileMemberArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UpdateFileMemberArgs(file={!r}, member={!r}, access_level={!r})'.format( + self._file_value, + self._member_value, + self._access_level_value, + ) + +UpdateFileMemberArgs_validator = bv.Struct(UpdateFileMemberArgs) + +class UpdateFolderMemberArg(bb.Struct): + """ + :ivar shared_folder_id: The ID for the shared folder. + :ivar member: The member of the shared folder to update. Only the + ``MemberSelector.dropbox_id`` may be set at this time. + :ivar access_level: The new access level for ``member``. + ``AccessLevel.owner`` is disallowed. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + '_member_value', + '_member_present', + '_access_level_value', + '_access_level_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None, + member=None, + access_level=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._member_value = None + self._member_present = False + self._access_level_value = None + self._access_level_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if member is not None: + self.member = member + if access_level is not None: + self.access_level = access_level + + @property + def shared_folder_id(self): + """ + The ID for the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def member(self): + """ + The member of the shared folder to update. Only the + ``MemberSelector.dropbox_id`` may be set at this time. + + :rtype: MemberSelector + """ + if self._member_present: + return self._member_value + else: + raise AttributeError("missing required field 'member'") + + @member.setter + def member(self, val): + self._member_validator.validate_type_only(val) + self._member_value = val + self._member_present = True + + @member.deleter + def member(self): + self._member_value = None + self._member_present = False + + @property + def access_level(self): + """ + The new access level for ``member``. ``AccessLevel.owner`` is + disallowed. + + :rtype: AccessLevel + """ + if self._access_level_present: + return self._access_level_value + else: + raise AttributeError("missing required field 'access_level'") + + @access_level.setter + def access_level(self, val): + self._access_level_validator.validate_type_only(val) + self._access_level_value = val + self._access_level_present = True + + @access_level.deleter + def access_level(self): + self._access_level_value = None + self._access_level_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UpdateFolderMemberArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UpdateFolderMemberArg(shared_folder_id={!r}, member={!r}, access_level={!r})'.format( + self._shared_folder_id_value, + self._member_value, + self._access_level_value, + ) + +UpdateFolderMemberArg_validator = bv.Struct(UpdateFolderMemberArg) + +class UpdateFolderMemberError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar AddFolderMemberError no_explicit_access: If updating the access type + required the member to be added to the shared folder and there was an + error when adding the member. + :ivar insufficient_plan: The current user's account doesn't support this + action. An example of this is when downgrading a member from editor to + viewer. This action can only be performed by users that have upgraded to + a Pro or Business plan. + :ivar no_permission: The current user does not have permission to perform + this action. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + insufficient_plan = None + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharedFolderAccessError val: + :rtype: UpdateFolderMemberError + """ + return cls('access_error', val) + + @classmethod + def member_error(cls, val): + """ + Create an instance of this class set to the ``member_error`` tag with + value ``val``. + + :param SharedFolderMemberError val: + :rtype: UpdateFolderMemberError + """ + return cls('member_error', val) + + @classmethod + def no_explicit_access(cls, val): + """ + Create an instance of this class set to the ``no_explicit_access`` tag + with value ``val``. + + :param AddFolderMemberError val: + :rtype: UpdateFolderMemberError + """ + return cls('no_explicit_access', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_member_error(self): + """ + Check if the union tag is ``member_error``. + + :rtype: bool + """ + return self._tag == 'member_error' + + def is_no_explicit_access(self): + """ + Check if the union tag is ``no_explicit_access``. + + :rtype: bool + """ + return self._tag == 'no_explicit_access' + + def is_insufficient_plan(self): + """ + Check if the union tag is ``insufficient_plan``. + + :rtype: bool + """ + return self._tag == 'insufficient_plan' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharedFolderAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def get_member_error(self): + """ + Only call this if :meth:`is_member_error` is true. + + :rtype: SharedFolderMemberError + """ + if not self.is_member_error(): + raise AttributeError("tag 'member_error' not set") + return self._value + + def get_no_explicit_access(self): + """ + If updating the access type required the member to be added to the + shared folder and there was an error when adding the member. + + Only call this if :meth:`is_no_explicit_access` is true. + + :rtype: AddFolderMemberError + """ + if not self.is_no_explicit_access(): + raise AttributeError("tag 'no_explicit_access' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(UpdateFolderMemberError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UpdateFolderMemberError(%r, %r)' % (self._tag, self._value) + +UpdateFolderMemberError_validator = bv.Union(UpdateFolderMemberError) + +class UpdateFolderPolicyArg(bb.Struct): + """ + If any of the policies are unset, then they retain their current setting. + + :ivar shared_folder_id: The ID for the shared folder. + :ivar member_policy: Who can be a member of this shared folder. Only + applicable if the current user is on a team. + :ivar acl_update_policy: Who can add and remove members of this shared + folder. + :ivar viewer_info_policy: Who can enable/disable viewer info for this shared + folder. + :ivar shared_link_policy: The policy to apply to shared links created for + content inside this shared folder. The current user must be on a team to + set this policy to ``SharedLinkPolicy.members``. + :ivar link_settings: Settings on the link for this folder. + :ivar actions: A list of `FolderAction`s corresponding to + `FolderPermission`s that should appear in the response's + ``SharedFolderMetadata.permissions`` field describing the actions the + authenticated user can perform on the folder. + """ + + __slots__ = [ + '_shared_folder_id_value', + '_shared_folder_id_present', + '_member_policy_value', + '_member_policy_present', + '_acl_update_policy_value', + '_acl_update_policy_present', + '_viewer_info_policy_value', + '_viewer_info_policy_present', + '_shared_link_policy_value', + '_shared_link_policy_present', + '_link_settings_value', + '_link_settings_present', + '_actions_value', + '_actions_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_id=None, + member_policy=None, + acl_update_policy=None, + viewer_info_policy=None, + shared_link_policy=None, + link_settings=None, + actions=None): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + self._member_policy_value = None + self._member_policy_present = False + self._acl_update_policy_value = None + self._acl_update_policy_present = False + self._viewer_info_policy_value = None + self._viewer_info_policy_present = False + self._shared_link_policy_value = None + self._shared_link_policy_present = False + self._link_settings_value = None + self._link_settings_present = False + self._actions_value = None + self._actions_present = False + if shared_folder_id is not None: + self.shared_folder_id = shared_folder_id + if member_policy is not None: + self.member_policy = member_policy + if acl_update_policy is not None: + self.acl_update_policy = acl_update_policy + if viewer_info_policy is not None: + self.viewer_info_policy = viewer_info_policy + if shared_link_policy is not None: + self.shared_link_policy = shared_link_policy + if link_settings is not None: + self.link_settings = link_settings + if actions is not None: + self.actions = actions + + @property + def shared_folder_id(self): + """ + The ID for the shared folder. + + :rtype: str + """ + if self._shared_folder_id_present: + return self._shared_folder_id_value + else: + raise AttributeError("missing required field 'shared_folder_id'") + + @shared_folder_id.setter + def shared_folder_id(self, val): + val = self._shared_folder_id_validator.validate(val) + self._shared_folder_id_value = val + self._shared_folder_id_present = True + + @shared_folder_id.deleter + def shared_folder_id(self): + self._shared_folder_id_value = None + self._shared_folder_id_present = False + + @property + def member_policy(self): + """ + Who can be a member of this shared folder. Only applicable if the + current user is on a team. + + :rtype: MemberPolicy + """ + if self._member_policy_present: + return self._member_policy_value + else: + return None + + @member_policy.setter + def member_policy(self, val): + if val is None: + del self.member_policy + return + self._member_policy_validator.validate_type_only(val) + self._member_policy_value = val + self._member_policy_present = True + + @member_policy.deleter + def member_policy(self): + self._member_policy_value = None + self._member_policy_present = False + + @property + def acl_update_policy(self): + """ + Who can add and remove members of this shared folder. + + :rtype: AclUpdatePolicy + """ + if self._acl_update_policy_present: + return self._acl_update_policy_value + else: + return None + + @acl_update_policy.setter + def acl_update_policy(self, val): + if val is None: + del self.acl_update_policy + return + self._acl_update_policy_validator.validate_type_only(val) + self._acl_update_policy_value = val + self._acl_update_policy_present = True + + @acl_update_policy.deleter + def acl_update_policy(self): + self._acl_update_policy_value = None + self._acl_update_policy_present = False + + @property + def viewer_info_policy(self): + """ + Who can enable/disable viewer info for this shared folder. + + :rtype: ViewerInfoPolicy + """ + if self._viewer_info_policy_present: + return self._viewer_info_policy_value + else: + return None + + @viewer_info_policy.setter + def viewer_info_policy(self, val): + if val is None: + del self.viewer_info_policy + return + self._viewer_info_policy_validator.validate_type_only(val) + self._viewer_info_policy_value = val + self._viewer_info_policy_present = True + + @viewer_info_policy.deleter + def viewer_info_policy(self): + self._viewer_info_policy_value = None + self._viewer_info_policy_present = False + + @property + def shared_link_policy(self): + """ + The policy to apply to shared links created for content inside this + shared folder. The current user must be on a team to set this policy to + ``SharedLinkPolicy.members``. + + :rtype: SharedLinkPolicy + """ + if self._shared_link_policy_present: + return self._shared_link_policy_value + else: + return None + + @shared_link_policy.setter + def shared_link_policy(self, val): + if val is None: + del self.shared_link_policy + return + self._shared_link_policy_validator.validate_type_only(val) + self._shared_link_policy_value = val + self._shared_link_policy_present = True + + @shared_link_policy.deleter + def shared_link_policy(self): + self._shared_link_policy_value = None + self._shared_link_policy_present = False + + @property + def link_settings(self): + """ + Settings on the link for this folder. + + :rtype: LinkSettings + """ + if self._link_settings_present: + return self._link_settings_value + else: + return None + + @link_settings.setter + def link_settings(self, val): + if val is None: + del self.link_settings + return + self._link_settings_validator.validate_type_only(val) + self._link_settings_value = val + self._link_settings_present = True + + @link_settings.deleter + def link_settings(self): + self._link_settings_value = None + self._link_settings_present = False + + @property + def actions(self): + """ + A list of `FolderAction`s corresponding to `FolderPermission`s that + should appear in the response's ``SharedFolderMetadata.permissions`` + field describing the actions the authenticated user can perform on the + folder. + + :rtype: list of [FolderAction] + """ + if self._actions_present: + return self._actions_value + else: + return None + + @actions.setter + def actions(self, val): + if val is None: + del self.actions + return + val = self._actions_validator.validate(val) + self._actions_value = val + self._actions_present = True + + @actions.deleter + def actions(self): + self._actions_value = None + self._actions_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UpdateFolderPolicyArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UpdateFolderPolicyArg(shared_folder_id={!r}, member_policy={!r}, acl_update_policy={!r}, viewer_info_policy={!r}, shared_link_policy={!r}, link_settings={!r}, actions={!r})'.format( + self._shared_folder_id_value, + self._member_policy_value, + self._acl_update_policy_value, + self._viewer_info_policy_value, + self._shared_link_policy_value, + self._link_settings_value, + self._actions_value, + ) + +UpdateFolderPolicyArg_validator = bv.Struct(UpdateFolderPolicyArg) + +class UpdateFolderPolicyError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar not_on_team: ``UpdateFolderPolicyArg.member_policy`` was set even + though user is not on a team. + :ivar team_policy_disallows_member_policy: Team policy is more restrictive + than ``ShareFolderArg.member_policy``. + :ivar disallowed_shared_link_policy: The current account is not allowed to + select the specified ``ShareFolderArg.shared_link_policy``. + :ivar no_permission: The current user does not have permission to perform + this action. + :ivar team_folder: This action cannot be performed on a team shared folder. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + not_on_team = None + # Attribute is overwritten below the class definition + team_policy_disallows_member_policy = None + # Attribute is overwritten below the class definition + disallowed_shared_link_policy = None + # Attribute is overwritten below the class definition + no_permission = None + # Attribute is overwritten below the class definition + team_folder = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param SharedFolderAccessError val: + :rtype: UpdateFolderPolicyError + """ + return cls('access_error', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_not_on_team(self): + """ + Check if the union tag is ``not_on_team``. + + :rtype: bool + """ + return self._tag == 'not_on_team' + + def is_team_policy_disallows_member_policy(self): + """ + Check if the union tag is ``team_policy_disallows_member_policy``. + + :rtype: bool + """ + return self._tag == 'team_policy_disallows_member_policy' + + def is_disallowed_shared_link_policy(self): + """ + Check if the union tag is ``disallowed_shared_link_policy``. + + :rtype: bool + """ + return self._tag == 'disallowed_shared_link_policy' + + def is_no_permission(self): + """ + Check if the union tag is ``no_permission``. + + :rtype: bool + """ + return self._tag == 'no_permission' + + def is_team_folder(self): + """ + Check if the union tag is ``team_folder``. + + :rtype: bool + """ + return self._tag == 'team_folder' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: SharedFolderAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(UpdateFolderPolicyError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UpdateFolderPolicyError(%r, %r)' % (self._tag, self._value) + +UpdateFolderPolicyError_validator = bv.Union(UpdateFolderPolicyError) + +class UserMembershipInfo(MembershipInfo): + """ + The information about a user member of the shared content. + + :ivar user: The account information for the membership user. + """ + + __slots__ = [ + '_user_value', + '_user_present', + ] + + _has_required_fields = True + + def __init__(self, + access_type=None, + user=None, + permissions=None, + initials=None, + is_inherited=None): + super(UserMembershipInfo, self).__init__(access_type, + permissions, + initials, + is_inherited) + self._user_value = None + self._user_present = False + if user is not None: + self.user = user + + @property + def user(self): + """ + The account information for the membership user. + + :rtype: UserInfo + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UserMembershipInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UserMembershipInfo(access_type={!r}, user={!r}, permissions={!r}, initials={!r}, is_inherited={!r})'.format( + self._access_type_value, + self._user_value, + self._permissions_value, + self._initials_value, + self._is_inherited_value, + ) + +UserMembershipInfo_validator = bv.Struct(UserMembershipInfo) + +class UserFileMembershipInfo(UserMembershipInfo): + """ + The information about a user member of the shared content with an appended + last seen timestamp. + + :ivar time_last_seen: The UTC timestamp of when the user has last seen the + content, if they have. + :ivar platform_type: The platform on which the user has last seen the + content, or unknown. + """ + + __slots__ = [ + '_time_last_seen_value', + '_time_last_seen_present', + '_platform_type_value', + '_platform_type_present', + ] + + _has_required_fields = True + + def __init__(self, + access_type=None, + user=None, + permissions=None, + initials=None, + is_inherited=None, + time_last_seen=None, + platform_type=None): + super(UserFileMembershipInfo, self).__init__(access_type, + user, + permissions, + initials, + is_inherited) + self._time_last_seen_value = None + self._time_last_seen_present = False + self._platform_type_value = None + self._platform_type_present = False + if time_last_seen is not None: + self.time_last_seen = time_last_seen + if platform_type is not None: + self.platform_type = platform_type + + @property + def time_last_seen(self): + """ + The UTC timestamp of when the user has last seen the content, if they + have. + + :rtype: datetime.datetime + """ + if self._time_last_seen_present: + return self._time_last_seen_value + else: + return None + + @time_last_seen.setter + def time_last_seen(self, val): + if val is None: + del self.time_last_seen + return + val = self._time_last_seen_validator.validate(val) + self._time_last_seen_value = val + self._time_last_seen_present = True + + @time_last_seen.deleter + def time_last_seen(self): + self._time_last_seen_value = None + self._time_last_seen_present = False + + @property + def platform_type(self): + """ + The platform on which the user has last seen the content, or unknown. + + :rtype: seen_state.PlatformType + """ + if self._platform_type_present: + return self._platform_type_value + else: + return None + + @platform_type.setter + def platform_type(self, val): + if val is None: + del self.platform_type + return + self._platform_type_validator.validate_type_only(val) + self._platform_type_value = val + self._platform_type_present = True + + @platform_type.deleter + def platform_type(self): + self._platform_type_value = None + self._platform_type_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UserFileMembershipInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UserFileMembershipInfo(access_type={!r}, user={!r}, permissions={!r}, initials={!r}, is_inherited={!r}, time_last_seen={!r}, platform_type={!r})'.format( + self._access_type_value, + self._user_value, + self._permissions_value, + self._initials_value, + self._is_inherited_value, + self._time_last_seen_value, + self._platform_type_value, + ) + +UserFileMembershipInfo_validator = bv.Struct(UserFileMembershipInfo) + +class UserInfo(bb.Struct): + """ + Basic information about a user. Use + :meth:`dropbox.dropbox.Dropbox.sharing_users_account` and + :meth:`dropbox.dropbox.Dropbox.sharing_users_account_batch` to obtain more + detailed information. + + :ivar account_id: The account ID of the user. + :ivar email: Email address of user. + :ivar display_name: The display name of the user. + :ivar same_team: If the user is in the same team as current user. + :ivar team_member_id: The team member ID of the shared folder member. Only + present if ``same_team`` is true. + """ + + __slots__ = [ + '_account_id_value', + '_account_id_present', + '_email_value', + '_email_present', + '_display_name_value', + '_display_name_present', + '_same_team_value', + '_same_team_present', + '_team_member_id_value', + '_team_member_id_present', + ] + + _has_required_fields = True + + def __init__(self, + account_id=None, + email=None, + display_name=None, + same_team=None, + team_member_id=None): + self._account_id_value = None + self._account_id_present = False + self._email_value = None + self._email_present = False + self._display_name_value = None + self._display_name_present = False + self._same_team_value = None + self._same_team_present = False + self._team_member_id_value = None + self._team_member_id_present = False + if account_id is not None: + self.account_id = account_id + if email is not None: + self.email = email + if display_name is not None: + self.display_name = display_name + if same_team is not None: + self.same_team = same_team + if team_member_id is not None: + self.team_member_id = team_member_id + + @property + def account_id(self): + """ + The account ID of the user. + + :rtype: str + """ + if self._account_id_present: + return self._account_id_value + else: + raise AttributeError("missing required field 'account_id'") + + @account_id.setter + def account_id(self, val): + val = self._account_id_validator.validate(val) + self._account_id_value = val + self._account_id_present = True + + @account_id.deleter + def account_id(self): + self._account_id_value = None + self._account_id_present = False + + @property + def email(self): + """ + Email address of user. + + :rtype: str + """ + if self._email_present: + return self._email_value + else: + raise AttributeError("missing required field 'email'") + + @email.setter + def email(self, val): + val = self._email_validator.validate(val) + self._email_value = val + self._email_present = True + + @email.deleter + def email(self): + self._email_value = None + self._email_present = False + + @property + def display_name(self): + """ + The display name of the user. + + :rtype: str + """ + if self._display_name_present: + return self._display_name_value + else: + raise AttributeError("missing required field 'display_name'") + + @display_name.setter + def display_name(self, val): + val = self._display_name_validator.validate(val) + self._display_name_value = val + self._display_name_present = True + + @display_name.deleter + def display_name(self): + self._display_name_value = None + self._display_name_present = False + + @property + def same_team(self): + """ + If the user is in the same team as current user. + + :rtype: bool + """ + if self._same_team_present: + return self._same_team_value + else: + raise AttributeError("missing required field 'same_team'") + + @same_team.setter + def same_team(self, val): + val = self._same_team_validator.validate(val) + self._same_team_value = val + self._same_team_present = True + + @same_team.deleter + def same_team(self): + self._same_team_value = None + self._same_team_present = False + + @property + def team_member_id(self): + """ + The team member ID of the shared folder member. Only present if + ``same_team`` is true. + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + return None + + @team_member_id.setter + def team_member_id(self, val): + if val is None: + del self.team_member_id + return + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UserInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UserInfo(account_id={!r}, email={!r}, display_name={!r}, same_team={!r}, team_member_id={!r})'.format( + self._account_id_value, + self._email_value, + self._display_name_value, + self._same_team_value, + self._team_member_id_value, + ) + +UserInfo_validator = bv.Struct(UserInfo) + +class ViewerInfoPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar enabled: Viewer information is available on this file. + :ivar disabled: Viewer information is disabled on this file. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + other = None + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ViewerInfoPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ViewerInfoPolicy(%r, %r)' % (self._tag, self._value) + +ViewerInfoPolicy_validator = bv.Union(ViewerInfoPolicy) + +class Visibility(bb.Union): + """ + Who can access a shared link. The most open visibility is ``public``. The + default depends on many aspects, such as team and user preferences and + shared folder settings. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar public: Anyone who has received the link can access it. No login + required. + :ivar team_only: Only members of the same team can access the link. Login is + required. + :ivar password: A link-specific password is required to access the link. + Login is not required. + :ivar team_and_password: Only members of the same team who have the + link-specific password can access the link. + :ivar shared_folder_only: Only members of the shared folder containing the + linked file can access the link. Login is required. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + public = None + # Attribute is overwritten below the class definition + team_only = None + # Attribute is overwritten below the class definition + password = None + # Attribute is overwritten below the class definition + team_and_password = None + # Attribute is overwritten below the class definition + shared_folder_only = None + # Attribute is overwritten below the class definition + other = None + + def is_public(self): + """ + Check if the union tag is ``public``. + + :rtype: bool + """ + return self._tag == 'public' + + def is_team_only(self): + """ + Check if the union tag is ``team_only``. + + :rtype: bool + """ + return self._tag == 'team_only' + + def is_password(self): + """ + Check if the union tag is ``password``. + + :rtype: bool + """ + return self._tag == 'password' + + def is_team_and_password(self): + """ + Check if the union tag is ``team_and_password``. + + :rtype: bool + """ + return self._tag == 'team_and_password' + + def is_shared_folder_only(self): + """ + Check if the union tag is ``shared_folder_only``. + + :rtype: bool + """ + return self._tag == 'shared_folder_only' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(Visibility, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'Visibility(%r, %r)' % (self._tag, self._value) + +Visibility_validator = bv.Union(Visibility) + +DropboxId_validator = bv.String(min_length=1) +GetSharedLinkFileArg_validator = GetSharedLinkMetadataArg_validator +GetSharedLinkFileArg = GetSharedLinkMetadataArg +Id_validator = files.Id_validator +Path_validator = files.Path_validator +PathOrId_validator = bv.String(min_length=1, pattern=u'((/|id:).*|nspath:[0-9]+:.*)|ns:[0-9]+(/.*)?') +ReadPath_validator = files.ReadPath_validator +Rev_validator = files.Rev_validator +TeamInfo_validator = users.Team_validator +TeamInfo = users.Team +AccessInheritance._inherit_validator = bv.Void() +AccessInheritance._no_inherit_validator = bv.Void() +AccessInheritance._other_validator = bv.Void() +AccessInheritance._tagmap = { + 'inherit': AccessInheritance._inherit_validator, + 'no_inherit': AccessInheritance._no_inherit_validator, + 'other': AccessInheritance._other_validator, +} + +AccessInheritance.inherit = AccessInheritance('inherit') +AccessInheritance.no_inherit = AccessInheritance('no_inherit') +AccessInheritance.other = AccessInheritance('other') + +AccessLevel._owner_validator = bv.Void() +AccessLevel._editor_validator = bv.Void() +AccessLevel._viewer_validator = bv.Void() +AccessLevel._viewer_no_comment_validator = bv.Void() +AccessLevel._other_validator = bv.Void() +AccessLevel._tagmap = { + 'owner': AccessLevel._owner_validator, + 'editor': AccessLevel._editor_validator, + 'viewer': AccessLevel._viewer_validator, + 'viewer_no_comment': AccessLevel._viewer_no_comment_validator, + 'other': AccessLevel._other_validator, +} + +AccessLevel.owner = AccessLevel('owner') +AccessLevel.editor = AccessLevel('editor') +AccessLevel.viewer = AccessLevel('viewer') +AccessLevel.viewer_no_comment = AccessLevel('viewer_no_comment') +AccessLevel.other = AccessLevel('other') + +AclUpdatePolicy._owner_validator = bv.Void() +AclUpdatePolicy._editors_validator = bv.Void() +AclUpdatePolicy._other_validator = bv.Void() +AclUpdatePolicy._tagmap = { + 'owner': AclUpdatePolicy._owner_validator, + 'editors': AclUpdatePolicy._editors_validator, + 'other': AclUpdatePolicy._other_validator, +} + +AclUpdatePolicy.owner = AclUpdatePolicy('owner') +AclUpdatePolicy.editors = AclUpdatePolicy('editors') +AclUpdatePolicy.other = AclUpdatePolicy('other') + +AddFileMemberArgs._file_validator = PathOrId_validator +AddFileMemberArgs._members_validator = bv.List(MemberSelector_validator) +AddFileMemberArgs._custom_message_validator = bv.Nullable(bv.String()) +AddFileMemberArgs._quiet_validator = bv.Boolean() +AddFileMemberArgs._access_level_validator = AccessLevel_validator +AddFileMemberArgs._add_message_as_comment_validator = bv.Boolean() +AddFileMemberArgs._all_field_names_ = set([ + 'file', + 'members', + 'custom_message', + 'quiet', + 'access_level', + 'add_message_as_comment', +]) +AddFileMemberArgs._all_fields_ = [ + ('file', AddFileMemberArgs._file_validator), + ('members', AddFileMemberArgs._members_validator), + ('custom_message', AddFileMemberArgs._custom_message_validator), + ('quiet', AddFileMemberArgs._quiet_validator), + ('access_level', AddFileMemberArgs._access_level_validator), + ('add_message_as_comment', AddFileMemberArgs._add_message_as_comment_validator), +] + +AddFileMemberError._user_error_validator = SharingUserError_validator +AddFileMemberError._access_error_validator = SharingFileAccessError_validator +AddFileMemberError._rate_limit_validator = bv.Void() +AddFileMemberError._invalid_comment_validator = bv.Void() +AddFileMemberError._other_validator = bv.Void() +AddFileMemberError._tagmap = { + 'user_error': AddFileMemberError._user_error_validator, + 'access_error': AddFileMemberError._access_error_validator, + 'rate_limit': AddFileMemberError._rate_limit_validator, + 'invalid_comment': AddFileMemberError._invalid_comment_validator, + 'other': AddFileMemberError._other_validator, +} + +AddFileMemberError.rate_limit = AddFileMemberError('rate_limit') +AddFileMemberError.invalid_comment = AddFileMemberError('invalid_comment') +AddFileMemberError.other = AddFileMemberError('other') + +AddFolderMemberArg._shared_folder_id_validator = common.SharedFolderId_validator +AddFolderMemberArg._members_validator = bv.List(AddMember_validator) +AddFolderMemberArg._quiet_validator = bv.Boolean() +AddFolderMemberArg._custom_message_validator = bv.Nullable(bv.String(min_length=1)) +AddFolderMemberArg._all_field_names_ = set([ + 'shared_folder_id', + 'members', + 'quiet', + 'custom_message', +]) +AddFolderMemberArg._all_fields_ = [ + ('shared_folder_id', AddFolderMemberArg._shared_folder_id_validator), + ('members', AddFolderMemberArg._members_validator), + ('quiet', AddFolderMemberArg._quiet_validator), + ('custom_message', AddFolderMemberArg._custom_message_validator), +] + +AddFolderMemberError._access_error_validator = SharedFolderAccessError_validator +AddFolderMemberError._email_unverified_validator = bv.Void() +AddFolderMemberError._bad_member_validator = AddMemberSelectorError_validator +AddFolderMemberError._cant_share_outside_team_validator = bv.Void() +AddFolderMemberError._too_many_members_validator = bv.UInt64() +AddFolderMemberError._too_many_pending_invites_validator = bv.UInt64() +AddFolderMemberError._rate_limit_validator = bv.Void() +AddFolderMemberError._too_many_invitees_validator = bv.Void() +AddFolderMemberError._insufficient_plan_validator = bv.Void() +AddFolderMemberError._team_folder_validator = bv.Void() +AddFolderMemberError._no_permission_validator = bv.Void() +AddFolderMemberError._other_validator = bv.Void() +AddFolderMemberError._tagmap = { + 'access_error': AddFolderMemberError._access_error_validator, + 'email_unverified': AddFolderMemberError._email_unverified_validator, + 'bad_member': AddFolderMemberError._bad_member_validator, + 'cant_share_outside_team': AddFolderMemberError._cant_share_outside_team_validator, + 'too_many_members': AddFolderMemberError._too_many_members_validator, + 'too_many_pending_invites': AddFolderMemberError._too_many_pending_invites_validator, + 'rate_limit': AddFolderMemberError._rate_limit_validator, + 'too_many_invitees': AddFolderMemberError._too_many_invitees_validator, + 'insufficient_plan': AddFolderMemberError._insufficient_plan_validator, + 'team_folder': AddFolderMemberError._team_folder_validator, + 'no_permission': AddFolderMemberError._no_permission_validator, + 'other': AddFolderMemberError._other_validator, +} + +AddFolderMemberError.email_unverified = AddFolderMemberError('email_unverified') +AddFolderMemberError.cant_share_outside_team = AddFolderMemberError('cant_share_outside_team') +AddFolderMemberError.rate_limit = AddFolderMemberError('rate_limit') +AddFolderMemberError.too_many_invitees = AddFolderMemberError('too_many_invitees') +AddFolderMemberError.insufficient_plan = AddFolderMemberError('insufficient_plan') +AddFolderMemberError.team_folder = AddFolderMemberError('team_folder') +AddFolderMemberError.no_permission = AddFolderMemberError('no_permission') +AddFolderMemberError.other = AddFolderMemberError('other') + +AddMember._member_validator = MemberSelector_validator +AddMember._access_level_validator = AccessLevel_validator +AddMember._all_field_names_ = set([ + 'member', + 'access_level', +]) +AddMember._all_fields_ = [ + ('member', AddMember._member_validator), + ('access_level', AddMember._access_level_validator), +] + +AddMemberSelectorError._automatic_group_validator = bv.Void() +AddMemberSelectorError._invalid_dropbox_id_validator = DropboxId_validator +AddMemberSelectorError._invalid_email_validator = common.EmailAddress_validator +AddMemberSelectorError._unverified_dropbox_id_validator = DropboxId_validator +AddMemberSelectorError._group_deleted_validator = bv.Void() +AddMemberSelectorError._group_not_on_team_validator = bv.Void() +AddMemberSelectorError._other_validator = bv.Void() +AddMemberSelectorError._tagmap = { + 'automatic_group': AddMemberSelectorError._automatic_group_validator, + 'invalid_dropbox_id': AddMemberSelectorError._invalid_dropbox_id_validator, + 'invalid_email': AddMemberSelectorError._invalid_email_validator, + 'unverified_dropbox_id': AddMemberSelectorError._unverified_dropbox_id_validator, + 'group_deleted': AddMemberSelectorError._group_deleted_validator, + 'group_not_on_team': AddMemberSelectorError._group_not_on_team_validator, + 'other': AddMemberSelectorError._other_validator, +} + +AddMemberSelectorError.automatic_group = AddMemberSelectorError('automatic_group') +AddMemberSelectorError.group_deleted = AddMemberSelectorError('group_deleted') +AddMemberSelectorError.group_not_on_team = AddMemberSelectorError('group_not_on_team') +AddMemberSelectorError.other = AddMemberSelectorError('other') + +AudienceExceptionContentInfo._name_validator = bv.String() +AudienceExceptionContentInfo._all_field_names_ = set(['name']) +AudienceExceptionContentInfo._all_fields_ = [('name', AudienceExceptionContentInfo._name_validator)] + +AudienceExceptions._count_validator = bv.UInt32() +AudienceExceptions._exceptions_validator = bv.List(AudienceExceptionContentInfo_validator) +AudienceExceptions._all_field_names_ = set([ + 'count', + 'exceptions', +]) +AudienceExceptions._all_fields_ = [ + ('count', AudienceExceptions._count_validator), + ('exceptions', AudienceExceptions._exceptions_validator), +] + +AudienceRestrictingSharedFolder._shared_folder_id_validator = common.SharedFolderId_validator +AudienceRestrictingSharedFolder._name_validator = bv.String() +AudienceRestrictingSharedFolder._audience_validator = LinkAudience_validator +AudienceRestrictingSharedFolder._all_field_names_ = set([ + 'shared_folder_id', + 'name', + 'audience', +]) +AudienceRestrictingSharedFolder._all_fields_ = [ + ('shared_folder_id', AudienceRestrictingSharedFolder._shared_folder_id_validator), + ('name', AudienceRestrictingSharedFolder._name_validator), + ('audience', AudienceRestrictingSharedFolder._audience_validator), +] + +ChangeFileMemberAccessArgs._file_validator = PathOrId_validator +ChangeFileMemberAccessArgs._member_validator = MemberSelector_validator +ChangeFileMemberAccessArgs._access_level_validator = AccessLevel_validator +ChangeFileMemberAccessArgs._all_field_names_ = set([ + 'file', + 'member', + 'access_level', +]) +ChangeFileMemberAccessArgs._all_fields_ = [ + ('file', ChangeFileMemberAccessArgs._file_validator), + ('member', ChangeFileMemberAccessArgs._member_validator), + ('access_level', ChangeFileMemberAccessArgs._access_level_validator), +] + +LinkMetadata._url_validator = bv.String() +LinkMetadata._visibility_validator = Visibility_validator +LinkMetadata._expires_validator = bv.Nullable(common.DropboxTimestamp_validator) +LinkMetadata._field_names_ = set([ + 'url', + 'visibility', + 'expires', +]) +LinkMetadata._all_field_names_ = LinkMetadata._field_names_ +LinkMetadata._fields_ = [ + ('url', LinkMetadata._url_validator), + ('visibility', LinkMetadata._visibility_validator), + ('expires', LinkMetadata._expires_validator), +] +LinkMetadata._all_fields_ = LinkMetadata._fields_ + +LinkMetadata._tag_to_subtype_ = { + (u'path',): PathLinkMetadata_validator, + (u'collection',): CollectionLinkMetadata_validator, +} +LinkMetadata._pytype_to_tag_and_subtype_ = { + PathLinkMetadata: ((u'path',), PathLinkMetadata_validator), + CollectionLinkMetadata: ((u'collection',), CollectionLinkMetadata_validator), +} +LinkMetadata._is_catch_all_ = True + +CollectionLinkMetadata._field_names_ = set([]) +CollectionLinkMetadata._all_field_names_ = LinkMetadata._all_field_names_.union(CollectionLinkMetadata._field_names_) +CollectionLinkMetadata._fields_ = [] +CollectionLinkMetadata._all_fields_ = LinkMetadata._all_fields_ + CollectionLinkMetadata._fields_ + +CreateSharedLinkArg._path_validator = bv.String() +CreateSharedLinkArg._short_url_validator = bv.Boolean() +CreateSharedLinkArg._pending_upload_validator = bv.Nullable(PendingUploadMode_validator) +CreateSharedLinkArg._all_field_names_ = set([ + 'path', + 'short_url', + 'pending_upload', +]) +CreateSharedLinkArg._all_fields_ = [ + ('path', CreateSharedLinkArg._path_validator), + ('short_url', CreateSharedLinkArg._short_url_validator), + ('pending_upload', CreateSharedLinkArg._pending_upload_validator), +] + +CreateSharedLinkError._path_validator = files.LookupError_validator +CreateSharedLinkError._other_validator = bv.Void() +CreateSharedLinkError._tagmap = { + 'path': CreateSharedLinkError._path_validator, + 'other': CreateSharedLinkError._other_validator, +} + +CreateSharedLinkError.other = CreateSharedLinkError('other') + +CreateSharedLinkWithSettingsArg._path_validator = ReadPath_validator +CreateSharedLinkWithSettingsArg._settings_validator = bv.Nullable(SharedLinkSettings_validator) +CreateSharedLinkWithSettingsArg._all_field_names_ = set([ + 'path', + 'settings', +]) +CreateSharedLinkWithSettingsArg._all_fields_ = [ + ('path', CreateSharedLinkWithSettingsArg._path_validator), + ('settings', CreateSharedLinkWithSettingsArg._settings_validator), +] + +CreateSharedLinkWithSettingsError._path_validator = files.LookupError_validator +CreateSharedLinkWithSettingsError._email_not_verified_validator = bv.Void() +CreateSharedLinkWithSettingsError._shared_link_already_exists_validator = bv.Void() +CreateSharedLinkWithSettingsError._settings_error_validator = SharedLinkSettingsError_validator +CreateSharedLinkWithSettingsError._access_denied_validator = bv.Void() +CreateSharedLinkWithSettingsError._tagmap = { + 'path': CreateSharedLinkWithSettingsError._path_validator, + 'email_not_verified': CreateSharedLinkWithSettingsError._email_not_verified_validator, + 'shared_link_already_exists': CreateSharedLinkWithSettingsError._shared_link_already_exists_validator, + 'settings_error': CreateSharedLinkWithSettingsError._settings_error_validator, + 'access_denied': CreateSharedLinkWithSettingsError._access_denied_validator, +} + +CreateSharedLinkWithSettingsError.email_not_verified = CreateSharedLinkWithSettingsError('email_not_verified') +CreateSharedLinkWithSettingsError.shared_link_already_exists = CreateSharedLinkWithSettingsError('shared_link_already_exists') +CreateSharedLinkWithSettingsError.access_denied = CreateSharedLinkWithSettingsError('access_denied') + +SharedContentLinkMetadataBase._access_level_validator = bv.Nullable(AccessLevel_validator) +SharedContentLinkMetadataBase._audience_options_validator = bv.List(LinkAudience_validator) +SharedContentLinkMetadataBase._audience_restricting_shared_folder_validator = bv.Nullable(AudienceRestrictingSharedFolder_validator) +SharedContentLinkMetadataBase._current_audience_validator = LinkAudience_validator +SharedContentLinkMetadataBase._expiry_validator = bv.Nullable(common.DropboxTimestamp_validator) +SharedContentLinkMetadataBase._link_permissions_validator = bv.List(LinkPermission_validator) +SharedContentLinkMetadataBase._password_protected_validator = bv.Boolean() +SharedContentLinkMetadataBase._all_field_names_ = set([ + 'access_level', + 'audience_options', + 'audience_restricting_shared_folder', + 'current_audience', + 'expiry', + 'link_permissions', + 'password_protected', +]) +SharedContentLinkMetadataBase._all_fields_ = [ + ('access_level', SharedContentLinkMetadataBase._access_level_validator), + ('audience_options', SharedContentLinkMetadataBase._audience_options_validator), + ('audience_restricting_shared_folder', SharedContentLinkMetadataBase._audience_restricting_shared_folder_validator), + ('current_audience', SharedContentLinkMetadataBase._current_audience_validator), + ('expiry', SharedContentLinkMetadataBase._expiry_validator), + ('link_permissions', SharedContentLinkMetadataBase._link_permissions_validator), + ('password_protected', SharedContentLinkMetadataBase._password_protected_validator), +] + +ExpectedSharedContentLinkMetadata._all_field_names_ = SharedContentLinkMetadataBase._all_field_names_.union(set([])) +ExpectedSharedContentLinkMetadata._all_fields_ = SharedContentLinkMetadataBase._all_fields_ + [] + +FileAction._disable_viewer_info_validator = bv.Void() +FileAction._edit_contents_validator = bv.Void() +FileAction._enable_viewer_info_validator = bv.Void() +FileAction._invite_viewer_validator = bv.Void() +FileAction._invite_viewer_no_comment_validator = bv.Void() +FileAction._invite_editor_validator = bv.Void() +FileAction._unshare_validator = bv.Void() +FileAction._relinquish_membership_validator = bv.Void() +FileAction._share_link_validator = bv.Void() +FileAction._create_link_validator = bv.Void() +FileAction._other_validator = bv.Void() +FileAction._tagmap = { + 'disable_viewer_info': FileAction._disable_viewer_info_validator, + 'edit_contents': FileAction._edit_contents_validator, + 'enable_viewer_info': FileAction._enable_viewer_info_validator, + 'invite_viewer': FileAction._invite_viewer_validator, + 'invite_viewer_no_comment': FileAction._invite_viewer_no_comment_validator, + 'invite_editor': FileAction._invite_editor_validator, + 'unshare': FileAction._unshare_validator, + 'relinquish_membership': FileAction._relinquish_membership_validator, + 'share_link': FileAction._share_link_validator, + 'create_link': FileAction._create_link_validator, + 'other': FileAction._other_validator, +} + +FileAction.disable_viewer_info = FileAction('disable_viewer_info') +FileAction.edit_contents = FileAction('edit_contents') +FileAction.enable_viewer_info = FileAction('enable_viewer_info') +FileAction.invite_viewer = FileAction('invite_viewer') +FileAction.invite_viewer_no_comment = FileAction('invite_viewer_no_comment') +FileAction.invite_editor = FileAction('invite_editor') +FileAction.unshare = FileAction('unshare') +FileAction.relinquish_membership = FileAction('relinquish_membership') +FileAction.share_link = FileAction('share_link') +FileAction.create_link = FileAction('create_link') +FileAction.other = FileAction('other') + +FileErrorResult._file_not_found_error_validator = files.Id_validator +FileErrorResult._invalid_file_action_error_validator = files.Id_validator +FileErrorResult._permission_denied_error_validator = files.Id_validator +FileErrorResult._other_validator = bv.Void() +FileErrorResult._tagmap = { + 'file_not_found_error': FileErrorResult._file_not_found_error_validator, + 'invalid_file_action_error': FileErrorResult._invalid_file_action_error_validator, + 'permission_denied_error': FileErrorResult._permission_denied_error_validator, + 'other': FileErrorResult._other_validator, +} + +FileErrorResult.other = FileErrorResult('other') + +SharedLinkMetadata._url_validator = bv.String() +SharedLinkMetadata._id_validator = bv.Nullable(Id_validator) +SharedLinkMetadata._name_validator = bv.String() +SharedLinkMetadata._expires_validator = bv.Nullable(common.DropboxTimestamp_validator) +SharedLinkMetadata._path_lower_validator = bv.Nullable(bv.String()) +SharedLinkMetadata._link_permissions_validator = LinkPermissions_validator +SharedLinkMetadata._team_member_info_validator = bv.Nullable(TeamMemberInfo_validator) +SharedLinkMetadata._content_owner_team_info_validator = bv.Nullable(TeamInfo_validator) +SharedLinkMetadata._field_names_ = set([ + 'url', + 'id', + 'name', + 'expires', + 'path_lower', + 'link_permissions', + 'team_member_info', + 'content_owner_team_info', +]) +SharedLinkMetadata._all_field_names_ = SharedLinkMetadata._field_names_ +SharedLinkMetadata._fields_ = [ + ('url', SharedLinkMetadata._url_validator), + ('id', SharedLinkMetadata._id_validator), + ('name', SharedLinkMetadata._name_validator), + ('expires', SharedLinkMetadata._expires_validator), + ('path_lower', SharedLinkMetadata._path_lower_validator), + ('link_permissions', SharedLinkMetadata._link_permissions_validator), + ('team_member_info', SharedLinkMetadata._team_member_info_validator), + ('content_owner_team_info', SharedLinkMetadata._content_owner_team_info_validator), +] +SharedLinkMetadata._all_fields_ = SharedLinkMetadata._fields_ + +SharedLinkMetadata._tag_to_subtype_ = { + (u'file',): FileLinkMetadata_validator, + (u'folder',): FolderLinkMetadata_validator, +} +SharedLinkMetadata._pytype_to_tag_and_subtype_ = { + FileLinkMetadata: ((u'file',), FileLinkMetadata_validator), + FolderLinkMetadata: ((u'folder',), FolderLinkMetadata_validator), +} +SharedLinkMetadata._is_catch_all_ = True + +FileLinkMetadata._client_modified_validator = common.DropboxTimestamp_validator +FileLinkMetadata._server_modified_validator = common.DropboxTimestamp_validator +FileLinkMetadata._rev_validator = Rev_validator +FileLinkMetadata._size_validator = bv.UInt64() +FileLinkMetadata._field_names_ = set([ + 'client_modified', + 'server_modified', + 'rev', + 'size', +]) +FileLinkMetadata._all_field_names_ = SharedLinkMetadata._all_field_names_.union(FileLinkMetadata._field_names_) +FileLinkMetadata._fields_ = [ + ('client_modified', FileLinkMetadata._client_modified_validator), + ('server_modified', FileLinkMetadata._server_modified_validator), + ('rev', FileLinkMetadata._rev_validator), + ('size', FileLinkMetadata._size_validator), +] +FileLinkMetadata._all_fields_ = SharedLinkMetadata._all_fields_ + FileLinkMetadata._fields_ + +FileMemberActionError._invalid_member_validator = bv.Void() +FileMemberActionError._no_permission_validator = bv.Void() +FileMemberActionError._access_error_validator = SharingFileAccessError_validator +FileMemberActionError._no_explicit_access_validator = MemberAccessLevelResult_validator +FileMemberActionError._other_validator = bv.Void() +FileMemberActionError._tagmap = { + 'invalid_member': FileMemberActionError._invalid_member_validator, + 'no_permission': FileMemberActionError._no_permission_validator, + 'access_error': FileMemberActionError._access_error_validator, + 'no_explicit_access': FileMemberActionError._no_explicit_access_validator, + 'other': FileMemberActionError._other_validator, +} + +FileMemberActionError.invalid_member = FileMemberActionError('invalid_member') +FileMemberActionError.no_permission = FileMemberActionError('no_permission') +FileMemberActionError.other = FileMemberActionError('other') + +FileMemberActionIndividualResult._success_validator = bv.Nullable(AccessLevel_validator) +FileMemberActionIndividualResult._member_error_validator = FileMemberActionError_validator +FileMemberActionIndividualResult._tagmap = { + 'success': FileMemberActionIndividualResult._success_validator, + 'member_error': FileMemberActionIndividualResult._member_error_validator, +} + +FileMemberActionResult._member_validator = MemberSelector_validator +FileMemberActionResult._result_validator = FileMemberActionIndividualResult_validator +FileMemberActionResult._all_field_names_ = set([ + 'member', + 'result', +]) +FileMemberActionResult._all_fields_ = [ + ('member', FileMemberActionResult._member_validator), + ('result', FileMemberActionResult._result_validator), +] + +FileMemberRemoveActionResult._success_validator = MemberAccessLevelResult_validator +FileMemberRemoveActionResult._member_error_validator = FileMemberActionError_validator +FileMemberRemoveActionResult._other_validator = bv.Void() +FileMemberRemoveActionResult._tagmap = { + 'success': FileMemberRemoveActionResult._success_validator, + 'member_error': FileMemberRemoveActionResult._member_error_validator, + 'other': FileMemberRemoveActionResult._other_validator, +} + +FileMemberRemoveActionResult.other = FileMemberRemoveActionResult('other') + +FilePermission._action_validator = FileAction_validator +FilePermission._allow_validator = bv.Boolean() +FilePermission._reason_validator = bv.Nullable(PermissionDeniedReason_validator) +FilePermission._all_field_names_ = set([ + 'action', + 'allow', + 'reason', +]) +FilePermission._all_fields_ = [ + ('action', FilePermission._action_validator), + ('allow', FilePermission._allow_validator), + ('reason', FilePermission._reason_validator), +] + +FolderAction._change_options_validator = bv.Void() +FolderAction._disable_viewer_info_validator = bv.Void() +FolderAction._edit_contents_validator = bv.Void() +FolderAction._enable_viewer_info_validator = bv.Void() +FolderAction._invite_editor_validator = bv.Void() +FolderAction._invite_viewer_validator = bv.Void() +FolderAction._invite_viewer_no_comment_validator = bv.Void() +FolderAction._relinquish_membership_validator = bv.Void() +FolderAction._unmount_validator = bv.Void() +FolderAction._unshare_validator = bv.Void() +FolderAction._leave_a_copy_validator = bv.Void() +FolderAction._share_link_validator = bv.Void() +FolderAction._create_link_validator = bv.Void() +FolderAction._set_access_inheritance_validator = bv.Void() +FolderAction._other_validator = bv.Void() +FolderAction._tagmap = { + 'change_options': FolderAction._change_options_validator, + 'disable_viewer_info': FolderAction._disable_viewer_info_validator, + 'edit_contents': FolderAction._edit_contents_validator, + 'enable_viewer_info': FolderAction._enable_viewer_info_validator, + 'invite_editor': FolderAction._invite_editor_validator, + 'invite_viewer': FolderAction._invite_viewer_validator, + 'invite_viewer_no_comment': FolderAction._invite_viewer_no_comment_validator, + 'relinquish_membership': FolderAction._relinquish_membership_validator, + 'unmount': FolderAction._unmount_validator, + 'unshare': FolderAction._unshare_validator, + 'leave_a_copy': FolderAction._leave_a_copy_validator, + 'share_link': FolderAction._share_link_validator, + 'create_link': FolderAction._create_link_validator, + 'set_access_inheritance': FolderAction._set_access_inheritance_validator, + 'other': FolderAction._other_validator, +} + +FolderAction.change_options = FolderAction('change_options') +FolderAction.disable_viewer_info = FolderAction('disable_viewer_info') +FolderAction.edit_contents = FolderAction('edit_contents') +FolderAction.enable_viewer_info = FolderAction('enable_viewer_info') +FolderAction.invite_editor = FolderAction('invite_editor') +FolderAction.invite_viewer = FolderAction('invite_viewer') +FolderAction.invite_viewer_no_comment = FolderAction('invite_viewer_no_comment') +FolderAction.relinquish_membership = FolderAction('relinquish_membership') +FolderAction.unmount = FolderAction('unmount') +FolderAction.unshare = FolderAction('unshare') +FolderAction.leave_a_copy = FolderAction('leave_a_copy') +FolderAction.share_link = FolderAction('share_link') +FolderAction.create_link = FolderAction('create_link') +FolderAction.set_access_inheritance = FolderAction('set_access_inheritance') +FolderAction.other = FolderAction('other') + +FolderLinkMetadata._field_names_ = set([]) +FolderLinkMetadata._all_field_names_ = SharedLinkMetadata._all_field_names_.union(FolderLinkMetadata._field_names_) +FolderLinkMetadata._fields_ = [] +FolderLinkMetadata._all_fields_ = SharedLinkMetadata._all_fields_ + FolderLinkMetadata._fields_ + +FolderPermission._action_validator = FolderAction_validator +FolderPermission._allow_validator = bv.Boolean() +FolderPermission._reason_validator = bv.Nullable(PermissionDeniedReason_validator) +FolderPermission._all_field_names_ = set([ + 'action', + 'allow', + 'reason', +]) +FolderPermission._all_fields_ = [ + ('action', FolderPermission._action_validator), + ('allow', FolderPermission._allow_validator), + ('reason', FolderPermission._reason_validator), +] + +FolderPolicy._member_policy_validator = bv.Nullable(MemberPolicy_validator) +FolderPolicy._resolved_member_policy_validator = bv.Nullable(MemberPolicy_validator) +FolderPolicy._acl_update_policy_validator = AclUpdatePolicy_validator +FolderPolicy._shared_link_policy_validator = SharedLinkPolicy_validator +FolderPolicy._viewer_info_policy_validator = bv.Nullable(ViewerInfoPolicy_validator) +FolderPolicy._all_field_names_ = set([ + 'member_policy', + 'resolved_member_policy', + 'acl_update_policy', + 'shared_link_policy', + 'viewer_info_policy', +]) +FolderPolicy._all_fields_ = [ + ('member_policy', FolderPolicy._member_policy_validator), + ('resolved_member_policy', FolderPolicy._resolved_member_policy_validator), + ('acl_update_policy', FolderPolicy._acl_update_policy_validator), + ('shared_link_policy', FolderPolicy._shared_link_policy_validator), + ('viewer_info_policy', FolderPolicy._viewer_info_policy_validator), +] + +GetFileMetadataArg._file_validator = PathOrId_validator +GetFileMetadataArg._actions_validator = bv.Nullable(bv.List(FileAction_validator)) +GetFileMetadataArg._all_field_names_ = set([ + 'file', + 'actions', +]) +GetFileMetadataArg._all_fields_ = [ + ('file', GetFileMetadataArg._file_validator), + ('actions', GetFileMetadataArg._actions_validator), +] + +GetFileMetadataBatchArg._files_validator = bv.List(PathOrId_validator, max_items=100) +GetFileMetadataBatchArg._actions_validator = bv.Nullable(bv.List(FileAction_validator)) +GetFileMetadataBatchArg._all_field_names_ = set([ + 'files', + 'actions', +]) +GetFileMetadataBatchArg._all_fields_ = [ + ('files', GetFileMetadataBatchArg._files_validator), + ('actions', GetFileMetadataBatchArg._actions_validator), +] + +GetFileMetadataBatchResult._file_validator = PathOrId_validator +GetFileMetadataBatchResult._result_validator = GetFileMetadataIndividualResult_validator +GetFileMetadataBatchResult._all_field_names_ = set([ + 'file', + 'result', +]) +GetFileMetadataBatchResult._all_fields_ = [ + ('file', GetFileMetadataBatchResult._file_validator), + ('result', GetFileMetadataBatchResult._result_validator), +] + +GetFileMetadataError._user_error_validator = SharingUserError_validator +GetFileMetadataError._access_error_validator = SharingFileAccessError_validator +GetFileMetadataError._other_validator = bv.Void() +GetFileMetadataError._tagmap = { + 'user_error': GetFileMetadataError._user_error_validator, + 'access_error': GetFileMetadataError._access_error_validator, + 'other': GetFileMetadataError._other_validator, +} + +GetFileMetadataError.other = GetFileMetadataError('other') + +GetFileMetadataIndividualResult._metadata_validator = SharedFileMetadata_validator +GetFileMetadataIndividualResult._access_error_validator = SharingFileAccessError_validator +GetFileMetadataIndividualResult._other_validator = bv.Void() +GetFileMetadataIndividualResult._tagmap = { + 'metadata': GetFileMetadataIndividualResult._metadata_validator, + 'access_error': GetFileMetadataIndividualResult._access_error_validator, + 'other': GetFileMetadataIndividualResult._other_validator, +} + +GetFileMetadataIndividualResult.other = GetFileMetadataIndividualResult('other') + +GetMetadataArgs._shared_folder_id_validator = common.SharedFolderId_validator +GetMetadataArgs._actions_validator = bv.Nullable(bv.List(FolderAction_validator)) +GetMetadataArgs._all_field_names_ = set([ + 'shared_folder_id', + 'actions', +]) +GetMetadataArgs._all_fields_ = [ + ('shared_folder_id', GetMetadataArgs._shared_folder_id_validator), + ('actions', GetMetadataArgs._actions_validator), +] + +SharedLinkError._shared_link_not_found_validator = bv.Void() +SharedLinkError._shared_link_access_denied_validator = bv.Void() +SharedLinkError._unsupported_link_type_validator = bv.Void() +SharedLinkError._other_validator = bv.Void() +SharedLinkError._tagmap = { + 'shared_link_not_found': SharedLinkError._shared_link_not_found_validator, + 'shared_link_access_denied': SharedLinkError._shared_link_access_denied_validator, + 'unsupported_link_type': SharedLinkError._unsupported_link_type_validator, + 'other': SharedLinkError._other_validator, +} + +SharedLinkError.shared_link_not_found = SharedLinkError('shared_link_not_found') +SharedLinkError.shared_link_access_denied = SharedLinkError('shared_link_access_denied') +SharedLinkError.unsupported_link_type = SharedLinkError('unsupported_link_type') +SharedLinkError.other = SharedLinkError('other') + +GetSharedLinkFileError._shared_link_is_directory_validator = bv.Void() +GetSharedLinkFileError._tagmap = { + 'shared_link_is_directory': GetSharedLinkFileError._shared_link_is_directory_validator, +} +GetSharedLinkFileError._tagmap.update(SharedLinkError._tagmap) + +GetSharedLinkFileError.shared_link_is_directory = GetSharedLinkFileError('shared_link_is_directory') + +GetSharedLinkMetadataArg._url_validator = bv.String() +GetSharedLinkMetadataArg._path_validator = bv.Nullable(Path_validator) +GetSharedLinkMetadataArg._link_password_validator = bv.Nullable(bv.String()) +GetSharedLinkMetadataArg._all_field_names_ = set([ + 'url', + 'path', + 'link_password', +]) +GetSharedLinkMetadataArg._all_fields_ = [ + ('url', GetSharedLinkMetadataArg._url_validator), + ('path', GetSharedLinkMetadataArg._path_validator), + ('link_password', GetSharedLinkMetadataArg._link_password_validator), +] + +GetSharedLinksArg._path_validator = bv.Nullable(bv.String()) +GetSharedLinksArg._all_field_names_ = set(['path']) +GetSharedLinksArg._all_fields_ = [('path', GetSharedLinksArg._path_validator)] + +GetSharedLinksError._path_validator = files.MalformedPathError_validator +GetSharedLinksError._other_validator = bv.Void() +GetSharedLinksError._tagmap = { + 'path': GetSharedLinksError._path_validator, + 'other': GetSharedLinksError._other_validator, +} + +GetSharedLinksError.other = GetSharedLinksError('other') + +GetSharedLinksResult._links_validator = bv.List(LinkMetadata_validator) +GetSharedLinksResult._all_field_names_ = set(['links']) +GetSharedLinksResult._all_fields_ = [('links', GetSharedLinksResult._links_validator)] + +GroupInfo._group_type_validator = team_common.GroupType_validator +GroupInfo._is_member_validator = bv.Boolean() +GroupInfo._is_owner_validator = bv.Boolean() +GroupInfo._same_team_validator = bv.Boolean() +GroupInfo._all_field_names_ = team_common.GroupSummary._all_field_names_.union(set([ + 'group_type', + 'is_member', + 'is_owner', + 'same_team', +])) +GroupInfo._all_fields_ = team_common.GroupSummary._all_fields_ + [ + ('group_type', GroupInfo._group_type_validator), + ('is_member', GroupInfo._is_member_validator), + ('is_owner', GroupInfo._is_owner_validator), + ('same_team', GroupInfo._same_team_validator), +] + +MembershipInfo._access_type_validator = AccessLevel_validator +MembershipInfo._permissions_validator = bv.Nullable(bv.List(MemberPermission_validator)) +MembershipInfo._initials_validator = bv.Nullable(bv.String()) +MembershipInfo._is_inherited_validator = bv.Boolean() +MembershipInfo._all_field_names_ = set([ + 'access_type', + 'permissions', + 'initials', + 'is_inherited', +]) +MembershipInfo._all_fields_ = [ + ('access_type', MembershipInfo._access_type_validator), + ('permissions', MembershipInfo._permissions_validator), + ('initials', MembershipInfo._initials_validator), + ('is_inherited', MembershipInfo._is_inherited_validator), +] + +GroupMembershipInfo._group_validator = GroupInfo_validator +GroupMembershipInfo._all_field_names_ = MembershipInfo._all_field_names_.union(set(['group'])) +GroupMembershipInfo._all_fields_ = MembershipInfo._all_fields_ + [('group', GroupMembershipInfo._group_validator)] + +InsufficientPlan._message_validator = bv.String() +InsufficientPlan._upsell_url_validator = bv.Nullable(bv.String()) +InsufficientPlan._all_field_names_ = set([ + 'message', + 'upsell_url', +]) +InsufficientPlan._all_fields_ = [ + ('message', InsufficientPlan._message_validator), + ('upsell_url', InsufficientPlan._upsell_url_validator), +] + +InsufficientQuotaAmounts._space_needed_validator = bv.UInt64() +InsufficientQuotaAmounts._space_shortage_validator = bv.UInt64() +InsufficientQuotaAmounts._space_left_validator = bv.UInt64() +InsufficientQuotaAmounts._all_field_names_ = set([ + 'space_needed', + 'space_shortage', + 'space_left', +]) +InsufficientQuotaAmounts._all_fields_ = [ + ('space_needed', InsufficientQuotaAmounts._space_needed_validator), + ('space_shortage', InsufficientQuotaAmounts._space_shortage_validator), + ('space_left', InsufficientQuotaAmounts._space_left_validator), +] + +InviteeInfo._email_validator = common.EmailAddress_validator +InviteeInfo._other_validator = bv.Void() +InviteeInfo._tagmap = { + 'email': InviteeInfo._email_validator, + 'other': InviteeInfo._other_validator, +} + +InviteeInfo.other = InviteeInfo('other') + +InviteeMembershipInfo._invitee_validator = InviteeInfo_validator +InviteeMembershipInfo._user_validator = bv.Nullable(UserInfo_validator) +InviteeMembershipInfo._all_field_names_ = MembershipInfo._all_field_names_.union(set([ + 'invitee', + 'user', +])) +InviteeMembershipInfo._all_fields_ = MembershipInfo._all_fields_ + [ + ('invitee', InviteeMembershipInfo._invitee_validator), + ('user', InviteeMembershipInfo._user_validator), +] + +JobError._unshare_folder_error_validator = UnshareFolderError_validator +JobError._remove_folder_member_error_validator = RemoveFolderMemberError_validator +JobError._relinquish_folder_membership_error_validator = RelinquishFolderMembershipError_validator +JobError._other_validator = bv.Void() +JobError._tagmap = { + 'unshare_folder_error': JobError._unshare_folder_error_validator, + 'remove_folder_member_error': JobError._remove_folder_member_error_validator, + 'relinquish_folder_membership_error': JobError._relinquish_folder_membership_error_validator, + 'other': JobError._other_validator, +} + +JobError.other = JobError('other') + +JobStatus._complete_validator = bv.Void() +JobStatus._failed_validator = JobError_validator +JobStatus._tagmap = { + 'complete': JobStatus._complete_validator, + 'failed': JobStatus._failed_validator, +} +JobStatus._tagmap.update(async_.PollResultBase._tagmap) + +JobStatus.complete = JobStatus('complete') + +LinkAction._change_access_level_validator = bv.Void() +LinkAction._change_audience_validator = bv.Void() +LinkAction._remove_expiry_validator = bv.Void() +LinkAction._remove_password_validator = bv.Void() +LinkAction._set_expiry_validator = bv.Void() +LinkAction._set_password_validator = bv.Void() +LinkAction._other_validator = bv.Void() +LinkAction._tagmap = { + 'change_access_level': LinkAction._change_access_level_validator, + 'change_audience': LinkAction._change_audience_validator, + 'remove_expiry': LinkAction._remove_expiry_validator, + 'remove_password': LinkAction._remove_password_validator, + 'set_expiry': LinkAction._set_expiry_validator, + 'set_password': LinkAction._set_password_validator, + 'other': LinkAction._other_validator, +} + +LinkAction.change_access_level = LinkAction('change_access_level') +LinkAction.change_audience = LinkAction('change_audience') +LinkAction.remove_expiry = LinkAction('remove_expiry') +LinkAction.remove_password = LinkAction('remove_password') +LinkAction.set_expiry = LinkAction('set_expiry') +LinkAction.set_password = LinkAction('set_password') +LinkAction.other = LinkAction('other') + +LinkAudience._public_validator = bv.Void() +LinkAudience._team_validator = bv.Void() +LinkAudience._no_one_validator = bv.Void() +LinkAudience._members_validator = bv.Void() +LinkAudience._other_validator = bv.Void() +LinkAudience._tagmap = { + 'public': LinkAudience._public_validator, + 'team': LinkAudience._team_validator, + 'no_one': LinkAudience._no_one_validator, + 'members': LinkAudience._members_validator, + 'other': LinkAudience._other_validator, +} + +LinkAudience.public = LinkAudience('public') +LinkAudience.team = LinkAudience('team') +LinkAudience.no_one = LinkAudience('no_one') +LinkAudience.members = LinkAudience('members') +LinkAudience.other = LinkAudience('other') + +LinkExpiry._remove_expiry_validator = bv.Void() +LinkExpiry._set_expiry_validator = common.DropboxTimestamp_validator +LinkExpiry._other_validator = bv.Void() +LinkExpiry._tagmap = { + 'remove_expiry': LinkExpiry._remove_expiry_validator, + 'set_expiry': LinkExpiry._set_expiry_validator, + 'other': LinkExpiry._other_validator, +} + +LinkExpiry.remove_expiry = LinkExpiry('remove_expiry') +LinkExpiry.other = LinkExpiry('other') + +LinkPassword._remove_password_validator = bv.Void() +LinkPassword._set_password_validator = bv.String() +LinkPassword._other_validator = bv.Void() +LinkPassword._tagmap = { + 'remove_password': LinkPassword._remove_password_validator, + 'set_password': LinkPassword._set_password_validator, + 'other': LinkPassword._other_validator, +} + +LinkPassword.remove_password = LinkPassword('remove_password') +LinkPassword.other = LinkPassword('other') + +LinkPermission._action_validator = LinkAction_validator +LinkPermission._allow_validator = bv.Boolean() +LinkPermission._reason_validator = bv.Nullable(PermissionDeniedReason_validator) +LinkPermission._all_field_names_ = set([ + 'action', + 'allow', + 'reason', +]) +LinkPermission._all_fields_ = [ + ('action', LinkPermission._action_validator), + ('allow', LinkPermission._allow_validator), + ('reason', LinkPermission._reason_validator), +] + +LinkPermissions._resolved_visibility_validator = bv.Nullable(ResolvedVisibility_validator) +LinkPermissions._requested_visibility_validator = bv.Nullable(RequestedVisibility_validator) +LinkPermissions._can_revoke_validator = bv.Boolean() +LinkPermissions._revoke_failure_reason_validator = bv.Nullable(SharedLinkAccessFailureReason_validator) +LinkPermissions._all_field_names_ = set([ + 'resolved_visibility', + 'requested_visibility', + 'can_revoke', + 'revoke_failure_reason', +]) +LinkPermissions._all_fields_ = [ + ('resolved_visibility', LinkPermissions._resolved_visibility_validator), + ('requested_visibility', LinkPermissions._requested_visibility_validator), + ('can_revoke', LinkPermissions._can_revoke_validator), + ('revoke_failure_reason', LinkPermissions._revoke_failure_reason_validator), +] + +LinkSettings._access_level_validator = bv.Nullable(AccessLevel_validator) +LinkSettings._audience_validator = bv.Nullable(LinkAudience_validator) +LinkSettings._expiry_validator = bv.Nullable(LinkExpiry_validator) +LinkSettings._password_validator = bv.Nullable(LinkPassword_validator) +LinkSettings._all_field_names_ = set([ + 'access_level', + 'audience', + 'expiry', + 'password', +]) +LinkSettings._all_fields_ = [ + ('access_level', LinkSettings._access_level_validator), + ('audience', LinkSettings._audience_validator), + ('expiry', LinkSettings._expiry_validator), + ('password', LinkSettings._password_validator), +] + +ListFileMembersArg._file_validator = PathOrId_validator +ListFileMembersArg._actions_validator = bv.Nullable(bv.List(MemberAction_validator)) +ListFileMembersArg._include_inherited_validator = bv.Boolean() +ListFileMembersArg._limit_validator = bv.UInt32(min_value=1, max_value=300) +ListFileMembersArg._all_field_names_ = set([ + 'file', + 'actions', + 'include_inherited', + 'limit', +]) +ListFileMembersArg._all_fields_ = [ + ('file', ListFileMembersArg._file_validator), + ('actions', ListFileMembersArg._actions_validator), + ('include_inherited', ListFileMembersArg._include_inherited_validator), + ('limit', ListFileMembersArg._limit_validator), +] + +ListFileMembersBatchArg._files_validator = bv.List(PathOrId_validator, max_items=100) +ListFileMembersBatchArg._limit_validator = bv.UInt32(max_value=20) +ListFileMembersBatchArg._all_field_names_ = set([ + 'files', + 'limit', +]) +ListFileMembersBatchArg._all_fields_ = [ + ('files', ListFileMembersBatchArg._files_validator), + ('limit', ListFileMembersBatchArg._limit_validator), +] + +ListFileMembersBatchResult._file_validator = PathOrId_validator +ListFileMembersBatchResult._result_validator = ListFileMembersIndividualResult_validator +ListFileMembersBatchResult._all_field_names_ = set([ + 'file', + 'result', +]) +ListFileMembersBatchResult._all_fields_ = [ + ('file', ListFileMembersBatchResult._file_validator), + ('result', ListFileMembersBatchResult._result_validator), +] + +ListFileMembersContinueArg._cursor_validator = bv.String() +ListFileMembersContinueArg._all_field_names_ = set(['cursor']) +ListFileMembersContinueArg._all_fields_ = [('cursor', ListFileMembersContinueArg._cursor_validator)] + +ListFileMembersContinueError._user_error_validator = SharingUserError_validator +ListFileMembersContinueError._access_error_validator = SharingFileAccessError_validator +ListFileMembersContinueError._invalid_cursor_validator = bv.Void() +ListFileMembersContinueError._other_validator = bv.Void() +ListFileMembersContinueError._tagmap = { + 'user_error': ListFileMembersContinueError._user_error_validator, + 'access_error': ListFileMembersContinueError._access_error_validator, + 'invalid_cursor': ListFileMembersContinueError._invalid_cursor_validator, + 'other': ListFileMembersContinueError._other_validator, +} + +ListFileMembersContinueError.invalid_cursor = ListFileMembersContinueError('invalid_cursor') +ListFileMembersContinueError.other = ListFileMembersContinueError('other') + +ListFileMembersCountResult._members_validator = SharedFileMembers_validator +ListFileMembersCountResult._member_count_validator = bv.UInt32() +ListFileMembersCountResult._all_field_names_ = set([ + 'members', + 'member_count', +]) +ListFileMembersCountResult._all_fields_ = [ + ('members', ListFileMembersCountResult._members_validator), + ('member_count', ListFileMembersCountResult._member_count_validator), +] + +ListFileMembersError._user_error_validator = SharingUserError_validator +ListFileMembersError._access_error_validator = SharingFileAccessError_validator +ListFileMembersError._other_validator = bv.Void() +ListFileMembersError._tagmap = { + 'user_error': ListFileMembersError._user_error_validator, + 'access_error': ListFileMembersError._access_error_validator, + 'other': ListFileMembersError._other_validator, +} + +ListFileMembersError.other = ListFileMembersError('other') + +ListFileMembersIndividualResult._result_validator = ListFileMembersCountResult_validator +ListFileMembersIndividualResult._access_error_validator = SharingFileAccessError_validator +ListFileMembersIndividualResult._other_validator = bv.Void() +ListFileMembersIndividualResult._tagmap = { + 'result': ListFileMembersIndividualResult._result_validator, + 'access_error': ListFileMembersIndividualResult._access_error_validator, + 'other': ListFileMembersIndividualResult._other_validator, +} + +ListFileMembersIndividualResult.other = ListFileMembersIndividualResult('other') + +ListFilesArg._limit_validator = bv.UInt32(min_value=1, max_value=300) +ListFilesArg._actions_validator = bv.Nullable(bv.List(FileAction_validator)) +ListFilesArg._all_field_names_ = set([ + 'limit', + 'actions', +]) +ListFilesArg._all_fields_ = [ + ('limit', ListFilesArg._limit_validator), + ('actions', ListFilesArg._actions_validator), +] + +ListFilesContinueArg._cursor_validator = bv.String() +ListFilesContinueArg._all_field_names_ = set(['cursor']) +ListFilesContinueArg._all_fields_ = [('cursor', ListFilesContinueArg._cursor_validator)] + +ListFilesContinueError._user_error_validator = SharingUserError_validator +ListFilesContinueError._invalid_cursor_validator = bv.Void() +ListFilesContinueError._other_validator = bv.Void() +ListFilesContinueError._tagmap = { + 'user_error': ListFilesContinueError._user_error_validator, + 'invalid_cursor': ListFilesContinueError._invalid_cursor_validator, + 'other': ListFilesContinueError._other_validator, +} + +ListFilesContinueError.invalid_cursor = ListFilesContinueError('invalid_cursor') +ListFilesContinueError.other = ListFilesContinueError('other') + +ListFilesResult._entries_validator = bv.List(SharedFileMetadata_validator) +ListFilesResult._cursor_validator = bv.Nullable(bv.String()) +ListFilesResult._all_field_names_ = set([ + 'entries', + 'cursor', +]) +ListFilesResult._all_fields_ = [ + ('entries', ListFilesResult._entries_validator), + ('cursor', ListFilesResult._cursor_validator), +] + +ListFolderMembersCursorArg._actions_validator = bv.Nullable(bv.List(MemberAction_validator)) +ListFolderMembersCursorArg._limit_validator = bv.UInt32(min_value=1, max_value=1000) +ListFolderMembersCursorArg._all_field_names_ = set([ + 'actions', + 'limit', +]) +ListFolderMembersCursorArg._all_fields_ = [ + ('actions', ListFolderMembersCursorArg._actions_validator), + ('limit', ListFolderMembersCursorArg._limit_validator), +] + +ListFolderMembersArgs._shared_folder_id_validator = common.SharedFolderId_validator +ListFolderMembersArgs._all_field_names_ = ListFolderMembersCursorArg._all_field_names_.union(set(['shared_folder_id'])) +ListFolderMembersArgs._all_fields_ = ListFolderMembersCursorArg._all_fields_ + [('shared_folder_id', ListFolderMembersArgs._shared_folder_id_validator)] + +ListFolderMembersContinueArg._cursor_validator = bv.String() +ListFolderMembersContinueArg._all_field_names_ = set(['cursor']) +ListFolderMembersContinueArg._all_fields_ = [('cursor', ListFolderMembersContinueArg._cursor_validator)] + +ListFolderMembersContinueError._access_error_validator = SharedFolderAccessError_validator +ListFolderMembersContinueError._invalid_cursor_validator = bv.Void() +ListFolderMembersContinueError._other_validator = bv.Void() +ListFolderMembersContinueError._tagmap = { + 'access_error': ListFolderMembersContinueError._access_error_validator, + 'invalid_cursor': ListFolderMembersContinueError._invalid_cursor_validator, + 'other': ListFolderMembersContinueError._other_validator, +} + +ListFolderMembersContinueError.invalid_cursor = ListFolderMembersContinueError('invalid_cursor') +ListFolderMembersContinueError.other = ListFolderMembersContinueError('other') + +ListFoldersArgs._limit_validator = bv.UInt32(min_value=1, max_value=1000) +ListFoldersArgs._actions_validator = bv.Nullable(bv.List(FolderAction_validator)) +ListFoldersArgs._all_field_names_ = set([ + 'limit', + 'actions', +]) +ListFoldersArgs._all_fields_ = [ + ('limit', ListFoldersArgs._limit_validator), + ('actions', ListFoldersArgs._actions_validator), +] + +ListFoldersContinueArg._cursor_validator = bv.String() +ListFoldersContinueArg._all_field_names_ = set(['cursor']) +ListFoldersContinueArg._all_fields_ = [('cursor', ListFoldersContinueArg._cursor_validator)] + +ListFoldersContinueError._invalid_cursor_validator = bv.Void() +ListFoldersContinueError._other_validator = bv.Void() +ListFoldersContinueError._tagmap = { + 'invalid_cursor': ListFoldersContinueError._invalid_cursor_validator, + 'other': ListFoldersContinueError._other_validator, +} + +ListFoldersContinueError.invalid_cursor = ListFoldersContinueError('invalid_cursor') +ListFoldersContinueError.other = ListFoldersContinueError('other') + +ListFoldersResult._entries_validator = bv.List(SharedFolderMetadata_validator) +ListFoldersResult._cursor_validator = bv.Nullable(bv.String()) +ListFoldersResult._all_field_names_ = set([ + 'entries', + 'cursor', +]) +ListFoldersResult._all_fields_ = [ + ('entries', ListFoldersResult._entries_validator), + ('cursor', ListFoldersResult._cursor_validator), +] + +ListSharedLinksArg._path_validator = bv.Nullable(ReadPath_validator) +ListSharedLinksArg._cursor_validator = bv.Nullable(bv.String()) +ListSharedLinksArg._direct_only_validator = bv.Nullable(bv.Boolean()) +ListSharedLinksArg._all_field_names_ = set([ + 'path', + 'cursor', + 'direct_only', +]) +ListSharedLinksArg._all_fields_ = [ + ('path', ListSharedLinksArg._path_validator), + ('cursor', ListSharedLinksArg._cursor_validator), + ('direct_only', ListSharedLinksArg._direct_only_validator), +] + +ListSharedLinksError._path_validator = files.LookupError_validator +ListSharedLinksError._reset_validator = bv.Void() +ListSharedLinksError._other_validator = bv.Void() +ListSharedLinksError._tagmap = { + 'path': ListSharedLinksError._path_validator, + 'reset': ListSharedLinksError._reset_validator, + 'other': ListSharedLinksError._other_validator, +} + +ListSharedLinksError.reset = ListSharedLinksError('reset') +ListSharedLinksError.other = ListSharedLinksError('other') + +ListSharedLinksResult._links_validator = bv.List(SharedLinkMetadata_validator) +ListSharedLinksResult._has_more_validator = bv.Boolean() +ListSharedLinksResult._cursor_validator = bv.Nullable(bv.String()) +ListSharedLinksResult._all_field_names_ = set([ + 'links', + 'has_more', + 'cursor', +]) +ListSharedLinksResult._all_fields_ = [ + ('links', ListSharedLinksResult._links_validator), + ('has_more', ListSharedLinksResult._has_more_validator), + ('cursor', ListSharedLinksResult._cursor_validator), +] + +MemberAccessLevelResult._access_level_validator = bv.Nullable(AccessLevel_validator) +MemberAccessLevelResult._warning_validator = bv.Nullable(bv.String()) +MemberAccessLevelResult._access_details_validator = bv.Nullable(bv.List(ParentFolderAccessInfo_validator)) +MemberAccessLevelResult._all_field_names_ = set([ + 'access_level', + 'warning', + 'access_details', +]) +MemberAccessLevelResult._all_fields_ = [ + ('access_level', MemberAccessLevelResult._access_level_validator), + ('warning', MemberAccessLevelResult._warning_validator), + ('access_details', MemberAccessLevelResult._access_details_validator), +] + +MemberAction._leave_a_copy_validator = bv.Void() +MemberAction._make_editor_validator = bv.Void() +MemberAction._make_owner_validator = bv.Void() +MemberAction._make_viewer_validator = bv.Void() +MemberAction._make_viewer_no_comment_validator = bv.Void() +MemberAction._remove_validator = bv.Void() +MemberAction._other_validator = bv.Void() +MemberAction._tagmap = { + 'leave_a_copy': MemberAction._leave_a_copy_validator, + 'make_editor': MemberAction._make_editor_validator, + 'make_owner': MemberAction._make_owner_validator, + 'make_viewer': MemberAction._make_viewer_validator, + 'make_viewer_no_comment': MemberAction._make_viewer_no_comment_validator, + 'remove': MemberAction._remove_validator, + 'other': MemberAction._other_validator, +} + +MemberAction.leave_a_copy = MemberAction('leave_a_copy') +MemberAction.make_editor = MemberAction('make_editor') +MemberAction.make_owner = MemberAction('make_owner') +MemberAction.make_viewer = MemberAction('make_viewer') +MemberAction.make_viewer_no_comment = MemberAction('make_viewer_no_comment') +MemberAction.remove = MemberAction('remove') +MemberAction.other = MemberAction('other') + +MemberPermission._action_validator = MemberAction_validator +MemberPermission._allow_validator = bv.Boolean() +MemberPermission._reason_validator = bv.Nullable(PermissionDeniedReason_validator) +MemberPermission._all_field_names_ = set([ + 'action', + 'allow', + 'reason', +]) +MemberPermission._all_fields_ = [ + ('action', MemberPermission._action_validator), + ('allow', MemberPermission._allow_validator), + ('reason', MemberPermission._reason_validator), +] + +MemberPolicy._team_validator = bv.Void() +MemberPolicy._anyone_validator = bv.Void() +MemberPolicy._other_validator = bv.Void() +MemberPolicy._tagmap = { + 'team': MemberPolicy._team_validator, + 'anyone': MemberPolicy._anyone_validator, + 'other': MemberPolicy._other_validator, +} + +MemberPolicy.team = MemberPolicy('team') +MemberPolicy.anyone = MemberPolicy('anyone') +MemberPolicy.other = MemberPolicy('other') + +MemberSelector._dropbox_id_validator = DropboxId_validator +MemberSelector._email_validator = common.EmailAddress_validator +MemberSelector._other_validator = bv.Void() +MemberSelector._tagmap = { + 'dropbox_id': MemberSelector._dropbox_id_validator, + 'email': MemberSelector._email_validator, + 'other': MemberSelector._other_validator, +} + +MemberSelector.other = MemberSelector('other') + +ModifySharedLinkSettingsArgs._url_validator = bv.String() +ModifySharedLinkSettingsArgs._settings_validator = SharedLinkSettings_validator +ModifySharedLinkSettingsArgs._remove_expiration_validator = bv.Boolean() +ModifySharedLinkSettingsArgs._all_field_names_ = set([ + 'url', + 'settings', + 'remove_expiration', +]) +ModifySharedLinkSettingsArgs._all_fields_ = [ + ('url', ModifySharedLinkSettingsArgs._url_validator), + ('settings', ModifySharedLinkSettingsArgs._settings_validator), + ('remove_expiration', ModifySharedLinkSettingsArgs._remove_expiration_validator), +] + +ModifySharedLinkSettingsError._settings_error_validator = SharedLinkSettingsError_validator +ModifySharedLinkSettingsError._email_not_verified_validator = bv.Void() +ModifySharedLinkSettingsError._tagmap = { + 'settings_error': ModifySharedLinkSettingsError._settings_error_validator, + 'email_not_verified': ModifySharedLinkSettingsError._email_not_verified_validator, +} +ModifySharedLinkSettingsError._tagmap.update(SharedLinkError._tagmap) + +ModifySharedLinkSettingsError.email_not_verified = ModifySharedLinkSettingsError('email_not_verified') + +MountFolderArg._shared_folder_id_validator = common.SharedFolderId_validator +MountFolderArg._all_field_names_ = set(['shared_folder_id']) +MountFolderArg._all_fields_ = [('shared_folder_id', MountFolderArg._shared_folder_id_validator)] + +MountFolderError._access_error_validator = SharedFolderAccessError_validator +MountFolderError._inside_shared_folder_validator = bv.Void() +MountFolderError._insufficient_quota_validator = InsufficientQuotaAmounts_validator +MountFolderError._already_mounted_validator = bv.Void() +MountFolderError._no_permission_validator = bv.Void() +MountFolderError._not_mountable_validator = bv.Void() +MountFolderError._other_validator = bv.Void() +MountFolderError._tagmap = { + 'access_error': MountFolderError._access_error_validator, + 'inside_shared_folder': MountFolderError._inside_shared_folder_validator, + 'insufficient_quota': MountFolderError._insufficient_quota_validator, + 'already_mounted': MountFolderError._already_mounted_validator, + 'no_permission': MountFolderError._no_permission_validator, + 'not_mountable': MountFolderError._not_mountable_validator, + 'other': MountFolderError._other_validator, +} + +MountFolderError.inside_shared_folder = MountFolderError('inside_shared_folder') +MountFolderError.already_mounted = MountFolderError('already_mounted') +MountFolderError.no_permission = MountFolderError('no_permission') +MountFolderError.not_mountable = MountFolderError('not_mountable') +MountFolderError.other = MountFolderError('other') + +ParentFolderAccessInfo._folder_name_validator = bv.String() +ParentFolderAccessInfo._shared_folder_id_validator = common.SharedFolderId_validator +ParentFolderAccessInfo._permissions_validator = bv.List(MemberPermission_validator) +ParentFolderAccessInfo._path_validator = bv.String() +ParentFolderAccessInfo._all_field_names_ = set([ + 'folder_name', + 'shared_folder_id', + 'permissions', + 'path', +]) +ParentFolderAccessInfo._all_fields_ = [ + ('folder_name', ParentFolderAccessInfo._folder_name_validator), + ('shared_folder_id', ParentFolderAccessInfo._shared_folder_id_validator), + ('permissions', ParentFolderAccessInfo._permissions_validator), + ('path', ParentFolderAccessInfo._path_validator), +] + +PathLinkMetadata._path_validator = bv.String() +PathLinkMetadata._field_names_ = set(['path']) +PathLinkMetadata._all_field_names_ = LinkMetadata._all_field_names_.union(PathLinkMetadata._field_names_) +PathLinkMetadata._fields_ = [('path', PathLinkMetadata._path_validator)] +PathLinkMetadata._all_fields_ = LinkMetadata._all_fields_ + PathLinkMetadata._fields_ + +PendingUploadMode._file_validator = bv.Void() +PendingUploadMode._folder_validator = bv.Void() +PendingUploadMode._tagmap = { + 'file': PendingUploadMode._file_validator, + 'folder': PendingUploadMode._folder_validator, +} + +PendingUploadMode.file = PendingUploadMode('file') +PendingUploadMode.folder = PendingUploadMode('folder') + +PermissionDeniedReason._user_not_same_team_as_owner_validator = bv.Void() +PermissionDeniedReason._user_not_allowed_by_owner_validator = bv.Void() +PermissionDeniedReason._target_is_indirect_member_validator = bv.Void() +PermissionDeniedReason._target_is_owner_validator = bv.Void() +PermissionDeniedReason._target_is_self_validator = bv.Void() +PermissionDeniedReason._target_not_active_validator = bv.Void() +PermissionDeniedReason._folder_is_limited_team_folder_validator = bv.Void() +PermissionDeniedReason._owner_not_on_team_validator = bv.Void() +PermissionDeniedReason._permission_denied_validator = bv.Void() +PermissionDeniedReason._restricted_by_team_validator = bv.Void() +PermissionDeniedReason._user_account_type_validator = bv.Void() +PermissionDeniedReason._user_not_on_team_validator = bv.Void() +PermissionDeniedReason._folder_is_inside_shared_folder_validator = bv.Void() +PermissionDeniedReason._restricted_by_parent_folder_validator = bv.Void() +PermissionDeniedReason._insufficient_plan_validator = InsufficientPlan_validator +PermissionDeniedReason._other_validator = bv.Void() +PermissionDeniedReason._tagmap = { + 'user_not_same_team_as_owner': PermissionDeniedReason._user_not_same_team_as_owner_validator, + 'user_not_allowed_by_owner': PermissionDeniedReason._user_not_allowed_by_owner_validator, + 'target_is_indirect_member': PermissionDeniedReason._target_is_indirect_member_validator, + 'target_is_owner': PermissionDeniedReason._target_is_owner_validator, + 'target_is_self': PermissionDeniedReason._target_is_self_validator, + 'target_not_active': PermissionDeniedReason._target_not_active_validator, + 'folder_is_limited_team_folder': PermissionDeniedReason._folder_is_limited_team_folder_validator, + 'owner_not_on_team': PermissionDeniedReason._owner_not_on_team_validator, + 'permission_denied': PermissionDeniedReason._permission_denied_validator, + 'restricted_by_team': PermissionDeniedReason._restricted_by_team_validator, + 'user_account_type': PermissionDeniedReason._user_account_type_validator, + 'user_not_on_team': PermissionDeniedReason._user_not_on_team_validator, + 'folder_is_inside_shared_folder': PermissionDeniedReason._folder_is_inside_shared_folder_validator, + 'restricted_by_parent_folder': PermissionDeniedReason._restricted_by_parent_folder_validator, + 'insufficient_plan': PermissionDeniedReason._insufficient_plan_validator, + 'other': PermissionDeniedReason._other_validator, +} + +PermissionDeniedReason.user_not_same_team_as_owner = PermissionDeniedReason('user_not_same_team_as_owner') +PermissionDeniedReason.user_not_allowed_by_owner = PermissionDeniedReason('user_not_allowed_by_owner') +PermissionDeniedReason.target_is_indirect_member = PermissionDeniedReason('target_is_indirect_member') +PermissionDeniedReason.target_is_owner = PermissionDeniedReason('target_is_owner') +PermissionDeniedReason.target_is_self = PermissionDeniedReason('target_is_self') +PermissionDeniedReason.target_not_active = PermissionDeniedReason('target_not_active') +PermissionDeniedReason.folder_is_limited_team_folder = PermissionDeniedReason('folder_is_limited_team_folder') +PermissionDeniedReason.owner_not_on_team = PermissionDeniedReason('owner_not_on_team') +PermissionDeniedReason.permission_denied = PermissionDeniedReason('permission_denied') +PermissionDeniedReason.restricted_by_team = PermissionDeniedReason('restricted_by_team') +PermissionDeniedReason.user_account_type = PermissionDeniedReason('user_account_type') +PermissionDeniedReason.user_not_on_team = PermissionDeniedReason('user_not_on_team') +PermissionDeniedReason.folder_is_inside_shared_folder = PermissionDeniedReason('folder_is_inside_shared_folder') +PermissionDeniedReason.restricted_by_parent_folder = PermissionDeniedReason('restricted_by_parent_folder') +PermissionDeniedReason.other = PermissionDeniedReason('other') + +RelinquishFileMembershipArg._file_validator = PathOrId_validator +RelinquishFileMembershipArg._all_field_names_ = set(['file']) +RelinquishFileMembershipArg._all_fields_ = [('file', RelinquishFileMembershipArg._file_validator)] + +RelinquishFileMembershipError._access_error_validator = SharingFileAccessError_validator +RelinquishFileMembershipError._group_access_validator = bv.Void() +RelinquishFileMembershipError._no_permission_validator = bv.Void() +RelinquishFileMembershipError._other_validator = bv.Void() +RelinquishFileMembershipError._tagmap = { + 'access_error': RelinquishFileMembershipError._access_error_validator, + 'group_access': RelinquishFileMembershipError._group_access_validator, + 'no_permission': RelinquishFileMembershipError._no_permission_validator, + 'other': RelinquishFileMembershipError._other_validator, +} + +RelinquishFileMembershipError.group_access = RelinquishFileMembershipError('group_access') +RelinquishFileMembershipError.no_permission = RelinquishFileMembershipError('no_permission') +RelinquishFileMembershipError.other = RelinquishFileMembershipError('other') + +RelinquishFolderMembershipArg._shared_folder_id_validator = common.SharedFolderId_validator +RelinquishFolderMembershipArg._leave_a_copy_validator = bv.Boolean() +RelinquishFolderMembershipArg._all_field_names_ = set([ + 'shared_folder_id', + 'leave_a_copy', +]) +RelinquishFolderMembershipArg._all_fields_ = [ + ('shared_folder_id', RelinquishFolderMembershipArg._shared_folder_id_validator), + ('leave_a_copy', RelinquishFolderMembershipArg._leave_a_copy_validator), +] + +RelinquishFolderMembershipError._access_error_validator = SharedFolderAccessError_validator +RelinquishFolderMembershipError._folder_owner_validator = bv.Void() +RelinquishFolderMembershipError._mounted_validator = bv.Void() +RelinquishFolderMembershipError._group_access_validator = bv.Void() +RelinquishFolderMembershipError._team_folder_validator = bv.Void() +RelinquishFolderMembershipError._no_permission_validator = bv.Void() +RelinquishFolderMembershipError._no_explicit_access_validator = bv.Void() +RelinquishFolderMembershipError._other_validator = bv.Void() +RelinquishFolderMembershipError._tagmap = { + 'access_error': RelinquishFolderMembershipError._access_error_validator, + 'folder_owner': RelinquishFolderMembershipError._folder_owner_validator, + 'mounted': RelinquishFolderMembershipError._mounted_validator, + 'group_access': RelinquishFolderMembershipError._group_access_validator, + 'team_folder': RelinquishFolderMembershipError._team_folder_validator, + 'no_permission': RelinquishFolderMembershipError._no_permission_validator, + 'no_explicit_access': RelinquishFolderMembershipError._no_explicit_access_validator, + 'other': RelinquishFolderMembershipError._other_validator, +} + +RelinquishFolderMembershipError.folder_owner = RelinquishFolderMembershipError('folder_owner') +RelinquishFolderMembershipError.mounted = RelinquishFolderMembershipError('mounted') +RelinquishFolderMembershipError.group_access = RelinquishFolderMembershipError('group_access') +RelinquishFolderMembershipError.team_folder = RelinquishFolderMembershipError('team_folder') +RelinquishFolderMembershipError.no_permission = RelinquishFolderMembershipError('no_permission') +RelinquishFolderMembershipError.no_explicit_access = RelinquishFolderMembershipError('no_explicit_access') +RelinquishFolderMembershipError.other = RelinquishFolderMembershipError('other') + +RemoveFileMemberArg._file_validator = PathOrId_validator +RemoveFileMemberArg._member_validator = MemberSelector_validator +RemoveFileMemberArg._all_field_names_ = set([ + 'file', + 'member', +]) +RemoveFileMemberArg._all_fields_ = [ + ('file', RemoveFileMemberArg._file_validator), + ('member', RemoveFileMemberArg._member_validator), +] + +RemoveFileMemberError._user_error_validator = SharingUserError_validator +RemoveFileMemberError._access_error_validator = SharingFileAccessError_validator +RemoveFileMemberError._no_explicit_access_validator = MemberAccessLevelResult_validator +RemoveFileMemberError._other_validator = bv.Void() +RemoveFileMemberError._tagmap = { + 'user_error': RemoveFileMemberError._user_error_validator, + 'access_error': RemoveFileMemberError._access_error_validator, + 'no_explicit_access': RemoveFileMemberError._no_explicit_access_validator, + 'other': RemoveFileMemberError._other_validator, +} + +RemoveFileMemberError.other = RemoveFileMemberError('other') + +RemoveFolderMemberArg._shared_folder_id_validator = common.SharedFolderId_validator +RemoveFolderMemberArg._member_validator = MemberSelector_validator +RemoveFolderMemberArg._leave_a_copy_validator = bv.Boolean() +RemoveFolderMemberArg._all_field_names_ = set([ + 'shared_folder_id', + 'member', + 'leave_a_copy', +]) +RemoveFolderMemberArg._all_fields_ = [ + ('shared_folder_id', RemoveFolderMemberArg._shared_folder_id_validator), + ('member', RemoveFolderMemberArg._member_validator), + ('leave_a_copy', RemoveFolderMemberArg._leave_a_copy_validator), +] + +RemoveFolderMemberError._access_error_validator = SharedFolderAccessError_validator +RemoveFolderMemberError._member_error_validator = SharedFolderMemberError_validator +RemoveFolderMemberError._folder_owner_validator = bv.Void() +RemoveFolderMemberError._group_access_validator = bv.Void() +RemoveFolderMemberError._team_folder_validator = bv.Void() +RemoveFolderMemberError._no_permission_validator = bv.Void() +RemoveFolderMemberError._too_many_files_validator = bv.Void() +RemoveFolderMemberError._other_validator = bv.Void() +RemoveFolderMemberError._tagmap = { + 'access_error': RemoveFolderMemberError._access_error_validator, + 'member_error': RemoveFolderMemberError._member_error_validator, + 'folder_owner': RemoveFolderMemberError._folder_owner_validator, + 'group_access': RemoveFolderMemberError._group_access_validator, + 'team_folder': RemoveFolderMemberError._team_folder_validator, + 'no_permission': RemoveFolderMemberError._no_permission_validator, + 'too_many_files': RemoveFolderMemberError._too_many_files_validator, + 'other': RemoveFolderMemberError._other_validator, +} + +RemoveFolderMemberError.folder_owner = RemoveFolderMemberError('folder_owner') +RemoveFolderMemberError.group_access = RemoveFolderMemberError('group_access') +RemoveFolderMemberError.team_folder = RemoveFolderMemberError('team_folder') +RemoveFolderMemberError.no_permission = RemoveFolderMemberError('no_permission') +RemoveFolderMemberError.too_many_files = RemoveFolderMemberError('too_many_files') +RemoveFolderMemberError.other = RemoveFolderMemberError('other') + +RemoveMemberJobStatus._complete_validator = MemberAccessLevelResult_validator +RemoveMemberJobStatus._failed_validator = RemoveFolderMemberError_validator +RemoveMemberJobStatus._tagmap = { + 'complete': RemoveMemberJobStatus._complete_validator, + 'failed': RemoveMemberJobStatus._failed_validator, +} +RemoveMemberJobStatus._tagmap.update(async_.PollResultBase._tagmap) + +RequestedVisibility._public_validator = bv.Void() +RequestedVisibility._team_only_validator = bv.Void() +RequestedVisibility._password_validator = bv.Void() +RequestedVisibility._tagmap = { + 'public': RequestedVisibility._public_validator, + 'team_only': RequestedVisibility._team_only_validator, + 'password': RequestedVisibility._password_validator, +} + +RequestedVisibility.public = RequestedVisibility('public') +RequestedVisibility.team_only = RequestedVisibility('team_only') +RequestedVisibility.password = RequestedVisibility('password') + +ResolvedVisibility._team_and_password_validator = bv.Void() +ResolvedVisibility._shared_folder_only_validator = bv.Void() +ResolvedVisibility._other_validator = bv.Void() +ResolvedVisibility._tagmap = { + 'team_and_password': ResolvedVisibility._team_and_password_validator, + 'shared_folder_only': ResolvedVisibility._shared_folder_only_validator, + 'other': ResolvedVisibility._other_validator, +} +ResolvedVisibility._tagmap.update(RequestedVisibility._tagmap) + +ResolvedVisibility.team_and_password = ResolvedVisibility('team_and_password') +ResolvedVisibility.shared_folder_only = ResolvedVisibility('shared_folder_only') +ResolvedVisibility.other = ResolvedVisibility('other') + +RevokeSharedLinkArg._url_validator = bv.String() +RevokeSharedLinkArg._all_field_names_ = set(['url']) +RevokeSharedLinkArg._all_fields_ = [('url', RevokeSharedLinkArg._url_validator)] + +RevokeSharedLinkError._shared_link_malformed_validator = bv.Void() +RevokeSharedLinkError._tagmap = { + 'shared_link_malformed': RevokeSharedLinkError._shared_link_malformed_validator, +} +RevokeSharedLinkError._tagmap.update(SharedLinkError._tagmap) + +RevokeSharedLinkError.shared_link_malformed = RevokeSharedLinkError('shared_link_malformed') + +SetAccessInheritanceArg._access_inheritance_validator = AccessInheritance_validator +SetAccessInheritanceArg._shared_folder_id_validator = common.SharedFolderId_validator +SetAccessInheritanceArg._all_field_names_ = set([ + 'access_inheritance', + 'shared_folder_id', +]) +SetAccessInheritanceArg._all_fields_ = [ + ('access_inheritance', SetAccessInheritanceArg._access_inheritance_validator), + ('shared_folder_id', SetAccessInheritanceArg._shared_folder_id_validator), +] + +SetAccessInheritanceError._access_error_validator = SharedFolderAccessError_validator +SetAccessInheritanceError._no_permission_validator = bv.Void() +SetAccessInheritanceError._other_validator = bv.Void() +SetAccessInheritanceError._tagmap = { + 'access_error': SetAccessInheritanceError._access_error_validator, + 'no_permission': SetAccessInheritanceError._no_permission_validator, + 'other': SetAccessInheritanceError._other_validator, +} + +SetAccessInheritanceError.no_permission = SetAccessInheritanceError('no_permission') +SetAccessInheritanceError.other = SetAccessInheritanceError('other') + +ShareFolderArgBase._acl_update_policy_validator = bv.Nullable(AclUpdatePolicy_validator) +ShareFolderArgBase._force_async_validator = bv.Boolean() +ShareFolderArgBase._member_policy_validator = bv.Nullable(MemberPolicy_validator) +ShareFolderArgBase._path_validator = files.WritePath_validator +ShareFolderArgBase._shared_link_policy_validator = bv.Nullable(SharedLinkPolicy_validator) +ShareFolderArgBase._viewer_info_policy_validator = bv.Nullable(ViewerInfoPolicy_validator) +ShareFolderArgBase._access_inheritance_validator = AccessInheritance_validator +ShareFolderArgBase._all_field_names_ = set([ + 'acl_update_policy', + 'force_async', + 'member_policy', + 'path', + 'shared_link_policy', + 'viewer_info_policy', + 'access_inheritance', +]) +ShareFolderArgBase._all_fields_ = [ + ('acl_update_policy', ShareFolderArgBase._acl_update_policy_validator), + ('force_async', ShareFolderArgBase._force_async_validator), + ('member_policy', ShareFolderArgBase._member_policy_validator), + ('path', ShareFolderArgBase._path_validator), + ('shared_link_policy', ShareFolderArgBase._shared_link_policy_validator), + ('viewer_info_policy', ShareFolderArgBase._viewer_info_policy_validator), + ('access_inheritance', ShareFolderArgBase._access_inheritance_validator), +] + +ShareFolderArg._actions_validator = bv.Nullable(bv.List(FolderAction_validator)) +ShareFolderArg._link_settings_validator = bv.Nullable(LinkSettings_validator) +ShareFolderArg._all_field_names_ = ShareFolderArgBase._all_field_names_.union(set([ + 'actions', + 'link_settings', +])) +ShareFolderArg._all_fields_ = ShareFolderArgBase._all_fields_ + [ + ('actions', ShareFolderArg._actions_validator), + ('link_settings', ShareFolderArg._link_settings_validator), +] + +ShareFolderErrorBase._email_unverified_validator = bv.Void() +ShareFolderErrorBase._bad_path_validator = SharePathError_validator +ShareFolderErrorBase._team_policy_disallows_member_policy_validator = bv.Void() +ShareFolderErrorBase._disallowed_shared_link_policy_validator = bv.Void() +ShareFolderErrorBase._other_validator = bv.Void() +ShareFolderErrorBase._tagmap = { + 'email_unverified': ShareFolderErrorBase._email_unverified_validator, + 'bad_path': ShareFolderErrorBase._bad_path_validator, + 'team_policy_disallows_member_policy': ShareFolderErrorBase._team_policy_disallows_member_policy_validator, + 'disallowed_shared_link_policy': ShareFolderErrorBase._disallowed_shared_link_policy_validator, + 'other': ShareFolderErrorBase._other_validator, +} + +ShareFolderErrorBase.email_unverified = ShareFolderErrorBase('email_unverified') +ShareFolderErrorBase.team_policy_disallows_member_policy = ShareFolderErrorBase('team_policy_disallows_member_policy') +ShareFolderErrorBase.disallowed_shared_link_policy = ShareFolderErrorBase('disallowed_shared_link_policy') +ShareFolderErrorBase.other = ShareFolderErrorBase('other') + +ShareFolderError._no_permission_validator = bv.Void() +ShareFolderError._tagmap = { + 'no_permission': ShareFolderError._no_permission_validator, +} +ShareFolderError._tagmap.update(ShareFolderErrorBase._tagmap) + +ShareFolderError.no_permission = ShareFolderError('no_permission') + +ShareFolderJobStatus._complete_validator = SharedFolderMetadata_validator +ShareFolderJobStatus._failed_validator = ShareFolderError_validator +ShareFolderJobStatus._tagmap = { + 'complete': ShareFolderJobStatus._complete_validator, + 'failed': ShareFolderJobStatus._failed_validator, +} +ShareFolderJobStatus._tagmap.update(async_.PollResultBase._tagmap) + +ShareFolderLaunch._complete_validator = SharedFolderMetadata_validator +ShareFolderLaunch._tagmap = { + 'complete': ShareFolderLaunch._complete_validator, +} +ShareFolderLaunch._tagmap.update(async_.LaunchResultBase._tagmap) + +SharePathError._is_file_validator = bv.Void() +SharePathError._inside_shared_folder_validator = bv.Void() +SharePathError._contains_shared_folder_validator = bv.Void() +SharePathError._contains_app_folder_validator = bv.Void() +SharePathError._contains_team_folder_validator = bv.Void() +SharePathError._is_app_folder_validator = bv.Void() +SharePathError._inside_app_folder_validator = bv.Void() +SharePathError._is_public_folder_validator = bv.Void() +SharePathError._inside_public_folder_validator = bv.Void() +SharePathError._already_shared_validator = SharedFolderMetadata_validator +SharePathError._invalid_path_validator = bv.Void() +SharePathError._is_osx_package_validator = bv.Void() +SharePathError._inside_osx_package_validator = bv.Void() +SharePathError._other_validator = bv.Void() +SharePathError._tagmap = { + 'is_file': SharePathError._is_file_validator, + 'inside_shared_folder': SharePathError._inside_shared_folder_validator, + 'contains_shared_folder': SharePathError._contains_shared_folder_validator, + 'contains_app_folder': SharePathError._contains_app_folder_validator, + 'contains_team_folder': SharePathError._contains_team_folder_validator, + 'is_app_folder': SharePathError._is_app_folder_validator, + 'inside_app_folder': SharePathError._inside_app_folder_validator, + 'is_public_folder': SharePathError._is_public_folder_validator, + 'inside_public_folder': SharePathError._inside_public_folder_validator, + 'already_shared': SharePathError._already_shared_validator, + 'invalid_path': SharePathError._invalid_path_validator, + 'is_osx_package': SharePathError._is_osx_package_validator, + 'inside_osx_package': SharePathError._inside_osx_package_validator, + 'other': SharePathError._other_validator, +} + +SharePathError.is_file = SharePathError('is_file') +SharePathError.inside_shared_folder = SharePathError('inside_shared_folder') +SharePathError.contains_shared_folder = SharePathError('contains_shared_folder') +SharePathError.contains_app_folder = SharePathError('contains_app_folder') +SharePathError.contains_team_folder = SharePathError('contains_team_folder') +SharePathError.is_app_folder = SharePathError('is_app_folder') +SharePathError.inside_app_folder = SharePathError('inside_app_folder') +SharePathError.is_public_folder = SharePathError('is_public_folder') +SharePathError.inside_public_folder = SharePathError('inside_public_folder') +SharePathError.invalid_path = SharePathError('invalid_path') +SharePathError.is_osx_package = SharePathError('is_osx_package') +SharePathError.inside_osx_package = SharePathError('inside_osx_package') +SharePathError.other = SharePathError('other') + +SharedContentLinkMetadata._audience_exceptions_validator = bv.Nullable(AudienceExceptions_validator) +SharedContentLinkMetadata._url_validator = bv.String() +SharedContentLinkMetadata._all_field_names_ = SharedContentLinkMetadataBase._all_field_names_.union(set([ + 'audience_exceptions', + 'url', +])) +SharedContentLinkMetadata._all_fields_ = SharedContentLinkMetadataBase._all_fields_ + [ + ('audience_exceptions', SharedContentLinkMetadata._audience_exceptions_validator), + ('url', SharedContentLinkMetadata._url_validator), +] + +SharedFileMembers._users_validator = bv.List(UserFileMembershipInfo_validator) +SharedFileMembers._groups_validator = bv.List(GroupMembershipInfo_validator) +SharedFileMembers._invitees_validator = bv.List(InviteeMembershipInfo_validator) +SharedFileMembers._cursor_validator = bv.Nullable(bv.String()) +SharedFileMembers._all_field_names_ = set([ + 'users', + 'groups', + 'invitees', + 'cursor', +]) +SharedFileMembers._all_fields_ = [ + ('users', SharedFileMembers._users_validator), + ('groups', SharedFileMembers._groups_validator), + ('invitees', SharedFileMembers._invitees_validator), + ('cursor', SharedFileMembers._cursor_validator), +] + +SharedFileMetadata._access_type_validator = bv.Nullable(AccessLevel_validator) +SharedFileMetadata._id_validator = files.FileId_validator +SharedFileMetadata._expected_link_metadata_validator = bv.Nullable(ExpectedSharedContentLinkMetadata_validator) +SharedFileMetadata._link_metadata_validator = bv.Nullable(SharedContentLinkMetadata_validator) +SharedFileMetadata._name_validator = bv.String() +SharedFileMetadata._owner_display_names_validator = bv.Nullable(bv.List(bv.String())) +SharedFileMetadata._owner_team_validator = bv.Nullable(users.Team_validator) +SharedFileMetadata._parent_shared_folder_id_validator = bv.Nullable(common.SharedFolderId_validator) +SharedFileMetadata._path_display_validator = bv.Nullable(bv.String()) +SharedFileMetadata._path_lower_validator = bv.Nullable(bv.String()) +SharedFileMetadata._permissions_validator = bv.Nullable(bv.List(FilePermission_validator)) +SharedFileMetadata._policy_validator = FolderPolicy_validator +SharedFileMetadata._preview_url_validator = bv.String() +SharedFileMetadata._time_invited_validator = bv.Nullable(common.DropboxTimestamp_validator) +SharedFileMetadata._all_field_names_ = set([ + 'access_type', + 'id', + 'expected_link_metadata', + 'link_metadata', + 'name', + 'owner_display_names', + 'owner_team', + 'parent_shared_folder_id', + 'path_display', + 'path_lower', + 'permissions', + 'policy', + 'preview_url', + 'time_invited', +]) +SharedFileMetadata._all_fields_ = [ + ('access_type', SharedFileMetadata._access_type_validator), + ('id', SharedFileMetadata._id_validator), + ('expected_link_metadata', SharedFileMetadata._expected_link_metadata_validator), + ('link_metadata', SharedFileMetadata._link_metadata_validator), + ('name', SharedFileMetadata._name_validator), + ('owner_display_names', SharedFileMetadata._owner_display_names_validator), + ('owner_team', SharedFileMetadata._owner_team_validator), + ('parent_shared_folder_id', SharedFileMetadata._parent_shared_folder_id_validator), + ('path_display', SharedFileMetadata._path_display_validator), + ('path_lower', SharedFileMetadata._path_lower_validator), + ('permissions', SharedFileMetadata._permissions_validator), + ('policy', SharedFileMetadata._policy_validator), + ('preview_url', SharedFileMetadata._preview_url_validator), + ('time_invited', SharedFileMetadata._time_invited_validator), +] + +SharedFolderAccessError._invalid_id_validator = bv.Void() +SharedFolderAccessError._not_a_member_validator = bv.Void() +SharedFolderAccessError._email_unverified_validator = bv.Void() +SharedFolderAccessError._unmounted_validator = bv.Void() +SharedFolderAccessError._other_validator = bv.Void() +SharedFolderAccessError._tagmap = { + 'invalid_id': SharedFolderAccessError._invalid_id_validator, + 'not_a_member': SharedFolderAccessError._not_a_member_validator, + 'email_unverified': SharedFolderAccessError._email_unverified_validator, + 'unmounted': SharedFolderAccessError._unmounted_validator, + 'other': SharedFolderAccessError._other_validator, +} + +SharedFolderAccessError.invalid_id = SharedFolderAccessError('invalid_id') +SharedFolderAccessError.not_a_member = SharedFolderAccessError('not_a_member') +SharedFolderAccessError.email_unverified = SharedFolderAccessError('email_unverified') +SharedFolderAccessError.unmounted = SharedFolderAccessError('unmounted') +SharedFolderAccessError.other = SharedFolderAccessError('other') + +SharedFolderMemberError._invalid_dropbox_id_validator = bv.Void() +SharedFolderMemberError._not_a_member_validator = bv.Void() +SharedFolderMemberError._no_explicit_access_validator = MemberAccessLevelResult_validator +SharedFolderMemberError._other_validator = bv.Void() +SharedFolderMemberError._tagmap = { + 'invalid_dropbox_id': SharedFolderMemberError._invalid_dropbox_id_validator, + 'not_a_member': SharedFolderMemberError._not_a_member_validator, + 'no_explicit_access': SharedFolderMemberError._no_explicit_access_validator, + 'other': SharedFolderMemberError._other_validator, +} + +SharedFolderMemberError.invalid_dropbox_id = SharedFolderMemberError('invalid_dropbox_id') +SharedFolderMemberError.not_a_member = SharedFolderMemberError('not_a_member') +SharedFolderMemberError.other = SharedFolderMemberError('other') + +SharedFolderMembers._users_validator = bv.List(UserMembershipInfo_validator) +SharedFolderMembers._groups_validator = bv.List(GroupMembershipInfo_validator) +SharedFolderMembers._invitees_validator = bv.List(InviteeMembershipInfo_validator) +SharedFolderMembers._cursor_validator = bv.Nullable(bv.String()) +SharedFolderMembers._all_field_names_ = set([ + 'users', + 'groups', + 'invitees', + 'cursor', +]) +SharedFolderMembers._all_fields_ = [ + ('users', SharedFolderMembers._users_validator), + ('groups', SharedFolderMembers._groups_validator), + ('invitees', SharedFolderMembers._invitees_validator), + ('cursor', SharedFolderMembers._cursor_validator), +] + +SharedFolderMetadataBase._access_type_validator = AccessLevel_validator +SharedFolderMetadataBase._is_inside_team_folder_validator = bv.Boolean() +SharedFolderMetadataBase._is_team_folder_validator = bv.Boolean() +SharedFolderMetadataBase._owner_display_names_validator = bv.Nullable(bv.List(bv.String())) +SharedFolderMetadataBase._owner_team_validator = bv.Nullable(users.Team_validator) +SharedFolderMetadataBase._parent_shared_folder_id_validator = bv.Nullable(common.SharedFolderId_validator) +SharedFolderMetadataBase._path_lower_validator = bv.Nullable(bv.String()) +SharedFolderMetadataBase._all_field_names_ = set([ + 'access_type', + 'is_inside_team_folder', + 'is_team_folder', + 'owner_display_names', + 'owner_team', + 'parent_shared_folder_id', + 'path_lower', +]) +SharedFolderMetadataBase._all_fields_ = [ + ('access_type', SharedFolderMetadataBase._access_type_validator), + ('is_inside_team_folder', SharedFolderMetadataBase._is_inside_team_folder_validator), + ('is_team_folder', SharedFolderMetadataBase._is_team_folder_validator), + ('owner_display_names', SharedFolderMetadataBase._owner_display_names_validator), + ('owner_team', SharedFolderMetadataBase._owner_team_validator), + ('parent_shared_folder_id', SharedFolderMetadataBase._parent_shared_folder_id_validator), + ('path_lower', SharedFolderMetadataBase._path_lower_validator), +] + +SharedFolderMetadata._link_metadata_validator = bv.Nullable(SharedContentLinkMetadata_validator) +SharedFolderMetadata._name_validator = bv.String() +SharedFolderMetadata._permissions_validator = bv.Nullable(bv.List(FolderPermission_validator)) +SharedFolderMetadata._policy_validator = FolderPolicy_validator +SharedFolderMetadata._preview_url_validator = bv.String() +SharedFolderMetadata._shared_folder_id_validator = common.SharedFolderId_validator +SharedFolderMetadata._time_invited_validator = common.DropboxTimestamp_validator +SharedFolderMetadata._access_inheritance_validator = AccessInheritance_validator +SharedFolderMetadata._all_field_names_ = SharedFolderMetadataBase._all_field_names_.union(set([ + 'link_metadata', + 'name', + 'permissions', + 'policy', + 'preview_url', + 'shared_folder_id', + 'time_invited', + 'access_inheritance', +])) +SharedFolderMetadata._all_fields_ = SharedFolderMetadataBase._all_fields_ + [ + ('link_metadata', SharedFolderMetadata._link_metadata_validator), + ('name', SharedFolderMetadata._name_validator), + ('permissions', SharedFolderMetadata._permissions_validator), + ('policy', SharedFolderMetadata._policy_validator), + ('preview_url', SharedFolderMetadata._preview_url_validator), + ('shared_folder_id', SharedFolderMetadata._shared_folder_id_validator), + ('time_invited', SharedFolderMetadata._time_invited_validator), + ('access_inheritance', SharedFolderMetadata._access_inheritance_validator), +] + +SharedLinkAccessFailureReason._login_required_validator = bv.Void() +SharedLinkAccessFailureReason._email_verify_required_validator = bv.Void() +SharedLinkAccessFailureReason._password_required_validator = bv.Void() +SharedLinkAccessFailureReason._team_only_validator = bv.Void() +SharedLinkAccessFailureReason._owner_only_validator = bv.Void() +SharedLinkAccessFailureReason._other_validator = bv.Void() +SharedLinkAccessFailureReason._tagmap = { + 'login_required': SharedLinkAccessFailureReason._login_required_validator, + 'email_verify_required': SharedLinkAccessFailureReason._email_verify_required_validator, + 'password_required': SharedLinkAccessFailureReason._password_required_validator, + 'team_only': SharedLinkAccessFailureReason._team_only_validator, + 'owner_only': SharedLinkAccessFailureReason._owner_only_validator, + 'other': SharedLinkAccessFailureReason._other_validator, +} + +SharedLinkAccessFailureReason.login_required = SharedLinkAccessFailureReason('login_required') +SharedLinkAccessFailureReason.email_verify_required = SharedLinkAccessFailureReason('email_verify_required') +SharedLinkAccessFailureReason.password_required = SharedLinkAccessFailureReason('password_required') +SharedLinkAccessFailureReason.team_only = SharedLinkAccessFailureReason('team_only') +SharedLinkAccessFailureReason.owner_only = SharedLinkAccessFailureReason('owner_only') +SharedLinkAccessFailureReason.other = SharedLinkAccessFailureReason('other') + +SharedLinkPolicy._anyone_validator = bv.Void() +SharedLinkPolicy._team_validator = bv.Void() +SharedLinkPolicy._members_validator = bv.Void() +SharedLinkPolicy._other_validator = bv.Void() +SharedLinkPolicy._tagmap = { + 'anyone': SharedLinkPolicy._anyone_validator, + 'team': SharedLinkPolicy._team_validator, + 'members': SharedLinkPolicy._members_validator, + 'other': SharedLinkPolicy._other_validator, +} + +SharedLinkPolicy.anyone = SharedLinkPolicy('anyone') +SharedLinkPolicy.team = SharedLinkPolicy('team') +SharedLinkPolicy.members = SharedLinkPolicy('members') +SharedLinkPolicy.other = SharedLinkPolicy('other') + +SharedLinkSettings._requested_visibility_validator = bv.Nullable(RequestedVisibility_validator) +SharedLinkSettings._link_password_validator = bv.Nullable(bv.String()) +SharedLinkSettings._expires_validator = bv.Nullable(common.DropboxTimestamp_validator) +SharedLinkSettings._all_field_names_ = set([ + 'requested_visibility', + 'link_password', + 'expires', +]) +SharedLinkSettings._all_fields_ = [ + ('requested_visibility', SharedLinkSettings._requested_visibility_validator), + ('link_password', SharedLinkSettings._link_password_validator), + ('expires', SharedLinkSettings._expires_validator), +] + +SharedLinkSettingsError._invalid_settings_validator = bv.Void() +SharedLinkSettingsError._not_authorized_validator = bv.Void() +SharedLinkSettingsError._tagmap = { + 'invalid_settings': SharedLinkSettingsError._invalid_settings_validator, + 'not_authorized': SharedLinkSettingsError._not_authorized_validator, +} + +SharedLinkSettingsError.invalid_settings = SharedLinkSettingsError('invalid_settings') +SharedLinkSettingsError.not_authorized = SharedLinkSettingsError('not_authorized') + +SharingFileAccessError._no_permission_validator = bv.Void() +SharingFileAccessError._invalid_file_validator = bv.Void() +SharingFileAccessError._is_folder_validator = bv.Void() +SharingFileAccessError._inside_public_folder_validator = bv.Void() +SharingFileAccessError._inside_osx_package_validator = bv.Void() +SharingFileAccessError._other_validator = bv.Void() +SharingFileAccessError._tagmap = { + 'no_permission': SharingFileAccessError._no_permission_validator, + 'invalid_file': SharingFileAccessError._invalid_file_validator, + 'is_folder': SharingFileAccessError._is_folder_validator, + 'inside_public_folder': SharingFileAccessError._inside_public_folder_validator, + 'inside_osx_package': SharingFileAccessError._inside_osx_package_validator, + 'other': SharingFileAccessError._other_validator, +} + +SharingFileAccessError.no_permission = SharingFileAccessError('no_permission') +SharingFileAccessError.invalid_file = SharingFileAccessError('invalid_file') +SharingFileAccessError.is_folder = SharingFileAccessError('is_folder') +SharingFileAccessError.inside_public_folder = SharingFileAccessError('inside_public_folder') +SharingFileAccessError.inside_osx_package = SharingFileAccessError('inside_osx_package') +SharingFileAccessError.other = SharingFileAccessError('other') + +SharingUserError._email_unverified_validator = bv.Void() +SharingUserError._other_validator = bv.Void() +SharingUserError._tagmap = { + 'email_unverified': SharingUserError._email_unverified_validator, + 'other': SharingUserError._other_validator, +} + +SharingUserError.email_unverified = SharingUserError('email_unverified') +SharingUserError.other = SharingUserError('other') + +TeamMemberInfo._team_info_validator = TeamInfo_validator +TeamMemberInfo._display_name_validator = bv.String() +TeamMemberInfo._member_id_validator = bv.Nullable(bv.String()) +TeamMemberInfo._all_field_names_ = set([ + 'team_info', + 'display_name', + 'member_id', +]) +TeamMemberInfo._all_fields_ = [ + ('team_info', TeamMemberInfo._team_info_validator), + ('display_name', TeamMemberInfo._display_name_validator), + ('member_id', TeamMemberInfo._member_id_validator), +] + +TransferFolderArg._shared_folder_id_validator = common.SharedFolderId_validator +TransferFolderArg._to_dropbox_id_validator = DropboxId_validator +TransferFolderArg._all_field_names_ = set([ + 'shared_folder_id', + 'to_dropbox_id', +]) +TransferFolderArg._all_fields_ = [ + ('shared_folder_id', TransferFolderArg._shared_folder_id_validator), + ('to_dropbox_id', TransferFolderArg._to_dropbox_id_validator), +] + +TransferFolderError._access_error_validator = SharedFolderAccessError_validator +TransferFolderError._invalid_dropbox_id_validator = bv.Void() +TransferFolderError._new_owner_not_a_member_validator = bv.Void() +TransferFolderError._new_owner_unmounted_validator = bv.Void() +TransferFolderError._new_owner_email_unverified_validator = bv.Void() +TransferFolderError._team_folder_validator = bv.Void() +TransferFolderError._no_permission_validator = bv.Void() +TransferFolderError._other_validator = bv.Void() +TransferFolderError._tagmap = { + 'access_error': TransferFolderError._access_error_validator, + 'invalid_dropbox_id': TransferFolderError._invalid_dropbox_id_validator, + 'new_owner_not_a_member': TransferFolderError._new_owner_not_a_member_validator, + 'new_owner_unmounted': TransferFolderError._new_owner_unmounted_validator, + 'new_owner_email_unverified': TransferFolderError._new_owner_email_unverified_validator, + 'team_folder': TransferFolderError._team_folder_validator, + 'no_permission': TransferFolderError._no_permission_validator, + 'other': TransferFolderError._other_validator, +} + +TransferFolderError.invalid_dropbox_id = TransferFolderError('invalid_dropbox_id') +TransferFolderError.new_owner_not_a_member = TransferFolderError('new_owner_not_a_member') +TransferFolderError.new_owner_unmounted = TransferFolderError('new_owner_unmounted') +TransferFolderError.new_owner_email_unverified = TransferFolderError('new_owner_email_unverified') +TransferFolderError.team_folder = TransferFolderError('team_folder') +TransferFolderError.no_permission = TransferFolderError('no_permission') +TransferFolderError.other = TransferFolderError('other') + +UnmountFolderArg._shared_folder_id_validator = common.SharedFolderId_validator +UnmountFolderArg._all_field_names_ = set(['shared_folder_id']) +UnmountFolderArg._all_fields_ = [('shared_folder_id', UnmountFolderArg._shared_folder_id_validator)] + +UnmountFolderError._access_error_validator = SharedFolderAccessError_validator +UnmountFolderError._no_permission_validator = bv.Void() +UnmountFolderError._not_unmountable_validator = bv.Void() +UnmountFolderError._other_validator = bv.Void() +UnmountFolderError._tagmap = { + 'access_error': UnmountFolderError._access_error_validator, + 'no_permission': UnmountFolderError._no_permission_validator, + 'not_unmountable': UnmountFolderError._not_unmountable_validator, + 'other': UnmountFolderError._other_validator, +} + +UnmountFolderError.no_permission = UnmountFolderError('no_permission') +UnmountFolderError.not_unmountable = UnmountFolderError('not_unmountable') +UnmountFolderError.other = UnmountFolderError('other') + +UnshareFileArg._file_validator = PathOrId_validator +UnshareFileArg._all_field_names_ = set(['file']) +UnshareFileArg._all_fields_ = [('file', UnshareFileArg._file_validator)] + +UnshareFileError._user_error_validator = SharingUserError_validator +UnshareFileError._access_error_validator = SharingFileAccessError_validator +UnshareFileError._other_validator = bv.Void() +UnshareFileError._tagmap = { + 'user_error': UnshareFileError._user_error_validator, + 'access_error': UnshareFileError._access_error_validator, + 'other': UnshareFileError._other_validator, +} + +UnshareFileError.other = UnshareFileError('other') + +UnshareFolderArg._shared_folder_id_validator = common.SharedFolderId_validator +UnshareFolderArg._leave_a_copy_validator = bv.Boolean() +UnshareFolderArg._all_field_names_ = set([ + 'shared_folder_id', + 'leave_a_copy', +]) +UnshareFolderArg._all_fields_ = [ + ('shared_folder_id', UnshareFolderArg._shared_folder_id_validator), + ('leave_a_copy', UnshareFolderArg._leave_a_copy_validator), +] + +UnshareFolderError._access_error_validator = SharedFolderAccessError_validator +UnshareFolderError._team_folder_validator = bv.Void() +UnshareFolderError._no_permission_validator = bv.Void() +UnshareFolderError._too_many_files_validator = bv.Void() +UnshareFolderError._other_validator = bv.Void() +UnshareFolderError._tagmap = { + 'access_error': UnshareFolderError._access_error_validator, + 'team_folder': UnshareFolderError._team_folder_validator, + 'no_permission': UnshareFolderError._no_permission_validator, + 'too_many_files': UnshareFolderError._too_many_files_validator, + 'other': UnshareFolderError._other_validator, +} + +UnshareFolderError.team_folder = UnshareFolderError('team_folder') +UnshareFolderError.no_permission = UnshareFolderError('no_permission') +UnshareFolderError.too_many_files = UnshareFolderError('too_many_files') +UnshareFolderError.other = UnshareFolderError('other') + +UpdateFileMemberArgs._all_field_names_ = ChangeFileMemberAccessArgs._all_field_names_.union(set([])) +UpdateFileMemberArgs._all_fields_ = ChangeFileMemberAccessArgs._all_fields_ + [] + +UpdateFolderMemberArg._shared_folder_id_validator = common.SharedFolderId_validator +UpdateFolderMemberArg._member_validator = MemberSelector_validator +UpdateFolderMemberArg._access_level_validator = AccessLevel_validator +UpdateFolderMemberArg._all_field_names_ = set([ + 'shared_folder_id', + 'member', + 'access_level', +]) +UpdateFolderMemberArg._all_fields_ = [ + ('shared_folder_id', UpdateFolderMemberArg._shared_folder_id_validator), + ('member', UpdateFolderMemberArg._member_validator), + ('access_level', UpdateFolderMemberArg._access_level_validator), +] + +UpdateFolderMemberError._access_error_validator = SharedFolderAccessError_validator +UpdateFolderMemberError._member_error_validator = SharedFolderMemberError_validator +UpdateFolderMemberError._no_explicit_access_validator = AddFolderMemberError_validator +UpdateFolderMemberError._insufficient_plan_validator = bv.Void() +UpdateFolderMemberError._no_permission_validator = bv.Void() +UpdateFolderMemberError._other_validator = bv.Void() +UpdateFolderMemberError._tagmap = { + 'access_error': UpdateFolderMemberError._access_error_validator, + 'member_error': UpdateFolderMemberError._member_error_validator, + 'no_explicit_access': UpdateFolderMemberError._no_explicit_access_validator, + 'insufficient_plan': UpdateFolderMemberError._insufficient_plan_validator, + 'no_permission': UpdateFolderMemberError._no_permission_validator, + 'other': UpdateFolderMemberError._other_validator, +} + +UpdateFolderMemberError.insufficient_plan = UpdateFolderMemberError('insufficient_plan') +UpdateFolderMemberError.no_permission = UpdateFolderMemberError('no_permission') +UpdateFolderMemberError.other = UpdateFolderMemberError('other') + +UpdateFolderPolicyArg._shared_folder_id_validator = common.SharedFolderId_validator +UpdateFolderPolicyArg._member_policy_validator = bv.Nullable(MemberPolicy_validator) +UpdateFolderPolicyArg._acl_update_policy_validator = bv.Nullable(AclUpdatePolicy_validator) +UpdateFolderPolicyArg._viewer_info_policy_validator = bv.Nullable(ViewerInfoPolicy_validator) +UpdateFolderPolicyArg._shared_link_policy_validator = bv.Nullable(SharedLinkPolicy_validator) +UpdateFolderPolicyArg._link_settings_validator = bv.Nullable(LinkSettings_validator) +UpdateFolderPolicyArg._actions_validator = bv.Nullable(bv.List(FolderAction_validator)) +UpdateFolderPolicyArg._all_field_names_ = set([ + 'shared_folder_id', + 'member_policy', + 'acl_update_policy', + 'viewer_info_policy', + 'shared_link_policy', + 'link_settings', + 'actions', +]) +UpdateFolderPolicyArg._all_fields_ = [ + ('shared_folder_id', UpdateFolderPolicyArg._shared_folder_id_validator), + ('member_policy', UpdateFolderPolicyArg._member_policy_validator), + ('acl_update_policy', UpdateFolderPolicyArg._acl_update_policy_validator), + ('viewer_info_policy', UpdateFolderPolicyArg._viewer_info_policy_validator), + ('shared_link_policy', UpdateFolderPolicyArg._shared_link_policy_validator), + ('link_settings', UpdateFolderPolicyArg._link_settings_validator), + ('actions', UpdateFolderPolicyArg._actions_validator), +] + +UpdateFolderPolicyError._access_error_validator = SharedFolderAccessError_validator +UpdateFolderPolicyError._not_on_team_validator = bv.Void() +UpdateFolderPolicyError._team_policy_disallows_member_policy_validator = bv.Void() +UpdateFolderPolicyError._disallowed_shared_link_policy_validator = bv.Void() +UpdateFolderPolicyError._no_permission_validator = bv.Void() +UpdateFolderPolicyError._team_folder_validator = bv.Void() +UpdateFolderPolicyError._other_validator = bv.Void() +UpdateFolderPolicyError._tagmap = { + 'access_error': UpdateFolderPolicyError._access_error_validator, + 'not_on_team': UpdateFolderPolicyError._not_on_team_validator, + 'team_policy_disallows_member_policy': UpdateFolderPolicyError._team_policy_disallows_member_policy_validator, + 'disallowed_shared_link_policy': UpdateFolderPolicyError._disallowed_shared_link_policy_validator, + 'no_permission': UpdateFolderPolicyError._no_permission_validator, + 'team_folder': UpdateFolderPolicyError._team_folder_validator, + 'other': UpdateFolderPolicyError._other_validator, +} + +UpdateFolderPolicyError.not_on_team = UpdateFolderPolicyError('not_on_team') +UpdateFolderPolicyError.team_policy_disallows_member_policy = UpdateFolderPolicyError('team_policy_disallows_member_policy') +UpdateFolderPolicyError.disallowed_shared_link_policy = UpdateFolderPolicyError('disallowed_shared_link_policy') +UpdateFolderPolicyError.no_permission = UpdateFolderPolicyError('no_permission') +UpdateFolderPolicyError.team_folder = UpdateFolderPolicyError('team_folder') +UpdateFolderPolicyError.other = UpdateFolderPolicyError('other') + +UserMembershipInfo._user_validator = UserInfo_validator +UserMembershipInfo._all_field_names_ = MembershipInfo._all_field_names_.union(set(['user'])) +UserMembershipInfo._all_fields_ = MembershipInfo._all_fields_ + [('user', UserMembershipInfo._user_validator)] + +UserFileMembershipInfo._time_last_seen_validator = bv.Nullable(common.DropboxTimestamp_validator) +UserFileMembershipInfo._platform_type_validator = bv.Nullable(seen_state.PlatformType_validator) +UserFileMembershipInfo._all_field_names_ = UserMembershipInfo._all_field_names_.union(set([ + 'time_last_seen', + 'platform_type', +])) +UserFileMembershipInfo._all_fields_ = UserMembershipInfo._all_fields_ + [ + ('time_last_seen', UserFileMembershipInfo._time_last_seen_validator), + ('platform_type', UserFileMembershipInfo._platform_type_validator), +] + +UserInfo._account_id_validator = users_common.AccountId_validator +UserInfo._email_validator = bv.String() +UserInfo._display_name_validator = bv.String() +UserInfo._same_team_validator = bv.Boolean() +UserInfo._team_member_id_validator = bv.Nullable(bv.String()) +UserInfo._all_field_names_ = set([ + 'account_id', + 'email', + 'display_name', + 'same_team', + 'team_member_id', +]) +UserInfo._all_fields_ = [ + ('account_id', UserInfo._account_id_validator), + ('email', UserInfo._email_validator), + ('display_name', UserInfo._display_name_validator), + ('same_team', UserInfo._same_team_validator), + ('team_member_id', UserInfo._team_member_id_validator), +] + +ViewerInfoPolicy._enabled_validator = bv.Void() +ViewerInfoPolicy._disabled_validator = bv.Void() +ViewerInfoPolicy._other_validator = bv.Void() +ViewerInfoPolicy._tagmap = { + 'enabled': ViewerInfoPolicy._enabled_validator, + 'disabled': ViewerInfoPolicy._disabled_validator, + 'other': ViewerInfoPolicy._other_validator, +} + +ViewerInfoPolicy.enabled = ViewerInfoPolicy('enabled') +ViewerInfoPolicy.disabled = ViewerInfoPolicy('disabled') +ViewerInfoPolicy.other = ViewerInfoPolicy('other') + +Visibility._public_validator = bv.Void() +Visibility._team_only_validator = bv.Void() +Visibility._password_validator = bv.Void() +Visibility._team_and_password_validator = bv.Void() +Visibility._shared_folder_only_validator = bv.Void() +Visibility._other_validator = bv.Void() +Visibility._tagmap = { + 'public': Visibility._public_validator, + 'team_only': Visibility._team_only_validator, + 'password': Visibility._password_validator, + 'team_and_password': Visibility._team_and_password_validator, + 'shared_folder_only': Visibility._shared_folder_only_validator, + 'other': Visibility._other_validator, +} + +Visibility.public = Visibility('public') +Visibility.team_only = Visibility('team_only') +Visibility.password = Visibility('password') +Visibility.team_and_password = Visibility('team_and_password') +Visibility.shared_folder_only = Visibility('shared_folder_only') +Visibility.other = Visibility('other') + +add_file_member = bb.Route( + 'add_file_member', + 1, + False, + AddFileMemberArgs_validator, + bv.List(FileMemberActionResult_validator), + AddFileMemberError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +add_folder_member = bb.Route( + 'add_folder_member', + 1, + False, + AddFolderMemberArg_validator, + bv.Void(), + AddFolderMemberError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +change_file_member_access = bb.Route( + 'change_file_member_access', + 1, + True, + ChangeFileMemberAccessArgs_validator, + FileMemberActionResult_validator, + FileMemberActionError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +check_job_status = bb.Route( + 'check_job_status', + 1, + False, + async_.PollArg_validator, + JobStatus_validator, + async_.PollError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +check_remove_member_job_status = bb.Route( + 'check_remove_member_job_status', + 1, + False, + async_.PollArg_validator, + RemoveMemberJobStatus_validator, + async_.PollError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +check_share_job_status = bb.Route( + 'check_share_job_status', + 1, + False, + async_.PollArg_validator, + ShareFolderJobStatus_validator, + async_.PollError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +create_shared_link = bb.Route( + 'create_shared_link', + 1, + True, + CreateSharedLinkArg_validator, + PathLinkMetadata_validator, + CreateSharedLinkError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +create_shared_link_with_settings = bb.Route( + 'create_shared_link_with_settings', + 1, + False, + CreateSharedLinkWithSettingsArg_validator, + SharedLinkMetadata_validator, + CreateSharedLinkWithSettingsError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +get_file_metadata = bb.Route( + 'get_file_metadata', + 1, + False, + GetFileMetadataArg_validator, + SharedFileMetadata_validator, + GetFileMetadataError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +get_file_metadata_batch = bb.Route( + 'get_file_metadata/batch', + 1, + False, + GetFileMetadataBatchArg_validator, + bv.List(GetFileMetadataBatchResult_validator), + SharingUserError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +get_folder_metadata = bb.Route( + 'get_folder_metadata', + 1, + False, + GetMetadataArgs_validator, + SharedFolderMetadata_validator, + SharedFolderAccessError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +get_shared_link_file = bb.Route( + 'get_shared_link_file', + 1, + False, + GetSharedLinkFileArg_validator, + SharedLinkMetadata_validator, + GetSharedLinkFileError_validator, + {'host': u'content', + 'style': u'download'}, +) +get_shared_link_metadata = bb.Route( + 'get_shared_link_metadata', + 1, + False, + GetSharedLinkMetadataArg_validator, + SharedLinkMetadata_validator, + SharedLinkError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +get_shared_links = bb.Route( + 'get_shared_links', + 1, + True, + GetSharedLinksArg_validator, + GetSharedLinksResult_validator, + GetSharedLinksError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +list_file_members = bb.Route( + 'list_file_members', + 1, + False, + ListFileMembersArg_validator, + SharedFileMembers_validator, + ListFileMembersError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +list_file_members_batch = bb.Route( + 'list_file_members/batch', + 1, + False, + ListFileMembersBatchArg_validator, + bv.List(ListFileMembersBatchResult_validator), + SharingUserError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +list_file_members_continue = bb.Route( + 'list_file_members/continue', + 1, + False, + ListFileMembersContinueArg_validator, + SharedFileMembers_validator, + ListFileMembersContinueError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +list_folder_members = bb.Route( + 'list_folder_members', + 1, + False, + ListFolderMembersArgs_validator, + SharedFolderMembers_validator, + SharedFolderAccessError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +list_folder_members_continue = bb.Route( + 'list_folder_members/continue', + 1, + False, + ListFolderMembersContinueArg_validator, + SharedFolderMembers_validator, + ListFolderMembersContinueError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +list_folders = bb.Route( + 'list_folders', + 1, + False, + ListFoldersArgs_validator, + ListFoldersResult_validator, + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) +list_folders_continue = bb.Route( + 'list_folders/continue', + 1, + False, + ListFoldersContinueArg_validator, + ListFoldersResult_validator, + ListFoldersContinueError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +list_mountable_folders = bb.Route( + 'list_mountable_folders', + 1, + False, + ListFoldersArgs_validator, + ListFoldersResult_validator, + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) +list_mountable_folders_continue = bb.Route( + 'list_mountable_folders/continue', + 1, + False, + ListFoldersContinueArg_validator, + ListFoldersResult_validator, + ListFoldersContinueError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +list_received_files = bb.Route( + 'list_received_files', + 1, + False, + ListFilesArg_validator, + ListFilesResult_validator, + SharingUserError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +list_received_files_continue = bb.Route( + 'list_received_files/continue', + 1, + False, + ListFilesContinueArg_validator, + ListFilesResult_validator, + ListFilesContinueError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +list_shared_links = bb.Route( + 'list_shared_links', + 1, + False, + ListSharedLinksArg_validator, + ListSharedLinksResult_validator, + ListSharedLinksError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +modify_shared_link_settings = bb.Route( + 'modify_shared_link_settings', + 1, + False, + ModifySharedLinkSettingsArgs_validator, + SharedLinkMetadata_validator, + ModifySharedLinkSettingsError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +mount_folder = bb.Route( + 'mount_folder', + 1, + False, + MountFolderArg_validator, + SharedFolderMetadata_validator, + MountFolderError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +relinquish_file_membership = bb.Route( + 'relinquish_file_membership', + 1, + False, + RelinquishFileMembershipArg_validator, + bv.Void(), + RelinquishFileMembershipError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +relinquish_folder_membership = bb.Route( + 'relinquish_folder_membership', + 1, + False, + RelinquishFolderMembershipArg_validator, + async_.LaunchEmptyResult_validator, + RelinquishFolderMembershipError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +remove_file_member = bb.Route( + 'remove_file_member', + 1, + True, + RemoveFileMemberArg_validator, + FileMemberActionIndividualResult_validator, + RemoveFileMemberError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +remove_file_member_2 = bb.Route( + 'remove_file_member_2', + 1, + False, + RemoveFileMemberArg_validator, + FileMemberRemoveActionResult_validator, + RemoveFileMemberError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +remove_folder_member = bb.Route( + 'remove_folder_member', + 1, + False, + RemoveFolderMemberArg_validator, + async_.LaunchResultBase_validator, + RemoveFolderMemberError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +revoke_shared_link = bb.Route( + 'revoke_shared_link', + 1, + False, + RevokeSharedLinkArg_validator, + bv.Void(), + RevokeSharedLinkError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +set_access_inheritance = bb.Route( + 'set_access_inheritance', + 1, + False, + SetAccessInheritanceArg_validator, + ShareFolderLaunch_validator, + SetAccessInheritanceError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +share_folder = bb.Route( + 'share_folder', + 1, + False, + ShareFolderArg_validator, + ShareFolderLaunch_validator, + ShareFolderError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +transfer_folder = bb.Route( + 'transfer_folder', + 1, + False, + TransferFolderArg_validator, + bv.Void(), + TransferFolderError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +unmount_folder = bb.Route( + 'unmount_folder', + 1, + False, + UnmountFolderArg_validator, + bv.Void(), + UnmountFolderError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +unshare_file = bb.Route( + 'unshare_file', + 1, + False, + UnshareFileArg_validator, + bv.Void(), + UnshareFileError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +unshare_folder = bb.Route( + 'unshare_folder', + 1, + False, + UnshareFolderArg_validator, + async_.LaunchEmptyResult_validator, + UnshareFolderError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +update_file_member = bb.Route( + 'update_file_member', + 1, + False, + UpdateFileMemberArgs_validator, + MemberAccessLevelResult_validator, + FileMemberActionError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +update_folder_member = bb.Route( + 'update_folder_member', + 1, + False, + UpdateFolderMemberArg_validator, + MemberAccessLevelResult_validator, + UpdateFolderMemberError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +update_folder_policy = bb.Route( + 'update_folder_policy', + 1, + False, + UpdateFolderPolicyArg_validator, + SharedFolderMetadata_validator, + UpdateFolderPolicyError_validator, + {'host': u'api', + 'style': u'rpc'}, +) + +ROUTES = { + 'add_file_member': add_file_member, + 'add_folder_member': add_folder_member, + 'change_file_member_access': change_file_member_access, + 'check_job_status': check_job_status, + 'check_remove_member_job_status': check_remove_member_job_status, + 'check_share_job_status': check_share_job_status, + 'create_shared_link': create_shared_link, + 'create_shared_link_with_settings': create_shared_link_with_settings, + 'get_file_metadata': get_file_metadata, + 'get_file_metadata/batch': get_file_metadata_batch, + 'get_folder_metadata': get_folder_metadata, + 'get_shared_link_file': get_shared_link_file, + 'get_shared_link_metadata': get_shared_link_metadata, + 'get_shared_links': get_shared_links, + 'list_file_members': list_file_members, + 'list_file_members/batch': list_file_members_batch, + 'list_file_members/continue': list_file_members_continue, + 'list_folder_members': list_folder_members, + 'list_folder_members/continue': list_folder_members_continue, + 'list_folders': list_folders, + 'list_folders/continue': list_folders_continue, + 'list_mountable_folders': list_mountable_folders, + 'list_mountable_folders/continue': list_mountable_folders_continue, + 'list_received_files': list_received_files, + 'list_received_files/continue': list_received_files_continue, + 'list_shared_links': list_shared_links, + 'modify_shared_link_settings': modify_shared_link_settings, + 'mount_folder': mount_folder, + 'relinquish_file_membership': relinquish_file_membership, + 'relinquish_folder_membership': relinquish_folder_membership, + 'remove_file_member': remove_file_member, + 'remove_file_member_2': remove_file_member_2, + 'remove_folder_member': remove_folder_member, + 'revoke_shared_link': revoke_shared_link, + 'set_access_inheritance': set_access_inheritance, + 'share_folder': share_folder, + 'transfer_folder': transfer_folder, + 'unmount_folder': unmount_folder, + 'unshare_file': unshare_file, + 'unshare_folder': unshare_folder, + 'update_file_member': update_file_member, + 'update_folder_member': update_folder_member, + 'update_folder_policy': update_folder_policy, +} + diff --git a/dropbox-script/dropbox/stone_base.py b/dropbox-script/dropbox/stone_base.py new file mode 100644 index 0000000..465a483 --- /dev/null +++ b/dropbox-script/dropbox/stone_base.py @@ -0,0 +1,152 @@ +""" +Helpers for representing Stone data types in Python. + +This module should be dropped into a project that requires the use of Stone. In +the future, this could be imported from a pre-installed Python package, rather +than being added to a project. +""" + +from __future__ import absolute_import, unicode_literals + +import functools + +try: + from . import stone_validators as bv +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bv # type: ignore + +_MYPY = False +if _MYPY: + import typing # noqa: F401 # pylint: disable=import-error,unused-import,useless-suppression + +class AnnotationType(object): + # This is a base class for all annotation types. + pass + +if _MYPY: + T = typing.TypeVar('T', bound=AnnotationType) + U = typing.TypeVar('U') + +class Struct(object): + # This is a base class for all classes representing Stone structs. + def _process_custom_annotations(self, annotation_type, processor): + # type: (typing.Type[T], typing.Callable[[T, U], U]) -> None + pass + +class Union(object): + # TODO(kelkabany): Possible optimization is to remove _value if a + # union is composed of only symbols. + __slots__ = ['_tag', '_value'] + _tagmap = {} # type: typing.Dict[typing.Text, bv.Validator] + _permissioned_tagmaps = set() # type: typing.Set[typing.Text] + + def __init__(self, tag, value=None): + validator = None + tagmap_names = ['_{}_tagmap'.format(map_name) for map_name in self._permissioned_tagmaps] + for tagmap_name in ['_tagmap'] + tagmap_names: + if tag in getattr(self, tagmap_name): + validator = getattr(self, tagmap_name)[tag] + assert validator is not None, 'Invalid tag %r.' % tag + if isinstance(validator, bv.Void): + assert value is None, 'Void type union member must have None value.' + elif isinstance(validator, (bv.Struct, bv.Union)): + validator.validate_type_only(value) + else: + validator.validate(value) + self._tag = tag + self._value = value + + def __eq__(self, other): + # Also need to check if one class is a subclass of another. If one union extends another, + # the common fields should be able to be compared to each other. + return ( + isinstance(other, Union) and + (isinstance(self, other.__class__) or isinstance(other, self.__class__)) and + self._tag == other._tag and self._value == other._value + ) + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash((self._tag, self._value)) + + def _process_custom_annotations(self, annotation_type, processor): + # type: (typing.Type[T], typing.Callable[[T, U], U]) -> None + pass + + @classmethod + def _is_tag_present(cls, tag, caller_permissions): + assert tag, 'tag value should not be None' + + if tag in cls._tagmap: + return True + + for extra_permission in caller_permissions.permissions: + tagmap_name = '_{}_tagmap'.format(extra_permission) + if hasattr(cls, tagmap_name) and tag in getattr(cls, tagmap_name): + return True + + return False + + @classmethod + def _get_val_data_type(cls, tag, caller_permissions): + assert tag, 'tag value should not be None' + + for extra_permission in caller_permissions.permissions: + tagmap_name = '_{}_tagmap'.format(extra_permission) + if hasattr(cls, tagmap_name) and tag in getattr(cls, tagmap_name): + return getattr(cls, tagmap_name)[tag] + + return cls._tagmap[tag] + +class Route(object): + + def __init__(self, name, version, deprecated, arg_type, result_type, error_type, attrs): + self.name = name + self.version = version + self.deprecated = deprecated + self.arg_type = arg_type + self.result_type = result_type + self.error_type = error_type + assert isinstance(attrs, dict), 'Expected dict, got %r' % attrs + self.attrs = attrs + + def __repr__(self): + return 'Route({!r}, {!r}, {!r}, {!r}, {!r}, {!r}, {!r})'.format( + self.name, + self.version, + self.deprecated, + self.arg_type, + self.result_type, + self.error_type, + self.attrs) + +# helper functions used when constructing custom annotation processors + +# put this here so that every other file doesn't need to import functools +partially_apply = functools.partial + +def make_struct_annotation_processor(annotation_type, processor): + def g(struct): + if struct is None: + return struct + struct._process_custom_annotations(annotation_type, processor) + return struct + return g + +def make_list_annotation_processor(processor): + def g(list_): + if list_ is None: + return list_ + return [processor(x) for x in list_] + return g + +def make_map_value_annotation_processor(processor): + def g(map_): + if map_ is None: + return map_ + return {k: processor(v) for k, v in map_.items()} + return g diff --git a/dropbox-script/dropbox/stone_serializers.py b/dropbox-script/dropbox/stone_serializers.py new file mode 100644 index 0000000..3622dbc --- /dev/null +++ b/dropbox-script/dropbox/stone_serializers.py @@ -0,0 +1,1075 @@ +""" +Serializers for Stone data types. + +Currently, only JSON is officially supported, but there's an experimental +msgpack integration. If possible, serializers should be kept separate from the +RPC format. + +This module should be dropped into a project that requires the use of Stone. In +the future, this could be imported from a pre-installed Python package, rather +than being added to a project. +""" + +from __future__ import absolute_import, unicode_literals + +import base64 +import collections +import datetime +import functools +import json +import re +import six +import time + +try: + from . import stone_base as bb # noqa: F401 # pylint: disable=unused-import + from . import stone_validators as bv +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bb # type: ignore # noqa: F401 # pylint: disable=unused-import + import stone_validators as bv # type: ignore + +_MYPY = False +if _MYPY: + import typing # noqa: F401 # pylint: disable=import-error,unused-import,useless-suppression + + +# ------------------------------------------------------------------------ +class CallerPermissionsInterface(object): + + @property + def permissions(self): + """ + Returns the list of permissions this caller has access to. + """ + raise NotImplementedError + + +class CallerPermissionsDefault(CallerPermissionsInterface): + + @property + def permissions(self): + return [] + +# ------------------------------------------------------------------------ +class StoneEncoderInterface(object): + """ + Interface defining a stone object encoder. + """ + + def encode(self, validator, value): + # type: (bv.Validator, typing.Any) -> typing.Any + """ + Validate ``value`` using ``validator`` and return the encoding. + + Args: + validator: the ``stone_validators.Validator`` used to validate + ``value`` + value: the object to encode + + Returns: + The encoded object. This is implementation-defined. + + Raises: + stone_validators.ValidationError: Raised if ``value`` (or one + of its sub-values). + """ + raise NotImplementedError + +# ------------------------------------------------------------------------ +class StoneSerializerBase(StoneEncoderInterface): + + def __init__(self, caller_permissions, alias_validators): + # type: (CallerPermissionsInterface, typing.Mapping[bv.Validator, typing.Callable[[typing.Any], None]]) -> None # noqa: E501 + """ + Constructor, `obviously + `. + + Args: + caller_permissions (list): The list of raw-string caller permissions with which + to serialize. + alias_validators (``typing.Mapping``, optional): A mapping of + custom validation callables in the format + ``{stone_validators.Validator: + typing.Callable[[typing.Any], None], ...}``. These callables must + raise a ``stone_validators.ValidationError`` on failure. + Defaults to ``None``. + """ + self.caller_permissions = (caller_permissions if + caller_permissions else CallerPermissionsDefault()) + self._alias_validators = {} # type: typing.Dict[bv.Validator, typing.Callable[[typing.Any], None]] # noqa: E501 + + if alias_validators is not None: + self._alias_validators.update(alias_validators) + + @property + def alias_validators(self): + """ + A ``typing.Mapping`` of custom validation callables in the format + ``{stone_validators.Validator: typing.Callable[typing.Any], + ...}``. + """ + return self._alias_validators + + def encode(self, validator, value): + return self.encode_sub(validator, value) + + def encode_sub(self, validator, value): + # type: (bv.Validator, typing.Any) -> typing.Any + """ + Callback intended to be called by other ``encode`` methods to + delegate encoding of sub-values. Arguments have the same semantics + as with the ``encode`` method. + """ + + if isinstance(validator, bv.List): + # Because Lists are mutable, we always validate them during + # serialization + validate_f = validator.validate # type: typing.Callable[[typing.Any], None] + encode_f = self.encode_list # type: typing.Callable[[typing.Any, typing.Any], typing.Any] # noqa: E501 + elif isinstance(validator, bv.Map): + # Also validate maps during serialization because they are also mutable + validate_f = validator.validate + encode_f = self.encode_map + elif isinstance(validator, bv.Nullable): + validate_f = validator.validate + encode_f = self.encode_nullable + elif isinstance(validator, bv.Primitive): + validate_f = validator.validate + encode_f = self.encode_primitive + elif isinstance(validator, bv.Struct): + if isinstance(validator, bv.StructTree): + if self.caller_permissions.permissions: + def validate_with_permissions(val): + validator.validate_with_permissions(val, self.caller_permissions) + + validate_f = validate_with_permissions + else: + validate_f = validator.validate + encode_f = self.encode_struct_tree + else: + # Fields are already validated on assignment + if self.caller_permissions.permissions: + def validate_with_permissions(val): + validator.validate_with_permissions(val, self.caller_permissions) + + validate_f = validate_with_permissions + else: + validate_f = validator.validate_type_only + encode_f = self.encode_struct + elif isinstance(validator, bv.Union): + # Fields are already validated on assignment + validate_f = validator.validate_type_only + encode_f = self.encode_union + else: + raise bv.ValidationError('Unsupported data type {}'.format(type(validator).__name__)) + + validate_f(value) + + return encode_f(validator, value) + + def encode_list(self, validator, value): + # type: (bv.List, typing.Any) -> typing.Any + """ + Callback for serializing a ``stone_validators.List``. Arguments + have the same semantics as with the ``encode`` method. + """ + raise NotImplementedError + + def encode_map(self, validator, value): + # type: (bv.Map, typing.Any) -> typing.Any + """ + Callback for serializing a ``stone_validators.Map``. Arguments + have the same semantics as with the ``encode`` method. + """ + raise NotImplementedError + + def encode_nullable(self, validator, value): + # type: (bv.Nullable, typing.Any) -> typing.Any + """ + Callback for serializing a ``stone_validators.Nullable``. + Arguments have the same semantics as with the ``encode`` method. + """ + raise NotImplementedError + + def encode_primitive(self, validator, value): + # type: (bv.Primitive, typing.Any) -> typing.Any + """ + Callback for serializing a ``stone_validators.Primitive``. + Arguments have the same semantics as with the ``encode`` method. + """ + raise NotImplementedError + + def encode_struct(self, validator, value): + # type: (bv.Struct, typing.Any) -> typing.Any + """ + Callback for serializing a ``stone_validators.Struct``. Arguments + have the same semantics as with the ``encode`` method. + """ + raise NotImplementedError + + def encode_struct_tree(self, validator, value): + # type: (bv.StructTree, typing.Any) -> typing.Any + """ + Callback for serializing a ``stone_validators.StructTree``. + Arguments have the same semantics as with the ``encode`` method. + """ + raise NotImplementedError + + def encode_union(self, validator, value): + # type: (bv.Union, bb.Union) -> typing.Any + """ + Callback for serializing a ``stone_validators.Union``. Arguments + have the same semantics as with the ``encode`` method. + """ + raise NotImplementedError + +# ------------------------------------------------------------------------ +class StoneToPythonPrimitiveSerializer(StoneSerializerBase): + + def __init__(self, caller_permissions, alias_validators, for_msgpack, old_style, should_redact): + # type: (CallerPermissionsInterface, typing.Mapping[bv.Validator, typing.Callable[[typing.Any], None]], bool, bool, bool) -> None # noqa: E501 + """ + Args: + alias_validators (``typing.Mapping``, optional): Passed + to ``StoneSerializer.__init__``. Defaults to ``None``. + for_msgpack (bool, optional): See the like-named property. + Defaults to ``False``. + old_style (bool, optional): See the like-named property. + Defaults to ``False``. + should_redact (bool, optional): Whether to perform redaction on + marked fields. Defaults to ``False``. + """ + super(StoneToPythonPrimitiveSerializer, self).__init__( + caller_permissions, alias_validators=alias_validators) + self._for_msgpack = for_msgpack + self._old_style = old_style + self.should_redact = should_redact + + @property + def for_msgpack(self): + """ + EXPERIMENTAL: A flag associated with the serializer indicating + whether objects produced by the ``encode`` method should be + encoded for msgpack. + + """ + return self._for_msgpack + + @property + def old_style(self): + """ + A flag associated with the serializer indicating whether objects + produced by the ``encode`` method should be encoded according to + Dropbox's old or new API styles. + """ + return self._old_style + + def encode_sub(self, validator, value): + if self.should_redact and hasattr(validator, '_redact'): + if isinstance(value, list): + return [validator._redact.apply(v) for v in value] + elif isinstance(value, dict): + return {k: validator._redact.apply(v) for k, v in value.items()} + else: + return validator._redact.apply(value) + + # Encode value normally + return super(StoneToPythonPrimitiveSerializer, self).encode_sub(validator, value) + + def encode_list(self, validator, value): + validated_value = validator.validate(value) + + return [self.encode_sub(validator.item_validator, value_item) for value_item in + validated_value] + + def encode_map(self, validator, value): + validated_value = validator.validate(value) + + return { + self.encode_sub(validator.key_validator, key): + self.encode_sub(validator.value_validator, value) for + key, value in validated_value.items() + } + + def encode_nullable(self, validator, value): + if value is None: + return None + + return self.encode_sub(validator.validator, value) + + def encode_primitive(self, validator, value): + if validator in self.alias_validators: + self.alias_validators[validator](value) + + if isinstance(validator, bv.Void): + return None + elif isinstance(validator, bv.Timestamp): + return _strftime(value, validator.format) + elif isinstance(validator, bv.Bytes): + if self.for_msgpack: + return value + else: + return base64.b64encode(value).decode('ascii') + elif isinstance(validator, bv.Integer) \ + and isinstance(value, bool): + # bool is sub-class of int so it passes Integer validation, + # but we want the bool to be encoded as ``0`` or ``1``, rather + # than ``False`` or ``True``, respectively + return int(value) + else: + return value + + def encode_struct(self, validator, value): + # Skip validation of fields with primitive data types because + # they've already been validated on assignment + d = collections.OrderedDict() # type: typing.Dict[str, typing.Any] + + all_fields = validator.definition._all_fields_ + + for extra_permission in self.caller_permissions.permissions: + all_fields_name = '_all_{}_fields_'.format(extra_permission) + all_fields = all_fields + getattr(validator.definition, all_fields_name, []) + + for field_name, field_validator in all_fields: + try: + field_value = getattr(value, field_name) + except AttributeError as exc: + raise bv.ValidationError(exc.args[0]) + + presence_key = '_%s_present' % field_name + + if field_value is not None \ + and getattr(value, presence_key): + # Only serialize struct fields that have been explicitly + # set, even if there is a default + try: + d[field_name] = self.encode_sub(field_validator, field_value) + except bv.ValidationError as exc: + exc.add_parent(field_name) + + raise + return d + + def encode_struct_tree(self, validator, value): + assert type(value) in validator.definition._pytype_to_tag_and_subtype_, \ + '%r is not a serializable subtype of %r.' % (type(value), validator.definition) + + tags, subtype = validator.definition._pytype_to_tag_and_subtype_[type(value)] + + assert len(tags) == 1, tags + assert not isinstance(subtype, bv.StructTree), \ + 'Cannot serialize type %r because it enumerates subtypes.' % subtype.definition + + if self.old_style: + d = { + tags[0]: self.encode_struct(subtype, value), + } + else: + d = collections.OrderedDict() + d['.tag'] = tags[0] + d.update(self.encode_struct(subtype, value)) + + return d + + def encode_union(self, validator, value): + if value._tag is None: + raise bv.ValidationError('no tag set') + + if not validator.definition._is_tag_present(value._tag, self.caller_permissions): + raise bv.ValidationError( + "caller does not have access to '{}' tag".format(value._tag)) + + field_validator = validator.definition._get_val_data_type(value._tag, + self.caller_permissions) + + is_none = isinstance(field_validator, bv.Void) \ + or (isinstance(field_validator, bv.Nullable) + and value._value is None) + + def encode_sub(sub_validator, sub_value, parent_tag): + try: + encoded_val = self.encode_sub(sub_validator, sub_value) + except bv.ValidationError as exc: + exc.add_parent(parent_tag) + + raise + else: + return encoded_val + + if self.old_style: + if field_validator is None: + return value._tag + elif is_none: + return value._tag + else: + encoded_val = encode_sub(field_validator, value._value, value._tag) + + return {value._tag: encoded_val} + elif is_none: + return {'.tag': value._tag} + else: + encoded_val = encode_sub(field_validator, value._value, value._tag) + + if isinstance(field_validator, bv.Nullable): + # We've already checked for the null case above, + # so now we're only interested in what the + # wrapped validator is + field_validator = field_validator.validator + + if isinstance(field_validator, bv.Struct) \ + and not isinstance(field_validator, bv.StructTree): + d = collections.OrderedDict() # type: typing.Dict[str, typing.Any] + d['.tag'] = value._tag + d.update(encoded_val) + + return d + else: + return collections.OrderedDict(( + ('.tag', value._tag), + (value._tag, encoded_val), + )) + +# ------------------------------------------------------------------------ +class StoneToJsonSerializer(StoneToPythonPrimitiveSerializer): + def encode(self, validator, value): + return json.dumps(super(StoneToJsonSerializer, self).encode(validator, value)) + +# -------------------------------------------------------------- +# JSON Encoder +# +# These interfaces are preserved for backward compatibility and symmetry with deserialization +# functions. + +def json_encode(data_type, obj, caller_permissions=None, alias_validators=None, old_style=False, + should_redact=False): + """Encodes an object into JSON based on its type. + + Args: + data_type (Validator): Validator for obj. + obj (object): Object to be serialized. + caller_permissions (list): The list of raw-string caller permissions with which + to serialize. + alias_validators (Optional[Mapping[bv.Validator, Callable[[], None]]]): + Custom validation functions. These must raise bv.ValidationError on + failure. + + Returns: + str: JSON-encoded object. + + This function will also do additional validation that wasn't done by the + objects themselves: + + 1. The passed in obj may not have been validated with data_type yet. + 2. If an object that should be a Struct was assigned to a field, its + type has been validated, but the presence of all required fields + hasn't been. + 3. If an object that should be a Union was assigned to a field, whether + or not a tag has been set has not been validated. + 4. A list may have passed validation initially, but been mutated since. + + Example of serializing a struct to JSON: + + struct FileRef + path String + rev String + + > fr = FileRef() + > fr.path = 'a/b/c' + > fr.rev = '1234' + > JsonEncoder.encode(fr) + "{'path': 'a/b/c', 'rev': '1234'}" + + Example of serializing a union to JSON: + + union UploadMode + add + overwrite + update FileRef + + > um = UploadMode() + > um.set_add() + > JsonEncoder.encode(um) + '"add"' + > um.update = fr + > JsonEncoder.encode(um) + "{'update': {'path': 'a/b/c', 'rev': '1234'}}" + """ + for_msgpack = False + serializer = StoneToJsonSerializer( + caller_permissions, alias_validators, for_msgpack, old_style, should_redact) + return serializer.encode(data_type, obj) + +def json_compat_obj_encode(data_type, obj, caller_permissions=None, alias_validators=None, + old_style=False, for_msgpack=False, should_redact=False): + """Encodes an object into a JSON-compatible dict based on its type. + + Args: + data_type (Validator): Validator for obj. + obj (object): Object to be serialized. + caller_permissions (list): The list of raw-string caller permissions + with which to serialize. + + Returns: + An object that when passed to json.dumps() will produce a string + giving the JSON-encoded object. + + See json_encode() for additional information about validation. + """ + serializer = StoneToPythonPrimitiveSerializer( + caller_permissions, alias_validators, for_msgpack, old_style, should_redact) + return serializer.encode(data_type, obj) + +# -------------------------------------------------------------- +# JSON Decoder +class PythonPrimitiveToStoneDecoder(object): + def __init__(self, caller_permissions, alias_validators, for_msgpack, old_style, strict): + self.caller_permissions = (caller_permissions if + caller_permissions else CallerPermissionsDefault()) + self.alias_validators = alias_validators + self.strict = strict + self._old_style = old_style + self._for_msgpack = for_msgpack + + @property + def for_msgpack(self): + """ + EXPERIMENTAL: A flag associated with the serializer indicating + whether objects produced by the ``encode`` method should be + encoded for msgpack. + """ + return self._for_msgpack + + @property + def old_style(self): + """ + A flag associated with the serializer indicating whether objects + produced by the ``encode`` method should be encoded according to + Dropbox's old or new API styles. + """ + return self._old_style + + def json_compat_obj_decode_helper(self, data_type, obj): + """ + See json_compat_obj_decode() for argument descriptions. + """ + if isinstance(data_type, bv.StructTree): + return self.decode_struct_tree(data_type, obj) + elif isinstance(data_type, bv.Struct): + return self.decode_struct(data_type, obj) + elif isinstance(data_type, bv.Union): + if self.old_style: + return self.decode_union_old(data_type, obj) + else: + return self.decode_union(data_type, obj) + elif isinstance(data_type, bv.List): + return self.decode_list( + data_type, obj) + elif isinstance(data_type, bv.Map): + return self.decode_map( + data_type, obj) + elif isinstance(data_type, bv.Nullable): + return self.decode_nullable( + data_type, obj) + elif isinstance(data_type, bv.Primitive): + # Set validate to false because validation will be done by the + # containing struct or union when the field is assigned. + return self.make_stone_friendly(data_type, obj, False) + else: + raise AssertionError('Cannot handle type %r.' % data_type) + + def decode_struct(self, data_type, obj): + """ + The data_type argument must be a Struct. + See json_compat_obj_decode() for argument descriptions. + """ + if obj is None and data_type.has_default(): + return data_type.get_default() + elif not isinstance(obj, dict): + raise bv.ValidationError('expected object, got %s' % + bv.generic_type_name(obj)) + all_fields = data_type.definition._all_fields_ + for extra_permission in self.caller_permissions.permissions: + all_extra_fields = '_all_{}_fields_'.format(extra_permission) + all_fields = all_fields + getattr(data_type.definition, all_extra_fields, []) + + if self.strict: + all_field_names = data_type.definition._all_field_names_ + for extra_permission in self.caller_permissions.permissions: + all_extra_field_names = '_all_{}_field_names_'.format(extra_permission) + all_field_names = all_field_names.union( + getattr(data_type.definition, all_extra_field_names, {})) + + for key in obj: + if (key not in all_field_names and + not key.startswith('.tag')): + raise bv.ValidationError("unknown field '%s'" % key) + ins = data_type.definition() + self.decode_struct_fields(ins, all_fields, obj) + # Check that all required fields have been set. + data_type.validate_fields_only_with_permissions(ins, self.caller_permissions) + return ins + + def decode_struct_fields(self, ins, fields, obj): + """ + Args: + ins: An instance of the class representing the data type being decoded. + The object will have its fields set. + fields: A tuple of (field_name: str, field_validator: Validator) + obj (dict): JSON-compatible dict that is being decoded. + strict (bool): See :func:`json_compat_obj_decode`. + Returns: + None: `ins` has its fields set based on the contents of `obj`. + """ + for name, field_data_type in fields: + if name in obj: + try: + v = self.json_compat_obj_decode_helper(field_data_type, obj[name]) + setattr(ins, name, v) + except bv.ValidationError as e: + e.add_parent(name) + raise + elif field_data_type.has_default(): + setattr(ins, name, field_data_type.get_default()) + + def decode_union(self, data_type, obj): + """ + The data_type argument must be a Union. + See json_compat_obj_decode() for argument descriptions. + """ + val = None + if isinstance(obj, six.string_types): + # Handles the shorthand format where the union is serialized as only + # the string of the tag. + tag = obj + if data_type.definition._is_tag_present(tag, self.caller_permissions): + val_data_type = data_type.definition._get_val_data_type( + tag, self.caller_permissions) + if not isinstance(val_data_type, (bv.Void, bv.Nullable)): + raise bv.ValidationError( + "expected object for '%s', got symbol" % tag) + if tag == data_type.definition._catch_all: + raise bv.ValidationError( + "unexpected use of the catch-all tag '%s'" % tag) + elif not self.strict and data_type.definition._catch_all: + tag = data_type.definition._catch_all + else: + raise bv.ValidationError("unknown tag '%s'" % tag) + elif isinstance(obj, dict): + tag, val = self.decode_union_dict( + data_type, obj) + else: + raise bv.ValidationError("expected string or object, got %s" % + bv.generic_type_name(obj)) + return data_type.definition(tag, val) + + def decode_union_dict(self, data_type, obj): + if '.tag' not in obj: + raise bv.ValidationError("missing '.tag' key") + tag = obj['.tag'] + if not isinstance(tag, six.string_types): + raise bv.ValidationError( + 'tag must be string, got %s' % bv.generic_type_name(tag)) + + if not data_type.definition._is_tag_present(tag, self.caller_permissions): + if not self.strict and data_type.definition._catch_all: + return data_type.definition._catch_all, None + else: + raise bv.ValidationError("unknown tag '%s'" % tag) + if tag == data_type.definition._catch_all: + raise bv.ValidationError( + "unexpected use of the catch-all tag '%s'" % tag) + + val_data_type = data_type.definition._get_val_data_type(tag, self.caller_permissions) + if isinstance(val_data_type, bv.Nullable): + val_data_type = val_data_type.validator + nullable = True + else: + nullable = False + + if isinstance(val_data_type, bv.Void): + if self.strict: + # In strict mode, ensure there are no extraneous keys set. In + # non-strict mode, we accept that other keys may be set due to a + # change of the void type to another. + if tag in obj: + if obj[tag] is not None: + raise bv.ValidationError('expected null, got %s' % + bv.generic_type_name(obj[tag])) + for key in obj: + if key != tag and key != '.tag': + raise bv.ValidationError("unexpected key '%s'" % key) + val = None + elif isinstance(val_data_type, + (bv.Primitive, bv.List, bv.StructTree, bv.Union, bv.Map)): + if tag in obj: + raw_val = obj[tag] + try: + val = self.json_compat_obj_decode_helper(val_data_type, raw_val) + except bv.ValidationError as e: + e.add_parent(tag) + raise + else: + # Check no other keys + if nullable: + val = None + else: + raise bv.ValidationError("missing '%s' key" % tag) + for key in obj: + if key != tag and key != '.tag': + raise bv.ValidationError("unexpected key '%s'" % key) + elif isinstance(val_data_type, bv.Struct): + if nullable and len(obj) == 1: # only has a .tag key + val = None + else: + # assume it's not null + raw_val = obj + try: + val = self.json_compat_obj_decode_helper(val_data_type, raw_val) + except bv.ValidationError as e: + e.add_parent(tag) + raise + else: + assert False, type(val_data_type) + return tag, val + + def decode_union_old(self, data_type, obj): + """ + The data_type argument must be a Union. + See json_compat_obj_decode() for argument descriptions. + """ + val = None + if isinstance(obj, six.string_types): + # Union member has no associated value + tag = obj + if data_type.definition._is_tag_present(tag, self.caller_permissions): + val_data_type = data_type.definition._get_val_data_type(tag, + self.caller_permissions) + if not isinstance(val_data_type, (bv.Void, bv.Nullable)): + raise bv.ValidationError( + "expected object for '%s', got symbol" % tag) + else: + if not self.strict and data_type.definition._catch_all: + tag = data_type.definition._catch_all + else: + raise bv.ValidationError("unknown tag '%s'" % tag) + elif isinstance(obj, dict): + # Union member has value + if len(obj) != 1: + raise bv.ValidationError('expected 1 key, got %s' % len(obj)) + tag = list(obj)[0] + raw_val = obj[tag] + if data_type.definition._is_tag_present(tag, self.caller_permissions): + val_data_type = data_type.definition._get_val_data_type(tag, + self.caller_permissions) + if isinstance(val_data_type, bv.Nullable) and raw_val is None: + val = None + elif isinstance(val_data_type, bv.Void): + if raw_val is None or not self.strict: + # If raw_val is None, then this is the more verbose + # representation of a void union member. If raw_val isn't + # None, then maybe the spec has changed, so check if we're + # in strict mode. + val = None + else: + raise bv.ValidationError('expected null, got %s' % + bv.generic_type_name(raw_val)) + else: + try: + val = self.json_compat_obj_decode_helper(val_data_type, raw_val) + except bv.ValidationError as e: + e.add_parent(tag) + raise + else: + if not self.strict and data_type.definition._catch_all: + tag = data_type.definition._catch_all + else: + raise bv.ValidationError("unknown tag '%s'" % tag) + else: + raise bv.ValidationError("expected string or object, got %s" % + bv.generic_type_name(obj)) + return data_type.definition(tag, val) + + def decode_struct_tree(self, data_type, obj): + """ + The data_type argument must be a StructTree. + See json_compat_obj_decode() for argument descriptions. + """ + subtype = self.determine_struct_tree_subtype(data_type, obj) + return self.decode_struct(subtype, obj) + + def determine_struct_tree_subtype(self, data_type, obj): + """ + Searches through the JSON-object-compatible dict using the data type + definition to determine which of the enumerated subtypes `obj` is. + """ + if '.tag' not in obj: + raise bv.ValidationError("missing '.tag' key") + if not isinstance(obj['.tag'], six.string_types): + raise bv.ValidationError('expected string, got %s' % + bv.generic_type_name(obj['.tag']), + parent='.tag') + + # Find the subtype the tags refer to + full_tags_tuple = (obj['.tag'],) + if full_tags_tuple in data_type.definition._tag_to_subtype_: + subtype = data_type.definition._tag_to_subtype_[full_tags_tuple] + if isinstance(subtype, bv.StructTree): + raise bv.ValidationError("tag '%s' refers to non-leaf subtype" % + ('.'.join(full_tags_tuple))) + return subtype + else: + if self.strict: + # In strict mode, the entirety of the tag hierarchy should + # point to a known subtype. + raise bv.ValidationError("unknown subtype '%s'" % + '.'.join(full_tags_tuple)) + else: + # If subtype was not found, use the base. + if data_type.definition._is_catch_all_: + return data_type + else: + raise bv.ValidationError( + "unknown subtype '%s' and '%s' is not a catch-all" % + ('.'.join(full_tags_tuple), data_type.definition.__name__)) + + def decode_list(self, data_type, obj): + """ + The data_type argument must be a List. + See json_compat_obj_decode() for argument descriptions. + """ + if not isinstance(obj, list): + raise bv.ValidationError( + 'expected list, got %s' % bv.generic_type_name(obj)) + return [ + self.json_compat_obj_decode_helper(data_type.item_validator, item) + for item in obj] + + def decode_map(self, data_type, obj): + """ + The data_type argument must be a Map. + See json_compat_obj_decode() for argument descriptions. + """ + if not isinstance(obj, dict): + raise bv.ValidationError( + 'expected dict, got %s' % bv.generic_type_name(obj)) + return { + self.json_compat_obj_decode_helper(data_type.key_validator, key): + self.json_compat_obj_decode_helper(data_type.value_validator, value) + for key, value in obj.items() + } + + def decode_nullable(self, data_type, obj): + """ + The data_type argument must be a Nullable. + See json_compat_obj_decode() for argument descriptions. + """ + if obj is not None: + return self.json_compat_obj_decode_helper(data_type.validator, obj) + else: + return None + + def make_stone_friendly(self, data_type, val, validate): + """ + Convert a Python object to a type that will pass validation by its + validator. + Validation by ``alias_validators`` is performed even if ``validate`` is + false. + """ + if isinstance(data_type, bv.Timestamp): + try: + ret = datetime.datetime.strptime(val, data_type.format) + except (TypeError, ValueError) as e: + raise bv.ValidationError(e.args[0]) + elif isinstance(data_type, bv.Bytes): + if self.for_msgpack: + if isinstance(val, six.text_type): + ret = val.encode('utf-8') + else: + ret = val + else: + try: + ret = base64.b64decode(val) + except TypeError: + raise bv.ValidationError('invalid base64-encoded bytes') + elif isinstance(data_type, bv.Void): + if self.strict and val is not None: + raise bv.ValidationError("expected null, got value") + return None + else: + if validate: + if self.caller_permissions.permissions: + data_type.validate_with_permissions(val, self.caller_permissions) + else: + data_type.validate(val) + ret = val + if self.alias_validators is not None and data_type in self.alias_validators: + self.alias_validators[data_type](ret) + return ret + +def json_decode(data_type, serialized_obj, caller_permissions=None, + alias_validators=None, strict=True, old_style=False): + """Performs the reverse operation of json_encode. + + Args: + data_type (Validator): Validator for serialized_obj. + serialized_obj (str): The JSON string to deserialize. + caller_permissions (list): The list of raw-string caller permissions + with which to serialize. + alias_validators (Optional[Mapping[bv.Validator, Callable[[], None]]]): + Custom validation functions. These must raise bv.ValidationError on + failure. + strict (bool): If strict, then unknown struct fields will raise an + error, and unknown union variants will raise an error even if a + catch all field is specified. strict should only be used by a + recipient of serialized JSON if it's guaranteed that its Stone + specs are at least as recent as the senders it receives messages + from. + + Returns: + The returned object depends on the input data_type. + - Boolean -> bool + - Bytes -> bytes + - Float -> float + - Integer -> long + - List -> list + - Map -> dict + - Nullable -> None or its wrapped type. + - String -> unicode (PY2) or str (PY3) + - Struct -> An instance of its definition attribute. + - Timestamp -> datetime.datetime + - Union -> An instance of its definition attribute. + """ + try: + deserialized_obj = json.loads(serialized_obj) + except ValueError: + raise bv.ValidationError('could not decode input as JSON') + else: + return json_compat_obj_decode( + data_type, deserialized_obj, caller_permissions=caller_permissions, + alias_validators=alias_validators, strict=strict, old_style=old_style) + + +def json_compat_obj_decode(data_type, obj, caller_permissions=None, + alias_validators=None, strict=True, + old_style=False, for_msgpack=False): + """ + Decodes a JSON-compatible object based on its data type into a + representative Python object. + + Args: + data_type (Validator): Validator for serialized_obj. + obj: The JSON-compatible object to decode based on data_type. + caller_permissions (list): The list of raw-string caller permissions + with which to serialize. + strict (bool): If strict, then unknown struct fields will raise an + error, and unknown union variants will raise an error even if a + catch all field is specified. See json_decode() for more. + + Returns: + See json_decode(). + """ + decoder = PythonPrimitiveToStoneDecoder(caller_permissions, + alias_validators, for_msgpack, old_style, strict) + + if isinstance(data_type, bv.Primitive): + return decoder.make_stone_friendly( + data_type, obj, True) + else: + return decoder.json_compat_obj_decode_helper( + data_type, obj) + +# Adapted from: +# http://code.activestate.com/recipes/306860-proleptic-gregorian-dates-and-strftime-before-1900/ +# Remove the unsupposed "%s" command. But don't do it if there's an odd +# number of %s before the s because those are all escaped. Can't simply +# remove the s because the result of %sY should be %Y if %s isn't +# supported, not the 4 digit year. +_ILLEGAL_S = re.compile(r'((^|[^%])(%%)*%s)') + +def _findall(text, substr): + # Also finds overlaps + sites = [] + i = 0 + + while 1: + j = text.find(substr, i) + + if j == -1: + break + + sites.append(j) + i = j + 1 + + return sites + +# Every 28 years the calendar repeats, except through century leap years +# where it's 6 years. But only if you're using the Gregorian calendar. ;) +def _strftime(dt, fmt): + try: + return dt.strftime(fmt) + except ValueError: + if not six.PY2 or dt.year > 1900: + raise + + if _ILLEGAL_S.search(fmt): + raise TypeError("This strftime implementation does not handle %s") + + year = dt.year + + # For every non-leap year century, advance by 6 years to get into the + # 28-year repeat cycle + delta = 2000 - year + off = 6 * (delta // 100 + delta // 400) + year = year + off + + # Move to around the year 2000 + year = year + ((2000 - year) // 28) * 28 + timetuple = dt.timetuple() + s1 = time.strftime(fmt, (year,) + timetuple[1:]) + sites1 = _findall(s1, str(year)) + + s2 = time.strftime(fmt, (year + 28,) + timetuple[1:]) + sites2 = _findall(s2, str(year + 28)) + + sites = [] + + for site in sites1: + if site in sites2: + sites.append(site) + + s = s1 + syear = '%4d' % (dt.year,) + + for site in sites: + s = s[:site] + syear + s[site + 4:] + + return s + + +try: + import msgpack +except ImportError: + pass +else: + msgpack_compat_obj_encode = functools.partial(json_compat_obj_encode, + for_msgpack=True) + + def msgpack_encode(data_type, obj): + return msgpack.dumps( + msgpack_compat_obj_encode(data_type, obj), encoding='utf-8') + + msgpack_compat_obj_decode = functools.partial(json_compat_obj_decode, + for_msgpack=True) + + def msgpack_decode( + data_type, serialized_obj, alias_validators=None, strict=True): + # We decode everything as utf-8 because we want all object keys to be + # unicode. Otherwise, we need to do a lot more refactoring to make + # json/msgpack share the same code. We expect byte arrays to fail + # decoding, but when they don't, we have to convert them to bytes. + deserialized_obj = msgpack.loads( + serialized_obj, encoding='utf-8', unicode_errors='ignore') + return msgpack_compat_obj_decode( + data_type, deserialized_obj, alias_validators, strict) diff --git a/dropbox-script/dropbox/stone_validators.py b/dropbox-script/dropbox/stone_validators.py new file mode 100644 index 0000000..f512989 --- /dev/null +++ b/dropbox-script/dropbox/stone_validators.py @@ -0,0 +1,673 @@ +""" +Defines classes to represent each Stone type in Python. These classes should +be used to validate Python objects and normalize them for a given type. + +The data types defined here should not be specific to an RPC or serialization +format. + +This module should be dropped into a project that requires the use of Stone. In +the future, this could be imported from a pre-installed Python package, rather +than being added to a project. +""" + +from __future__ import absolute_import, unicode_literals + +from abc import ABCMeta, abstractmethod +import datetime +import hashlib +import math +import numbers +import re +import six + +_MYPY = False +if _MYPY: + import typing # noqa: F401 # pylint: disable=import-error,unused-import,useless-suppression + +# See +if six.PY3: + _binary_types = (bytes, memoryview) # noqa: E501,F821 # pylint: disable=undefined-variable,useless-suppression +else: + _binary_types = (bytes, buffer) # noqa: E501,F821 # pylint: disable=undefined-variable,useless-suppression + + +class ValidationError(Exception): + """Raised when a value doesn't pass validation by its validator.""" + + def __init__(self, message, parent=None): + """ + Args: + message (str): Error message detailing validation failure. + parent (str): Adds the parent as the closest reference point for + the error. Use :meth:`add_parent` to add more. + """ + super(ValidationError, self).__init__(message) + self.message = message + self._parents = [] + if parent: + self._parents.append(parent) + + def add_parent(self, parent): + """ + Args: + parent (str): Adds the parent to the top of the tree of references + that lead to the validator that failed. + """ + self._parents.append(parent) + + def __str__(self): + """ + Returns: + str: A descriptive message of the validation error that may also + include the path to the validator that failed. + """ + if self._parents: + return '{}: {}'.format('.'.join(self._parents[::-1]), self.message) + else: + return self.message + + def __repr__(self): + # Not a perfect repr, but includes the error location information. + return 'ValidationError(%r)' % six.text_type(self) + + +def generic_type_name(v): + """Return a descriptive type name that isn't Python specific. For example, + an int value will return 'integer' rather than 'int'.""" + if isinstance(v, bool): + # Must come before any numbers checks since booleans are integers too + return 'boolean' + elif isinstance(v, numbers.Integral): + # Must come before real numbers check since integrals are reals too + return 'integer' + elif isinstance(v, numbers.Real): + return 'float' + elif isinstance(v, (tuple, list)): + return 'list' + elif isinstance(v, six.string_types): + return 'string' + elif v is None: + return 'null' + else: + return type(v).__name__ + + +class Validator(object): + """All primitive and composite data types should be a subclass of this.""" + __metaclass__ = ABCMeta + + @abstractmethod + def validate(self, val): + """Validates that val is of this data type. + + Returns: A normalized value if validation succeeds. + Raises: ValidationError + """ + pass + + def has_default(self): + return False + + def get_default(self): + raise AssertionError('No default available.') + + +class Primitive(Validator): + """A basic type that is defined by Stone.""" + # pylint: disable=abstract-method + pass + + +class Boolean(Primitive): + + def validate(self, val): + if not isinstance(val, bool): + raise ValidationError('%r is not a valid boolean' % val) + return val + + +class Integer(Primitive): + """ + Do not use this class directly. Extend it and specify a 'minimum' and + 'maximum' value as class variables for a more restrictive integer range. + """ + minimum = None # type: typing.Optional[int] + maximum = None # type: typing.Optional[int] + + def __init__(self, min_value=None, max_value=None): + """ + A more restrictive minimum or maximum value can be specified than the + range inherent to the defined type. + """ + if min_value is not None: + assert isinstance(min_value, numbers.Integral), \ + 'min_value must be an integral number' + assert min_value >= self.minimum, \ + 'min_value cannot be less than the minimum value for this ' \ + 'type (%d < %d)' % (min_value, self.minimum) + self.minimum = min_value + if max_value is not None: + assert isinstance(max_value, numbers.Integral), \ + 'max_value must be an integral number' + assert max_value <= self.maximum, \ + 'max_value cannot be greater than the maximum value for ' \ + 'this type (%d < %d)' % (max_value, self.maximum) + self.maximum = max_value + + def validate(self, val): + if not isinstance(val, numbers.Integral): + raise ValidationError('expected integer, got %s' + % generic_type_name(val)) + elif not (self.minimum <= val <= self.maximum): + raise ValidationError('%d is not within range [%d, %d]' + % (val, self.minimum, self.maximum)) + return val + + def __repr__(self): + return '%s()' % self.__class__.__name__ + + +class Int32(Integer): + minimum = -2**31 + maximum = 2**31 - 1 + + +class UInt32(Integer): + minimum = 0 + maximum = 2**32 - 1 + + +class Int64(Integer): + minimum = -2**63 + maximum = 2**63 - 1 + + +class UInt64(Integer): + minimum = 0 + maximum = 2**64 - 1 + + +class Real(Primitive): + """ + Do not use this class directly. Extend it and optionally set a 'minimum' + and 'maximum' value to enforce a range that's a subset of the Python float + implementation. Python floats are doubles. + """ + minimum = None # type: typing.Optional[float] + maximum = None # type: typing.Optional[float] + + def __init__(self, min_value=None, max_value=None): + """ + A more restrictive minimum or maximum value can be specified than the + range inherent to the defined type. + """ + if min_value is not None: + assert isinstance(min_value, numbers.Real), \ + 'min_value must be a real number' + if not isinstance(min_value, float): + try: + min_value = float(min_value) + except OverflowError: + raise AssertionError('min_value is too small for a float') + if self.minimum is not None and min_value < self.minimum: + raise AssertionError('min_value cannot be less than the ' + 'minimum value for this type (%f < %f)' % + (min_value, self.minimum)) + self.minimum = min_value + if max_value is not None: + assert isinstance(max_value, numbers.Real), \ + 'max_value must be a real number' + if not isinstance(max_value, float): + try: + max_value = float(max_value) + except OverflowError: + raise AssertionError('max_value is too large for a float') + if self.maximum is not None and max_value > self.maximum: + raise AssertionError('max_value cannot be greater than the ' + 'maximum value for this type (%f < %f)' % + (max_value, self.maximum)) + self.maximum = max_value + + def validate(self, val): + if not isinstance(val, numbers.Real): + raise ValidationError('expected real number, got %s' % + generic_type_name(val)) + if not isinstance(val, float): + # This checks for the case where a number is passed in with a + # magnitude larger than supported by float64. + try: + val = float(val) + except OverflowError: + raise ValidationError('too large for float') + if math.isnan(val) or math.isinf(val): + raise ValidationError('%f values are not supported' % val) + if self.minimum is not None and val < self.minimum: + raise ValidationError('%f is not greater than %f' % + (val, self.minimum)) + if self.maximum is not None and val > self.maximum: + raise ValidationError('%f is not less than %f' % + (val, self.maximum)) + return val + + def __repr__(self): + return '%s()' % self.__class__.__name__ + + +class Float32(Real): + # Maximum and minimums from the IEEE 754-1985 standard + minimum = -3.40282 * 10**38 + maximum = 3.40282 * 10**38 + + +class Float64(Real): + pass + + +class String(Primitive): + """Represents a unicode string.""" + + def __init__(self, min_length=None, max_length=None, pattern=None): + if min_length is not None: + assert isinstance(min_length, numbers.Integral), \ + 'min_length must be an integral number' + assert min_length >= 0, 'min_length must be >= 0' + if max_length is not None: + assert isinstance(max_length, numbers.Integral), \ + 'max_length must be an integral number' + assert max_length > 0, 'max_length must be > 0' + if min_length and max_length: + assert max_length >= min_length, 'max_length must be >= min_length' + if pattern is not None: + assert isinstance(pattern, six.string_types), \ + 'pattern must be a string' + + self.min_length = min_length + self.max_length = max_length + self.pattern = pattern + self.pattern_re = None + + if pattern: + try: + self.pattern_re = re.compile(r"\A(?:" + pattern + r")\Z") + except re.error as e: + raise AssertionError('Regex {!r} failed: {}'.format( + pattern, e.args[0])) + + def validate(self, val): + """ + A unicode string of the correct length and pattern will pass validation. + In PY2, we enforce that a str type must be valid utf-8, and a unicode + string will be returned. + """ + if not isinstance(val, six.string_types): + raise ValidationError("'%s' expected to be a string, got %s" + % (val, generic_type_name(val))) + if not six.PY3 and isinstance(val, str): + try: + val = val.decode('utf-8') + except UnicodeDecodeError: + raise ValidationError("'%s' was not valid utf-8") + + if self.max_length is not None and len(val) > self.max_length: + raise ValidationError("'%s' must be at most %d characters, got %d" + % (val, self.max_length, len(val))) + if self.min_length is not None and len(val) < self.min_length: + raise ValidationError("'%s' must be at least %d characters, got %d" + % (val, self.min_length, len(val))) + + if self.pattern and not self.pattern_re.match(val): + raise ValidationError("'%s' did not match pattern '%s'" + % (val, self.pattern)) + return val + + +class Bytes(Primitive): + + def __init__(self, min_length=None, max_length=None): + if min_length is not None: + assert isinstance(min_length, numbers.Integral), \ + 'min_length must be an integral number' + assert min_length >= 0, 'min_length must be >= 0' + if max_length is not None: + assert isinstance(max_length, numbers.Integral), \ + 'max_length must be an integral number' + assert max_length > 0, 'max_length must be > 0' + if min_length is not None and max_length is not None: + assert max_length >= min_length, 'max_length must be >= min_length' + + self.min_length = min_length + self.max_length = max_length + + def validate(self, val): + if not isinstance(val, _binary_types): + raise ValidationError("expected bytes type, got %s" + % generic_type_name(val)) + elif self.max_length is not None and len(val) > self.max_length: + raise ValidationError("'%s' must have at most %d bytes, got %d" + % (val, self.max_length, len(val))) + elif self.min_length is not None and len(val) < self.min_length: + raise ValidationError("'%s' has fewer than %d bytes, got %d" + % (val, self.min_length, len(val))) + return val + + +class Timestamp(Primitive): + """Note that while a format is specified, it isn't used in validation + since a native Python datetime object is preferred. The format, however, + can and should be used by serializers.""" + + def __init__(self, fmt): + """fmt must be composed of format codes that the C standard (1989) + supports, most notably in its strftime() function.""" + assert isinstance(fmt, six.text_type), 'format must be a string' + self.format = fmt + + def validate(self, val): + if not isinstance(val, datetime.datetime): + raise ValidationError('expected timestamp, got %s' + % generic_type_name(val)) + elif val.tzinfo is not None and \ + val.tzinfo.utcoffset(val).total_seconds() != 0: + raise ValidationError('timestamp should have either a UTC ' + 'timezone or none set at all') + return val + + +class Composite(Validator): + """Validator for a type that builds on other primitive and composite + types.""" + # pylint: disable=abstract-method + pass + + +class List(Composite): + """Assumes list contents are homogeneous with respect to types.""" + + def __init__(self, item_validator, min_items=None, max_items=None): + """Every list item will be validated with item_validator.""" + self.item_validator = item_validator + if min_items is not None: + assert isinstance(min_items, numbers.Integral), \ + 'min_items must be an integral number' + assert min_items >= 0, 'min_items must be >= 0' + if max_items is not None: + assert isinstance(max_items, numbers.Integral), \ + 'max_items must be an integral number' + assert max_items > 0, 'max_items must be > 0' + if min_items is not None and max_items is not None: + assert max_items >= min_items, 'max_items must be >= min_items' + + self.min_items = min_items + self.max_items = max_items + + def validate(self, val): + if not isinstance(val, (tuple, list)): + raise ValidationError('%r is not a valid list' % val) + elif self.max_items is not None and len(val) > self.max_items: + raise ValidationError('%r has more than %s items' + % (val, self.max_items)) + elif self.min_items is not None and len(val) < self.min_items: + raise ValidationError('%r has fewer than %s items' + % (val, self.min_items)) + return [self.item_validator.validate(item) for item in val] + + +class Map(Composite): + """Assumes map keys and values are homogeneous with respect to types.""" + + def __init__(self, key_validator, value_validator): + """ + Every Map key/value pair will be validated with item_validator. + key validators must be a subclass of a String validator + """ + self.key_validator = key_validator + self.value_validator = value_validator + + def validate(self, val): + if not isinstance(val, dict): + raise ValidationError('%r is not a valid dict' % val) + return { + self.key_validator.validate(key): + self.value_validator.validate(value) for key, value in val.items() + } + + +class Struct(Composite): + + def __init__(self, definition): + """ + Args: + definition (class): A generated class representing a Stone struct + from a spec. Must have a _fields_ attribute with the following + structure: + + _fields_ = [(field_name, validator), ...] + + where + field_name: Name of the field (str). + validator: Validator object. + """ + super(Struct, self).__init__() + self.definition = definition + + def validate(self, val): + """ + For a val to pass validation, val must be of the correct type and have + all required fields present. + """ + self.validate_type_only(val) + self.validate_fields_only(val) + return val + + def validate_with_permissions(self, val, caller_permissions): + """ + For a val to pass validation, val must be of the correct type and have + all required permissioned fields present. Should only be called + for callers with extra permissions. + """ + self.validate(val) + self.validate_fields_only_with_permissions(val, caller_permissions) + return val + + def validate_fields_only(self, val): + """ + To pass field validation, no required field should be missing. + + This method assumes that the contents of each field have already been + validated on assignment, so it's merely a presence check. + + FIXME(kelkabany): Since the definition object does not maintain a list + of which fields are required, all fields are scanned. + """ + for field_name in self.definition._all_field_names_: + if not hasattr(val, field_name): + raise ValidationError("missing required field '%s'" % + field_name) + + def validate_fields_only_with_permissions(self, val, caller_permissions): + """ + To pass field validation, no required field should be missing. + This method assumes that the contents of each field have already been + validated on assignment, so it's merely a presence check. + Should only be called for callers with extra permissions. + """ + self.validate_fields_only(val) + + # check if type has been patched + for extra_permission in caller_permissions.permissions: + all_field_names = '_all_{}_field_names_'.format(extra_permission) + for field_name in getattr(self.definition, all_field_names, set()): + if not hasattr(val, field_name): + raise ValidationError("missing required field '%s'" % field_name) + + def validate_type_only(self, val): + """ + Use this when you only want to validate that the type of an object + is correct, but not yet validate each field. + """ + # Since the definition maintains the list of fields for serialization, + # we're okay with a subclass that might have extra information. This + # makes it easier to return one subclass for two routes, one of which + # relies on the parent class. + if not isinstance(val, self.definition): + raise ValidationError('expected type %s, got %s' % + (self.definition.__name__, generic_type_name(val))) + + def has_default(self): + return not self.definition._has_required_fields + + def get_default(self): + assert not self.definition._has_required_fields, 'No default available.' + return self.definition() + + +class StructTree(Struct): + """Validator for structs with enumerated subtypes. + + NOTE: validate_fields_only() validates the fields known to this base + struct, but does not do any validation specific to the subtype. + """ + + # See PyCQA/pylint#1043 for why this is disabled; this should show up + # as a usless-suppression (and can be removed) once a fix is released + def __init__(self, definition): # pylint: disable=useless-super-delegation + super(StructTree, self).__init__(definition) + + +class Union(Composite): + + def __init__(self, definition): + """ + Args: + definition (class): A generated class representing a Stone union + from a spec. Must have a _tagmap attribute with the following + structure: + + _tagmap = {field_name: validator, ...} + + where + field_name (str): Tag name. + validator (Validator): Tag value validator. + """ + self.definition = definition + + def validate(self, val): + """ + For a val to pass validation, it must have a _tag set. This assumes + that the object validated that _tag is a valid tag, and that any + associated value has also been validated. + """ + self.validate_type_only(val) + if not hasattr(val, '_tag') or val._tag is None: + raise ValidationError('no tag set') + return val + + def validate_type_only(self, val): + """ + Use this when you only want to validate that the type of an object + is correct, but not yet validate each field. + + We check whether val is a Python parent class of the definition. This + is because Union subtyping works in the opposite direction of Python + inheritance. For example, if a union U2 extends U1 in Python, this + validator will accept U1 in places where U2 is expected. + """ + if not issubclass(self.definition, type(val)): + raise ValidationError('expected type %s or subtype, got %s' % + (self.definition.__name__, generic_type_name(val))) + + +class Void(Primitive): + + def validate(self, val): + if val is not None: + raise ValidationError('expected NoneType, got %s' % + generic_type_name(val)) + + def has_default(self): + return True + + def get_default(self): + return None + + +class Nullable(Validator): + + def __init__(self, validator): + assert isinstance(validator, (Primitive, Composite)), \ + 'validator must be for a primitive or composite type' + assert not isinstance(validator, Nullable), \ + 'nullables cannot be stacked' + assert not isinstance(validator, Void), \ + 'void cannot be made nullable' + self.validator = validator + + def validate(self, val): + if val is None: + return + else: + return self.validator.validate(val) + + def validate_type_only(self, val): + """Use this only if Nullable is wrapping a Composite.""" + if val is None: + return + else: + return self.validator.validate_type_only(val) + + def has_default(self): + return True + + def get_default(self): + return None + +class Redactor(object): + def __init__(self, regex): + """ + Args: + regex: What parts of the field to redact. + """ + self.regex = regex + + @abstractmethod + def apply(self, val): + """Redacts information from annotated field. + Returns: A redacted version of the string provided. + """ + pass + + def _get_matches(self, val): + if not self.regex: + return None + try: + return re.search(self.regex, val) + except TypeError: + return None + + +class HashRedactor(Redactor): + def apply(self, val): + matches = self._get_matches(val) + + val_to_hash = str(val) if isinstance(val, int) or isinstance(val, float) else val + + try: + # add string literal to ensure unicode + hashed = hashlib.md5(val_to_hash.encode('utf-8')).hexdigest() + '' + except [AttributeError, ValueError]: + hashed = None + + if matches: + blotted = '***'.join(matches.groups()) + if hashed: + return '{} ({})'.format(hashed, blotted) + return blotted + return hashed + + +class BlotRedactor(Redactor): + def apply(self, val): + matches = self._get_matches(val) + if matches: + return '***'.join(matches.groups()) + return '********' diff --git a/dropbox-script/dropbox/team.py b/dropbox-script/dropbox/team.py new file mode 100644 index 0000000..8f744a1 --- /dev/null +++ b/dropbox-script/dropbox/team.py @@ -0,0 +1,19382 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# @generated +# flake8: noqa +# pylint: skip-file +try: + from . import stone_validators as bv + from . import stone_base as bb +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bv + import stone_base as bb + +try: + from . import ( + async_, + common, + file_properties, + files, + team_common, + team_policies, + users, + users_common, + ) +except (ImportError, SystemError, ValueError): + import async_ + import common + import file_properties + import files + import team_common + import team_policies + import users + import users_common + +class DeviceSession(bb.Struct): + """ + :ivar session_id: The session id. + :ivar ip_address: The IP address of the last activity from this session. + :ivar country: The country from which the last activity from this session + was made. + :ivar created: The time this session was created. + :ivar updated: The time of the last activity from this session. + """ + + __slots__ = [ + '_session_id_value', + '_session_id_present', + '_ip_address_value', + '_ip_address_present', + '_country_value', + '_country_present', + '_created_value', + '_created_present', + '_updated_value', + '_updated_present', + ] + + _has_required_fields = True + + def __init__(self, + session_id=None, + ip_address=None, + country=None, + created=None, + updated=None): + self._session_id_value = None + self._session_id_present = False + self._ip_address_value = None + self._ip_address_present = False + self._country_value = None + self._country_present = False + self._created_value = None + self._created_present = False + self._updated_value = None + self._updated_present = False + if session_id is not None: + self.session_id = session_id + if ip_address is not None: + self.ip_address = ip_address + if country is not None: + self.country = country + if created is not None: + self.created = created + if updated is not None: + self.updated = updated + + @property + def session_id(self): + """ + The session id. + + :rtype: str + """ + if self._session_id_present: + return self._session_id_value + else: + raise AttributeError("missing required field 'session_id'") + + @session_id.setter + def session_id(self, val): + val = self._session_id_validator.validate(val) + self._session_id_value = val + self._session_id_present = True + + @session_id.deleter + def session_id(self): + self._session_id_value = None + self._session_id_present = False + + @property + def ip_address(self): + """ + The IP address of the last activity from this session. + + :rtype: str + """ + if self._ip_address_present: + return self._ip_address_value + else: + return None + + @ip_address.setter + def ip_address(self, val): + if val is None: + del self.ip_address + return + val = self._ip_address_validator.validate(val) + self._ip_address_value = val + self._ip_address_present = True + + @ip_address.deleter + def ip_address(self): + self._ip_address_value = None + self._ip_address_present = False + + @property + def country(self): + """ + The country from which the last activity from this session was made. + + :rtype: str + """ + if self._country_present: + return self._country_value + else: + return None + + @country.setter + def country(self, val): + if val is None: + del self.country + return + val = self._country_validator.validate(val) + self._country_value = val + self._country_present = True + + @country.deleter + def country(self): + self._country_value = None + self._country_present = False + + @property + def created(self): + """ + The time this session was created. + + :rtype: datetime.datetime + """ + if self._created_present: + return self._created_value + else: + return None + + @created.setter + def created(self, val): + if val is None: + del self.created + return + val = self._created_validator.validate(val) + self._created_value = val + self._created_present = True + + @created.deleter + def created(self): + self._created_value = None + self._created_present = False + + @property + def updated(self): + """ + The time of the last activity from this session. + + :rtype: datetime.datetime + """ + if self._updated_present: + return self._updated_value + else: + return None + + @updated.setter + def updated(self, val): + if val is None: + del self.updated + return + val = self._updated_validator.validate(val) + self._updated_value = val + self._updated_present = True + + @updated.deleter + def updated(self): + self._updated_value = None + self._updated_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceSession, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceSession(session_id={!r}, ip_address={!r}, country={!r}, created={!r}, updated={!r})'.format( + self._session_id_value, + self._ip_address_value, + self._country_value, + self._created_value, + self._updated_value, + ) + +DeviceSession_validator = bv.Struct(DeviceSession) + +class ActiveWebSession(DeviceSession): + """ + Information on active web sessions. + + :ivar user_agent: Information on the hosting device. + :ivar os: Information on the hosting operating system. + :ivar browser: Information on the browser used for this web session. + :ivar expires: The time this session expires. + """ + + __slots__ = [ + '_user_agent_value', + '_user_agent_present', + '_os_value', + '_os_present', + '_browser_value', + '_browser_present', + '_expires_value', + '_expires_present', + ] + + _has_required_fields = True + + def __init__(self, + session_id=None, + user_agent=None, + os=None, + browser=None, + ip_address=None, + country=None, + created=None, + updated=None, + expires=None): + super(ActiveWebSession, self).__init__(session_id, + ip_address, + country, + created, + updated) + self._user_agent_value = None + self._user_agent_present = False + self._os_value = None + self._os_present = False + self._browser_value = None + self._browser_present = False + self._expires_value = None + self._expires_present = False + if user_agent is not None: + self.user_agent = user_agent + if os is not None: + self.os = os + if browser is not None: + self.browser = browser + if expires is not None: + self.expires = expires + + @property + def user_agent(self): + """ + Information on the hosting device. + + :rtype: str + """ + if self._user_agent_present: + return self._user_agent_value + else: + raise AttributeError("missing required field 'user_agent'") + + @user_agent.setter + def user_agent(self, val): + val = self._user_agent_validator.validate(val) + self._user_agent_value = val + self._user_agent_present = True + + @user_agent.deleter + def user_agent(self): + self._user_agent_value = None + self._user_agent_present = False + + @property + def os(self): + """ + Information on the hosting operating system. + + :rtype: str + """ + if self._os_present: + return self._os_value + else: + raise AttributeError("missing required field 'os'") + + @os.setter + def os(self, val): + val = self._os_validator.validate(val) + self._os_value = val + self._os_present = True + + @os.deleter + def os(self): + self._os_value = None + self._os_present = False + + @property + def browser(self): + """ + Information on the browser used for this web session. + + :rtype: str + """ + if self._browser_present: + return self._browser_value + else: + raise AttributeError("missing required field 'browser'") + + @browser.setter + def browser(self, val): + val = self._browser_validator.validate(val) + self._browser_value = val + self._browser_present = True + + @browser.deleter + def browser(self): + self._browser_value = None + self._browser_present = False + + @property + def expires(self): + """ + The time this session expires. + + :rtype: datetime.datetime + """ + if self._expires_present: + return self._expires_value + else: + return None + + @expires.setter + def expires(self, val): + if val is None: + del self.expires + return + val = self._expires_validator.validate(val) + self._expires_value = val + self._expires_present = True + + @expires.deleter + def expires(self): + self._expires_value = None + self._expires_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ActiveWebSession, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ActiveWebSession(session_id={!r}, user_agent={!r}, os={!r}, browser={!r}, ip_address={!r}, country={!r}, created={!r}, updated={!r}, expires={!r})'.format( + self._session_id_value, + self._user_agent_value, + self._os_value, + self._browser_value, + self._ip_address_value, + self._country_value, + self._created_value, + self._updated_value, + self._expires_value, + ) + +ActiveWebSession_validator = bv.Struct(ActiveWebSession) + +class AdminTier(bb.Union): + """ + Describes which team-related admin permissions a user has. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar team_admin: User is an administrator of the team - has all + permissions. + :ivar user_management_admin: User can do most user provisioning, + de-provisioning and management. + :ivar support_admin: User can do a limited set of common support tasks for + existing users. + :ivar member_only: User is not an admin of the team. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + team_admin = None + # Attribute is overwritten below the class definition + user_management_admin = None + # Attribute is overwritten below the class definition + support_admin = None + # Attribute is overwritten below the class definition + member_only = None + + def is_team_admin(self): + """ + Check if the union tag is ``team_admin``. + + :rtype: bool + """ + return self._tag == 'team_admin' + + def is_user_management_admin(self): + """ + Check if the union tag is ``user_management_admin``. + + :rtype: bool + """ + return self._tag == 'user_management_admin' + + def is_support_admin(self): + """ + Check if the union tag is ``support_admin``. + + :rtype: bool + """ + return self._tag == 'support_admin' + + def is_member_only(self): + """ + Check if the union tag is ``member_only``. + + :rtype: bool + """ + return self._tag == 'member_only' + + def _process_custom_annotations(self, annotation_type, processor): + super(AdminTier, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AdminTier(%r, %r)' % (self._tag, self._value) + +AdminTier_validator = bv.Union(AdminTier) + +class ApiApp(bb.Struct): + """ + Information on linked third party applications. + + :ivar app_id: The application unique id. + :ivar app_name: The application name. + :ivar publisher: The application publisher name. + :ivar publisher_url: The publisher's URL. + :ivar linked: The time this application was linked. + :ivar is_app_folder: Whether the linked application uses a dedicated folder. + """ + + __slots__ = [ + '_app_id_value', + '_app_id_present', + '_app_name_value', + '_app_name_present', + '_publisher_value', + '_publisher_present', + '_publisher_url_value', + '_publisher_url_present', + '_linked_value', + '_linked_present', + '_is_app_folder_value', + '_is_app_folder_present', + ] + + _has_required_fields = True + + def __init__(self, + app_id=None, + app_name=None, + is_app_folder=None, + publisher=None, + publisher_url=None, + linked=None): + self._app_id_value = None + self._app_id_present = False + self._app_name_value = None + self._app_name_present = False + self._publisher_value = None + self._publisher_present = False + self._publisher_url_value = None + self._publisher_url_present = False + self._linked_value = None + self._linked_present = False + self._is_app_folder_value = None + self._is_app_folder_present = False + if app_id is not None: + self.app_id = app_id + if app_name is not None: + self.app_name = app_name + if publisher is not None: + self.publisher = publisher + if publisher_url is not None: + self.publisher_url = publisher_url + if linked is not None: + self.linked = linked + if is_app_folder is not None: + self.is_app_folder = is_app_folder + + @property + def app_id(self): + """ + The application unique id. + + :rtype: str + """ + if self._app_id_present: + return self._app_id_value + else: + raise AttributeError("missing required field 'app_id'") + + @app_id.setter + def app_id(self, val): + val = self._app_id_validator.validate(val) + self._app_id_value = val + self._app_id_present = True + + @app_id.deleter + def app_id(self): + self._app_id_value = None + self._app_id_present = False + + @property + def app_name(self): + """ + The application name. + + :rtype: str + """ + if self._app_name_present: + return self._app_name_value + else: + raise AttributeError("missing required field 'app_name'") + + @app_name.setter + def app_name(self, val): + val = self._app_name_validator.validate(val) + self._app_name_value = val + self._app_name_present = True + + @app_name.deleter + def app_name(self): + self._app_name_value = None + self._app_name_present = False + + @property + def publisher(self): + """ + The application publisher name. + + :rtype: str + """ + if self._publisher_present: + return self._publisher_value + else: + return None + + @publisher.setter + def publisher(self, val): + if val is None: + del self.publisher + return + val = self._publisher_validator.validate(val) + self._publisher_value = val + self._publisher_present = True + + @publisher.deleter + def publisher(self): + self._publisher_value = None + self._publisher_present = False + + @property + def publisher_url(self): + """ + The publisher's URL. + + :rtype: str + """ + if self._publisher_url_present: + return self._publisher_url_value + else: + return None + + @publisher_url.setter + def publisher_url(self, val): + if val is None: + del self.publisher_url + return + val = self._publisher_url_validator.validate(val) + self._publisher_url_value = val + self._publisher_url_present = True + + @publisher_url.deleter + def publisher_url(self): + self._publisher_url_value = None + self._publisher_url_present = False + + @property + def linked(self): + """ + The time this application was linked. + + :rtype: datetime.datetime + """ + if self._linked_present: + return self._linked_value + else: + return None + + @linked.setter + def linked(self, val): + if val is None: + del self.linked + return + val = self._linked_validator.validate(val) + self._linked_value = val + self._linked_present = True + + @linked.deleter + def linked(self): + self._linked_value = None + self._linked_present = False + + @property + def is_app_folder(self): + """ + Whether the linked application uses a dedicated folder. + + :rtype: bool + """ + if self._is_app_folder_present: + return self._is_app_folder_value + else: + raise AttributeError("missing required field 'is_app_folder'") + + @is_app_folder.setter + def is_app_folder(self, val): + val = self._is_app_folder_validator.validate(val) + self._is_app_folder_value = val + self._is_app_folder_present = True + + @is_app_folder.deleter + def is_app_folder(self): + self._is_app_folder_value = None + self._is_app_folder_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ApiApp, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ApiApp(app_id={!r}, app_name={!r}, is_app_folder={!r}, publisher={!r}, publisher_url={!r}, linked={!r})'.format( + self._app_id_value, + self._app_name_value, + self._is_app_folder_value, + self._publisher_value, + self._publisher_url_value, + self._linked_value, + ) + +ApiApp_validator = bv.Struct(ApiApp) + +class BaseDfbReport(bb.Struct): + """ + Base report structure. + + :ivar start_date: First date present in the results as 'YYYY-MM-DD' or None. + """ + + __slots__ = [ + '_start_date_value', + '_start_date_present', + ] + + _has_required_fields = True + + def __init__(self, + start_date=None): + self._start_date_value = None + self._start_date_present = False + if start_date is not None: + self.start_date = start_date + + @property + def start_date(self): + """ + First date present in the results as 'YYYY-MM-DD' or None. + + :rtype: str + """ + if self._start_date_present: + return self._start_date_value + else: + raise AttributeError("missing required field 'start_date'") + + @start_date.setter + def start_date(self, val): + val = self._start_date_validator.validate(val) + self._start_date_value = val + self._start_date_present = True + + @start_date.deleter + def start_date(self): + self._start_date_value = None + self._start_date_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(BaseDfbReport, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'BaseDfbReport(start_date={!r})'.format( + self._start_date_value, + ) + +BaseDfbReport_validator = bv.Struct(BaseDfbReport) + +class BaseTeamFolderError(bb.Union): + """ + Base error that all errors for existing team folders should extend. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def access_error(cls, val): + """ + Create an instance of this class set to the ``access_error`` tag with + value ``val``. + + :param TeamFolderAccessError val: + :rtype: BaseTeamFolderError + """ + return cls('access_error', val) + + @classmethod + def status_error(cls, val): + """ + Create an instance of this class set to the ``status_error`` tag with + value ``val``. + + :param TeamFolderInvalidStatusError val: + :rtype: BaseTeamFolderError + """ + return cls('status_error', val) + + @classmethod + def team_shared_dropbox_error(cls, val): + """ + Create an instance of this class set to the + ``team_shared_dropbox_error`` tag with value ``val``. + + :param TeamFolderTeamSharedDropboxError val: + :rtype: BaseTeamFolderError + """ + return cls('team_shared_dropbox_error', val) + + def is_access_error(self): + """ + Check if the union tag is ``access_error``. + + :rtype: bool + """ + return self._tag == 'access_error' + + def is_status_error(self): + """ + Check if the union tag is ``status_error``. + + :rtype: bool + """ + return self._tag == 'status_error' + + def is_team_shared_dropbox_error(self): + """ + Check if the union tag is ``team_shared_dropbox_error``. + + :rtype: bool + """ + return self._tag == 'team_shared_dropbox_error' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_access_error(self): + """ + Only call this if :meth:`is_access_error` is true. + + :rtype: TeamFolderAccessError + """ + if not self.is_access_error(): + raise AttributeError("tag 'access_error' not set") + return self._value + + def get_status_error(self): + """ + Only call this if :meth:`is_status_error` is true. + + :rtype: TeamFolderInvalidStatusError + """ + if not self.is_status_error(): + raise AttributeError("tag 'status_error' not set") + return self._value + + def get_team_shared_dropbox_error(self): + """ + Only call this if :meth:`is_team_shared_dropbox_error` is true. + + :rtype: TeamFolderTeamSharedDropboxError + """ + if not self.is_team_shared_dropbox_error(): + raise AttributeError("tag 'team_shared_dropbox_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(BaseTeamFolderError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'BaseTeamFolderError(%r, %r)' % (self._tag, self._value) + +BaseTeamFolderError_validator = bv.Union(BaseTeamFolderError) + +class CustomQuotaError(bb.Union): + """ + Error returned when getting member custom quota. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar too_many_users: A maximum of 1000 users can be set for a single call. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + too_many_users = None + # Attribute is overwritten below the class definition + other = None + + def is_too_many_users(self): + """ + Check if the union tag is ``too_many_users``. + + :rtype: bool + """ + return self._tag == 'too_many_users' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(CustomQuotaError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CustomQuotaError(%r, %r)' % (self._tag, self._value) + +CustomQuotaError_validator = bv.Union(CustomQuotaError) + +class CustomQuotaResult(bb.Union): + """ + User custom quota. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar UserCustomQuotaResult success: User's custom quota. + :ivar UserSelectorArg invalid_user: Invalid user (not in team). + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def success(cls, val): + """ + Create an instance of this class set to the ``success`` tag with value + ``val``. + + :param UserCustomQuotaResult val: + :rtype: CustomQuotaResult + """ + return cls('success', val) + + @classmethod + def invalid_user(cls, val): + """ + Create an instance of this class set to the ``invalid_user`` tag with + value ``val``. + + :param UserSelectorArg val: + :rtype: CustomQuotaResult + """ + return cls('invalid_user', val) + + def is_success(self): + """ + Check if the union tag is ``success``. + + :rtype: bool + """ + return self._tag == 'success' + + def is_invalid_user(self): + """ + Check if the union tag is ``invalid_user``. + + :rtype: bool + """ + return self._tag == 'invalid_user' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_success(self): + """ + User's custom quota. + + Only call this if :meth:`is_success` is true. + + :rtype: UserCustomQuotaResult + """ + if not self.is_success(): + raise AttributeError("tag 'success' not set") + return self._value + + def get_invalid_user(self): + """ + Invalid user (not in team). + + Only call this if :meth:`is_invalid_user` is true. + + :rtype: UserSelectorArg + """ + if not self.is_invalid_user(): + raise AttributeError("tag 'invalid_user' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(CustomQuotaResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CustomQuotaResult(%r, %r)' % (self._tag, self._value) + +CustomQuotaResult_validator = bv.Union(CustomQuotaResult) + +class CustomQuotaUsersArg(bb.Struct): + """ + :ivar users: List of users. + """ + + __slots__ = [ + '_users_value', + '_users_present', + ] + + _has_required_fields = True + + def __init__(self, + users=None): + self._users_value = None + self._users_present = False + if users is not None: + self.users = users + + @property + def users(self): + """ + List of users. + + :rtype: list of [UserSelectorArg] + """ + if self._users_present: + return self._users_value + else: + raise AttributeError("missing required field 'users'") + + @users.setter + def users(self, val): + val = self._users_validator.validate(val) + self._users_value = val + self._users_present = True + + @users.deleter + def users(self): + self._users_value = None + self._users_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(CustomQuotaUsersArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CustomQuotaUsersArg(users={!r})'.format( + self._users_value, + ) + +CustomQuotaUsersArg_validator = bv.Struct(CustomQuotaUsersArg) + +class DateRange(bb.Struct): + """ + Input arguments that can be provided for most reports. + + :ivar start_date: Optional starting date (inclusive). + :ivar end_date: Optional ending date (exclusive). + """ + + __slots__ = [ + '_start_date_value', + '_start_date_present', + '_end_date_value', + '_end_date_present', + ] + + _has_required_fields = False + + def __init__(self, + start_date=None, + end_date=None): + self._start_date_value = None + self._start_date_present = False + self._end_date_value = None + self._end_date_present = False + if start_date is not None: + self.start_date = start_date + if end_date is not None: + self.end_date = end_date + + @property + def start_date(self): + """ + Optional starting date (inclusive). + + :rtype: datetime.datetime + """ + if self._start_date_present: + return self._start_date_value + else: + return None + + @start_date.setter + def start_date(self, val): + if val is None: + del self.start_date + return + val = self._start_date_validator.validate(val) + self._start_date_value = val + self._start_date_present = True + + @start_date.deleter + def start_date(self): + self._start_date_value = None + self._start_date_present = False + + @property + def end_date(self): + """ + Optional ending date (exclusive). + + :rtype: datetime.datetime + """ + if self._end_date_present: + return self._end_date_value + else: + return None + + @end_date.setter + def end_date(self, val): + if val is None: + del self.end_date + return + val = self._end_date_validator.validate(val) + self._end_date_value = val + self._end_date_present = True + + @end_date.deleter + def end_date(self): + self._end_date_value = None + self._end_date_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DateRange, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DateRange(start_date={!r}, end_date={!r})'.format( + self._start_date_value, + self._end_date_value, + ) + +DateRange_validator = bv.Struct(DateRange) + +class DateRangeError(bb.Union): + """ + Errors that can originate from problems in input arguments to reports. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(DateRangeError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DateRangeError(%r, %r)' % (self._tag, self._value) + +DateRangeError_validator = bv.Union(DateRangeError) + +class DesktopClientSession(DeviceSession): + """ + Information about linked Dropbox desktop client sessions. + + :ivar host_name: Name of the hosting desktop. + :ivar client_type: The Dropbox desktop client type. + :ivar client_version: The Dropbox client version. + :ivar platform: Information on the hosting platform. + :ivar is_delete_on_unlink_supported: Whether it's possible to delete all of + the account files upon unlinking. + """ + + __slots__ = [ + '_host_name_value', + '_host_name_present', + '_client_type_value', + '_client_type_present', + '_client_version_value', + '_client_version_present', + '_platform_value', + '_platform_present', + '_is_delete_on_unlink_supported_value', + '_is_delete_on_unlink_supported_present', + ] + + _has_required_fields = True + + def __init__(self, + session_id=None, + host_name=None, + client_type=None, + client_version=None, + platform=None, + is_delete_on_unlink_supported=None, + ip_address=None, + country=None, + created=None, + updated=None): + super(DesktopClientSession, self).__init__(session_id, + ip_address, + country, + created, + updated) + self._host_name_value = None + self._host_name_present = False + self._client_type_value = None + self._client_type_present = False + self._client_version_value = None + self._client_version_present = False + self._platform_value = None + self._platform_present = False + self._is_delete_on_unlink_supported_value = None + self._is_delete_on_unlink_supported_present = False + if host_name is not None: + self.host_name = host_name + if client_type is not None: + self.client_type = client_type + if client_version is not None: + self.client_version = client_version + if platform is not None: + self.platform = platform + if is_delete_on_unlink_supported is not None: + self.is_delete_on_unlink_supported = is_delete_on_unlink_supported + + @property + def host_name(self): + """ + Name of the hosting desktop. + + :rtype: str + """ + if self._host_name_present: + return self._host_name_value + else: + raise AttributeError("missing required field 'host_name'") + + @host_name.setter + def host_name(self, val): + val = self._host_name_validator.validate(val) + self._host_name_value = val + self._host_name_present = True + + @host_name.deleter + def host_name(self): + self._host_name_value = None + self._host_name_present = False + + @property + def client_type(self): + """ + The Dropbox desktop client type. + + :rtype: DesktopPlatform + """ + if self._client_type_present: + return self._client_type_value + else: + raise AttributeError("missing required field 'client_type'") + + @client_type.setter + def client_type(self, val): + self._client_type_validator.validate_type_only(val) + self._client_type_value = val + self._client_type_present = True + + @client_type.deleter + def client_type(self): + self._client_type_value = None + self._client_type_present = False + + @property + def client_version(self): + """ + The Dropbox client version. + + :rtype: str + """ + if self._client_version_present: + return self._client_version_value + else: + raise AttributeError("missing required field 'client_version'") + + @client_version.setter + def client_version(self, val): + val = self._client_version_validator.validate(val) + self._client_version_value = val + self._client_version_present = True + + @client_version.deleter + def client_version(self): + self._client_version_value = None + self._client_version_present = False + + @property + def platform(self): + """ + Information on the hosting platform. + + :rtype: str + """ + if self._platform_present: + return self._platform_value + else: + raise AttributeError("missing required field 'platform'") + + @platform.setter + def platform(self, val): + val = self._platform_validator.validate(val) + self._platform_value = val + self._platform_present = True + + @platform.deleter + def platform(self): + self._platform_value = None + self._platform_present = False + + @property + def is_delete_on_unlink_supported(self): + """ + Whether it's possible to delete all of the account files upon unlinking. + + :rtype: bool + """ + if self._is_delete_on_unlink_supported_present: + return self._is_delete_on_unlink_supported_value + else: + raise AttributeError("missing required field 'is_delete_on_unlink_supported'") + + @is_delete_on_unlink_supported.setter + def is_delete_on_unlink_supported(self, val): + val = self._is_delete_on_unlink_supported_validator.validate(val) + self._is_delete_on_unlink_supported_value = val + self._is_delete_on_unlink_supported_present = True + + @is_delete_on_unlink_supported.deleter + def is_delete_on_unlink_supported(self): + self._is_delete_on_unlink_supported_value = None + self._is_delete_on_unlink_supported_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DesktopClientSession, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DesktopClientSession(session_id={!r}, host_name={!r}, client_type={!r}, client_version={!r}, platform={!r}, is_delete_on_unlink_supported={!r}, ip_address={!r}, country={!r}, created={!r}, updated={!r})'.format( + self._session_id_value, + self._host_name_value, + self._client_type_value, + self._client_version_value, + self._platform_value, + self._is_delete_on_unlink_supported_value, + self._ip_address_value, + self._country_value, + self._created_value, + self._updated_value, + ) + +DesktopClientSession_validator = bv.Struct(DesktopClientSession) + +class DesktopPlatform(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar windows: Official Windows Dropbox desktop client. + :ivar mac: Official Mac Dropbox desktop client. + :ivar linux: Official Linux Dropbox desktop client. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + windows = None + # Attribute is overwritten below the class definition + mac = None + # Attribute is overwritten below the class definition + linux = None + # Attribute is overwritten below the class definition + other = None + + def is_windows(self): + """ + Check if the union tag is ``windows``. + + :rtype: bool + """ + return self._tag == 'windows' + + def is_mac(self): + """ + Check if the union tag is ``mac``. + + :rtype: bool + """ + return self._tag == 'mac' + + def is_linux(self): + """ + Check if the union tag is ``linux``. + + :rtype: bool + """ + return self._tag == 'linux' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(DesktopPlatform, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DesktopPlatform(%r, %r)' % (self._tag, self._value) + +DesktopPlatform_validator = bv.Union(DesktopPlatform) + +class DeviceSessionArg(bb.Struct): + """ + :ivar session_id: The session id. + :ivar team_member_id: The unique id of the member owning the device. + """ + + __slots__ = [ + '_session_id_value', + '_session_id_present', + '_team_member_id_value', + '_team_member_id_present', + ] + + _has_required_fields = True + + def __init__(self, + session_id=None, + team_member_id=None): + self._session_id_value = None + self._session_id_present = False + self._team_member_id_value = None + self._team_member_id_present = False + if session_id is not None: + self.session_id = session_id + if team_member_id is not None: + self.team_member_id = team_member_id + + @property + def session_id(self): + """ + The session id. + + :rtype: str + """ + if self._session_id_present: + return self._session_id_value + else: + raise AttributeError("missing required field 'session_id'") + + @session_id.setter + def session_id(self, val): + val = self._session_id_validator.validate(val) + self._session_id_value = val + self._session_id_present = True + + @session_id.deleter + def session_id(self): + self._session_id_value = None + self._session_id_present = False + + @property + def team_member_id(self): + """ + The unique id of the member owning the device. + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + raise AttributeError("missing required field 'team_member_id'") + + @team_member_id.setter + def team_member_id(self, val): + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceSessionArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceSessionArg(session_id={!r}, team_member_id={!r})'.format( + self._session_id_value, + self._team_member_id_value, + ) + +DeviceSessionArg_validator = bv.Struct(DeviceSessionArg) + +class DevicesActive(bb.Struct): + """ + Each of the items is an array of values, one value per day. The value is the + number of devices active within a time window, ending with that day. If + there is no data for a day, then the value will be None. + + :ivar windows: Array of number of linked windows (desktop) clients with + activity. + :ivar macos: Array of number of linked mac (desktop) clients with activity. + :ivar linux: Array of number of linked linus (desktop) clients with + activity. + :ivar ios: Array of number of linked ios devices with activity. + :ivar android: Array of number of linked android devices with activity. + :ivar other: Array of number of other linked devices (blackberry, windows + phone, etc) with activity. + :ivar total: Array of total number of linked clients with activity. + """ + + __slots__ = [ + '_windows_value', + '_windows_present', + '_macos_value', + '_macos_present', + '_linux_value', + '_linux_present', + '_ios_value', + '_ios_present', + '_android_value', + '_android_present', + '_other_value', + '_other_present', + '_total_value', + '_total_present', + ] + + _has_required_fields = True + + def __init__(self, + windows=None, + macos=None, + linux=None, + ios=None, + android=None, + other=None, + total=None): + self._windows_value = None + self._windows_present = False + self._macos_value = None + self._macos_present = False + self._linux_value = None + self._linux_present = False + self._ios_value = None + self._ios_present = False + self._android_value = None + self._android_present = False + self._other_value = None + self._other_present = False + self._total_value = None + self._total_present = False + if windows is not None: + self.windows = windows + if macos is not None: + self.macos = macos + if linux is not None: + self.linux = linux + if ios is not None: + self.ios = ios + if android is not None: + self.android = android + if other is not None: + self.other = other + if total is not None: + self.total = total + + @property + def windows(self): + """ + Array of number of linked windows (desktop) clients with activity. + + :rtype: list of [Optional[int]] + """ + if self._windows_present: + return self._windows_value + else: + raise AttributeError("missing required field 'windows'") + + @windows.setter + def windows(self, val): + val = self._windows_validator.validate(val) + self._windows_value = val + self._windows_present = True + + @windows.deleter + def windows(self): + self._windows_value = None + self._windows_present = False + + @property + def macos(self): + """ + Array of number of linked mac (desktop) clients with activity. + + :rtype: list of [Optional[int]] + """ + if self._macos_present: + return self._macos_value + else: + raise AttributeError("missing required field 'macos'") + + @macos.setter + def macos(self, val): + val = self._macos_validator.validate(val) + self._macos_value = val + self._macos_present = True + + @macos.deleter + def macos(self): + self._macos_value = None + self._macos_present = False + + @property + def linux(self): + """ + Array of number of linked linus (desktop) clients with activity. + + :rtype: list of [Optional[int]] + """ + if self._linux_present: + return self._linux_value + else: + raise AttributeError("missing required field 'linux'") + + @linux.setter + def linux(self, val): + val = self._linux_validator.validate(val) + self._linux_value = val + self._linux_present = True + + @linux.deleter + def linux(self): + self._linux_value = None + self._linux_present = False + + @property + def ios(self): + """ + Array of number of linked ios devices with activity. + + :rtype: list of [Optional[int]] + """ + if self._ios_present: + return self._ios_value + else: + raise AttributeError("missing required field 'ios'") + + @ios.setter + def ios(self, val): + val = self._ios_validator.validate(val) + self._ios_value = val + self._ios_present = True + + @ios.deleter + def ios(self): + self._ios_value = None + self._ios_present = False + + @property + def android(self): + """ + Array of number of linked android devices with activity. + + :rtype: list of [Optional[int]] + """ + if self._android_present: + return self._android_value + else: + raise AttributeError("missing required field 'android'") + + @android.setter + def android(self, val): + val = self._android_validator.validate(val) + self._android_value = val + self._android_present = True + + @android.deleter + def android(self): + self._android_value = None + self._android_present = False + + @property + def other(self): + """ + Array of number of other linked devices (blackberry, windows phone, etc) + with activity. + + :rtype: list of [Optional[int]] + """ + if self._other_present: + return self._other_value + else: + raise AttributeError("missing required field 'other'") + + @other.setter + def other(self, val): + val = self._other_validator.validate(val) + self._other_value = val + self._other_present = True + + @other.deleter + def other(self): + self._other_value = None + self._other_present = False + + @property + def total(self): + """ + Array of total number of linked clients with activity. + + :rtype: list of [Optional[int]] + """ + if self._total_present: + return self._total_value + else: + raise AttributeError("missing required field 'total'") + + @total.setter + def total(self, val): + val = self._total_validator.validate(val) + self._total_value = val + self._total_present = True + + @total.deleter + def total(self): + self._total_value = None + self._total_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DevicesActive, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DevicesActive(windows={!r}, macos={!r}, linux={!r}, ios={!r}, android={!r}, other={!r}, total={!r})'.format( + self._windows_value, + self._macos_value, + self._linux_value, + self._ios_value, + self._android_value, + self._other_value, + self._total_value, + ) + +DevicesActive_validator = bv.Struct(DevicesActive) + +class ExcludedUsersListArg(bb.Struct): + """ + Excluded users list argument. + + :ivar limit: Number of results to return per call. + """ + + __slots__ = [ + '_limit_value', + '_limit_present', + ] + + _has_required_fields = False + + def __init__(self, + limit=None): + self._limit_value = None + self._limit_present = False + if limit is not None: + self.limit = limit + + @property + def limit(self): + """ + Number of results to return per call. + + :rtype: int + """ + if self._limit_present: + return self._limit_value + else: + return 1000 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ExcludedUsersListArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ExcludedUsersListArg(limit={!r})'.format( + self._limit_value, + ) + +ExcludedUsersListArg_validator = bv.Struct(ExcludedUsersListArg) + +class ExcludedUsersListContinueArg(bb.Struct): + """ + Excluded users list continue argument. + + :ivar cursor: Indicates from what point to get the next set of users. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + Indicates from what point to get the next set of users. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ExcludedUsersListContinueArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ExcludedUsersListContinueArg(cursor={!r})'.format( + self._cursor_value, + ) + +ExcludedUsersListContinueArg_validator = bv.Struct(ExcludedUsersListContinueArg) + +class ExcludedUsersListContinueError(bb.Union): + """ + Excluded users list continue error. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_cursor: The cursor is invalid. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_cursor = None + # Attribute is overwritten below the class definition + other = None + + def is_invalid_cursor(self): + """ + Check if the union tag is ``invalid_cursor``. + + :rtype: bool + """ + return self._tag == 'invalid_cursor' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ExcludedUsersListContinueError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ExcludedUsersListContinueError(%r, %r)' % (self._tag, self._value) + +ExcludedUsersListContinueError_validator = bv.Union(ExcludedUsersListContinueError) + +class ExcludedUsersListError(bb.Union): + """ + Excluded users list error. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar list_error: An error occurred. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + list_error = None + # Attribute is overwritten below the class definition + other = None + + def is_list_error(self): + """ + Check if the union tag is ``list_error``. + + :rtype: bool + """ + return self._tag == 'list_error' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ExcludedUsersListError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ExcludedUsersListError(%r, %r)' % (self._tag, self._value) + +ExcludedUsersListError_validator = bv.Union(ExcludedUsersListError) + +class ExcludedUsersListResult(bb.Struct): + """ + Excluded users list result. + + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_member_space_limits_excluded_users_list_continue` + to obtain additional excluded users. + :ivar has_more: Is true if there are additional excluded users that have not + been returned yet. An additional call to + :meth:`dropbox.dropbox.Dropbox.team_member_space_limits_excluded_users_list_continue` + can retrieve them. + """ + + __slots__ = [ + '_users_value', + '_users_present', + '_cursor_value', + '_cursor_present', + '_has_more_value', + '_has_more_present', + ] + + _has_required_fields = True + + def __init__(self, + users=None, + has_more=None, + cursor=None): + self._users_value = None + self._users_present = False + self._cursor_value = None + self._cursor_present = False + self._has_more_value = None + self._has_more_present = False + if users is not None: + self.users = users + if cursor is not None: + self.cursor = cursor + if has_more is not None: + self.has_more = has_more + + @property + def users(self): + """ + :rtype: list of [MemberProfile] + """ + if self._users_present: + return self._users_value + else: + raise AttributeError("missing required field 'users'") + + @users.setter + def users(self, val): + val = self._users_validator.validate(val) + self._users_value = val + self._users_present = True + + @users.deleter + def users(self): + self._users_value = None + self._users_present = False + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_member_space_limits_excluded_users_list_continue` + to obtain additional excluded users. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def has_more(self): + """ + Is true if there are additional excluded users that have not been + returned yet. An additional call to + :meth:`dropbox.dropbox.Dropbox.team_member_space_limits_excluded_users_list_continue` + can retrieve them. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ExcludedUsersListResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ExcludedUsersListResult(users={!r}, has_more={!r}, cursor={!r})'.format( + self._users_value, + self._has_more_value, + self._cursor_value, + ) + +ExcludedUsersListResult_validator = bv.Struct(ExcludedUsersListResult) + +class ExcludedUsersUpdateArg(bb.Struct): + """ + Argument of excluded users update operation. Should include a list of users + to add/remove (according to endpoint), Maximum size of the list is 1000 + users. + + :ivar users: List of users to be added/removed. + """ + + __slots__ = [ + '_users_value', + '_users_present', + ] + + _has_required_fields = False + + def __init__(self, + users=None): + self._users_value = None + self._users_present = False + if users is not None: + self.users = users + + @property + def users(self): + """ + List of users to be added/removed. + + :rtype: list of [UserSelectorArg] + """ + if self._users_present: + return self._users_value + else: + return None + + @users.setter + def users(self, val): + if val is None: + del self.users + return + val = self._users_validator.validate(val) + self._users_value = val + self._users_present = True + + @users.deleter + def users(self): + self._users_value = None + self._users_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ExcludedUsersUpdateArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ExcludedUsersUpdateArg(users={!r})'.format( + self._users_value, + ) + +ExcludedUsersUpdateArg_validator = bv.Struct(ExcludedUsersUpdateArg) + +class ExcludedUsersUpdateError(bb.Union): + """ + Excluded users update error. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar users_not_in_team: At least one of the users is not part of your team. + :ivar too_many_users: A maximum of 1000 users for each of addition/removal + can be supplied. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + users_not_in_team = None + # Attribute is overwritten below the class definition + too_many_users = None + # Attribute is overwritten below the class definition + other = None + + def is_users_not_in_team(self): + """ + Check if the union tag is ``users_not_in_team``. + + :rtype: bool + """ + return self._tag == 'users_not_in_team' + + def is_too_many_users(self): + """ + Check if the union tag is ``too_many_users``. + + :rtype: bool + """ + return self._tag == 'too_many_users' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ExcludedUsersUpdateError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ExcludedUsersUpdateError(%r, %r)' % (self._tag, self._value) + +ExcludedUsersUpdateError_validator = bv.Union(ExcludedUsersUpdateError) + +class ExcludedUsersUpdateResult(bb.Struct): + """ + Excluded users update result. + + :ivar status: Update status. + """ + + __slots__ = [ + '_status_value', + '_status_present', + ] + + _has_required_fields = True + + def __init__(self, + status=None): + self._status_value = None + self._status_present = False + if status is not None: + self.status = status + + @property + def status(self): + """ + Update status. + + :rtype: ExcludedUsersUpdateStatus + """ + if self._status_present: + return self._status_value + else: + raise AttributeError("missing required field 'status'") + + @status.setter + def status(self, val): + self._status_validator.validate_type_only(val) + self._status_value = val + self._status_present = True + + @status.deleter + def status(self): + self._status_value = None + self._status_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ExcludedUsersUpdateResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ExcludedUsersUpdateResult(status={!r})'.format( + self._status_value, + ) + +ExcludedUsersUpdateResult_validator = bv.Struct(ExcludedUsersUpdateResult) + +class ExcludedUsersUpdateStatus(bb.Union): + """ + Excluded users update operation status. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar success: Update successful. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + success = None + # Attribute is overwritten below the class definition + other = None + + def is_success(self): + """ + Check if the union tag is ``success``. + + :rtype: bool + """ + return self._tag == 'success' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ExcludedUsersUpdateStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ExcludedUsersUpdateStatus(%r, %r)' % (self._tag, self._value) + +ExcludedUsersUpdateStatus_validator = bv.Union(ExcludedUsersUpdateStatus) + +class Feature(bb.Union): + """ + A set of features that a Dropbox Business account may support. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar upload_api_rate_limit: The number of upload API calls allowed per + month. + :ivar has_team_shared_dropbox: Does this team have a shared team root. + :ivar has_team_file_events: Does this team have file events. + :ivar has_team_selective_sync: Does this team have team selective sync + enabled. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + upload_api_rate_limit = None + # Attribute is overwritten below the class definition + has_team_shared_dropbox = None + # Attribute is overwritten below the class definition + has_team_file_events = None + # Attribute is overwritten below the class definition + has_team_selective_sync = None + # Attribute is overwritten below the class definition + other = None + + def is_upload_api_rate_limit(self): + """ + Check if the union tag is ``upload_api_rate_limit``. + + :rtype: bool + """ + return self._tag == 'upload_api_rate_limit' + + def is_has_team_shared_dropbox(self): + """ + Check if the union tag is ``has_team_shared_dropbox``. + + :rtype: bool + """ + return self._tag == 'has_team_shared_dropbox' + + def is_has_team_file_events(self): + """ + Check if the union tag is ``has_team_file_events``. + + :rtype: bool + """ + return self._tag == 'has_team_file_events' + + def is_has_team_selective_sync(self): + """ + Check if the union tag is ``has_team_selective_sync``. + + :rtype: bool + """ + return self._tag == 'has_team_selective_sync' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(Feature, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'Feature(%r, %r)' % (self._tag, self._value) + +Feature_validator = bv.Union(Feature) + +class FeatureValue(bb.Union): + """ + The values correspond to entries in :class:`Feature`. You may get different + value according to your Dropbox Business plan. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def upload_api_rate_limit(cls, val): + """ + Create an instance of this class set to the ``upload_api_rate_limit`` + tag with value ``val``. + + :param UploadApiRateLimitValue val: + :rtype: FeatureValue + """ + return cls('upload_api_rate_limit', val) + + @classmethod + def has_team_shared_dropbox(cls, val): + """ + Create an instance of this class set to the ``has_team_shared_dropbox`` + tag with value ``val``. + + :param HasTeamSharedDropboxValue val: + :rtype: FeatureValue + """ + return cls('has_team_shared_dropbox', val) + + @classmethod + def has_team_file_events(cls, val): + """ + Create an instance of this class set to the ``has_team_file_events`` tag + with value ``val``. + + :param HasTeamFileEventsValue val: + :rtype: FeatureValue + """ + return cls('has_team_file_events', val) + + @classmethod + def has_team_selective_sync(cls, val): + """ + Create an instance of this class set to the ``has_team_selective_sync`` + tag with value ``val``. + + :param HasTeamSelectiveSyncValue val: + :rtype: FeatureValue + """ + return cls('has_team_selective_sync', val) + + def is_upload_api_rate_limit(self): + """ + Check if the union tag is ``upload_api_rate_limit``. + + :rtype: bool + """ + return self._tag == 'upload_api_rate_limit' + + def is_has_team_shared_dropbox(self): + """ + Check if the union tag is ``has_team_shared_dropbox``. + + :rtype: bool + """ + return self._tag == 'has_team_shared_dropbox' + + def is_has_team_file_events(self): + """ + Check if the union tag is ``has_team_file_events``. + + :rtype: bool + """ + return self._tag == 'has_team_file_events' + + def is_has_team_selective_sync(self): + """ + Check if the union tag is ``has_team_selective_sync``. + + :rtype: bool + """ + return self._tag == 'has_team_selective_sync' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_upload_api_rate_limit(self): + """ + Only call this if :meth:`is_upload_api_rate_limit` is true. + + :rtype: UploadApiRateLimitValue + """ + if not self.is_upload_api_rate_limit(): + raise AttributeError("tag 'upload_api_rate_limit' not set") + return self._value + + def get_has_team_shared_dropbox(self): + """ + Only call this if :meth:`is_has_team_shared_dropbox` is true. + + :rtype: HasTeamSharedDropboxValue + """ + if not self.is_has_team_shared_dropbox(): + raise AttributeError("tag 'has_team_shared_dropbox' not set") + return self._value + + def get_has_team_file_events(self): + """ + Only call this if :meth:`is_has_team_file_events` is true. + + :rtype: HasTeamFileEventsValue + """ + if not self.is_has_team_file_events(): + raise AttributeError("tag 'has_team_file_events' not set") + return self._value + + def get_has_team_selective_sync(self): + """ + Only call this if :meth:`is_has_team_selective_sync` is true. + + :rtype: HasTeamSelectiveSyncValue + """ + if not self.is_has_team_selective_sync(): + raise AttributeError("tag 'has_team_selective_sync' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(FeatureValue, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FeatureValue(%r, %r)' % (self._tag, self._value) + +FeatureValue_validator = bv.Union(FeatureValue) + +class FeaturesGetValuesBatchArg(bb.Struct): + """ + :ivar features: A list of features in :class:`Feature`. If the list is + empty, this route will return :class:`FeaturesGetValuesBatchError`. + """ + + __slots__ = [ + '_features_value', + '_features_present', + ] + + _has_required_fields = True + + def __init__(self, + features=None): + self._features_value = None + self._features_present = False + if features is not None: + self.features = features + + @property + def features(self): + """ + A list of features in :class:`Feature`. If the list is empty, this route + will return :class:`FeaturesGetValuesBatchError`. + + :rtype: list of [Feature] + """ + if self._features_present: + return self._features_value + else: + raise AttributeError("missing required field 'features'") + + @features.setter + def features(self, val): + val = self._features_validator.validate(val) + self._features_value = val + self._features_present = True + + @features.deleter + def features(self): + self._features_value = None + self._features_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FeaturesGetValuesBatchArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FeaturesGetValuesBatchArg(features={!r})'.format( + self._features_value, + ) + +FeaturesGetValuesBatchArg_validator = bv.Struct(FeaturesGetValuesBatchArg) + +class FeaturesGetValuesBatchError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar empty_features_list: At least one :class:`Feature` must be included in + the :class:`FeaturesGetValuesBatchArg`.features list. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + empty_features_list = None + # Attribute is overwritten below the class definition + other = None + + def is_empty_features_list(self): + """ + Check if the union tag is ``empty_features_list``. + + :rtype: bool + """ + return self._tag == 'empty_features_list' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(FeaturesGetValuesBatchError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FeaturesGetValuesBatchError(%r, %r)' % (self._tag, self._value) + +FeaturesGetValuesBatchError_validator = bv.Union(FeaturesGetValuesBatchError) + +class FeaturesGetValuesBatchResult(bb.Struct): + + __slots__ = [ + '_values_value', + '_values_present', + ] + + _has_required_fields = True + + def __init__(self, + values=None): + self._values_value = None + self._values_present = False + if values is not None: + self.values = values + + @property + def values(self): + """ + :rtype: list of [FeatureValue] + """ + if self._values_present: + return self._values_value + else: + raise AttributeError("missing required field 'values'") + + @values.setter + def values(self, val): + val = self._values_validator.validate(val) + self._values_value = val + self._values_present = True + + @values.deleter + def values(self): + self._values_value = None + self._values_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FeaturesGetValuesBatchResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FeaturesGetValuesBatchResult(values={!r})'.format( + self._values_value, + ) + +FeaturesGetValuesBatchResult_validator = bv.Struct(FeaturesGetValuesBatchResult) + +class GetActivityReport(BaseDfbReport): + """ + Activity Report Result. Each of the items in the storage report is an array + of values, one value per day. If there is no data for a day, then the value + will be None. + + :ivar adds: Array of total number of adds by team members. + :ivar edits: Array of number of edits by team members. If the same user + edits the same file multiple times this is counted as a single edit. + :ivar deletes: Array of total number of deletes by team members. + :ivar active_users_28_day: Array of the number of users who have been active + in the last 28 days. + :ivar active_users_7_day: Array of the number of users who have been active + in the last week. + :ivar active_users_1_day: Array of the number of users who have been active + in the last day. + :ivar active_shared_folders_28_day: Array of the number of shared folders + with some activity in the last 28 days. + :ivar active_shared_folders_7_day: Array of the number of shared folders + with some activity in the last week. + :ivar active_shared_folders_1_day: Array of the number of shared folders + with some activity in the last day. + :ivar shared_links_created: Array of the number of shared links created. + :ivar shared_links_viewed_by_team: Array of the number of views by team + users to shared links created by the team. + :ivar shared_links_viewed_by_outside_user: Array of the number of views by + users outside of the team to shared links created by the team. + :ivar shared_links_viewed_by_not_logged_in: Array of the number of views by + non-logged-in users to shared links created by the team. + :ivar shared_links_viewed_total: Array of the total number of views to + shared links created by the team. + """ + + __slots__ = [ + '_adds_value', + '_adds_present', + '_edits_value', + '_edits_present', + '_deletes_value', + '_deletes_present', + '_active_users_28_day_value', + '_active_users_28_day_present', + '_active_users_7_day_value', + '_active_users_7_day_present', + '_active_users_1_day_value', + '_active_users_1_day_present', + '_active_shared_folders_28_day_value', + '_active_shared_folders_28_day_present', + '_active_shared_folders_7_day_value', + '_active_shared_folders_7_day_present', + '_active_shared_folders_1_day_value', + '_active_shared_folders_1_day_present', + '_shared_links_created_value', + '_shared_links_created_present', + '_shared_links_viewed_by_team_value', + '_shared_links_viewed_by_team_present', + '_shared_links_viewed_by_outside_user_value', + '_shared_links_viewed_by_outside_user_present', + '_shared_links_viewed_by_not_logged_in_value', + '_shared_links_viewed_by_not_logged_in_present', + '_shared_links_viewed_total_value', + '_shared_links_viewed_total_present', + ] + + _has_required_fields = True + + def __init__(self, + start_date=None, + adds=None, + edits=None, + deletes=None, + active_users_28_day=None, + active_users_7_day=None, + active_users_1_day=None, + active_shared_folders_28_day=None, + active_shared_folders_7_day=None, + active_shared_folders_1_day=None, + shared_links_created=None, + shared_links_viewed_by_team=None, + shared_links_viewed_by_outside_user=None, + shared_links_viewed_by_not_logged_in=None, + shared_links_viewed_total=None): + super(GetActivityReport, self).__init__(start_date) + self._adds_value = None + self._adds_present = False + self._edits_value = None + self._edits_present = False + self._deletes_value = None + self._deletes_present = False + self._active_users_28_day_value = None + self._active_users_28_day_present = False + self._active_users_7_day_value = None + self._active_users_7_day_present = False + self._active_users_1_day_value = None + self._active_users_1_day_present = False + self._active_shared_folders_28_day_value = None + self._active_shared_folders_28_day_present = False + self._active_shared_folders_7_day_value = None + self._active_shared_folders_7_day_present = False + self._active_shared_folders_1_day_value = None + self._active_shared_folders_1_day_present = False + self._shared_links_created_value = None + self._shared_links_created_present = False + self._shared_links_viewed_by_team_value = None + self._shared_links_viewed_by_team_present = False + self._shared_links_viewed_by_outside_user_value = None + self._shared_links_viewed_by_outside_user_present = False + self._shared_links_viewed_by_not_logged_in_value = None + self._shared_links_viewed_by_not_logged_in_present = False + self._shared_links_viewed_total_value = None + self._shared_links_viewed_total_present = False + if adds is not None: + self.adds = adds + if edits is not None: + self.edits = edits + if deletes is not None: + self.deletes = deletes + if active_users_28_day is not None: + self.active_users_28_day = active_users_28_day + if active_users_7_day is not None: + self.active_users_7_day = active_users_7_day + if active_users_1_day is not None: + self.active_users_1_day = active_users_1_day + if active_shared_folders_28_day is not None: + self.active_shared_folders_28_day = active_shared_folders_28_day + if active_shared_folders_7_day is not None: + self.active_shared_folders_7_day = active_shared_folders_7_day + if active_shared_folders_1_day is not None: + self.active_shared_folders_1_day = active_shared_folders_1_day + if shared_links_created is not None: + self.shared_links_created = shared_links_created + if shared_links_viewed_by_team is not None: + self.shared_links_viewed_by_team = shared_links_viewed_by_team + if shared_links_viewed_by_outside_user is not None: + self.shared_links_viewed_by_outside_user = shared_links_viewed_by_outside_user + if shared_links_viewed_by_not_logged_in is not None: + self.shared_links_viewed_by_not_logged_in = shared_links_viewed_by_not_logged_in + if shared_links_viewed_total is not None: + self.shared_links_viewed_total = shared_links_viewed_total + + @property + def adds(self): + """ + Array of total number of adds by team members. + + :rtype: list of [Optional[int]] + """ + if self._adds_present: + return self._adds_value + else: + raise AttributeError("missing required field 'adds'") + + @adds.setter + def adds(self, val): + val = self._adds_validator.validate(val) + self._adds_value = val + self._adds_present = True + + @adds.deleter + def adds(self): + self._adds_value = None + self._adds_present = False + + @property + def edits(self): + """ + Array of number of edits by team members. If the same user edits the + same file multiple times this is counted as a single edit. + + :rtype: list of [Optional[int]] + """ + if self._edits_present: + return self._edits_value + else: + raise AttributeError("missing required field 'edits'") + + @edits.setter + def edits(self, val): + val = self._edits_validator.validate(val) + self._edits_value = val + self._edits_present = True + + @edits.deleter + def edits(self): + self._edits_value = None + self._edits_present = False + + @property + def deletes(self): + """ + Array of total number of deletes by team members. + + :rtype: list of [Optional[int]] + """ + if self._deletes_present: + return self._deletes_value + else: + raise AttributeError("missing required field 'deletes'") + + @deletes.setter + def deletes(self, val): + val = self._deletes_validator.validate(val) + self._deletes_value = val + self._deletes_present = True + + @deletes.deleter + def deletes(self): + self._deletes_value = None + self._deletes_present = False + + @property + def active_users_28_day(self): + """ + Array of the number of users who have been active in the last 28 days. + + :rtype: list of [Optional[int]] + """ + if self._active_users_28_day_present: + return self._active_users_28_day_value + else: + raise AttributeError("missing required field 'active_users_28_day'") + + @active_users_28_day.setter + def active_users_28_day(self, val): + val = self._active_users_28_day_validator.validate(val) + self._active_users_28_day_value = val + self._active_users_28_day_present = True + + @active_users_28_day.deleter + def active_users_28_day(self): + self._active_users_28_day_value = None + self._active_users_28_day_present = False + + @property + def active_users_7_day(self): + """ + Array of the number of users who have been active in the last week. + + :rtype: list of [Optional[int]] + """ + if self._active_users_7_day_present: + return self._active_users_7_day_value + else: + raise AttributeError("missing required field 'active_users_7_day'") + + @active_users_7_day.setter + def active_users_7_day(self, val): + val = self._active_users_7_day_validator.validate(val) + self._active_users_7_day_value = val + self._active_users_7_day_present = True + + @active_users_7_day.deleter + def active_users_7_day(self): + self._active_users_7_day_value = None + self._active_users_7_day_present = False + + @property + def active_users_1_day(self): + """ + Array of the number of users who have been active in the last day. + + :rtype: list of [Optional[int]] + """ + if self._active_users_1_day_present: + return self._active_users_1_day_value + else: + raise AttributeError("missing required field 'active_users_1_day'") + + @active_users_1_day.setter + def active_users_1_day(self, val): + val = self._active_users_1_day_validator.validate(val) + self._active_users_1_day_value = val + self._active_users_1_day_present = True + + @active_users_1_day.deleter + def active_users_1_day(self): + self._active_users_1_day_value = None + self._active_users_1_day_present = False + + @property + def active_shared_folders_28_day(self): + """ + Array of the number of shared folders with some activity in the last 28 + days. + + :rtype: list of [Optional[int]] + """ + if self._active_shared_folders_28_day_present: + return self._active_shared_folders_28_day_value + else: + raise AttributeError("missing required field 'active_shared_folders_28_day'") + + @active_shared_folders_28_day.setter + def active_shared_folders_28_day(self, val): + val = self._active_shared_folders_28_day_validator.validate(val) + self._active_shared_folders_28_day_value = val + self._active_shared_folders_28_day_present = True + + @active_shared_folders_28_day.deleter + def active_shared_folders_28_day(self): + self._active_shared_folders_28_day_value = None + self._active_shared_folders_28_day_present = False + + @property + def active_shared_folders_7_day(self): + """ + Array of the number of shared folders with some activity in the last + week. + + :rtype: list of [Optional[int]] + """ + if self._active_shared_folders_7_day_present: + return self._active_shared_folders_7_day_value + else: + raise AttributeError("missing required field 'active_shared_folders_7_day'") + + @active_shared_folders_7_day.setter + def active_shared_folders_7_day(self, val): + val = self._active_shared_folders_7_day_validator.validate(val) + self._active_shared_folders_7_day_value = val + self._active_shared_folders_7_day_present = True + + @active_shared_folders_7_day.deleter + def active_shared_folders_7_day(self): + self._active_shared_folders_7_day_value = None + self._active_shared_folders_7_day_present = False + + @property + def active_shared_folders_1_day(self): + """ + Array of the number of shared folders with some activity in the last + day. + + :rtype: list of [Optional[int]] + """ + if self._active_shared_folders_1_day_present: + return self._active_shared_folders_1_day_value + else: + raise AttributeError("missing required field 'active_shared_folders_1_day'") + + @active_shared_folders_1_day.setter + def active_shared_folders_1_day(self, val): + val = self._active_shared_folders_1_day_validator.validate(val) + self._active_shared_folders_1_day_value = val + self._active_shared_folders_1_day_present = True + + @active_shared_folders_1_day.deleter + def active_shared_folders_1_day(self): + self._active_shared_folders_1_day_value = None + self._active_shared_folders_1_day_present = False + + @property + def shared_links_created(self): + """ + Array of the number of shared links created. + + :rtype: list of [Optional[int]] + """ + if self._shared_links_created_present: + return self._shared_links_created_value + else: + raise AttributeError("missing required field 'shared_links_created'") + + @shared_links_created.setter + def shared_links_created(self, val): + val = self._shared_links_created_validator.validate(val) + self._shared_links_created_value = val + self._shared_links_created_present = True + + @shared_links_created.deleter + def shared_links_created(self): + self._shared_links_created_value = None + self._shared_links_created_present = False + + @property + def shared_links_viewed_by_team(self): + """ + Array of the number of views by team users to shared links created by + the team. + + :rtype: list of [Optional[int]] + """ + if self._shared_links_viewed_by_team_present: + return self._shared_links_viewed_by_team_value + else: + raise AttributeError("missing required field 'shared_links_viewed_by_team'") + + @shared_links_viewed_by_team.setter + def shared_links_viewed_by_team(self, val): + val = self._shared_links_viewed_by_team_validator.validate(val) + self._shared_links_viewed_by_team_value = val + self._shared_links_viewed_by_team_present = True + + @shared_links_viewed_by_team.deleter + def shared_links_viewed_by_team(self): + self._shared_links_viewed_by_team_value = None + self._shared_links_viewed_by_team_present = False + + @property + def shared_links_viewed_by_outside_user(self): + """ + Array of the number of views by users outside of the team to shared + links created by the team. + + :rtype: list of [Optional[int]] + """ + if self._shared_links_viewed_by_outside_user_present: + return self._shared_links_viewed_by_outside_user_value + else: + raise AttributeError("missing required field 'shared_links_viewed_by_outside_user'") + + @shared_links_viewed_by_outside_user.setter + def shared_links_viewed_by_outside_user(self, val): + val = self._shared_links_viewed_by_outside_user_validator.validate(val) + self._shared_links_viewed_by_outside_user_value = val + self._shared_links_viewed_by_outside_user_present = True + + @shared_links_viewed_by_outside_user.deleter + def shared_links_viewed_by_outside_user(self): + self._shared_links_viewed_by_outside_user_value = None + self._shared_links_viewed_by_outside_user_present = False + + @property + def shared_links_viewed_by_not_logged_in(self): + """ + Array of the number of views by non-logged-in users to shared links + created by the team. + + :rtype: list of [Optional[int]] + """ + if self._shared_links_viewed_by_not_logged_in_present: + return self._shared_links_viewed_by_not_logged_in_value + else: + raise AttributeError("missing required field 'shared_links_viewed_by_not_logged_in'") + + @shared_links_viewed_by_not_logged_in.setter + def shared_links_viewed_by_not_logged_in(self, val): + val = self._shared_links_viewed_by_not_logged_in_validator.validate(val) + self._shared_links_viewed_by_not_logged_in_value = val + self._shared_links_viewed_by_not_logged_in_present = True + + @shared_links_viewed_by_not_logged_in.deleter + def shared_links_viewed_by_not_logged_in(self): + self._shared_links_viewed_by_not_logged_in_value = None + self._shared_links_viewed_by_not_logged_in_present = False + + @property + def shared_links_viewed_total(self): + """ + Array of the total number of views to shared links created by the team. + + :rtype: list of [Optional[int]] + """ + if self._shared_links_viewed_total_present: + return self._shared_links_viewed_total_value + else: + raise AttributeError("missing required field 'shared_links_viewed_total'") + + @shared_links_viewed_total.setter + def shared_links_viewed_total(self, val): + val = self._shared_links_viewed_total_validator.validate(val) + self._shared_links_viewed_total_value = val + self._shared_links_viewed_total_present = True + + @shared_links_viewed_total.deleter + def shared_links_viewed_total(self): + self._shared_links_viewed_total_value = None + self._shared_links_viewed_total_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetActivityReport, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetActivityReport(start_date={!r}, adds={!r}, edits={!r}, deletes={!r}, active_users_28_day={!r}, active_users_7_day={!r}, active_users_1_day={!r}, active_shared_folders_28_day={!r}, active_shared_folders_7_day={!r}, active_shared_folders_1_day={!r}, shared_links_created={!r}, shared_links_viewed_by_team={!r}, shared_links_viewed_by_outside_user={!r}, shared_links_viewed_by_not_logged_in={!r}, shared_links_viewed_total={!r})'.format( + self._start_date_value, + self._adds_value, + self._edits_value, + self._deletes_value, + self._active_users_28_day_value, + self._active_users_7_day_value, + self._active_users_1_day_value, + self._active_shared_folders_28_day_value, + self._active_shared_folders_7_day_value, + self._active_shared_folders_1_day_value, + self._shared_links_created_value, + self._shared_links_viewed_by_team_value, + self._shared_links_viewed_by_outside_user_value, + self._shared_links_viewed_by_not_logged_in_value, + self._shared_links_viewed_total_value, + ) + +GetActivityReport_validator = bv.Struct(GetActivityReport) + +class GetDevicesReport(BaseDfbReport): + """ + Devices Report Result. Contains subsections for different time ranges of + activity. Each of the items in each subsection of the storage report is an + array of values, one value per day. If there is no data for a day, then the + value will be None. + + :ivar active_1_day: Report of the number of devices active in the last day. + :ivar active_7_day: Report of the number of devices active in the last 7 + days. + :ivar active_28_day: Report of the number of devices active in the last 28 + days. + """ + + __slots__ = [ + '_active_1_day_value', + '_active_1_day_present', + '_active_7_day_value', + '_active_7_day_present', + '_active_28_day_value', + '_active_28_day_present', + ] + + _has_required_fields = True + + def __init__(self, + start_date=None, + active_1_day=None, + active_7_day=None, + active_28_day=None): + super(GetDevicesReport, self).__init__(start_date) + self._active_1_day_value = None + self._active_1_day_present = False + self._active_7_day_value = None + self._active_7_day_present = False + self._active_28_day_value = None + self._active_28_day_present = False + if active_1_day is not None: + self.active_1_day = active_1_day + if active_7_day is not None: + self.active_7_day = active_7_day + if active_28_day is not None: + self.active_28_day = active_28_day + + @property + def active_1_day(self): + """ + Report of the number of devices active in the last day. + + :rtype: DevicesActive + """ + if self._active_1_day_present: + return self._active_1_day_value + else: + raise AttributeError("missing required field 'active_1_day'") + + @active_1_day.setter + def active_1_day(self, val): + self._active_1_day_validator.validate_type_only(val) + self._active_1_day_value = val + self._active_1_day_present = True + + @active_1_day.deleter + def active_1_day(self): + self._active_1_day_value = None + self._active_1_day_present = False + + @property + def active_7_day(self): + """ + Report of the number of devices active in the last 7 days. + + :rtype: DevicesActive + """ + if self._active_7_day_present: + return self._active_7_day_value + else: + raise AttributeError("missing required field 'active_7_day'") + + @active_7_day.setter + def active_7_day(self, val): + self._active_7_day_validator.validate_type_only(val) + self._active_7_day_value = val + self._active_7_day_present = True + + @active_7_day.deleter + def active_7_day(self): + self._active_7_day_value = None + self._active_7_day_present = False + + @property + def active_28_day(self): + """ + Report of the number of devices active in the last 28 days. + + :rtype: DevicesActive + """ + if self._active_28_day_present: + return self._active_28_day_value + else: + raise AttributeError("missing required field 'active_28_day'") + + @active_28_day.setter + def active_28_day(self, val): + self._active_28_day_validator.validate_type_only(val) + self._active_28_day_value = val + self._active_28_day_present = True + + @active_28_day.deleter + def active_28_day(self): + self._active_28_day_value = None + self._active_28_day_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetDevicesReport, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetDevicesReport(start_date={!r}, active_1_day={!r}, active_7_day={!r}, active_28_day={!r})'.format( + self._start_date_value, + self._active_1_day_value, + self._active_7_day_value, + self._active_28_day_value, + ) + +GetDevicesReport_validator = bv.Struct(GetDevicesReport) + +class GetMembershipReport(BaseDfbReport): + """ + Membership Report Result. Each of the items in the storage report is an + array of values, one value per day. If there is no data for a day, then the + value will be None. + + :ivar team_size: Team size, for each day. + :ivar pending_invites: The number of pending invites to the team, for each + day. + :ivar members_joined: The number of members that joined the team, for each + day. + :ivar suspended_members: The number of suspended team members, for each day. + :ivar licenses: The total number of licenses the team has, for each day. + """ + + __slots__ = [ + '_team_size_value', + '_team_size_present', + '_pending_invites_value', + '_pending_invites_present', + '_members_joined_value', + '_members_joined_present', + '_suspended_members_value', + '_suspended_members_present', + '_licenses_value', + '_licenses_present', + ] + + _has_required_fields = True + + def __init__(self, + start_date=None, + team_size=None, + pending_invites=None, + members_joined=None, + suspended_members=None, + licenses=None): + super(GetMembershipReport, self).__init__(start_date) + self._team_size_value = None + self._team_size_present = False + self._pending_invites_value = None + self._pending_invites_present = False + self._members_joined_value = None + self._members_joined_present = False + self._suspended_members_value = None + self._suspended_members_present = False + self._licenses_value = None + self._licenses_present = False + if team_size is not None: + self.team_size = team_size + if pending_invites is not None: + self.pending_invites = pending_invites + if members_joined is not None: + self.members_joined = members_joined + if suspended_members is not None: + self.suspended_members = suspended_members + if licenses is not None: + self.licenses = licenses + + @property + def team_size(self): + """ + Team size, for each day. + + :rtype: list of [Optional[int]] + """ + if self._team_size_present: + return self._team_size_value + else: + raise AttributeError("missing required field 'team_size'") + + @team_size.setter + def team_size(self, val): + val = self._team_size_validator.validate(val) + self._team_size_value = val + self._team_size_present = True + + @team_size.deleter + def team_size(self): + self._team_size_value = None + self._team_size_present = False + + @property + def pending_invites(self): + """ + The number of pending invites to the team, for each day. + + :rtype: list of [Optional[int]] + """ + if self._pending_invites_present: + return self._pending_invites_value + else: + raise AttributeError("missing required field 'pending_invites'") + + @pending_invites.setter + def pending_invites(self, val): + val = self._pending_invites_validator.validate(val) + self._pending_invites_value = val + self._pending_invites_present = True + + @pending_invites.deleter + def pending_invites(self): + self._pending_invites_value = None + self._pending_invites_present = False + + @property + def members_joined(self): + """ + The number of members that joined the team, for each day. + + :rtype: list of [Optional[int]] + """ + if self._members_joined_present: + return self._members_joined_value + else: + raise AttributeError("missing required field 'members_joined'") + + @members_joined.setter + def members_joined(self, val): + val = self._members_joined_validator.validate(val) + self._members_joined_value = val + self._members_joined_present = True + + @members_joined.deleter + def members_joined(self): + self._members_joined_value = None + self._members_joined_present = False + + @property + def suspended_members(self): + """ + The number of suspended team members, for each day. + + :rtype: list of [Optional[int]] + """ + if self._suspended_members_present: + return self._suspended_members_value + else: + raise AttributeError("missing required field 'suspended_members'") + + @suspended_members.setter + def suspended_members(self, val): + val = self._suspended_members_validator.validate(val) + self._suspended_members_value = val + self._suspended_members_present = True + + @suspended_members.deleter + def suspended_members(self): + self._suspended_members_value = None + self._suspended_members_present = False + + @property + def licenses(self): + """ + The total number of licenses the team has, for each day. + + :rtype: list of [Optional[int]] + """ + if self._licenses_present: + return self._licenses_value + else: + raise AttributeError("missing required field 'licenses'") + + @licenses.setter + def licenses(self, val): + val = self._licenses_validator.validate(val) + self._licenses_value = val + self._licenses_present = True + + @licenses.deleter + def licenses(self): + self._licenses_value = None + self._licenses_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetMembershipReport, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetMembershipReport(start_date={!r}, team_size={!r}, pending_invites={!r}, members_joined={!r}, suspended_members={!r}, licenses={!r})'.format( + self._start_date_value, + self._team_size_value, + self._pending_invites_value, + self._members_joined_value, + self._suspended_members_value, + self._licenses_value, + ) + +GetMembershipReport_validator = bv.Struct(GetMembershipReport) + +class GetStorageReport(BaseDfbReport): + """ + Storage Report Result. Each of the items in the storage report is an array + of values, one value per day. If there is no data for a day, then the value + will be None. + + :ivar total_usage: Sum of the shared, unshared, and datastore usages, for + each day. + :ivar shared_usage: Array of the combined size (bytes) of team members' + shared folders, for each day. + :ivar unshared_usage: Array of the combined size (bytes) of team members' + root namespaces, for each day. + :ivar shared_folders: Array of the number of shared folders owned by team + members, for each day. + :ivar member_storage_map: Array of storage summaries of team members' + account sizes. Each storage summary is an array of key, value pairs, + where each pair describes a storage bucket. The key indicates the upper + bound of the bucket and the value is the number of users in that bucket. + There is one such summary per day. If there is no data for a day, the + storage summary will be empty. + """ + + __slots__ = [ + '_total_usage_value', + '_total_usage_present', + '_shared_usage_value', + '_shared_usage_present', + '_unshared_usage_value', + '_unshared_usage_present', + '_shared_folders_value', + '_shared_folders_present', + '_member_storage_map_value', + '_member_storage_map_present', + ] + + _has_required_fields = True + + def __init__(self, + start_date=None, + total_usage=None, + shared_usage=None, + unshared_usage=None, + shared_folders=None, + member_storage_map=None): + super(GetStorageReport, self).__init__(start_date) + self._total_usage_value = None + self._total_usage_present = False + self._shared_usage_value = None + self._shared_usage_present = False + self._unshared_usage_value = None + self._unshared_usage_present = False + self._shared_folders_value = None + self._shared_folders_present = False + self._member_storage_map_value = None + self._member_storage_map_present = False + if total_usage is not None: + self.total_usage = total_usage + if shared_usage is not None: + self.shared_usage = shared_usage + if unshared_usage is not None: + self.unshared_usage = unshared_usage + if shared_folders is not None: + self.shared_folders = shared_folders + if member_storage_map is not None: + self.member_storage_map = member_storage_map + + @property + def total_usage(self): + """ + Sum of the shared, unshared, and datastore usages, for each day. + + :rtype: list of [Optional[int]] + """ + if self._total_usage_present: + return self._total_usage_value + else: + raise AttributeError("missing required field 'total_usage'") + + @total_usage.setter + def total_usage(self, val): + val = self._total_usage_validator.validate(val) + self._total_usage_value = val + self._total_usage_present = True + + @total_usage.deleter + def total_usage(self): + self._total_usage_value = None + self._total_usage_present = False + + @property + def shared_usage(self): + """ + Array of the combined size (bytes) of team members' shared folders, for + each day. + + :rtype: list of [Optional[int]] + """ + if self._shared_usage_present: + return self._shared_usage_value + else: + raise AttributeError("missing required field 'shared_usage'") + + @shared_usage.setter + def shared_usage(self, val): + val = self._shared_usage_validator.validate(val) + self._shared_usage_value = val + self._shared_usage_present = True + + @shared_usage.deleter + def shared_usage(self): + self._shared_usage_value = None + self._shared_usage_present = False + + @property + def unshared_usage(self): + """ + Array of the combined size (bytes) of team members' root namespaces, for + each day. + + :rtype: list of [Optional[int]] + """ + if self._unshared_usage_present: + return self._unshared_usage_value + else: + raise AttributeError("missing required field 'unshared_usage'") + + @unshared_usage.setter + def unshared_usage(self, val): + val = self._unshared_usage_validator.validate(val) + self._unshared_usage_value = val + self._unshared_usage_present = True + + @unshared_usage.deleter + def unshared_usage(self): + self._unshared_usage_value = None + self._unshared_usage_present = False + + @property + def shared_folders(self): + """ + Array of the number of shared folders owned by team members, for each + day. + + :rtype: list of [Optional[int]] + """ + if self._shared_folders_present: + return self._shared_folders_value + else: + raise AttributeError("missing required field 'shared_folders'") + + @shared_folders.setter + def shared_folders(self, val): + val = self._shared_folders_validator.validate(val) + self._shared_folders_value = val + self._shared_folders_present = True + + @shared_folders.deleter + def shared_folders(self): + self._shared_folders_value = None + self._shared_folders_present = False + + @property + def member_storage_map(self): + """ + Array of storage summaries of team members' account sizes. Each storage + summary is an array of key, value pairs, where each pair describes a + storage bucket. The key indicates the upper bound of the bucket and the + value is the number of users in that bucket. There is one such summary + per day. If there is no data for a day, the storage summary will be + empty. + + :rtype: list of [list of [StorageBucket]] + """ + if self._member_storage_map_present: + return self._member_storage_map_value + else: + raise AttributeError("missing required field 'member_storage_map'") + + @member_storage_map.setter + def member_storage_map(self, val): + val = self._member_storage_map_validator.validate(val) + self._member_storage_map_value = val + self._member_storage_map_present = True + + @member_storage_map.deleter + def member_storage_map(self): + self._member_storage_map_value = None + self._member_storage_map_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetStorageReport, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetStorageReport(start_date={!r}, total_usage={!r}, shared_usage={!r}, unshared_usage={!r}, shared_folders={!r}, member_storage_map={!r})'.format( + self._start_date_value, + self._total_usage_value, + self._shared_usage_value, + self._unshared_usage_value, + self._shared_folders_value, + self._member_storage_map_value, + ) + +GetStorageReport_validator = bv.Struct(GetStorageReport) + +class GroupAccessType(bb.Union): + """ + Role of a user in group. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar member: User is a member of the group, but has no special permissions. + :ivar owner: User can rename the group, and add/remove members. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + member = None + # Attribute is overwritten below the class definition + owner = None + + def is_member(self): + """ + Check if the union tag is ``member``. + + :rtype: bool + """ + return self._tag == 'member' + + def is_owner(self): + """ + Check if the union tag is ``owner``. + + :rtype: bool + """ + return self._tag == 'owner' + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupAccessType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupAccessType(%r, %r)' % (self._tag, self._value) + +GroupAccessType_validator = bv.Union(GroupAccessType) + +class GroupCreateArg(bb.Struct): + """ + :ivar group_name: Group name. + :ivar group_external_id: The creator of a team can associate an arbitrary + external ID to the group. + :ivar group_management_type: Whether the team can be managed by selected + users, or only by team admins. + """ + + __slots__ = [ + '_group_name_value', + '_group_name_present', + '_group_external_id_value', + '_group_external_id_present', + '_group_management_type_value', + '_group_management_type_present', + ] + + _has_required_fields = True + + def __init__(self, + group_name=None, + group_external_id=None, + group_management_type=None): + self._group_name_value = None + self._group_name_present = False + self._group_external_id_value = None + self._group_external_id_present = False + self._group_management_type_value = None + self._group_management_type_present = False + if group_name is not None: + self.group_name = group_name + if group_external_id is not None: + self.group_external_id = group_external_id + if group_management_type is not None: + self.group_management_type = group_management_type + + @property + def group_name(self): + """ + Group name. + + :rtype: str + """ + if self._group_name_present: + return self._group_name_value + else: + raise AttributeError("missing required field 'group_name'") + + @group_name.setter + def group_name(self, val): + val = self._group_name_validator.validate(val) + self._group_name_value = val + self._group_name_present = True + + @group_name.deleter + def group_name(self): + self._group_name_value = None + self._group_name_present = False + + @property + def group_external_id(self): + """ + The creator of a team can associate an arbitrary external ID to the + group. + + :rtype: str + """ + if self._group_external_id_present: + return self._group_external_id_value + else: + return None + + @group_external_id.setter + def group_external_id(self, val): + if val is None: + del self.group_external_id + return + val = self._group_external_id_validator.validate(val) + self._group_external_id_value = val + self._group_external_id_present = True + + @group_external_id.deleter + def group_external_id(self): + self._group_external_id_value = None + self._group_external_id_present = False + + @property + def group_management_type(self): + """ + Whether the team can be managed by selected users, or only by team + admins. + + :rtype: team_common.GroupManagementType + """ + if self._group_management_type_present: + return self._group_management_type_value + else: + return None + + @group_management_type.setter + def group_management_type(self, val): + if val is None: + del self.group_management_type + return + self._group_management_type_validator.validate_type_only(val) + self._group_management_type_value = val + self._group_management_type_present = True + + @group_management_type.deleter + def group_management_type(self): + self._group_management_type_value = None + self._group_management_type_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupCreateArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupCreateArg(group_name={!r}, group_external_id={!r}, group_management_type={!r})'.format( + self._group_name_value, + self._group_external_id_value, + self._group_management_type_value, + ) + +GroupCreateArg_validator = bv.Struct(GroupCreateArg) + +class GroupCreateError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar group_name_already_used: The requested group name is already being + used by another group. + :ivar group_name_invalid: Group name is empty or has invalid characters. + :ivar external_id_already_in_use: The requested external ID is already being + used by another group. + :ivar system_managed_group_disallowed: System-managed group cannot be + manually created. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + group_name_already_used = None + # Attribute is overwritten below the class definition + group_name_invalid = None + # Attribute is overwritten below the class definition + external_id_already_in_use = None + # Attribute is overwritten below the class definition + system_managed_group_disallowed = None + # Attribute is overwritten below the class definition + other = None + + def is_group_name_already_used(self): + """ + Check if the union tag is ``group_name_already_used``. + + :rtype: bool + """ + return self._tag == 'group_name_already_used' + + def is_group_name_invalid(self): + """ + Check if the union tag is ``group_name_invalid``. + + :rtype: bool + """ + return self._tag == 'group_name_invalid' + + def is_external_id_already_in_use(self): + """ + Check if the union tag is ``external_id_already_in_use``. + + :rtype: bool + """ + return self._tag == 'external_id_already_in_use' + + def is_system_managed_group_disallowed(self): + """ + Check if the union tag is ``system_managed_group_disallowed``. + + :rtype: bool + """ + return self._tag == 'system_managed_group_disallowed' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupCreateError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupCreateError(%r, %r)' % (self._tag, self._value) + +GroupCreateError_validator = bv.Union(GroupCreateError) + +class GroupSelectorError(bb.Union): + """ + Error that can be raised when :class:`GroupSelector` is used. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar group_not_found: No matching group found. No groups match the + specified group ID. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + group_not_found = None + # Attribute is overwritten below the class definition + other = None + + def is_group_not_found(self): + """ + Check if the union tag is ``group_not_found``. + + :rtype: bool + """ + return self._tag == 'group_not_found' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupSelectorError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupSelectorError(%r, %r)' % (self._tag, self._value) + +GroupSelectorError_validator = bv.Union(GroupSelectorError) + +class GroupSelectorWithTeamGroupError(GroupSelectorError): + """ + Error that can be raised when :class:`GroupSelector` is used and team groups + are disallowed from being used. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar system_managed_group_disallowed: This operation is not supported on + system-managed groups. + """ + + # Attribute is overwritten below the class definition + system_managed_group_disallowed = None + + def is_system_managed_group_disallowed(self): + """ + Check if the union tag is ``system_managed_group_disallowed``. + + :rtype: bool + """ + return self._tag == 'system_managed_group_disallowed' + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupSelectorWithTeamGroupError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupSelectorWithTeamGroupError(%r, %r)' % (self._tag, self._value) + +GroupSelectorWithTeamGroupError_validator = bv.Union(GroupSelectorWithTeamGroupError) + +class GroupDeleteError(GroupSelectorWithTeamGroupError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar group_already_deleted: This group has already been deleted. + """ + + # Attribute is overwritten below the class definition + group_already_deleted = None + + def is_group_already_deleted(self): + """ + Check if the union tag is ``group_already_deleted``. + + :rtype: bool + """ + return self._tag == 'group_already_deleted' + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupDeleteError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupDeleteError(%r, %r)' % (self._tag, self._value) + +GroupDeleteError_validator = bv.Union(GroupDeleteError) + +class GroupFullInfo(team_common.GroupSummary): + """ + Full description of a group. + + :ivar members: List of group members. + :ivar created: The group creation time as a UTC timestamp in milliseconds + since the Unix epoch. + """ + + __slots__ = [ + '_members_value', + '_members_present', + '_created_value', + '_created_present', + ] + + _has_required_fields = True + + def __init__(self, + group_name=None, + group_id=None, + group_management_type=None, + created=None, + group_external_id=None, + member_count=None, + members=None): + super(GroupFullInfo, self).__init__(group_name, + group_id, + group_management_type, + group_external_id, + member_count) + self._members_value = None + self._members_present = False + self._created_value = None + self._created_present = False + if members is not None: + self.members = members + if created is not None: + self.created = created + + @property + def members(self): + """ + List of group members. + + :rtype: list of [GroupMemberInfo] + """ + if self._members_present: + return self._members_value + else: + return None + + @members.setter + def members(self, val): + if val is None: + del self.members + return + val = self._members_validator.validate(val) + self._members_value = val + self._members_present = True + + @members.deleter + def members(self): + self._members_value = None + self._members_present = False + + @property + def created(self): + """ + The group creation time as a UTC timestamp in milliseconds since the + Unix epoch. + + :rtype: int + """ + if self._created_present: + return self._created_value + else: + raise AttributeError("missing required field 'created'") + + @created.setter + def created(self, val): + val = self._created_validator.validate(val) + self._created_value = val + self._created_present = True + + @created.deleter + def created(self): + self._created_value = None + self._created_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupFullInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupFullInfo(group_name={!r}, group_id={!r}, group_management_type={!r}, created={!r}, group_external_id={!r}, member_count={!r}, members={!r})'.format( + self._group_name_value, + self._group_id_value, + self._group_management_type_value, + self._created_value, + self._group_external_id_value, + self._member_count_value, + self._members_value, + ) + +GroupFullInfo_validator = bv.Struct(GroupFullInfo) + +class GroupMemberInfo(bb.Struct): + """ + Profile of group member, and role in group. + + :ivar profile: Profile of group member. + :ivar access_type: The role that the user has in the group. + """ + + __slots__ = [ + '_profile_value', + '_profile_present', + '_access_type_value', + '_access_type_present', + ] + + _has_required_fields = True + + def __init__(self, + profile=None, + access_type=None): + self._profile_value = None + self._profile_present = False + self._access_type_value = None + self._access_type_present = False + if profile is not None: + self.profile = profile + if access_type is not None: + self.access_type = access_type + + @property + def profile(self): + """ + Profile of group member. + + :rtype: MemberProfile + """ + if self._profile_present: + return self._profile_value + else: + raise AttributeError("missing required field 'profile'") + + @profile.setter + def profile(self, val): + self._profile_validator.validate_type_only(val) + self._profile_value = val + self._profile_present = True + + @profile.deleter + def profile(self): + self._profile_value = None + self._profile_present = False + + @property + def access_type(self): + """ + The role that the user has in the group. + + :rtype: GroupAccessType + """ + if self._access_type_present: + return self._access_type_value + else: + raise AttributeError("missing required field 'access_type'") + + @access_type.setter + def access_type(self, val): + self._access_type_validator.validate_type_only(val) + self._access_type_value = val + self._access_type_present = True + + @access_type.deleter + def access_type(self): + self._access_type_value = None + self._access_type_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupMemberInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupMemberInfo(profile={!r}, access_type={!r})'.format( + self._profile_value, + self._access_type_value, + ) + +GroupMemberInfo_validator = bv.Struct(GroupMemberInfo) + +class GroupMemberSelector(bb.Struct): + """ + Argument for selecting a group and a single user. + + :ivar group: Specify a group. + :ivar user: Identity of a user that is a member of ``group``. + """ + + __slots__ = [ + '_group_value', + '_group_present', + '_user_value', + '_user_present', + ] + + _has_required_fields = True + + def __init__(self, + group=None, + user=None): + self._group_value = None + self._group_present = False + self._user_value = None + self._user_present = False + if group is not None: + self.group = group + if user is not None: + self.user = user + + @property + def group(self): + """ + Specify a group. + + :rtype: GroupSelector + """ + if self._group_present: + return self._group_value + else: + raise AttributeError("missing required field 'group'") + + @group.setter + def group(self, val): + self._group_validator.validate_type_only(val) + self._group_value = val + self._group_present = True + + @group.deleter + def group(self): + self._group_value = None + self._group_present = False + + @property + def user(self): + """ + Identity of a user that is a member of ``group``. + + :rtype: UserSelectorArg + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupMemberSelector, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupMemberSelector(group={!r}, user={!r})'.format( + self._group_value, + self._user_value, + ) + +GroupMemberSelector_validator = bv.Struct(GroupMemberSelector) + +class GroupMemberSelectorError(GroupSelectorWithTeamGroupError): + """ + Error that can be raised when :class:`GroupMemberSelector` is used, and the + user is required to be a member of the specified group. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar member_not_in_group: The specified user is not a member of this group. + """ + + # Attribute is overwritten below the class definition + member_not_in_group = None + + def is_member_not_in_group(self): + """ + Check if the union tag is ``member_not_in_group``. + + :rtype: bool + """ + return self._tag == 'member_not_in_group' + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupMemberSelectorError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupMemberSelectorError(%r, %r)' % (self._tag, self._value) + +GroupMemberSelectorError_validator = bv.Union(GroupMemberSelectorError) + +class GroupMemberSetAccessTypeError(GroupMemberSelectorError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar user_cannot_be_manager_of_company_managed_group: A company managed + group cannot be managed by a user. + """ + + # Attribute is overwritten below the class definition + user_cannot_be_manager_of_company_managed_group = None + + def is_user_cannot_be_manager_of_company_managed_group(self): + """ + Check if the union tag is ``user_cannot_be_manager_of_company_managed_group``. + + :rtype: bool + """ + return self._tag == 'user_cannot_be_manager_of_company_managed_group' + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupMemberSetAccessTypeError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupMemberSetAccessTypeError(%r, %r)' % (self._tag, self._value) + +GroupMemberSetAccessTypeError_validator = bv.Union(GroupMemberSetAccessTypeError) + +class IncludeMembersArg(bb.Struct): + """ + :ivar return_members: Whether to return the list of members in the group. + Note that the default value will cause all the group members to be + returned in the response. This may take a long time for large groups. + """ + + __slots__ = [ + '_return_members_value', + '_return_members_present', + ] + + _has_required_fields = False + + def __init__(self, + return_members=None): + self._return_members_value = None + self._return_members_present = False + if return_members is not None: + self.return_members = return_members + + @property + def return_members(self): + """ + Whether to return the list of members in the group. Note that the + default value will cause all the group members to be returned in the + response. This may take a long time for large groups. + + :rtype: bool + """ + if self._return_members_present: + return self._return_members_value + else: + return True + + @return_members.setter + def return_members(self, val): + val = self._return_members_validator.validate(val) + self._return_members_value = val + self._return_members_present = True + + @return_members.deleter + def return_members(self): + self._return_members_value = None + self._return_members_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(IncludeMembersArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'IncludeMembersArg(return_members={!r})'.format( + self._return_members_value, + ) + +IncludeMembersArg_validator = bv.Struct(IncludeMembersArg) + +class GroupMembersAddArg(IncludeMembersArg): + """ + :ivar group: Group to which users will be added. + :ivar members: List of users to be added to the group. + """ + + __slots__ = [ + '_group_value', + '_group_present', + '_members_value', + '_members_present', + ] + + _has_required_fields = True + + def __init__(self, + group=None, + members=None, + return_members=None): + super(GroupMembersAddArg, self).__init__(return_members) + self._group_value = None + self._group_present = False + self._members_value = None + self._members_present = False + if group is not None: + self.group = group + if members is not None: + self.members = members + + @property + def group(self): + """ + Group to which users will be added. + + :rtype: GroupSelector + """ + if self._group_present: + return self._group_value + else: + raise AttributeError("missing required field 'group'") + + @group.setter + def group(self, val): + self._group_validator.validate_type_only(val) + self._group_value = val + self._group_present = True + + @group.deleter + def group(self): + self._group_value = None + self._group_present = False + + @property + def members(self): + """ + List of users to be added to the group. + + :rtype: list of [MemberAccess] + """ + if self._members_present: + return self._members_value + else: + raise AttributeError("missing required field 'members'") + + @members.setter + def members(self, val): + val = self._members_validator.validate(val) + self._members_value = val + self._members_present = True + + @members.deleter + def members(self): + self._members_value = None + self._members_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupMembersAddArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupMembersAddArg(group={!r}, members={!r}, return_members={!r})'.format( + self._group_value, + self._members_value, + self._return_members_value, + ) + +GroupMembersAddArg_validator = bv.Struct(GroupMembersAddArg) + +class GroupMembersAddError(GroupSelectorWithTeamGroupError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar duplicate_user: You cannot add duplicate users. One or more of the + members you are trying to add is already a member of the group. + :ivar group_not_in_team: Group is not in this team. You cannot add members + to a group that is outside of your team. + :ivar list of [str] members_not_in_team: These members are not part of your + team. Currently, you cannot add members to a group if they are not part + of your team, though this may change in a subsequent version. To add new + members to your Dropbox Business team, use the :route:`members/add` + endpoint. + :ivar list of [str] users_not_found: These users were not found in Dropbox. + :ivar user_must_be_active_to_be_owner: A suspended user cannot be added to a + group as ``GroupAccessType.owner``. + :ivar list of [str] user_cannot_be_manager_of_company_managed_group: A + company-managed group cannot be managed by a user. + """ + + # Attribute is overwritten below the class definition + duplicate_user = None + # Attribute is overwritten below the class definition + group_not_in_team = None + # Attribute is overwritten below the class definition + user_must_be_active_to_be_owner = None + + @classmethod + def members_not_in_team(cls, val): + """ + Create an instance of this class set to the ``members_not_in_team`` tag + with value ``val``. + + :param list of [str] val: + :rtype: GroupMembersAddError + """ + return cls('members_not_in_team', val) + + @classmethod + def users_not_found(cls, val): + """ + Create an instance of this class set to the ``users_not_found`` tag with + value ``val``. + + :param list of [str] val: + :rtype: GroupMembersAddError + """ + return cls('users_not_found', val) + + @classmethod + def user_cannot_be_manager_of_company_managed_group(cls, val): + """ + Create an instance of this class set to the + ``user_cannot_be_manager_of_company_managed_group`` tag with value + ``val``. + + :param list of [str] val: + :rtype: GroupMembersAddError + """ + return cls('user_cannot_be_manager_of_company_managed_group', val) + + def is_duplicate_user(self): + """ + Check if the union tag is ``duplicate_user``. + + :rtype: bool + """ + return self._tag == 'duplicate_user' + + def is_group_not_in_team(self): + """ + Check if the union tag is ``group_not_in_team``. + + :rtype: bool + """ + return self._tag == 'group_not_in_team' + + def is_members_not_in_team(self): + """ + Check if the union tag is ``members_not_in_team``. + + :rtype: bool + """ + return self._tag == 'members_not_in_team' + + def is_users_not_found(self): + """ + Check if the union tag is ``users_not_found``. + + :rtype: bool + """ + return self._tag == 'users_not_found' + + def is_user_must_be_active_to_be_owner(self): + """ + Check if the union tag is ``user_must_be_active_to_be_owner``. + + :rtype: bool + """ + return self._tag == 'user_must_be_active_to_be_owner' + + def is_user_cannot_be_manager_of_company_managed_group(self): + """ + Check if the union tag is ``user_cannot_be_manager_of_company_managed_group``. + + :rtype: bool + """ + return self._tag == 'user_cannot_be_manager_of_company_managed_group' + + def get_members_not_in_team(self): + """ + These members are not part of your team. Currently, you cannot add + members to a group if they are not part of your team, though this may + change in a subsequent version. To add new members to your Dropbox + Business team, use the :meth:`dropbox.dropbox.Dropbox.team_members_add` + endpoint. + + Only call this if :meth:`is_members_not_in_team` is true. + + :rtype: list of [str] + """ + if not self.is_members_not_in_team(): + raise AttributeError("tag 'members_not_in_team' not set") + return self._value + + def get_users_not_found(self): + """ + These users were not found in Dropbox. + + Only call this if :meth:`is_users_not_found` is true. + + :rtype: list of [str] + """ + if not self.is_users_not_found(): + raise AttributeError("tag 'users_not_found' not set") + return self._value + + def get_user_cannot_be_manager_of_company_managed_group(self): + """ + A company-managed group cannot be managed by a user. + + Only call this if :meth:`is_user_cannot_be_manager_of_company_managed_group` is true. + + :rtype: list of [str] + """ + if not self.is_user_cannot_be_manager_of_company_managed_group(): + raise AttributeError("tag 'user_cannot_be_manager_of_company_managed_group' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupMembersAddError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupMembersAddError(%r, %r)' % (self._tag, self._value) + +GroupMembersAddError_validator = bv.Union(GroupMembersAddError) + +class GroupMembersChangeResult(bb.Struct): + """ + Result returned by :meth:`dropbox.dropbox.Dropbox.team_groups_members_add` + and :meth:`dropbox.dropbox.Dropbox.team_groups_members_remove`. + + :ivar group_info: The group info after member change operation has been + performed. + :ivar async_job_id: An ID that can be used to obtain the status of + granting/revoking group-owned resources. + """ + + __slots__ = [ + '_group_info_value', + '_group_info_present', + '_async_job_id_value', + '_async_job_id_present', + ] + + _has_required_fields = True + + def __init__(self, + group_info=None, + async_job_id=None): + self._group_info_value = None + self._group_info_present = False + self._async_job_id_value = None + self._async_job_id_present = False + if group_info is not None: + self.group_info = group_info + if async_job_id is not None: + self.async_job_id = async_job_id + + @property + def group_info(self): + """ + The group info after member change operation has been performed. + + :rtype: GroupFullInfo + """ + if self._group_info_present: + return self._group_info_value + else: + raise AttributeError("missing required field 'group_info'") + + @group_info.setter + def group_info(self, val): + self._group_info_validator.validate_type_only(val) + self._group_info_value = val + self._group_info_present = True + + @group_info.deleter + def group_info(self): + self._group_info_value = None + self._group_info_present = False + + @property + def async_job_id(self): + """ + An ID that can be used to obtain the status of granting/revoking + group-owned resources. + + :rtype: str + """ + if self._async_job_id_present: + return self._async_job_id_value + else: + raise AttributeError("missing required field 'async_job_id'") + + @async_job_id.setter + def async_job_id(self, val): + val = self._async_job_id_validator.validate(val) + self._async_job_id_value = val + self._async_job_id_present = True + + @async_job_id.deleter + def async_job_id(self): + self._async_job_id_value = None + self._async_job_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupMembersChangeResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupMembersChangeResult(group_info={!r}, async_job_id={!r})'.format( + self._group_info_value, + self._async_job_id_value, + ) + +GroupMembersChangeResult_validator = bv.Struct(GroupMembersChangeResult) + +class GroupMembersRemoveArg(IncludeMembersArg): + """ + :ivar group: Group from which users will be removed. + :ivar users: List of users to be removed from the group. + """ + + __slots__ = [ + '_group_value', + '_group_present', + '_users_value', + '_users_present', + ] + + _has_required_fields = True + + def __init__(self, + group=None, + users=None, + return_members=None): + super(GroupMembersRemoveArg, self).__init__(return_members) + self._group_value = None + self._group_present = False + self._users_value = None + self._users_present = False + if group is not None: + self.group = group + if users is not None: + self.users = users + + @property + def group(self): + """ + Group from which users will be removed. + + :rtype: GroupSelector + """ + if self._group_present: + return self._group_value + else: + raise AttributeError("missing required field 'group'") + + @group.setter + def group(self, val): + self._group_validator.validate_type_only(val) + self._group_value = val + self._group_present = True + + @group.deleter + def group(self): + self._group_value = None + self._group_present = False + + @property + def users(self): + """ + List of users to be removed from the group. + + :rtype: list of [UserSelectorArg] + """ + if self._users_present: + return self._users_value + else: + raise AttributeError("missing required field 'users'") + + @users.setter + def users(self, val): + val = self._users_validator.validate(val) + self._users_value = val + self._users_present = True + + @users.deleter + def users(self): + self._users_value = None + self._users_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupMembersRemoveArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupMembersRemoveArg(group={!r}, users={!r}, return_members={!r})'.format( + self._group_value, + self._users_value, + self._return_members_value, + ) + +GroupMembersRemoveArg_validator = bv.Struct(GroupMembersRemoveArg) + +class GroupMembersSelectorError(GroupSelectorWithTeamGroupError): + """ + Error that can be raised when :class:`GroupMembersSelector` is used, and the + users are required to be members of the specified group. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar member_not_in_group: At least one of the specified users is not a + member of the group. + """ + + # Attribute is overwritten below the class definition + member_not_in_group = None + + def is_member_not_in_group(self): + """ + Check if the union tag is ``member_not_in_group``. + + :rtype: bool + """ + return self._tag == 'member_not_in_group' + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupMembersSelectorError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupMembersSelectorError(%r, %r)' % (self._tag, self._value) + +GroupMembersSelectorError_validator = bv.Union(GroupMembersSelectorError) + +class GroupMembersRemoveError(GroupMembersSelectorError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar group_not_in_team: Group is not in this team. You cannot remove + members from a group that is outside of your team. + :ivar list of [str] members_not_in_team: These members are not part of your + team. + :ivar list of [str] users_not_found: These users were not found in Dropbox. + """ + + # Attribute is overwritten below the class definition + group_not_in_team = None + + @classmethod + def members_not_in_team(cls, val): + """ + Create an instance of this class set to the ``members_not_in_team`` tag + with value ``val``. + + :param list of [str] val: + :rtype: GroupMembersRemoveError + """ + return cls('members_not_in_team', val) + + @classmethod + def users_not_found(cls, val): + """ + Create an instance of this class set to the ``users_not_found`` tag with + value ``val``. + + :param list of [str] val: + :rtype: GroupMembersRemoveError + """ + return cls('users_not_found', val) + + def is_group_not_in_team(self): + """ + Check if the union tag is ``group_not_in_team``. + + :rtype: bool + """ + return self._tag == 'group_not_in_team' + + def is_members_not_in_team(self): + """ + Check if the union tag is ``members_not_in_team``. + + :rtype: bool + """ + return self._tag == 'members_not_in_team' + + def is_users_not_found(self): + """ + Check if the union tag is ``users_not_found``. + + :rtype: bool + """ + return self._tag == 'users_not_found' + + def get_members_not_in_team(self): + """ + These members are not part of your team. + + Only call this if :meth:`is_members_not_in_team` is true. + + :rtype: list of [str] + """ + if not self.is_members_not_in_team(): + raise AttributeError("tag 'members_not_in_team' not set") + return self._value + + def get_users_not_found(self): + """ + These users were not found in Dropbox. + + Only call this if :meth:`is_users_not_found` is true. + + :rtype: list of [str] + """ + if not self.is_users_not_found(): + raise AttributeError("tag 'users_not_found' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupMembersRemoveError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupMembersRemoveError(%r, %r)' % (self._tag, self._value) + +GroupMembersRemoveError_validator = bv.Union(GroupMembersRemoveError) + +class GroupMembersSelector(bb.Struct): + """ + Argument for selecting a group and a list of users. + + :ivar group: Specify a group. + :ivar users: A list of users that are members of ``group``. + """ + + __slots__ = [ + '_group_value', + '_group_present', + '_users_value', + '_users_present', + ] + + _has_required_fields = True + + def __init__(self, + group=None, + users=None): + self._group_value = None + self._group_present = False + self._users_value = None + self._users_present = False + if group is not None: + self.group = group + if users is not None: + self.users = users + + @property + def group(self): + """ + Specify a group. + + :rtype: GroupSelector + """ + if self._group_present: + return self._group_value + else: + raise AttributeError("missing required field 'group'") + + @group.setter + def group(self, val): + self._group_validator.validate_type_only(val) + self._group_value = val + self._group_present = True + + @group.deleter + def group(self): + self._group_value = None + self._group_present = False + + @property + def users(self): + """ + A list of users that are members of ``group``. + + :rtype: UsersSelectorArg + """ + if self._users_present: + return self._users_value + else: + raise AttributeError("missing required field 'users'") + + @users.setter + def users(self, val): + self._users_validator.validate_type_only(val) + self._users_value = val + self._users_present = True + + @users.deleter + def users(self): + self._users_value = None + self._users_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupMembersSelector, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupMembersSelector(group={!r}, users={!r})'.format( + self._group_value, + self._users_value, + ) + +GroupMembersSelector_validator = bv.Struct(GroupMembersSelector) + +class GroupMembersSetAccessTypeArg(GroupMemberSelector): + """ + :ivar access_type: New group access type the user will have. + :ivar return_members: Whether to return the list of members in the group. + Note that the default value will cause all the group members to be + returned in the response. This may take a long time for large groups. + """ + + __slots__ = [ + '_access_type_value', + '_access_type_present', + '_return_members_value', + '_return_members_present', + ] + + _has_required_fields = True + + def __init__(self, + group=None, + user=None, + access_type=None, + return_members=None): + super(GroupMembersSetAccessTypeArg, self).__init__(group, + user) + self._access_type_value = None + self._access_type_present = False + self._return_members_value = None + self._return_members_present = False + if access_type is not None: + self.access_type = access_type + if return_members is not None: + self.return_members = return_members + + @property + def access_type(self): + """ + New group access type the user will have. + + :rtype: GroupAccessType + """ + if self._access_type_present: + return self._access_type_value + else: + raise AttributeError("missing required field 'access_type'") + + @access_type.setter + def access_type(self, val): + self._access_type_validator.validate_type_only(val) + self._access_type_value = val + self._access_type_present = True + + @access_type.deleter + def access_type(self): + self._access_type_value = None + self._access_type_present = False + + @property + def return_members(self): + """ + Whether to return the list of members in the group. Note that the + default value will cause all the group members to be returned in the + response. This may take a long time for large groups. + + :rtype: bool + """ + if self._return_members_present: + return self._return_members_value + else: + return True + + @return_members.setter + def return_members(self, val): + val = self._return_members_validator.validate(val) + self._return_members_value = val + self._return_members_present = True + + @return_members.deleter + def return_members(self): + self._return_members_value = None + self._return_members_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupMembersSetAccessTypeArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupMembersSetAccessTypeArg(group={!r}, user={!r}, access_type={!r}, return_members={!r})'.format( + self._group_value, + self._user_value, + self._access_type_value, + self._return_members_value, + ) + +GroupMembersSetAccessTypeArg_validator = bv.Struct(GroupMembersSetAccessTypeArg) + +class GroupSelector(bb.Union): + """ + Argument for selecting a single group, either by group_id or by external + group ID. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar str group_id: Group ID. + :ivar str group_external_id: External ID of the group. + """ + + _catch_all = None + + @classmethod + def group_id(cls, val): + """ + Create an instance of this class set to the ``group_id`` tag with value + ``val``. + + :param str val: + :rtype: GroupSelector + """ + return cls('group_id', val) + + @classmethod + def group_external_id(cls, val): + """ + Create an instance of this class set to the ``group_external_id`` tag + with value ``val``. + + :param str val: + :rtype: GroupSelector + """ + return cls('group_external_id', val) + + def is_group_id(self): + """ + Check if the union tag is ``group_id``. + + :rtype: bool + """ + return self._tag == 'group_id' + + def is_group_external_id(self): + """ + Check if the union tag is ``group_external_id``. + + :rtype: bool + """ + return self._tag == 'group_external_id' + + def get_group_id(self): + """ + Group ID. + + Only call this if :meth:`is_group_id` is true. + + :rtype: str + """ + if not self.is_group_id(): + raise AttributeError("tag 'group_id' not set") + return self._value + + def get_group_external_id(self): + """ + External ID of the group. + + Only call this if :meth:`is_group_external_id` is true. + + :rtype: str + """ + if not self.is_group_external_id(): + raise AttributeError("tag 'group_external_id' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupSelector, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupSelector(%r, %r)' % (self._tag, self._value) + +GroupSelector_validator = bv.Union(GroupSelector) + +class GroupUpdateArgs(IncludeMembersArg): + """ + :ivar group: Specify a group. + :ivar new_group_name: Optional argument. Set group name to this if provided. + :ivar new_group_external_id: Optional argument. New group external ID. If + the argument is None, the group's external_id won't be updated. If the + argument is empty string, the group's external id will be cleared. + :ivar new_group_management_type: Set new group management type, if provided. + """ + + __slots__ = [ + '_group_value', + '_group_present', + '_new_group_name_value', + '_new_group_name_present', + '_new_group_external_id_value', + '_new_group_external_id_present', + '_new_group_management_type_value', + '_new_group_management_type_present', + ] + + _has_required_fields = True + + def __init__(self, + group=None, + return_members=None, + new_group_name=None, + new_group_external_id=None, + new_group_management_type=None): + super(GroupUpdateArgs, self).__init__(return_members) + self._group_value = None + self._group_present = False + self._new_group_name_value = None + self._new_group_name_present = False + self._new_group_external_id_value = None + self._new_group_external_id_present = False + self._new_group_management_type_value = None + self._new_group_management_type_present = False + if group is not None: + self.group = group + if new_group_name is not None: + self.new_group_name = new_group_name + if new_group_external_id is not None: + self.new_group_external_id = new_group_external_id + if new_group_management_type is not None: + self.new_group_management_type = new_group_management_type + + @property + def group(self): + """ + Specify a group. + + :rtype: GroupSelector + """ + if self._group_present: + return self._group_value + else: + raise AttributeError("missing required field 'group'") + + @group.setter + def group(self, val): + self._group_validator.validate_type_only(val) + self._group_value = val + self._group_present = True + + @group.deleter + def group(self): + self._group_value = None + self._group_present = False + + @property + def new_group_name(self): + """ + Optional argument. Set group name to this if provided. + + :rtype: str + """ + if self._new_group_name_present: + return self._new_group_name_value + else: + return None + + @new_group_name.setter + def new_group_name(self, val): + if val is None: + del self.new_group_name + return + val = self._new_group_name_validator.validate(val) + self._new_group_name_value = val + self._new_group_name_present = True + + @new_group_name.deleter + def new_group_name(self): + self._new_group_name_value = None + self._new_group_name_present = False + + @property + def new_group_external_id(self): + """ + Optional argument. New group external ID. If the argument is None, the + group's external_id won't be updated. If the argument is empty string, + the group's external id will be cleared. + + :rtype: str + """ + if self._new_group_external_id_present: + return self._new_group_external_id_value + else: + return None + + @new_group_external_id.setter + def new_group_external_id(self, val): + if val is None: + del self.new_group_external_id + return + val = self._new_group_external_id_validator.validate(val) + self._new_group_external_id_value = val + self._new_group_external_id_present = True + + @new_group_external_id.deleter + def new_group_external_id(self): + self._new_group_external_id_value = None + self._new_group_external_id_present = False + + @property + def new_group_management_type(self): + """ + Set new group management type, if provided. + + :rtype: team_common.GroupManagementType + """ + if self._new_group_management_type_present: + return self._new_group_management_type_value + else: + return None + + @new_group_management_type.setter + def new_group_management_type(self, val): + if val is None: + del self.new_group_management_type + return + self._new_group_management_type_validator.validate_type_only(val) + self._new_group_management_type_value = val + self._new_group_management_type_present = True + + @new_group_management_type.deleter + def new_group_management_type(self): + self._new_group_management_type_value = None + self._new_group_management_type_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupUpdateArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupUpdateArgs(group={!r}, return_members={!r}, new_group_name={!r}, new_group_external_id={!r}, new_group_management_type={!r})'.format( + self._group_value, + self._return_members_value, + self._new_group_name_value, + self._new_group_external_id_value, + self._new_group_management_type_value, + ) + +GroupUpdateArgs_validator = bv.Struct(GroupUpdateArgs) + +class GroupUpdateError(GroupSelectorWithTeamGroupError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar group_name_already_used: The requested group name is already being + used by another group. + :ivar group_name_invalid: Group name is empty or has invalid characters. + :ivar external_id_already_in_use: The requested external ID is already being + used by another group. + """ + + # Attribute is overwritten below the class definition + group_name_already_used = None + # Attribute is overwritten below the class definition + group_name_invalid = None + # Attribute is overwritten below the class definition + external_id_already_in_use = None + + def is_group_name_already_used(self): + """ + Check if the union tag is ``group_name_already_used``. + + :rtype: bool + """ + return self._tag == 'group_name_already_used' + + def is_group_name_invalid(self): + """ + Check if the union tag is ``group_name_invalid``. + + :rtype: bool + """ + return self._tag == 'group_name_invalid' + + def is_external_id_already_in_use(self): + """ + Check if the union tag is ``external_id_already_in_use``. + + :rtype: bool + """ + return self._tag == 'external_id_already_in_use' + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupUpdateError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupUpdateError(%r, %r)' % (self._tag, self._value) + +GroupUpdateError_validator = bv.Union(GroupUpdateError) + +class GroupsGetInfoError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar group_not_on_team: The group is not on your team. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + group_not_on_team = None + # Attribute is overwritten below the class definition + other = None + + def is_group_not_on_team(self): + """ + Check if the union tag is ``group_not_on_team``. + + :rtype: bool + """ + return self._tag == 'group_not_on_team' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupsGetInfoError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupsGetInfoError(%r, %r)' % (self._tag, self._value) + +GroupsGetInfoError_validator = bv.Union(GroupsGetInfoError) + +class GroupsGetInfoItem(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar str id_not_found: An ID that was provided as a parameter to + :route:`groups/get_info`, and did not match a corresponding group. The + ID can be a group ID, or an external ID, depending on how the method was + called. + :ivar GroupFullInfo group_info: Info about a group. + """ + + _catch_all = None + + @classmethod + def id_not_found(cls, val): + """ + Create an instance of this class set to the ``id_not_found`` tag with + value ``val``. + + :param str val: + :rtype: GroupsGetInfoItem + """ + return cls('id_not_found', val) + + @classmethod + def group_info(cls, val): + """ + Create an instance of this class set to the ``group_info`` tag with + value ``val``. + + :param GroupFullInfo val: + :rtype: GroupsGetInfoItem + """ + return cls('group_info', val) + + def is_id_not_found(self): + """ + Check if the union tag is ``id_not_found``. + + :rtype: bool + """ + return self._tag == 'id_not_found' + + def is_group_info(self): + """ + Check if the union tag is ``group_info``. + + :rtype: bool + """ + return self._tag == 'group_info' + + def get_id_not_found(self): + """ + An ID that was provided as a parameter to + :meth:`dropbox.dropbox.Dropbox.team_groups_get_info`, and did not match + a corresponding group. The ID can be a group ID, or an external ID, + depending on how the method was called. + + Only call this if :meth:`is_id_not_found` is true. + + :rtype: str + """ + if not self.is_id_not_found(): + raise AttributeError("tag 'id_not_found' not set") + return self._value + + def get_group_info(self): + """ + Info about a group. + + Only call this if :meth:`is_group_info` is true. + + :rtype: GroupFullInfo + """ + if not self.is_group_info(): + raise AttributeError("tag 'group_info' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupsGetInfoItem, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupsGetInfoItem(%r, %r)' % (self._tag, self._value) + +GroupsGetInfoItem_validator = bv.Union(GroupsGetInfoItem) + +class GroupsListArg(bb.Struct): + """ + :ivar limit: Number of results to return per call. + """ + + __slots__ = [ + '_limit_value', + '_limit_present', + ] + + _has_required_fields = False + + def __init__(self, + limit=None): + self._limit_value = None + self._limit_present = False + if limit is not None: + self.limit = limit + + @property + def limit(self): + """ + Number of results to return per call. + + :rtype: int + """ + if self._limit_present: + return self._limit_value + else: + return 1000 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupsListArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupsListArg(limit={!r})'.format( + self._limit_value, + ) + +GroupsListArg_validator = bv.Struct(GroupsListArg) + +class GroupsListContinueArg(bb.Struct): + """ + :ivar cursor: Indicates from what point to get the next set of groups. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + Indicates from what point to get the next set of groups. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupsListContinueArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupsListContinueArg(cursor={!r})'.format( + self._cursor_value, + ) + +GroupsListContinueArg_validator = bv.Struct(GroupsListContinueArg) + +class GroupsListContinueError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_cursor: The cursor is invalid. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_cursor = None + # Attribute is overwritten below the class definition + other = None + + def is_invalid_cursor(self): + """ + Check if the union tag is ``invalid_cursor``. + + :rtype: bool + """ + return self._tag == 'invalid_cursor' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupsListContinueError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupsListContinueError(%r, %r)' % (self._tag, self._value) + +GroupsListContinueError_validator = bv.Union(GroupsListContinueError) + +class GroupsListResult(bb.Struct): + """ + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_groups_list_continue` to obtain the + additional groups. + :ivar has_more: Is true if there are additional groups that have not been + returned yet. An additional call to + :meth:`dropbox.dropbox.Dropbox.team_groups_list_continue` can retrieve + them. + """ + + __slots__ = [ + '_groups_value', + '_groups_present', + '_cursor_value', + '_cursor_present', + '_has_more_value', + '_has_more_present', + ] + + _has_required_fields = True + + def __init__(self, + groups=None, + cursor=None, + has_more=None): + self._groups_value = None + self._groups_present = False + self._cursor_value = None + self._cursor_present = False + self._has_more_value = None + self._has_more_present = False + if groups is not None: + self.groups = groups + if cursor is not None: + self.cursor = cursor + if has_more is not None: + self.has_more = has_more + + @property + def groups(self): + """ + :rtype: list of [team_common.GroupSummary] + """ + if self._groups_present: + return self._groups_value + else: + raise AttributeError("missing required field 'groups'") + + @groups.setter + def groups(self, val): + val = self._groups_validator.validate(val) + self._groups_value = val + self._groups_present = True + + @groups.deleter + def groups(self): + self._groups_value = None + self._groups_present = False + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_groups_list_continue` to obtain the + additional groups. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def has_more(self): + """ + Is true if there are additional groups that have not been returned yet. + An additional call to + :meth:`dropbox.dropbox.Dropbox.team_groups_list_continue` can retrieve + them. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupsListResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupsListResult(groups={!r}, cursor={!r}, has_more={!r})'.format( + self._groups_value, + self._cursor_value, + self._has_more_value, + ) + +GroupsListResult_validator = bv.Struct(GroupsListResult) + +class GroupsMembersListArg(bb.Struct): + """ + :ivar group: The group whose members are to be listed. + :ivar limit: Number of results to return per call. + """ + + __slots__ = [ + '_group_value', + '_group_present', + '_limit_value', + '_limit_present', + ] + + _has_required_fields = True + + def __init__(self, + group=None, + limit=None): + self._group_value = None + self._group_present = False + self._limit_value = None + self._limit_present = False + if group is not None: + self.group = group + if limit is not None: + self.limit = limit + + @property + def group(self): + """ + The group whose members are to be listed. + + :rtype: GroupSelector + """ + if self._group_present: + return self._group_value + else: + raise AttributeError("missing required field 'group'") + + @group.setter + def group(self, val): + self._group_validator.validate_type_only(val) + self._group_value = val + self._group_present = True + + @group.deleter + def group(self): + self._group_value = None + self._group_present = False + + @property + def limit(self): + """ + Number of results to return per call. + + :rtype: int + """ + if self._limit_present: + return self._limit_value + else: + return 1000 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupsMembersListArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupsMembersListArg(group={!r}, limit={!r})'.format( + self._group_value, + self._limit_value, + ) + +GroupsMembersListArg_validator = bv.Struct(GroupsMembersListArg) + +class GroupsMembersListContinueArg(bb.Struct): + """ + :ivar cursor: Indicates from what point to get the next set of groups. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + Indicates from what point to get the next set of groups. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupsMembersListContinueArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupsMembersListContinueArg(cursor={!r})'.format( + self._cursor_value, + ) + +GroupsMembersListContinueArg_validator = bv.Struct(GroupsMembersListContinueArg) + +class GroupsMembersListContinueError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_cursor: The cursor is invalid. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_cursor = None + # Attribute is overwritten below the class definition + other = None + + def is_invalid_cursor(self): + """ + Check if the union tag is ``invalid_cursor``. + + :rtype: bool + """ + return self._tag == 'invalid_cursor' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupsMembersListContinueError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupsMembersListContinueError(%r, %r)' % (self._tag, self._value) + +GroupsMembersListContinueError_validator = bv.Union(GroupsMembersListContinueError) + +class GroupsMembersListResult(bb.Struct): + """ + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_groups_members_list_continue` to + obtain additional group members. + :ivar has_more: Is true if there are additional group members that have not + been returned yet. An additional call to + :meth:`dropbox.dropbox.Dropbox.team_groups_members_list_continue` can + retrieve them. + """ + + __slots__ = [ + '_members_value', + '_members_present', + '_cursor_value', + '_cursor_present', + '_has_more_value', + '_has_more_present', + ] + + _has_required_fields = True + + def __init__(self, + members=None, + cursor=None, + has_more=None): + self._members_value = None + self._members_present = False + self._cursor_value = None + self._cursor_present = False + self._has_more_value = None + self._has_more_present = False + if members is not None: + self.members = members + if cursor is not None: + self.cursor = cursor + if has_more is not None: + self.has_more = has_more + + @property + def members(self): + """ + :rtype: list of [GroupMemberInfo] + """ + if self._members_present: + return self._members_value + else: + raise AttributeError("missing required field 'members'") + + @members.setter + def members(self, val): + val = self._members_validator.validate(val) + self._members_value = val + self._members_present = True + + @members.deleter + def members(self): + self._members_value = None + self._members_present = False + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_groups_members_list_continue` to + obtain additional group members. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def has_more(self): + """ + Is true if there are additional group members that have not been + returned yet. An additional call to + :meth:`dropbox.dropbox.Dropbox.team_groups_members_list_continue` can + retrieve them. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupsMembersListResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupsMembersListResult(members={!r}, cursor={!r}, has_more={!r})'.format( + self._members_value, + self._cursor_value, + self._has_more_value, + ) + +GroupsMembersListResult_validator = bv.Struct(GroupsMembersListResult) + +class GroupsPollError(async_.PollError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar access_denied: You are not allowed to poll this job. + """ + + # Attribute is overwritten below the class definition + access_denied = None + + def is_access_denied(self): + """ + Check if the union tag is ``access_denied``. + + :rtype: bool + """ + return self._tag == 'access_denied' + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupsPollError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupsPollError(%r, %r)' % (self._tag, self._value) + +GroupsPollError_validator = bv.Union(GroupsPollError) + +class GroupsSelector(bb.Union): + """ + Argument for selecting a list of groups, either by group_ids, or external + group IDs. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar list of [str] group_ids: List of group IDs. + :ivar list of [str] group_external_ids: List of external IDs of groups. + """ + + _catch_all = None + + @classmethod + def group_ids(cls, val): + """ + Create an instance of this class set to the ``group_ids`` tag with value + ``val``. + + :param list of [str] val: + :rtype: GroupsSelector + """ + return cls('group_ids', val) + + @classmethod + def group_external_ids(cls, val): + """ + Create an instance of this class set to the ``group_external_ids`` tag + with value ``val``. + + :param list of [str] val: + :rtype: GroupsSelector + """ + return cls('group_external_ids', val) + + def is_group_ids(self): + """ + Check if the union tag is ``group_ids``. + + :rtype: bool + """ + return self._tag == 'group_ids' + + def is_group_external_ids(self): + """ + Check if the union tag is ``group_external_ids``. + + :rtype: bool + """ + return self._tag == 'group_external_ids' + + def get_group_ids(self): + """ + List of group IDs. + + Only call this if :meth:`is_group_ids` is true. + + :rtype: list of [str] + """ + if not self.is_group_ids(): + raise AttributeError("tag 'group_ids' not set") + return self._value + + def get_group_external_ids(self): + """ + List of external IDs of groups. + + Only call this if :meth:`is_group_external_ids` is true. + + :rtype: list of [str] + """ + if not self.is_group_external_ids(): + raise AttributeError("tag 'group_external_ids' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupsSelector, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupsSelector(%r, %r)' % (self._tag, self._value) + +GroupsSelector_validator = bv.Union(GroupsSelector) + +class HasTeamFileEventsValue(bb.Union): + """ + The value for ``Feature.has_team_file_events``. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar bool enabled: Does this team have file events. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def enabled(cls, val): + """ + Create an instance of this class set to the ``enabled`` tag with value + ``val``. + + :param bool val: + :rtype: HasTeamFileEventsValue + """ + return cls('enabled', val) + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_enabled(self): + """ + Does this team have file events. + + Only call this if :meth:`is_enabled` is true. + + :rtype: bool + """ + if not self.is_enabled(): + raise AttributeError("tag 'enabled' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(HasTeamFileEventsValue, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'HasTeamFileEventsValue(%r, %r)' % (self._tag, self._value) + +HasTeamFileEventsValue_validator = bv.Union(HasTeamFileEventsValue) + +class HasTeamSelectiveSyncValue(bb.Union): + """ + The value for ``Feature.has_team_selective_sync``. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar bool has_team_selective_sync: Does this team have team selective sync + enabled. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def has_team_selective_sync(cls, val): + """ + Create an instance of this class set to the ``has_team_selective_sync`` + tag with value ``val``. + + :param bool val: + :rtype: HasTeamSelectiveSyncValue + """ + return cls('has_team_selective_sync', val) + + def is_has_team_selective_sync(self): + """ + Check if the union tag is ``has_team_selective_sync``. + + :rtype: bool + """ + return self._tag == 'has_team_selective_sync' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_has_team_selective_sync(self): + """ + Does this team have team selective sync enabled. + + Only call this if :meth:`is_has_team_selective_sync` is true. + + :rtype: bool + """ + if not self.is_has_team_selective_sync(): + raise AttributeError("tag 'has_team_selective_sync' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(HasTeamSelectiveSyncValue, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'HasTeamSelectiveSyncValue(%r, %r)' % (self._tag, self._value) + +HasTeamSelectiveSyncValue_validator = bv.Union(HasTeamSelectiveSyncValue) + +class HasTeamSharedDropboxValue(bb.Union): + """ + The value for ``Feature.has_team_shared_dropbox``. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar bool has_team_shared_dropbox: Does this team have a shared team root. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def has_team_shared_dropbox(cls, val): + """ + Create an instance of this class set to the ``has_team_shared_dropbox`` + tag with value ``val``. + + :param bool val: + :rtype: HasTeamSharedDropboxValue + """ + return cls('has_team_shared_dropbox', val) + + def is_has_team_shared_dropbox(self): + """ + Check if the union tag is ``has_team_shared_dropbox``. + + :rtype: bool + """ + return self._tag == 'has_team_shared_dropbox' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_has_team_shared_dropbox(self): + """ + Does this team have a shared team root. + + Only call this if :meth:`is_has_team_shared_dropbox` is true. + + :rtype: bool + """ + if not self.is_has_team_shared_dropbox(): + raise AttributeError("tag 'has_team_shared_dropbox' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(HasTeamSharedDropboxValue, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'HasTeamSharedDropboxValue(%r, %r)' % (self._tag, self._value) + +HasTeamSharedDropboxValue_validator = bv.Union(HasTeamSharedDropboxValue) + +class ListMemberAppsArg(bb.Struct): + """ + :ivar team_member_id: The team member id. + """ + + __slots__ = [ + '_team_member_id_value', + '_team_member_id_present', + ] + + _has_required_fields = True + + def __init__(self, + team_member_id=None): + self._team_member_id_value = None + self._team_member_id_present = False + if team_member_id is not None: + self.team_member_id = team_member_id + + @property + def team_member_id(self): + """ + The team member id. + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + raise AttributeError("missing required field 'team_member_id'") + + @team_member_id.setter + def team_member_id(self, val): + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListMemberAppsArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListMemberAppsArg(team_member_id={!r})'.format( + self._team_member_id_value, + ) + +ListMemberAppsArg_validator = bv.Struct(ListMemberAppsArg) + +class ListMemberAppsError(bb.Union): + """ + Error returned by + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_member_linked_apps`. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar member_not_found: Member not found. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + member_not_found = None + # Attribute is overwritten below the class definition + other = None + + def is_member_not_found(self): + """ + Check if the union tag is ``member_not_found``. + + :rtype: bool + """ + return self._tag == 'member_not_found' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ListMemberAppsError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListMemberAppsError(%r, %r)' % (self._tag, self._value) + +ListMemberAppsError_validator = bv.Union(ListMemberAppsError) + +class ListMemberAppsResult(bb.Struct): + """ + :ivar linked_api_apps: List of third party applications linked by this team + member. + """ + + __slots__ = [ + '_linked_api_apps_value', + '_linked_api_apps_present', + ] + + _has_required_fields = True + + def __init__(self, + linked_api_apps=None): + self._linked_api_apps_value = None + self._linked_api_apps_present = False + if linked_api_apps is not None: + self.linked_api_apps = linked_api_apps + + @property + def linked_api_apps(self): + """ + List of third party applications linked by this team member. + + :rtype: list of [ApiApp] + """ + if self._linked_api_apps_present: + return self._linked_api_apps_value + else: + raise AttributeError("missing required field 'linked_api_apps'") + + @linked_api_apps.setter + def linked_api_apps(self, val): + val = self._linked_api_apps_validator.validate(val) + self._linked_api_apps_value = val + self._linked_api_apps_present = True + + @linked_api_apps.deleter + def linked_api_apps(self): + self._linked_api_apps_value = None + self._linked_api_apps_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListMemberAppsResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListMemberAppsResult(linked_api_apps={!r})'.format( + self._linked_api_apps_value, + ) + +ListMemberAppsResult_validator = bv.Struct(ListMemberAppsResult) + +class ListMemberDevicesArg(bb.Struct): + """ + :ivar team_member_id: The team's member id. + :ivar include_web_sessions: Whether to list web sessions of the team's + member. + :ivar include_desktop_clients: Whether to list linked desktop devices of the + team's member. + :ivar include_mobile_clients: Whether to list linked mobile devices of the + team's member. + """ + + __slots__ = [ + '_team_member_id_value', + '_team_member_id_present', + '_include_web_sessions_value', + '_include_web_sessions_present', + '_include_desktop_clients_value', + '_include_desktop_clients_present', + '_include_mobile_clients_value', + '_include_mobile_clients_present', + ] + + _has_required_fields = True + + def __init__(self, + team_member_id=None, + include_web_sessions=None, + include_desktop_clients=None, + include_mobile_clients=None): + self._team_member_id_value = None + self._team_member_id_present = False + self._include_web_sessions_value = None + self._include_web_sessions_present = False + self._include_desktop_clients_value = None + self._include_desktop_clients_present = False + self._include_mobile_clients_value = None + self._include_mobile_clients_present = False + if team_member_id is not None: + self.team_member_id = team_member_id + if include_web_sessions is not None: + self.include_web_sessions = include_web_sessions + if include_desktop_clients is not None: + self.include_desktop_clients = include_desktop_clients + if include_mobile_clients is not None: + self.include_mobile_clients = include_mobile_clients + + @property + def team_member_id(self): + """ + The team's member id. + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + raise AttributeError("missing required field 'team_member_id'") + + @team_member_id.setter + def team_member_id(self, val): + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + @property + def include_web_sessions(self): + """ + Whether to list web sessions of the team's member. + + :rtype: bool + """ + if self._include_web_sessions_present: + return self._include_web_sessions_value + else: + return True + + @include_web_sessions.setter + def include_web_sessions(self, val): + val = self._include_web_sessions_validator.validate(val) + self._include_web_sessions_value = val + self._include_web_sessions_present = True + + @include_web_sessions.deleter + def include_web_sessions(self): + self._include_web_sessions_value = None + self._include_web_sessions_present = False + + @property + def include_desktop_clients(self): + """ + Whether to list linked desktop devices of the team's member. + + :rtype: bool + """ + if self._include_desktop_clients_present: + return self._include_desktop_clients_value + else: + return True + + @include_desktop_clients.setter + def include_desktop_clients(self, val): + val = self._include_desktop_clients_validator.validate(val) + self._include_desktop_clients_value = val + self._include_desktop_clients_present = True + + @include_desktop_clients.deleter + def include_desktop_clients(self): + self._include_desktop_clients_value = None + self._include_desktop_clients_present = False + + @property + def include_mobile_clients(self): + """ + Whether to list linked mobile devices of the team's member. + + :rtype: bool + """ + if self._include_mobile_clients_present: + return self._include_mobile_clients_value + else: + return True + + @include_mobile_clients.setter + def include_mobile_clients(self, val): + val = self._include_mobile_clients_validator.validate(val) + self._include_mobile_clients_value = val + self._include_mobile_clients_present = True + + @include_mobile_clients.deleter + def include_mobile_clients(self): + self._include_mobile_clients_value = None + self._include_mobile_clients_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListMemberDevicesArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListMemberDevicesArg(team_member_id={!r}, include_web_sessions={!r}, include_desktop_clients={!r}, include_mobile_clients={!r})'.format( + self._team_member_id_value, + self._include_web_sessions_value, + self._include_desktop_clients_value, + self._include_mobile_clients_value, + ) + +ListMemberDevicesArg_validator = bv.Struct(ListMemberDevicesArg) + +class ListMemberDevicesError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar member_not_found: Member not found. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + member_not_found = None + # Attribute is overwritten below the class definition + other = None + + def is_member_not_found(self): + """ + Check if the union tag is ``member_not_found``. + + :rtype: bool + """ + return self._tag == 'member_not_found' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ListMemberDevicesError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListMemberDevicesError(%r, %r)' % (self._tag, self._value) + +ListMemberDevicesError_validator = bv.Union(ListMemberDevicesError) + +class ListMemberDevicesResult(bb.Struct): + """ + :ivar active_web_sessions: List of web sessions made by this team member. + :ivar desktop_client_sessions: List of desktop clients used by this team + member. + :ivar mobile_client_sessions: List of mobile client used by this team + member. + """ + + __slots__ = [ + '_active_web_sessions_value', + '_active_web_sessions_present', + '_desktop_client_sessions_value', + '_desktop_client_sessions_present', + '_mobile_client_sessions_value', + '_mobile_client_sessions_present', + ] + + _has_required_fields = False + + def __init__(self, + active_web_sessions=None, + desktop_client_sessions=None, + mobile_client_sessions=None): + self._active_web_sessions_value = None + self._active_web_sessions_present = False + self._desktop_client_sessions_value = None + self._desktop_client_sessions_present = False + self._mobile_client_sessions_value = None + self._mobile_client_sessions_present = False + if active_web_sessions is not None: + self.active_web_sessions = active_web_sessions + if desktop_client_sessions is not None: + self.desktop_client_sessions = desktop_client_sessions + if mobile_client_sessions is not None: + self.mobile_client_sessions = mobile_client_sessions + + @property + def active_web_sessions(self): + """ + List of web sessions made by this team member. + + :rtype: list of [ActiveWebSession] + """ + if self._active_web_sessions_present: + return self._active_web_sessions_value + else: + return None + + @active_web_sessions.setter + def active_web_sessions(self, val): + if val is None: + del self.active_web_sessions + return + val = self._active_web_sessions_validator.validate(val) + self._active_web_sessions_value = val + self._active_web_sessions_present = True + + @active_web_sessions.deleter + def active_web_sessions(self): + self._active_web_sessions_value = None + self._active_web_sessions_present = False + + @property + def desktop_client_sessions(self): + """ + List of desktop clients used by this team member. + + :rtype: list of [DesktopClientSession] + """ + if self._desktop_client_sessions_present: + return self._desktop_client_sessions_value + else: + return None + + @desktop_client_sessions.setter + def desktop_client_sessions(self, val): + if val is None: + del self.desktop_client_sessions + return + val = self._desktop_client_sessions_validator.validate(val) + self._desktop_client_sessions_value = val + self._desktop_client_sessions_present = True + + @desktop_client_sessions.deleter + def desktop_client_sessions(self): + self._desktop_client_sessions_value = None + self._desktop_client_sessions_present = False + + @property + def mobile_client_sessions(self): + """ + List of mobile client used by this team member. + + :rtype: list of [MobileClientSession] + """ + if self._mobile_client_sessions_present: + return self._mobile_client_sessions_value + else: + return None + + @mobile_client_sessions.setter + def mobile_client_sessions(self, val): + if val is None: + del self.mobile_client_sessions + return + val = self._mobile_client_sessions_validator.validate(val) + self._mobile_client_sessions_value = val + self._mobile_client_sessions_present = True + + @mobile_client_sessions.deleter + def mobile_client_sessions(self): + self._mobile_client_sessions_value = None + self._mobile_client_sessions_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListMemberDevicesResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListMemberDevicesResult(active_web_sessions={!r}, desktop_client_sessions={!r}, mobile_client_sessions={!r})'.format( + self._active_web_sessions_value, + self._desktop_client_sessions_value, + self._mobile_client_sessions_value, + ) + +ListMemberDevicesResult_validator = bv.Struct(ListMemberDevicesResult) + +class ListMembersAppsArg(bb.Struct): + """ + Arguments for + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_members_linked_apps`. + + :ivar cursor: At the first call to the + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_members_linked_apps` + the cursor shouldn't be passed. Then, if the result of the call includes + a cursor, the following requests should include the received cursors in + order to receive the next sub list of the team applications. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = False + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + At the first call to the + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_members_linked_apps` + the cursor shouldn't be passed. Then, if the result of the call includes + a cursor, the following requests should include the received cursors in + order to receive the next sub list of the team applications. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListMembersAppsArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListMembersAppsArg(cursor={!r})'.format( + self._cursor_value, + ) + +ListMembersAppsArg_validator = bv.Struct(ListMembersAppsArg) + +class ListMembersAppsError(bb.Union): + """ + Error returned by + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_members_linked_apps`. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar reset: Indicates that the cursor has been invalidated. Call + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_members_linked_apps` + again with an empty cursor to obtain a new cursor. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + reset = None + # Attribute is overwritten below the class definition + other = None + + def is_reset(self): + """ + Check if the union tag is ``reset``. + + :rtype: bool + """ + return self._tag == 'reset' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ListMembersAppsError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListMembersAppsError(%r, %r)' % (self._tag, self._value) + +ListMembersAppsError_validator = bv.Union(ListMembersAppsError) + +class ListMembersAppsResult(bb.Struct): + """ + Information returned by + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_members_linked_apps`. + + :ivar apps: The linked applications of each member of the team. + :ivar has_more: If true, then there are more apps available. Pass the cursor + to + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_members_linked_apps` + to retrieve the rest. + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_members_linked_apps` + to receive the next sub list of team's applications. + """ + + __slots__ = [ + '_apps_value', + '_apps_present', + '_has_more_value', + '_has_more_present', + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + apps=None, + has_more=None, + cursor=None): + self._apps_value = None + self._apps_present = False + self._has_more_value = None + self._has_more_present = False + self._cursor_value = None + self._cursor_present = False + if apps is not None: + self.apps = apps + if has_more is not None: + self.has_more = has_more + if cursor is not None: + self.cursor = cursor + + @property + def apps(self): + """ + The linked applications of each member of the team. + + :rtype: list of [MemberLinkedApps] + """ + if self._apps_present: + return self._apps_value + else: + raise AttributeError("missing required field 'apps'") + + @apps.setter + def apps(self, val): + val = self._apps_validator.validate(val) + self._apps_value = val + self._apps_present = True + + @apps.deleter + def apps(self): + self._apps_value = None + self._apps_present = False + + @property + def has_more(self): + """ + If true, then there are more apps available. Pass the cursor to + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_members_linked_apps` + to retrieve the rest. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_members_linked_apps` + to receive the next sub list of team's applications. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListMembersAppsResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListMembersAppsResult(apps={!r}, has_more={!r}, cursor={!r})'.format( + self._apps_value, + self._has_more_value, + self._cursor_value, + ) + +ListMembersAppsResult_validator = bv.Struct(ListMembersAppsResult) + +class ListMembersDevicesArg(bb.Struct): + """ + :ivar cursor: At the first call to the + :meth:`dropbox.dropbox.Dropbox.team_devices_list_members_devices` the + cursor shouldn't be passed. Then, if the result of the call includes a + cursor, the following requests should include the received cursors in + order to receive the next sub list of team devices. + :ivar include_web_sessions: Whether to list web sessions of the team + members. + :ivar include_desktop_clients: Whether to list desktop clients of the team + members. + :ivar include_mobile_clients: Whether to list mobile clients of the team + members. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + '_include_web_sessions_value', + '_include_web_sessions_present', + '_include_desktop_clients_value', + '_include_desktop_clients_present', + '_include_mobile_clients_value', + '_include_mobile_clients_present', + ] + + _has_required_fields = False + + def __init__(self, + cursor=None, + include_web_sessions=None, + include_desktop_clients=None, + include_mobile_clients=None): + self._cursor_value = None + self._cursor_present = False + self._include_web_sessions_value = None + self._include_web_sessions_present = False + self._include_desktop_clients_value = None + self._include_desktop_clients_present = False + self._include_mobile_clients_value = None + self._include_mobile_clients_present = False + if cursor is not None: + self.cursor = cursor + if include_web_sessions is not None: + self.include_web_sessions = include_web_sessions + if include_desktop_clients is not None: + self.include_desktop_clients = include_desktop_clients + if include_mobile_clients is not None: + self.include_mobile_clients = include_mobile_clients + + @property + def cursor(self): + """ + At the first call to the + :meth:`dropbox.dropbox.Dropbox.team_devices_list_members_devices` the + cursor shouldn't be passed. Then, if the result of the call includes a + cursor, the following requests should include the received cursors in + order to receive the next sub list of team devices. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def include_web_sessions(self): + """ + Whether to list web sessions of the team members. + + :rtype: bool + """ + if self._include_web_sessions_present: + return self._include_web_sessions_value + else: + return True + + @include_web_sessions.setter + def include_web_sessions(self, val): + val = self._include_web_sessions_validator.validate(val) + self._include_web_sessions_value = val + self._include_web_sessions_present = True + + @include_web_sessions.deleter + def include_web_sessions(self): + self._include_web_sessions_value = None + self._include_web_sessions_present = False + + @property + def include_desktop_clients(self): + """ + Whether to list desktop clients of the team members. + + :rtype: bool + """ + if self._include_desktop_clients_present: + return self._include_desktop_clients_value + else: + return True + + @include_desktop_clients.setter + def include_desktop_clients(self, val): + val = self._include_desktop_clients_validator.validate(val) + self._include_desktop_clients_value = val + self._include_desktop_clients_present = True + + @include_desktop_clients.deleter + def include_desktop_clients(self): + self._include_desktop_clients_value = None + self._include_desktop_clients_present = False + + @property + def include_mobile_clients(self): + """ + Whether to list mobile clients of the team members. + + :rtype: bool + """ + if self._include_mobile_clients_present: + return self._include_mobile_clients_value + else: + return True + + @include_mobile_clients.setter + def include_mobile_clients(self, val): + val = self._include_mobile_clients_validator.validate(val) + self._include_mobile_clients_value = val + self._include_mobile_clients_present = True + + @include_mobile_clients.deleter + def include_mobile_clients(self): + self._include_mobile_clients_value = None + self._include_mobile_clients_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListMembersDevicesArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListMembersDevicesArg(cursor={!r}, include_web_sessions={!r}, include_desktop_clients={!r}, include_mobile_clients={!r})'.format( + self._cursor_value, + self._include_web_sessions_value, + self._include_desktop_clients_value, + self._include_mobile_clients_value, + ) + +ListMembersDevicesArg_validator = bv.Struct(ListMembersDevicesArg) + +class ListMembersDevicesError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar reset: Indicates that the cursor has been invalidated. Call + :meth:`dropbox.dropbox.Dropbox.team_devices_list_members_devices` again + with an empty cursor to obtain a new cursor. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + reset = None + # Attribute is overwritten below the class definition + other = None + + def is_reset(self): + """ + Check if the union tag is ``reset``. + + :rtype: bool + """ + return self._tag == 'reset' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ListMembersDevicesError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListMembersDevicesError(%r, %r)' % (self._tag, self._value) + +ListMembersDevicesError_validator = bv.Union(ListMembersDevicesError) + +class ListMembersDevicesResult(bb.Struct): + """ + :ivar devices: The devices of each member of the team. + :ivar has_more: If true, then there are more devices available. Pass the + cursor to + :meth:`dropbox.dropbox.Dropbox.team_devices_list_members_devices` to + retrieve the rest. + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_devices_list_members_devices` to + receive the next sub list of team's devices. + """ + + __slots__ = [ + '_devices_value', + '_devices_present', + '_has_more_value', + '_has_more_present', + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + devices=None, + has_more=None, + cursor=None): + self._devices_value = None + self._devices_present = False + self._has_more_value = None + self._has_more_present = False + self._cursor_value = None + self._cursor_present = False + if devices is not None: + self.devices = devices + if has_more is not None: + self.has_more = has_more + if cursor is not None: + self.cursor = cursor + + @property + def devices(self): + """ + The devices of each member of the team. + + :rtype: list of [MemberDevices] + """ + if self._devices_present: + return self._devices_value + else: + raise AttributeError("missing required field 'devices'") + + @devices.setter + def devices(self, val): + val = self._devices_validator.validate(val) + self._devices_value = val + self._devices_present = True + + @devices.deleter + def devices(self): + self._devices_value = None + self._devices_present = False + + @property + def has_more(self): + """ + If true, then there are more devices available. Pass the cursor to + :meth:`dropbox.dropbox.Dropbox.team_devices_list_members_devices` to + retrieve the rest. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_devices_list_members_devices` to + receive the next sub list of team's devices. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListMembersDevicesResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListMembersDevicesResult(devices={!r}, has_more={!r}, cursor={!r})'.format( + self._devices_value, + self._has_more_value, + self._cursor_value, + ) + +ListMembersDevicesResult_validator = bv.Struct(ListMembersDevicesResult) + +class ListTeamAppsArg(bb.Struct): + """ + Arguments for + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_team_linked_apps`. + + :ivar cursor: At the first call to the + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_team_linked_apps` + the cursor shouldn't be passed. Then, if the result of the call includes + a cursor, the following requests should include the received cursors in + order to receive the next sub list of the team applications. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = False + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + At the first call to the + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_team_linked_apps` + the cursor shouldn't be passed. Then, if the result of the call includes + a cursor, the following requests should include the received cursors in + order to receive the next sub list of the team applications. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListTeamAppsArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListTeamAppsArg(cursor={!r})'.format( + self._cursor_value, + ) + +ListTeamAppsArg_validator = bv.Struct(ListTeamAppsArg) + +class ListTeamAppsError(bb.Union): + """ + Error returned by + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_team_linked_apps`. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar reset: Indicates that the cursor has been invalidated. Call + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_team_linked_apps` + again with an empty cursor to obtain a new cursor. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + reset = None + # Attribute is overwritten below the class definition + other = None + + def is_reset(self): + """ + Check if the union tag is ``reset``. + + :rtype: bool + """ + return self._tag == 'reset' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ListTeamAppsError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListTeamAppsError(%r, %r)' % (self._tag, self._value) + +ListTeamAppsError_validator = bv.Union(ListTeamAppsError) + +class ListTeamAppsResult(bb.Struct): + """ + Information returned by + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_team_linked_apps`. + + :ivar apps: The linked applications of each member of the team. + :ivar has_more: If true, then there are more apps available. Pass the cursor + to + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_team_linked_apps` + to retrieve the rest. + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_team_linked_apps` + to receive the next sub list of team's applications. + """ + + __slots__ = [ + '_apps_value', + '_apps_present', + '_has_more_value', + '_has_more_present', + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + apps=None, + has_more=None, + cursor=None): + self._apps_value = None + self._apps_present = False + self._has_more_value = None + self._has_more_present = False + self._cursor_value = None + self._cursor_present = False + if apps is not None: + self.apps = apps + if has_more is not None: + self.has_more = has_more + if cursor is not None: + self.cursor = cursor + + @property + def apps(self): + """ + The linked applications of each member of the team. + + :rtype: list of [MemberLinkedApps] + """ + if self._apps_present: + return self._apps_value + else: + raise AttributeError("missing required field 'apps'") + + @apps.setter + def apps(self, val): + val = self._apps_validator.validate(val) + self._apps_value = val + self._apps_present = True + + @apps.deleter + def apps(self): + self._apps_value = None + self._apps_present = False + + @property + def has_more(self): + """ + If true, then there are more apps available. Pass the cursor to + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_team_linked_apps` + to retrieve the rest. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_list_team_linked_apps` + to receive the next sub list of team's applications. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListTeamAppsResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListTeamAppsResult(apps={!r}, has_more={!r}, cursor={!r})'.format( + self._apps_value, + self._has_more_value, + self._cursor_value, + ) + +ListTeamAppsResult_validator = bv.Struct(ListTeamAppsResult) + +class ListTeamDevicesArg(bb.Struct): + """ + :ivar cursor: At the first call to the + :meth:`dropbox.dropbox.Dropbox.team_devices_list_team_devices` the + cursor shouldn't be passed. Then, if the result of the call includes a + cursor, the following requests should include the received cursors in + order to receive the next sub list of team devices. + :ivar include_web_sessions: Whether to list web sessions of the team + members. + :ivar include_desktop_clients: Whether to list desktop clients of the team + members. + :ivar include_mobile_clients: Whether to list mobile clients of the team + members. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + '_include_web_sessions_value', + '_include_web_sessions_present', + '_include_desktop_clients_value', + '_include_desktop_clients_present', + '_include_mobile_clients_value', + '_include_mobile_clients_present', + ] + + _has_required_fields = False + + def __init__(self, + cursor=None, + include_web_sessions=None, + include_desktop_clients=None, + include_mobile_clients=None): + self._cursor_value = None + self._cursor_present = False + self._include_web_sessions_value = None + self._include_web_sessions_present = False + self._include_desktop_clients_value = None + self._include_desktop_clients_present = False + self._include_mobile_clients_value = None + self._include_mobile_clients_present = False + if cursor is not None: + self.cursor = cursor + if include_web_sessions is not None: + self.include_web_sessions = include_web_sessions + if include_desktop_clients is not None: + self.include_desktop_clients = include_desktop_clients + if include_mobile_clients is not None: + self.include_mobile_clients = include_mobile_clients + + @property + def cursor(self): + """ + At the first call to the + :meth:`dropbox.dropbox.Dropbox.team_devices_list_team_devices` the + cursor shouldn't be passed. Then, if the result of the call includes a + cursor, the following requests should include the received cursors in + order to receive the next sub list of team devices. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def include_web_sessions(self): + """ + Whether to list web sessions of the team members. + + :rtype: bool + """ + if self._include_web_sessions_present: + return self._include_web_sessions_value + else: + return True + + @include_web_sessions.setter + def include_web_sessions(self, val): + val = self._include_web_sessions_validator.validate(val) + self._include_web_sessions_value = val + self._include_web_sessions_present = True + + @include_web_sessions.deleter + def include_web_sessions(self): + self._include_web_sessions_value = None + self._include_web_sessions_present = False + + @property + def include_desktop_clients(self): + """ + Whether to list desktop clients of the team members. + + :rtype: bool + """ + if self._include_desktop_clients_present: + return self._include_desktop_clients_value + else: + return True + + @include_desktop_clients.setter + def include_desktop_clients(self, val): + val = self._include_desktop_clients_validator.validate(val) + self._include_desktop_clients_value = val + self._include_desktop_clients_present = True + + @include_desktop_clients.deleter + def include_desktop_clients(self): + self._include_desktop_clients_value = None + self._include_desktop_clients_present = False + + @property + def include_mobile_clients(self): + """ + Whether to list mobile clients of the team members. + + :rtype: bool + """ + if self._include_mobile_clients_present: + return self._include_mobile_clients_value + else: + return True + + @include_mobile_clients.setter + def include_mobile_clients(self, val): + val = self._include_mobile_clients_validator.validate(val) + self._include_mobile_clients_value = val + self._include_mobile_clients_present = True + + @include_mobile_clients.deleter + def include_mobile_clients(self): + self._include_mobile_clients_value = None + self._include_mobile_clients_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListTeamDevicesArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListTeamDevicesArg(cursor={!r}, include_web_sessions={!r}, include_desktop_clients={!r}, include_mobile_clients={!r})'.format( + self._cursor_value, + self._include_web_sessions_value, + self._include_desktop_clients_value, + self._include_mobile_clients_value, + ) + +ListTeamDevicesArg_validator = bv.Struct(ListTeamDevicesArg) + +class ListTeamDevicesError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar reset: Indicates that the cursor has been invalidated. Call + :meth:`dropbox.dropbox.Dropbox.team_devices_list_team_devices` again + with an empty cursor to obtain a new cursor. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + reset = None + # Attribute is overwritten below the class definition + other = None + + def is_reset(self): + """ + Check if the union tag is ``reset``. + + :rtype: bool + """ + return self._tag == 'reset' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ListTeamDevicesError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListTeamDevicesError(%r, %r)' % (self._tag, self._value) + +ListTeamDevicesError_validator = bv.Union(ListTeamDevicesError) + +class ListTeamDevicesResult(bb.Struct): + """ + :ivar devices: The devices of each member of the team. + :ivar has_more: If true, then there are more devices available. Pass the + cursor to :meth:`dropbox.dropbox.Dropbox.team_devices_list_team_devices` + to retrieve the rest. + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_devices_list_team_devices` to + receive the next sub list of team's devices. + """ + + __slots__ = [ + '_devices_value', + '_devices_present', + '_has_more_value', + '_has_more_present', + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + devices=None, + has_more=None, + cursor=None): + self._devices_value = None + self._devices_present = False + self._has_more_value = None + self._has_more_present = False + self._cursor_value = None + self._cursor_present = False + if devices is not None: + self.devices = devices + if has_more is not None: + self.has_more = has_more + if cursor is not None: + self.cursor = cursor + + @property + def devices(self): + """ + The devices of each member of the team. + + :rtype: list of [MemberDevices] + """ + if self._devices_present: + return self._devices_value + else: + raise AttributeError("missing required field 'devices'") + + @devices.setter + def devices(self, val): + val = self._devices_validator.validate(val) + self._devices_value = val + self._devices_present = True + + @devices.deleter + def devices(self): + self._devices_value = None + self._devices_present = False + + @property + def has_more(self): + """ + If true, then there are more devices available. Pass the cursor to + :meth:`dropbox.dropbox.Dropbox.team_devices_list_team_devices` to + retrieve the rest. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_devices_list_team_devices` to + receive the next sub list of team's devices. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + return None + + @cursor.setter + def cursor(self, val): + if val is None: + del self.cursor + return + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ListTeamDevicesResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ListTeamDevicesResult(devices={!r}, has_more={!r}, cursor={!r})'.format( + self._devices_value, + self._has_more_value, + self._cursor_value, + ) + +ListTeamDevicesResult_validator = bv.Struct(ListTeamDevicesResult) + +class MemberAccess(bb.Struct): + """ + Specify access type a member should have when joined to a group. + + :ivar user: Identity of a user. + :ivar access_type: Access type. + """ + + __slots__ = [ + '_user_value', + '_user_present', + '_access_type_value', + '_access_type_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None, + access_type=None): + self._user_value = None + self._user_present = False + self._access_type_value = None + self._access_type_present = False + if user is not None: + self.user = user + if access_type is not None: + self.access_type = access_type + + @property + def user(self): + """ + Identity of a user. + + :rtype: UserSelectorArg + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + @property + def access_type(self): + """ + Access type. + + :rtype: GroupAccessType + """ + if self._access_type_present: + return self._access_type_value + else: + raise AttributeError("missing required field 'access_type'") + + @access_type.setter + def access_type(self, val): + self._access_type_validator.validate_type_only(val) + self._access_type_value = val + self._access_type_present = True + + @access_type.deleter + def access_type(self): + self._access_type_value = None + self._access_type_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberAccess, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberAccess(user={!r}, access_type={!r})'.format( + self._user_value, + self._access_type_value, + ) + +MemberAccess_validator = bv.Struct(MemberAccess) + +class MemberAddArg(bb.Struct): + """ + :ivar member_given_name: Member's first name. + :ivar member_surname: Member's last name. + :ivar member_external_id: External ID for member. + :ivar member_persistent_id: Persistent ID for member. This field is only + available to teams using persistent ID SAML configuration. + :ivar send_welcome_email: Whether to send a welcome email to the member. If + send_welcome_email is false, no email invitation will be sent to the + user. This may be useful for apps using single sign-on (SSO) flows for + onboarding that want to handle announcements themselves. + :ivar is_directory_restricted: Whether a user is directory restricted. + """ + + __slots__ = [ + '_member_email_value', + '_member_email_present', + '_member_given_name_value', + '_member_given_name_present', + '_member_surname_value', + '_member_surname_present', + '_member_external_id_value', + '_member_external_id_present', + '_member_persistent_id_value', + '_member_persistent_id_present', + '_send_welcome_email_value', + '_send_welcome_email_present', + '_role_value', + '_role_present', + '_is_directory_restricted_value', + '_is_directory_restricted_present', + ] + + _has_required_fields = True + + def __init__(self, + member_email=None, + member_given_name=None, + member_surname=None, + member_external_id=None, + member_persistent_id=None, + send_welcome_email=None, + role=None, + is_directory_restricted=None): + self._member_email_value = None + self._member_email_present = False + self._member_given_name_value = None + self._member_given_name_present = False + self._member_surname_value = None + self._member_surname_present = False + self._member_external_id_value = None + self._member_external_id_present = False + self._member_persistent_id_value = None + self._member_persistent_id_present = False + self._send_welcome_email_value = None + self._send_welcome_email_present = False + self._role_value = None + self._role_present = False + self._is_directory_restricted_value = None + self._is_directory_restricted_present = False + if member_email is not None: + self.member_email = member_email + if member_given_name is not None: + self.member_given_name = member_given_name + if member_surname is not None: + self.member_surname = member_surname + if member_external_id is not None: + self.member_external_id = member_external_id + if member_persistent_id is not None: + self.member_persistent_id = member_persistent_id + if send_welcome_email is not None: + self.send_welcome_email = send_welcome_email + if role is not None: + self.role = role + if is_directory_restricted is not None: + self.is_directory_restricted = is_directory_restricted + + @property + def member_email(self): + """ + :rtype: str + """ + if self._member_email_present: + return self._member_email_value + else: + raise AttributeError("missing required field 'member_email'") + + @member_email.setter + def member_email(self, val): + val = self._member_email_validator.validate(val) + self._member_email_value = val + self._member_email_present = True + + @member_email.deleter + def member_email(self): + self._member_email_value = None + self._member_email_present = False + + @property + def member_given_name(self): + """ + Member's first name. + + :rtype: str + """ + if self._member_given_name_present: + return self._member_given_name_value + else: + return None + + @member_given_name.setter + def member_given_name(self, val): + if val is None: + del self.member_given_name + return + val = self._member_given_name_validator.validate(val) + self._member_given_name_value = val + self._member_given_name_present = True + + @member_given_name.deleter + def member_given_name(self): + self._member_given_name_value = None + self._member_given_name_present = False + + @property + def member_surname(self): + """ + Member's last name. + + :rtype: str + """ + if self._member_surname_present: + return self._member_surname_value + else: + return None + + @member_surname.setter + def member_surname(self, val): + if val is None: + del self.member_surname + return + val = self._member_surname_validator.validate(val) + self._member_surname_value = val + self._member_surname_present = True + + @member_surname.deleter + def member_surname(self): + self._member_surname_value = None + self._member_surname_present = False + + @property + def member_external_id(self): + """ + External ID for member. + + :rtype: str + """ + if self._member_external_id_present: + return self._member_external_id_value + else: + return None + + @member_external_id.setter + def member_external_id(self, val): + if val is None: + del self.member_external_id + return + val = self._member_external_id_validator.validate(val) + self._member_external_id_value = val + self._member_external_id_present = True + + @member_external_id.deleter + def member_external_id(self): + self._member_external_id_value = None + self._member_external_id_present = False + + @property + def member_persistent_id(self): + """ + Persistent ID for member. This field is only available to teams using + persistent ID SAML configuration. + + :rtype: str + """ + if self._member_persistent_id_present: + return self._member_persistent_id_value + else: + return None + + @member_persistent_id.setter + def member_persistent_id(self, val): + if val is None: + del self.member_persistent_id + return + val = self._member_persistent_id_validator.validate(val) + self._member_persistent_id_value = val + self._member_persistent_id_present = True + + @member_persistent_id.deleter + def member_persistent_id(self): + self._member_persistent_id_value = None + self._member_persistent_id_present = False + + @property + def send_welcome_email(self): + """ + Whether to send a welcome email to the member. If send_welcome_email is + false, no email invitation will be sent to the user. This may be useful + for apps using single sign-on (SSO) flows for onboarding that want to + handle announcements themselves. + + :rtype: bool + """ + if self._send_welcome_email_present: + return self._send_welcome_email_value + else: + return True + + @send_welcome_email.setter + def send_welcome_email(self, val): + val = self._send_welcome_email_validator.validate(val) + self._send_welcome_email_value = val + self._send_welcome_email_present = True + + @send_welcome_email.deleter + def send_welcome_email(self): + self._send_welcome_email_value = None + self._send_welcome_email_present = False + + @property + def role(self): + """ + :rtype: AdminTier + """ + if self._role_present: + return self._role_value + else: + return AdminTier.member_only + + @role.setter + def role(self, val): + self._role_validator.validate_type_only(val) + self._role_value = val + self._role_present = True + + @role.deleter + def role(self): + self._role_value = None + self._role_present = False + + @property + def is_directory_restricted(self): + """ + Whether a user is directory restricted. + + :rtype: bool + """ + if self._is_directory_restricted_present: + return self._is_directory_restricted_value + else: + return None + + @is_directory_restricted.setter + def is_directory_restricted(self, val): + if val is None: + del self.is_directory_restricted + return + val = self._is_directory_restricted_validator.validate(val) + self._is_directory_restricted_value = val + self._is_directory_restricted_present = True + + @is_directory_restricted.deleter + def is_directory_restricted(self): + self._is_directory_restricted_value = None + self._is_directory_restricted_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberAddArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberAddArg(member_email={!r}, member_given_name={!r}, member_surname={!r}, member_external_id={!r}, member_persistent_id={!r}, send_welcome_email={!r}, role={!r}, is_directory_restricted={!r})'.format( + self._member_email_value, + self._member_given_name_value, + self._member_surname_value, + self._member_external_id_value, + self._member_persistent_id_value, + self._send_welcome_email_value, + self._role_value, + self._is_directory_restricted_value, + ) + +MemberAddArg_validator = bv.Struct(MemberAddArg) + +class MemberAddResult(bb.Union): + """ + Describes the result of attempting to add a single user to the team. + 'success' is the only value indicating that a user was indeed added to the + team - the other values explain the type of failure that occurred, and + include the email of the user for which the operation has failed. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar TeamMemberInfo success: Describes a user that was successfully added + to the team. + :ivar str team_license_limit: Team is already full. The organization has no + available licenses. + :ivar str free_team_member_limit_reached: Team is already full. The free + team member limit has been reached. + :ivar str user_already_on_team: User is already on this team. The provided + email address is associated with a user who is already a member of + (including in recoverable state) or invited to the team. + :ivar str user_on_another_team: User is already on another team. The + provided email address is associated with a user that is already a + member or invited to another team. + :ivar str user_already_paired: User is already paired. + :ivar str user_migration_failed: User migration has failed. + :ivar str duplicate_external_member_id: A user with the given external + member ID already exists on the team (including in recoverable state). + :ivar str duplicate_member_persistent_id: A user with the given persistent + ID already exists on the team (including in recoverable state). + :ivar str persistent_id_disabled: Persistent ID is only available to teams + with persistent ID SAML configuration. Please contact Dropbox for more + information. + :ivar str user_creation_failed: User creation has failed. + """ + + _catch_all = None + + @classmethod + def success(cls, val): + """ + Create an instance of this class set to the ``success`` tag with value + ``val``. + + :param TeamMemberInfo val: + :rtype: MemberAddResult + """ + return cls('success', val) + + @classmethod + def team_license_limit(cls, val): + """ + Create an instance of this class set to the ``team_license_limit`` tag + with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('team_license_limit', val) + + @classmethod + def free_team_member_limit_reached(cls, val): + """ + Create an instance of this class set to the + ``free_team_member_limit_reached`` tag with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('free_team_member_limit_reached', val) + + @classmethod + def user_already_on_team(cls, val): + """ + Create an instance of this class set to the ``user_already_on_team`` tag + with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('user_already_on_team', val) + + @classmethod + def user_on_another_team(cls, val): + """ + Create an instance of this class set to the ``user_on_another_team`` tag + with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('user_on_another_team', val) + + @classmethod + def user_already_paired(cls, val): + """ + Create an instance of this class set to the ``user_already_paired`` tag + with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('user_already_paired', val) + + @classmethod + def user_migration_failed(cls, val): + """ + Create an instance of this class set to the ``user_migration_failed`` + tag with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('user_migration_failed', val) + + @classmethod + def duplicate_external_member_id(cls, val): + """ + Create an instance of this class set to the + ``duplicate_external_member_id`` tag with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('duplicate_external_member_id', val) + + @classmethod + def duplicate_member_persistent_id(cls, val): + """ + Create an instance of this class set to the + ``duplicate_member_persistent_id`` tag with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('duplicate_member_persistent_id', val) + + @classmethod + def persistent_id_disabled(cls, val): + """ + Create an instance of this class set to the ``persistent_id_disabled`` + tag with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('persistent_id_disabled', val) + + @classmethod + def user_creation_failed(cls, val): + """ + Create an instance of this class set to the ``user_creation_failed`` tag + with value ``val``. + + :param str val: + :rtype: MemberAddResult + """ + return cls('user_creation_failed', val) + + def is_success(self): + """ + Check if the union tag is ``success``. + + :rtype: bool + """ + return self._tag == 'success' + + def is_team_license_limit(self): + """ + Check if the union tag is ``team_license_limit``. + + :rtype: bool + """ + return self._tag == 'team_license_limit' + + def is_free_team_member_limit_reached(self): + """ + Check if the union tag is ``free_team_member_limit_reached``. + + :rtype: bool + """ + return self._tag == 'free_team_member_limit_reached' + + def is_user_already_on_team(self): + """ + Check if the union tag is ``user_already_on_team``. + + :rtype: bool + """ + return self._tag == 'user_already_on_team' + + def is_user_on_another_team(self): + """ + Check if the union tag is ``user_on_another_team``. + + :rtype: bool + """ + return self._tag == 'user_on_another_team' + + def is_user_already_paired(self): + """ + Check if the union tag is ``user_already_paired``. + + :rtype: bool + """ + return self._tag == 'user_already_paired' + + def is_user_migration_failed(self): + """ + Check if the union tag is ``user_migration_failed``. + + :rtype: bool + """ + return self._tag == 'user_migration_failed' + + def is_duplicate_external_member_id(self): + """ + Check if the union tag is ``duplicate_external_member_id``. + + :rtype: bool + """ + return self._tag == 'duplicate_external_member_id' + + def is_duplicate_member_persistent_id(self): + """ + Check if the union tag is ``duplicate_member_persistent_id``. + + :rtype: bool + """ + return self._tag == 'duplicate_member_persistent_id' + + def is_persistent_id_disabled(self): + """ + Check if the union tag is ``persistent_id_disabled``. + + :rtype: bool + """ + return self._tag == 'persistent_id_disabled' + + def is_user_creation_failed(self): + """ + Check if the union tag is ``user_creation_failed``. + + :rtype: bool + """ + return self._tag == 'user_creation_failed' + + def get_success(self): + """ + Describes a user that was successfully added to the team. + + Only call this if :meth:`is_success` is true. + + :rtype: TeamMemberInfo + """ + if not self.is_success(): + raise AttributeError("tag 'success' not set") + return self._value + + def get_team_license_limit(self): + """ + Team is already full. The organization has no available licenses. + + Only call this if :meth:`is_team_license_limit` is true. + + :rtype: str + """ + if not self.is_team_license_limit(): + raise AttributeError("tag 'team_license_limit' not set") + return self._value + + def get_free_team_member_limit_reached(self): + """ + Team is already full. The free team member limit has been reached. + + Only call this if :meth:`is_free_team_member_limit_reached` is true. + + :rtype: str + """ + if not self.is_free_team_member_limit_reached(): + raise AttributeError("tag 'free_team_member_limit_reached' not set") + return self._value + + def get_user_already_on_team(self): + """ + User is already on this team. The provided email address is associated + with a user who is already a member of (including in recoverable state) + or invited to the team. + + Only call this if :meth:`is_user_already_on_team` is true. + + :rtype: str + """ + if not self.is_user_already_on_team(): + raise AttributeError("tag 'user_already_on_team' not set") + return self._value + + def get_user_on_another_team(self): + """ + User is already on another team. The provided email address is + associated with a user that is already a member or invited to another + team. + + Only call this if :meth:`is_user_on_another_team` is true. + + :rtype: str + """ + if not self.is_user_on_another_team(): + raise AttributeError("tag 'user_on_another_team' not set") + return self._value + + def get_user_already_paired(self): + """ + User is already paired. + + Only call this if :meth:`is_user_already_paired` is true. + + :rtype: str + """ + if not self.is_user_already_paired(): + raise AttributeError("tag 'user_already_paired' not set") + return self._value + + def get_user_migration_failed(self): + """ + User migration has failed. + + Only call this if :meth:`is_user_migration_failed` is true. + + :rtype: str + """ + if not self.is_user_migration_failed(): + raise AttributeError("tag 'user_migration_failed' not set") + return self._value + + def get_duplicate_external_member_id(self): + """ + A user with the given external member ID already exists on the team + (including in recoverable state). + + Only call this if :meth:`is_duplicate_external_member_id` is true. + + :rtype: str + """ + if not self.is_duplicate_external_member_id(): + raise AttributeError("tag 'duplicate_external_member_id' not set") + return self._value + + def get_duplicate_member_persistent_id(self): + """ + A user with the given persistent ID already exists on the team + (including in recoverable state). + + Only call this if :meth:`is_duplicate_member_persistent_id` is true. + + :rtype: str + """ + if not self.is_duplicate_member_persistent_id(): + raise AttributeError("tag 'duplicate_member_persistent_id' not set") + return self._value + + def get_persistent_id_disabled(self): + """ + Persistent ID is only available to teams with persistent ID SAML + configuration. Please contact Dropbox for more information. + + Only call this if :meth:`is_persistent_id_disabled` is true. + + :rtype: str + """ + if not self.is_persistent_id_disabled(): + raise AttributeError("tag 'persistent_id_disabled' not set") + return self._value + + def get_user_creation_failed(self): + """ + User creation has failed. + + Only call this if :meth:`is_user_creation_failed` is true. + + :rtype: str + """ + if not self.is_user_creation_failed(): + raise AttributeError("tag 'user_creation_failed' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberAddResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberAddResult(%r, %r)' % (self._tag, self._value) + +MemberAddResult_validator = bv.Union(MemberAddResult) + +class MemberDevices(bb.Struct): + """ + Information on devices of a team's member. + + :ivar team_member_id: The member unique Id. + :ivar web_sessions: List of web sessions made by this team member. + :ivar desktop_clients: List of desktop clients by this team member. + :ivar mobile_clients: List of mobile clients by this team member. + """ + + __slots__ = [ + '_team_member_id_value', + '_team_member_id_present', + '_web_sessions_value', + '_web_sessions_present', + '_desktop_clients_value', + '_desktop_clients_present', + '_mobile_clients_value', + '_mobile_clients_present', + ] + + _has_required_fields = True + + def __init__(self, + team_member_id=None, + web_sessions=None, + desktop_clients=None, + mobile_clients=None): + self._team_member_id_value = None + self._team_member_id_present = False + self._web_sessions_value = None + self._web_sessions_present = False + self._desktop_clients_value = None + self._desktop_clients_present = False + self._mobile_clients_value = None + self._mobile_clients_present = False + if team_member_id is not None: + self.team_member_id = team_member_id + if web_sessions is not None: + self.web_sessions = web_sessions + if desktop_clients is not None: + self.desktop_clients = desktop_clients + if mobile_clients is not None: + self.mobile_clients = mobile_clients + + @property + def team_member_id(self): + """ + The member unique Id. + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + raise AttributeError("missing required field 'team_member_id'") + + @team_member_id.setter + def team_member_id(self, val): + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + @property + def web_sessions(self): + """ + List of web sessions made by this team member. + + :rtype: list of [ActiveWebSession] + """ + if self._web_sessions_present: + return self._web_sessions_value + else: + return None + + @web_sessions.setter + def web_sessions(self, val): + if val is None: + del self.web_sessions + return + val = self._web_sessions_validator.validate(val) + self._web_sessions_value = val + self._web_sessions_present = True + + @web_sessions.deleter + def web_sessions(self): + self._web_sessions_value = None + self._web_sessions_present = False + + @property + def desktop_clients(self): + """ + List of desktop clients by this team member. + + :rtype: list of [DesktopClientSession] + """ + if self._desktop_clients_present: + return self._desktop_clients_value + else: + return None + + @desktop_clients.setter + def desktop_clients(self, val): + if val is None: + del self.desktop_clients + return + val = self._desktop_clients_validator.validate(val) + self._desktop_clients_value = val + self._desktop_clients_present = True + + @desktop_clients.deleter + def desktop_clients(self): + self._desktop_clients_value = None + self._desktop_clients_present = False + + @property + def mobile_clients(self): + """ + List of mobile clients by this team member. + + :rtype: list of [MobileClientSession] + """ + if self._mobile_clients_present: + return self._mobile_clients_value + else: + return None + + @mobile_clients.setter + def mobile_clients(self, val): + if val is None: + del self.mobile_clients + return + val = self._mobile_clients_validator.validate(val) + self._mobile_clients_value = val + self._mobile_clients_present = True + + @mobile_clients.deleter + def mobile_clients(self): + self._mobile_clients_value = None + self._mobile_clients_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberDevices, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberDevices(team_member_id={!r}, web_sessions={!r}, desktop_clients={!r}, mobile_clients={!r})'.format( + self._team_member_id_value, + self._web_sessions_value, + self._desktop_clients_value, + self._mobile_clients_value, + ) + +MemberDevices_validator = bv.Struct(MemberDevices) + +class MemberLinkedApps(bb.Struct): + """ + Information on linked applications of a team member. + + :ivar team_member_id: The member unique Id. + :ivar linked_api_apps: List of third party applications linked by this team + member. + """ + + __slots__ = [ + '_team_member_id_value', + '_team_member_id_present', + '_linked_api_apps_value', + '_linked_api_apps_present', + ] + + _has_required_fields = True + + def __init__(self, + team_member_id=None, + linked_api_apps=None): + self._team_member_id_value = None + self._team_member_id_present = False + self._linked_api_apps_value = None + self._linked_api_apps_present = False + if team_member_id is not None: + self.team_member_id = team_member_id + if linked_api_apps is not None: + self.linked_api_apps = linked_api_apps + + @property + def team_member_id(self): + """ + The member unique Id. + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + raise AttributeError("missing required field 'team_member_id'") + + @team_member_id.setter + def team_member_id(self, val): + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + @property + def linked_api_apps(self): + """ + List of third party applications linked by this team member. + + :rtype: list of [ApiApp] + """ + if self._linked_api_apps_present: + return self._linked_api_apps_value + else: + raise AttributeError("missing required field 'linked_api_apps'") + + @linked_api_apps.setter + def linked_api_apps(self, val): + val = self._linked_api_apps_validator.validate(val) + self._linked_api_apps_value = val + self._linked_api_apps_present = True + + @linked_api_apps.deleter + def linked_api_apps(self): + self._linked_api_apps_value = None + self._linked_api_apps_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberLinkedApps, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberLinkedApps(team_member_id={!r}, linked_api_apps={!r})'.format( + self._team_member_id_value, + self._linked_api_apps_value, + ) + +MemberLinkedApps_validator = bv.Struct(MemberLinkedApps) + +class MemberProfile(bb.Struct): + """ + Basic member profile. + + :ivar team_member_id: ID of user as a member of a team. + :ivar external_id: External ID that a team can attach to the user. An + application using the API may find it easier to use their own IDs + instead of Dropbox IDs like account_id or team_member_id. + :ivar account_id: A user's account identifier. + :ivar email: Email address of user. + :ivar email_verified: Is true if the user's email is verified to be owned by + the user. + :ivar status: The user's status as a member of a specific team. + :ivar name: Representations for a person's name. + :ivar membership_type: The user's membership type: full (normal team member) + vs limited (does not use a license; no access to the team's shared + quota). + :ivar joined_on: The date and time the user joined as a member of a specific + team. + :ivar persistent_id: Persistent ID that a team can attach to the user. The + persistent ID is unique ID to be used for SAML authentication. + :ivar is_directory_restricted: Whether the user is a directory restricted + user. + """ + + __slots__ = [ + '_team_member_id_value', + '_team_member_id_present', + '_external_id_value', + '_external_id_present', + '_account_id_value', + '_account_id_present', + '_email_value', + '_email_present', + '_email_verified_value', + '_email_verified_present', + '_status_value', + '_status_present', + '_name_value', + '_name_present', + '_membership_type_value', + '_membership_type_present', + '_joined_on_value', + '_joined_on_present', + '_persistent_id_value', + '_persistent_id_present', + '_is_directory_restricted_value', + '_is_directory_restricted_present', + ] + + _has_required_fields = True + + def __init__(self, + team_member_id=None, + email=None, + email_verified=None, + status=None, + name=None, + membership_type=None, + external_id=None, + account_id=None, + joined_on=None, + persistent_id=None, + is_directory_restricted=None): + self._team_member_id_value = None + self._team_member_id_present = False + self._external_id_value = None + self._external_id_present = False + self._account_id_value = None + self._account_id_present = False + self._email_value = None + self._email_present = False + self._email_verified_value = None + self._email_verified_present = False + self._status_value = None + self._status_present = False + self._name_value = None + self._name_present = False + self._membership_type_value = None + self._membership_type_present = False + self._joined_on_value = None + self._joined_on_present = False + self._persistent_id_value = None + self._persistent_id_present = False + self._is_directory_restricted_value = None + self._is_directory_restricted_present = False + if team_member_id is not None: + self.team_member_id = team_member_id + if external_id is not None: + self.external_id = external_id + if account_id is not None: + self.account_id = account_id + if email is not None: + self.email = email + if email_verified is not None: + self.email_verified = email_verified + if status is not None: + self.status = status + if name is not None: + self.name = name + if membership_type is not None: + self.membership_type = membership_type + if joined_on is not None: + self.joined_on = joined_on + if persistent_id is not None: + self.persistent_id = persistent_id + if is_directory_restricted is not None: + self.is_directory_restricted = is_directory_restricted + + @property + def team_member_id(self): + """ + ID of user as a member of a team. + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + raise AttributeError("missing required field 'team_member_id'") + + @team_member_id.setter + def team_member_id(self, val): + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + @property + def external_id(self): + """ + External ID that a team can attach to the user. An application using the + API may find it easier to use their own IDs instead of Dropbox IDs like + account_id or team_member_id. + + :rtype: str + """ + if self._external_id_present: + return self._external_id_value + else: + return None + + @external_id.setter + def external_id(self, val): + if val is None: + del self.external_id + return + val = self._external_id_validator.validate(val) + self._external_id_value = val + self._external_id_present = True + + @external_id.deleter + def external_id(self): + self._external_id_value = None + self._external_id_present = False + + @property + def account_id(self): + """ + A user's account identifier. + + :rtype: str + """ + if self._account_id_present: + return self._account_id_value + else: + return None + + @account_id.setter + def account_id(self, val): + if val is None: + del self.account_id + return + val = self._account_id_validator.validate(val) + self._account_id_value = val + self._account_id_present = True + + @account_id.deleter + def account_id(self): + self._account_id_value = None + self._account_id_present = False + + @property + def email(self): + """ + Email address of user. + + :rtype: str + """ + if self._email_present: + return self._email_value + else: + raise AttributeError("missing required field 'email'") + + @email.setter + def email(self, val): + val = self._email_validator.validate(val) + self._email_value = val + self._email_present = True + + @email.deleter + def email(self): + self._email_value = None + self._email_present = False + + @property + def email_verified(self): + """ + Is true if the user's email is verified to be owned by the user. + + :rtype: bool + """ + if self._email_verified_present: + return self._email_verified_value + else: + raise AttributeError("missing required field 'email_verified'") + + @email_verified.setter + def email_verified(self, val): + val = self._email_verified_validator.validate(val) + self._email_verified_value = val + self._email_verified_present = True + + @email_verified.deleter + def email_verified(self): + self._email_verified_value = None + self._email_verified_present = False + + @property + def status(self): + """ + The user's status as a member of a specific team. + + :rtype: TeamMemberStatus + """ + if self._status_present: + return self._status_value + else: + raise AttributeError("missing required field 'status'") + + @status.setter + def status(self, val): + self._status_validator.validate_type_only(val) + self._status_value = val + self._status_present = True + + @status.deleter + def status(self): + self._status_value = None + self._status_present = False + + @property + def name(self): + """ + Representations for a person's name. + + :rtype: users.Name + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + self._name_validator.validate_type_only(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def membership_type(self): + """ + The user's membership type: full (normal team member) vs limited (does + not use a license; no access to the team's shared quota). + + :rtype: TeamMembershipType + """ + if self._membership_type_present: + return self._membership_type_value + else: + raise AttributeError("missing required field 'membership_type'") + + @membership_type.setter + def membership_type(self, val): + self._membership_type_validator.validate_type_only(val) + self._membership_type_value = val + self._membership_type_present = True + + @membership_type.deleter + def membership_type(self): + self._membership_type_value = None + self._membership_type_present = False + + @property + def joined_on(self): + """ + The date and time the user joined as a member of a specific team. + + :rtype: datetime.datetime + """ + if self._joined_on_present: + return self._joined_on_value + else: + return None + + @joined_on.setter + def joined_on(self, val): + if val is None: + del self.joined_on + return + val = self._joined_on_validator.validate(val) + self._joined_on_value = val + self._joined_on_present = True + + @joined_on.deleter + def joined_on(self): + self._joined_on_value = None + self._joined_on_present = False + + @property + def persistent_id(self): + """ + Persistent ID that a team can attach to the user. The persistent ID is + unique ID to be used for SAML authentication. + + :rtype: str + """ + if self._persistent_id_present: + return self._persistent_id_value + else: + return None + + @persistent_id.setter + def persistent_id(self, val): + if val is None: + del self.persistent_id + return + val = self._persistent_id_validator.validate(val) + self._persistent_id_value = val + self._persistent_id_present = True + + @persistent_id.deleter + def persistent_id(self): + self._persistent_id_value = None + self._persistent_id_present = False + + @property + def is_directory_restricted(self): + """ + Whether the user is a directory restricted user. + + :rtype: bool + """ + if self._is_directory_restricted_present: + return self._is_directory_restricted_value + else: + return None + + @is_directory_restricted.setter + def is_directory_restricted(self, val): + if val is None: + del self.is_directory_restricted + return + val = self._is_directory_restricted_validator.validate(val) + self._is_directory_restricted_value = val + self._is_directory_restricted_present = True + + @is_directory_restricted.deleter + def is_directory_restricted(self): + self._is_directory_restricted_value = None + self._is_directory_restricted_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberProfile, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberProfile(team_member_id={!r}, email={!r}, email_verified={!r}, status={!r}, name={!r}, membership_type={!r}, external_id={!r}, account_id={!r}, joined_on={!r}, persistent_id={!r}, is_directory_restricted={!r})'.format( + self._team_member_id_value, + self._email_value, + self._email_verified_value, + self._status_value, + self._name_value, + self._membership_type_value, + self._external_id_value, + self._account_id_value, + self._joined_on_value, + self._persistent_id_value, + self._is_directory_restricted_value, + ) + +MemberProfile_validator = bv.Struct(MemberProfile) + +class UserSelectorError(bb.Union): + """ + Error that can be returned whenever a struct derived from + :class:`UserSelectorArg` is used. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar user_not_found: No matching user found. The provided team_member_id, + email, or external_id does not exist on this team. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + user_not_found = None + + def is_user_not_found(self): + """ + Check if the union tag is ``user_not_found``. + + :rtype: bool + """ + return self._tag == 'user_not_found' + + def _process_custom_annotations(self, annotation_type, processor): + super(UserSelectorError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UserSelectorError(%r, %r)' % (self._tag, self._value) + +UserSelectorError_validator = bv.Union(UserSelectorError) + +class MemberSelectorError(UserSelectorError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar user_not_in_team: The user is not a member of the team. + """ + + # Attribute is overwritten below the class definition + user_not_in_team = None + + def is_user_not_in_team(self): + """ + Check if the union tag is ``user_not_in_team``. + + :rtype: bool + """ + return self._tag == 'user_not_in_team' + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSelectorError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSelectorError(%r, %r)' % (self._tag, self._value) + +MemberSelectorError_validator = bv.Union(MemberSelectorError) + +class MembersAddArg(bb.Struct): + """ + :ivar new_members: Details of new members to be added to the team. + :ivar force_async: Whether to force the add to happen asynchronously. + """ + + __slots__ = [ + '_new_members_value', + '_new_members_present', + '_force_async_value', + '_force_async_present', + ] + + _has_required_fields = True + + def __init__(self, + new_members=None, + force_async=None): + self._new_members_value = None + self._new_members_present = False + self._force_async_value = None + self._force_async_present = False + if new_members is not None: + self.new_members = new_members + if force_async is not None: + self.force_async = force_async + + @property + def new_members(self): + """ + Details of new members to be added to the team. + + :rtype: list of [MemberAddArg] + """ + if self._new_members_present: + return self._new_members_value + else: + raise AttributeError("missing required field 'new_members'") + + @new_members.setter + def new_members(self, val): + val = self._new_members_validator.validate(val) + self._new_members_value = val + self._new_members_present = True + + @new_members.deleter + def new_members(self): + self._new_members_value = None + self._new_members_present = False + + @property + def force_async(self): + """ + Whether to force the add to happen asynchronously. + + :rtype: bool + """ + if self._force_async_present: + return self._force_async_value + else: + return False + + @force_async.setter + def force_async(self, val): + val = self._force_async_validator.validate(val) + self._force_async_value = val + self._force_async_present = True + + @force_async.deleter + def force_async(self): + self._force_async_value = None + self._force_async_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersAddArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersAddArg(new_members={!r}, force_async={!r})'.format( + self._new_members_value, + self._force_async_value, + ) + +MembersAddArg_validator = bv.Struct(MembersAddArg) + +class MembersAddJobStatus(async_.PollResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar list of [MemberAddResult] complete: The asynchronous job has finished. + For each member that was specified in the parameter + :type:`MembersAddArg` that was provided to :route:`members/add`, a + corresponding item is returned in this list. + :ivar str failed: The asynchronous job returned an error. The string + contains an error message. + """ + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param list of [MemberAddResult] val: + :rtype: MembersAddJobStatus + """ + return cls('complete', val) + + @classmethod + def failed(cls, val): + """ + Create an instance of this class set to the ``failed`` tag with value + ``val``. + + :param str val: + :rtype: MembersAddJobStatus + """ + return cls('failed', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def is_failed(self): + """ + Check if the union tag is ``failed``. + + :rtype: bool + """ + return self._tag == 'failed' + + def get_complete(self): + """ + The asynchronous job has finished. For each member that was specified in + the parameter :class:`MembersAddArg` that was provided to + :meth:`dropbox.dropbox.Dropbox.team_members_add`, a corresponding item + is returned in this list. + + Only call this if :meth:`is_complete` is true. + + :rtype: list of [MemberAddResult] + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def get_failed(self): + """ + The asynchronous job returned an error. The string contains an error + message. + + Only call this if :meth:`is_failed` is true. + + :rtype: str + """ + if not self.is_failed(): + raise AttributeError("tag 'failed' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersAddJobStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersAddJobStatus(%r, %r)' % (self._tag, self._value) + +MembersAddJobStatus_validator = bv.Union(MembersAddJobStatus) + +class MembersAddLaunch(async_.LaunchResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param list of [MemberAddResult] val: + :rtype: MembersAddLaunch + """ + return cls('complete', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def get_complete(self): + """ + Only call this if :meth:`is_complete` is true. + + :rtype: list of [MemberAddResult] + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersAddLaunch, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersAddLaunch(%r, %r)' % (self._tag, self._value) + +MembersAddLaunch_validator = bv.Union(MembersAddLaunch) + +class MembersDeactivateBaseArg(bb.Struct): + """ + Exactly one of team_member_id, email, or external_id must be provided to + identify the user account. + + :ivar user: Identity of user to remove/suspend/have their files moved. + """ + + __slots__ = [ + '_user_value', + '_user_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None): + self._user_value = None + self._user_present = False + if user is not None: + self.user = user + + @property + def user(self): + """ + Identity of user to remove/suspend/have their files moved. + + :rtype: UserSelectorArg + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersDeactivateBaseArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersDeactivateBaseArg(user={!r})'.format( + self._user_value, + ) + +MembersDeactivateBaseArg_validator = bv.Struct(MembersDeactivateBaseArg) + +class MembersDataTransferArg(MembersDeactivateBaseArg): + """ + :ivar transfer_dest_id: Files from the deleted member account will be + transferred to this user. + :ivar transfer_admin_id: Errors during the transfer process will be sent via + email to this user. + """ + + __slots__ = [ + '_transfer_dest_id_value', + '_transfer_dest_id_present', + '_transfer_admin_id_value', + '_transfer_admin_id_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None, + transfer_dest_id=None, + transfer_admin_id=None): + super(MembersDataTransferArg, self).__init__(user) + self._transfer_dest_id_value = None + self._transfer_dest_id_present = False + self._transfer_admin_id_value = None + self._transfer_admin_id_present = False + if transfer_dest_id is not None: + self.transfer_dest_id = transfer_dest_id + if transfer_admin_id is not None: + self.transfer_admin_id = transfer_admin_id + + @property + def transfer_dest_id(self): + """ + Files from the deleted member account will be transferred to this user. + + :rtype: UserSelectorArg + """ + if self._transfer_dest_id_present: + return self._transfer_dest_id_value + else: + raise AttributeError("missing required field 'transfer_dest_id'") + + @transfer_dest_id.setter + def transfer_dest_id(self, val): + self._transfer_dest_id_validator.validate_type_only(val) + self._transfer_dest_id_value = val + self._transfer_dest_id_present = True + + @transfer_dest_id.deleter + def transfer_dest_id(self): + self._transfer_dest_id_value = None + self._transfer_dest_id_present = False + + @property + def transfer_admin_id(self): + """ + Errors during the transfer process will be sent via email to this user. + + :rtype: UserSelectorArg + """ + if self._transfer_admin_id_present: + return self._transfer_admin_id_value + else: + raise AttributeError("missing required field 'transfer_admin_id'") + + @transfer_admin_id.setter + def transfer_admin_id(self, val): + self._transfer_admin_id_validator.validate_type_only(val) + self._transfer_admin_id_value = val + self._transfer_admin_id_present = True + + @transfer_admin_id.deleter + def transfer_admin_id(self): + self._transfer_admin_id_value = None + self._transfer_admin_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersDataTransferArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersDataTransferArg(user={!r}, transfer_dest_id={!r}, transfer_admin_id={!r})'.format( + self._user_value, + self._transfer_dest_id_value, + self._transfer_admin_id_value, + ) + +MembersDataTransferArg_validator = bv.Struct(MembersDataTransferArg) + +class MembersDeactivateArg(MembersDeactivateBaseArg): + """ + :ivar wipe_data: If provided, controls if the user's data will be deleted on + their linked devices. + """ + + __slots__ = [ + '_wipe_data_value', + '_wipe_data_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None, + wipe_data=None): + super(MembersDeactivateArg, self).__init__(user) + self._wipe_data_value = None + self._wipe_data_present = False + if wipe_data is not None: + self.wipe_data = wipe_data + + @property + def wipe_data(self): + """ + If provided, controls if the user's data will be deleted on their linked + devices. + + :rtype: bool + """ + if self._wipe_data_present: + return self._wipe_data_value + else: + return True + + @wipe_data.setter + def wipe_data(self, val): + val = self._wipe_data_validator.validate(val) + self._wipe_data_value = val + self._wipe_data_present = True + + @wipe_data.deleter + def wipe_data(self): + self._wipe_data_value = None + self._wipe_data_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersDeactivateArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersDeactivateArg(user={!r}, wipe_data={!r})'.format( + self._user_value, + self._wipe_data_value, + ) + +MembersDeactivateArg_validator = bv.Struct(MembersDeactivateArg) + +class MembersDeactivateError(UserSelectorError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar user_not_in_team: The user is not a member of the team. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + user_not_in_team = None + # Attribute is overwritten below the class definition + other = None + + def is_user_not_in_team(self): + """ + Check if the union tag is ``user_not_in_team``. + + :rtype: bool + """ + return self._tag == 'user_not_in_team' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersDeactivateError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersDeactivateError(%r, %r)' % (self._tag, self._value) + +MembersDeactivateError_validator = bv.Union(MembersDeactivateError) + +class MembersGetInfoArgs(bb.Struct): + """ + :ivar members: List of team members. + """ + + __slots__ = [ + '_members_value', + '_members_present', + ] + + _has_required_fields = True + + def __init__(self, + members=None): + self._members_value = None + self._members_present = False + if members is not None: + self.members = members + + @property + def members(self): + """ + List of team members. + + :rtype: list of [UserSelectorArg] + """ + if self._members_present: + return self._members_value + else: + raise AttributeError("missing required field 'members'") + + @members.setter + def members(self, val): + val = self._members_validator.validate(val) + self._members_value = val + self._members_present = True + + @members.deleter + def members(self): + self._members_value = None + self._members_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersGetInfoArgs, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersGetInfoArgs(members={!r})'.format( + self._members_value, + ) + +MembersGetInfoArgs_validator = bv.Struct(MembersGetInfoArgs) + +class MembersGetInfoError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersGetInfoError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersGetInfoError(%r, %r)' % (self._tag, self._value) + +MembersGetInfoError_validator = bv.Union(MembersGetInfoError) + +class MembersGetInfoItem(bb.Union): + """ + Describes a result obtained for a single user whose id was specified in the + parameter of :meth:`dropbox.dropbox.Dropbox.team_members_get_info`. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar str id_not_found: An ID that was provided as a parameter to + :route:`members/get_info`, and did not match a corresponding user. This + might be a team_member_id, an email, or an external ID, depending on how + the method was called. + :ivar TeamMemberInfo member_info: Info about a team member. + """ + + _catch_all = None + + @classmethod + def id_not_found(cls, val): + """ + Create an instance of this class set to the ``id_not_found`` tag with + value ``val``. + + :param str val: + :rtype: MembersGetInfoItem + """ + return cls('id_not_found', val) + + @classmethod + def member_info(cls, val): + """ + Create an instance of this class set to the ``member_info`` tag with + value ``val``. + + :param TeamMemberInfo val: + :rtype: MembersGetInfoItem + """ + return cls('member_info', val) + + def is_id_not_found(self): + """ + Check if the union tag is ``id_not_found``. + + :rtype: bool + """ + return self._tag == 'id_not_found' + + def is_member_info(self): + """ + Check if the union tag is ``member_info``. + + :rtype: bool + """ + return self._tag == 'member_info' + + def get_id_not_found(self): + """ + An ID that was provided as a parameter to + :meth:`dropbox.dropbox.Dropbox.team_members_get_info`, and did not match + a corresponding user. This might be a team_member_id, an email, or an + external ID, depending on how the method was called. + + Only call this if :meth:`is_id_not_found` is true. + + :rtype: str + """ + if not self.is_id_not_found(): + raise AttributeError("tag 'id_not_found' not set") + return self._value + + def get_member_info(self): + """ + Info about a team member. + + Only call this if :meth:`is_member_info` is true. + + :rtype: TeamMemberInfo + """ + if not self.is_member_info(): + raise AttributeError("tag 'member_info' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersGetInfoItem, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersGetInfoItem(%r, %r)' % (self._tag, self._value) + +MembersGetInfoItem_validator = bv.Union(MembersGetInfoItem) + +class MembersListArg(bb.Struct): + """ + :ivar limit: Number of results to return per call. + :ivar include_removed: Whether to return removed members. + """ + + __slots__ = [ + '_limit_value', + '_limit_present', + '_include_removed_value', + '_include_removed_present', + ] + + _has_required_fields = False + + def __init__(self, + limit=None, + include_removed=None): + self._limit_value = None + self._limit_present = False + self._include_removed_value = None + self._include_removed_present = False + if limit is not None: + self.limit = limit + if include_removed is not None: + self.include_removed = include_removed + + @property + def limit(self): + """ + Number of results to return per call. + + :rtype: int + """ + if self._limit_present: + return self._limit_value + else: + return 1000 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + @property + def include_removed(self): + """ + Whether to return removed members. + + :rtype: bool + """ + if self._include_removed_present: + return self._include_removed_value + else: + return False + + @include_removed.setter + def include_removed(self, val): + val = self._include_removed_validator.validate(val) + self._include_removed_value = val + self._include_removed_present = True + + @include_removed.deleter + def include_removed(self): + self._include_removed_value = None + self._include_removed_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersListArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersListArg(limit={!r}, include_removed={!r})'.format( + self._limit_value, + self._include_removed_value, + ) + +MembersListArg_validator = bv.Struct(MembersListArg) + +class MembersListContinueArg(bb.Struct): + """ + :ivar cursor: Indicates from what point to get the next set of members. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + Indicates from what point to get the next set of members. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersListContinueArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersListContinueArg(cursor={!r})'.format( + self._cursor_value, + ) + +MembersListContinueArg_validator = bv.Struct(MembersListContinueArg) + +class MembersListContinueError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_cursor: The cursor is invalid. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_cursor = None + # Attribute is overwritten below the class definition + other = None + + def is_invalid_cursor(self): + """ + Check if the union tag is ``invalid_cursor``. + + :rtype: bool + """ + return self._tag == 'invalid_cursor' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersListContinueError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersListContinueError(%r, %r)' % (self._tag, self._value) + +MembersListContinueError_validator = bv.Union(MembersListContinueError) + +class MembersListError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersListError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersListError(%r, %r)' % (self._tag, self._value) + +MembersListError_validator = bv.Union(MembersListError) + +class MembersListResult(bb.Struct): + """ + :ivar members: List of team members. + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_members_list_continue` to obtain the + additional members. + :ivar has_more: Is true if there are additional team members that have not + been returned yet. An additional call to + :meth:`dropbox.dropbox.Dropbox.team_members_list_continue` can retrieve + them. + """ + + __slots__ = [ + '_members_value', + '_members_present', + '_cursor_value', + '_cursor_present', + '_has_more_value', + '_has_more_present', + ] + + _has_required_fields = True + + def __init__(self, + members=None, + cursor=None, + has_more=None): + self._members_value = None + self._members_present = False + self._cursor_value = None + self._cursor_present = False + self._has_more_value = None + self._has_more_present = False + if members is not None: + self.members = members + if cursor is not None: + self.cursor = cursor + if has_more is not None: + self.has_more = has_more + + @property + def members(self): + """ + List of team members. + + :rtype: list of [TeamMemberInfo] + """ + if self._members_present: + return self._members_value + else: + raise AttributeError("missing required field 'members'") + + @members.setter + def members(self, val): + val = self._members_validator.validate(val) + self._members_value = val + self._members_present = True + + @members.deleter + def members(self): + self._members_value = None + self._members_present = False + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_members_list_continue` to obtain the + additional members. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def has_more(self): + """ + Is true if there are additional team members that have not been returned + yet. An additional call to + :meth:`dropbox.dropbox.Dropbox.team_members_list_continue` can retrieve + them. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersListResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersListResult(members={!r}, cursor={!r}, has_more={!r})'.format( + self._members_value, + self._cursor_value, + self._has_more_value, + ) + +MembersListResult_validator = bv.Struct(MembersListResult) + +class MembersRecoverArg(bb.Struct): + """ + Exactly one of team_member_id, email, or external_id must be provided to + identify the user account. + + :ivar user: Identity of user to recover. + """ + + __slots__ = [ + '_user_value', + '_user_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None): + self._user_value = None + self._user_present = False + if user is not None: + self.user = user + + @property + def user(self): + """ + Identity of user to recover. + + :rtype: UserSelectorArg + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersRecoverArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersRecoverArg(user={!r})'.format( + self._user_value, + ) + +MembersRecoverArg_validator = bv.Struct(MembersRecoverArg) + +class MembersRecoverError(UserSelectorError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar user_unrecoverable: The user is not recoverable. + :ivar user_not_in_team: The user is not a member of the team. + :ivar team_license_limit: Team is full. The organization has no available + licenses. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + user_unrecoverable = None + # Attribute is overwritten below the class definition + user_not_in_team = None + # Attribute is overwritten below the class definition + team_license_limit = None + # Attribute is overwritten below the class definition + other = None + + def is_user_unrecoverable(self): + """ + Check if the union tag is ``user_unrecoverable``. + + :rtype: bool + """ + return self._tag == 'user_unrecoverable' + + def is_user_not_in_team(self): + """ + Check if the union tag is ``user_not_in_team``. + + :rtype: bool + """ + return self._tag == 'user_not_in_team' + + def is_team_license_limit(self): + """ + Check if the union tag is ``team_license_limit``. + + :rtype: bool + """ + return self._tag == 'team_license_limit' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersRecoverError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersRecoverError(%r, %r)' % (self._tag, self._value) + +MembersRecoverError_validator = bv.Union(MembersRecoverError) + +class MembersRemoveArg(MembersDeactivateArg): + """ + :ivar transfer_dest_id: If provided, files from the deleted member account + will be transferred to this user. + :ivar transfer_admin_id: If provided, errors during the transfer process + will be sent via email to this user. If the transfer_dest_id argument + was provided, then this argument must be provided as well. + :ivar keep_account: Downgrade the member to a Basic account. The user will + retain the email address associated with their Dropbox account and data + in their account that is not restricted to team members. In order to + keep the account the argument wipe_data should be set to False. + """ + + __slots__ = [ + '_transfer_dest_id_value', + '_transfer_dest_id_present', + '_transfer_admin_id_value', + '_transfer_admin_id_present', + '_keep_account_value', + '_keep_account_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None, + wipe_data=None, + transfer_dest_id=None, + transfer_admin_id=None, + keep_account=None): + super(MembersRemoveArg, self).__init__(user, + wipe_data) + self._transfer_dest_id_value = None + self._transfer_dest_id_present = False + self._transfer_admin_id_value = None + self._transfer_admin_id_present = False + self._keep_account_value = None + self._keep_account_present = False + if transfer_dest_id is not None: + self.transfer_dest_id = transfer_dest_id + if transfer_admin_id is not None: + self.transfer_admin_id = transfer_admin_id + if keep_account is not None: + self.keep_account = keep_account + + @property + def transfer_dest_id(self): + """ + If provided, files from the deleted member account will be transferred + to this user. + + :rtype: UserSelectorArg + """ + if self._transfer_dest_id_present: + return self._transfer_dest_id_value + else: + return None + + @transfer_dest_id.setter + def transfer_dest_id(self, val): + if val is None: + del self.transfer_dest_id + return + self._transfer_dest_id_validator.validate_type_only(val) + self._transfer_dest_id_value = val + self._transfer_dest_id_present = True + + @transfer_dest_id.deleter + def transfer_dest_id(self): + self._transfer_dest_id_value = None + self._transfer_dest_id_present = False + + @property + def transfer_admin_id(self): + """ + If provided, errors during the transfer process will be sent via email + to this user. If the transfer_dest_id argument was provided, then this + argument must be provided as well. + + :rtype: UserSelectorArg + """ + if self._transfer_admin_id_present: + return self._transfer_admin_id_value + else: + return None + + @transfer_admin_id.setter + def transfer_admin_id(self, val): + if val is None: + del self.transfer_admin_id + return + self._transfer_admin_id_validator.validate_type_only(val) + self._transfer_admin_id_value = val + self._transfer_admin_id_present = True + + @transfer_admin_id.deleter + def transfer_admin_id(self): + self._transfer_admin_id_value = None + self._transfer_admin_id_present = False + + @property + def keep_account(self): + """ + Downgrade the member to a Basic account. The user will retain the email + address associated with their Dropbox account and data in their account + that is not restricted to team members. In order to keep the account the + argument wipe_data should be set to False. + + :rtype: bool + """ + if self._keep_account_present: + return self._keep_account_value + else: + return False + + @keep_account.setter + def keep_account(self, val): + val = self._keep_account_validator.validate(val) + self._keep_account_value = val + self._keep_account_present = True + + @keep_account.deleter + def keep_account(self): + self._keep_account_value = None + self._keep_account_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersRemoveArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersRemoveArg(user={!r}, wipe_data={!r}, transfer_dest_id={!r}, transfer_admin_id={!r}, keep_account={!r})'.format( + self._user_value, + self._wipe_data_value, + self._transfer_dest_id_value, + self._transfer_admin_id_value, + self._keep_account_value, + ) + +MembersRemoveArg_validator = bv.Struct(MembersRemoveArg) + +class MembersTransferFilesError(MembersDeactivateError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar removed_and_transfer_dest_should_differ: Expected removed user and + transfer_dest user to be different. + :ivar removed_and_transfer_admin_should_differ: Expected removed user and + transfer_admin user to be different. + :ivar transfer_dest_user_not_found: No matching user found for the argument + transfer_dest_id. + :ivar transfer_dest_user_not_in_team: The provided transfer_dest_id does not + exist on this team. + :ivar transfer_admin_user_not_in_team: The provided transfer_admin_id does + not exist on this team. + :ivar transfer_admin_user_not_found: No matching user found for the argument + transfer_admin_id. + :ivar unspecified_transfer_admin_id: The transfer_admin_id argument must be + provided when file transfer is requested. + :ivar transfer_admin_is_not_admin: Specified transfer_admin user is not a + team admin. + :ivar recipient_not_verified: The recipient user's email is not verified. + """ + + # Attribute is overwritten below the class definition + removed_and_transfer_dest_should_differ = None + # Attribute is overwritten below the class definition + removed_and_transfer_admin_should_differ = None + # Attribute is overwritten below the class definition + transfer_dest_user_not_found = None + # Attribute is overwritten below the class definition + transfer_dest_user_not_in_team = None + # Attribute is overwritten below the class definition + transfer_admin_user_not_in_team = None + # Attribute is overwritten below the class definition + transfer_admin_user_not_found = None + # Attribute is overwritten below the class definition + unspecified_transfer_admin_id = None + # Attribute is overwritten below the class definition + transfer_admin_is_not_admin = None + # Attribute is overwritten below the class definition + recipient_not_verified = None + + def is_removed_and_transfer_dest_should_differ(self): + """ + Check if the union tag is ``removed_and_transfer_dest_should_differ``. + + :rtype: bool + """ + return self._tag == 'removed_and_transfer_dest_should_differ' + + def is_removed_and_transfer_admin_should_differ(self): + """ + Check if the union tag is ``removed_and_transfer_admin_should_differ``. + + :rtype: bool + """ + return self._tag == 'removed_and_transfer_admin_should_differ' + + def is_transfer_dest_user_not_found(self): + """ + Check if the union tag is ``transfer_dest_user_not_found``. + + :rtype: bool + """ + return self._tag == 'transfer_dest_user_not_found' + + def is_transfer_dest_user_not_in_team(self): + """ + Check if the union tag is ``transfer_dest_user_not_in_team``. + + :rtype: bool + """ + return self._tag == 'transfer_dest_user_not_in_team' + + def is_transfer_admin_user_not_in_team(self): + """ + Check if the union tag is ``transfer_admin_user_not_in_team``. + + :rtype: bool + """ + return self._tag == 'transfer_admin_user_not_in_team' + + def is_transfer_admin_user_not_found(self): + """ + Check if the union tag is ``transfer_admin_user_not_found``. + + :rtype: bool + """ + return self._tag == 'transfer_admin_user_not_found' + + def is_unspecified_transfer_admin_id(self): + """ + Check if the union tag is ``unspecified_transfer_admin_id``. + + :rtype: bool + """ + return self._tag == 'unspecified_transfer_admin_id' + + def is_transfer_admin_is_not_admin(self): + """ + Check if the union tag is ``transfer_admin_is_not_admin``. + + :rtype: bool + """ + return self._tag == 'transfer_admin_is_not_admin' + + def is_recipient_not_verified(self): + """ + Check if the union tag is ``recipient_not_verified``. + + :rtype: bool + """ + return self._tag == 'recipient_not_verified' + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersTransferFilesError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersTransferFilesError(%r, %r)' % (self._tag, self._value) + +MembersTransferFilesError_validator = bv.Union(MembersTransferFilesError) + +class MembersRemoveError(MembersTransferFilesError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar remove_last_admin: The user is the last admin of the team, so it + cannot be removed from it. + :ivar cannot_keep_account_and_transfer: Cannot keep account and transfer the + data to another user at the same time. + :ivar cannot_keep_account_and_delete_data: Cannot keep account and delete + the data at the same time. To keep the account the argument wipe_data + should be set to False. + :ivar email_address_too_long_to_be_disabled: The email address of the user + is too long to be disabled. + :ivar cannot_keep_invited_user_account: Cannot keep account of an invited + user. + """ + + # Attribute is overwritten below the class definition + remove_last_admin = None + # Attribute is overwritten below the class definition + cannot_keep_account_and_transfer = None + # Attribute is overwritten below the class definition + cannot_keep_account_and_delete_data = None + # Attribute is overwritten below the class definition + email_address_too_long_to_be_disabled = None + # Attribute is overwritten below the class definition + cannot_keep_invited_user_account = None + + def is_remove_last_admin(self): + """ + Check if the union tag is ``remove_last_admin``. + + :rtype: bool + """ + return self._tag == 'remove_last_admin' + + def is_cannot_keep_account_and_transfer(self): + """ + Check if the union tag is ``cannot_keep_account_and_transfer``. + + :rtype: bool + """ + return self._tag == 'cannot_keep_account_and_transfer' + + def is_cannot_keep_account_and_delete_data(self): + """ + Check if the union tag is ``cannot_keep_account_and_delete_data``. + + :rtype: bool + """ + return self._tag == 'cannot_keep_account_and_delete_data' + + def is_email_address_too_long_to_be_disabled(self): + """ + Check if the union tag is ``email_address_too_long_to_be_disabled``. + + :rtype: bool + """ + return self._tag == 'email_address_too_long_to_be_disabled' + + def is_cannot_keep_invited_user_account(self): + """ + Check if the union tag is ``cannot_keep_invited_user_account``. + + :rtype: bool + """ + return self._tag == 'cannot_keep_invited_user_account' + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersRemoveError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersRemoveError(%r, %r)' % (self._tag, self._value) + +MembersRemoveError_validator = bv.Union(MembersRemoveError) + +class MembersSendWelcomeError(MemberSelectorError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersSendWelcomeError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersSendWelcomeError(%r, %r)' % (self._tag, self._value) + +MembersSendWelcomeError_validator = bv.Union(MembersSendWelcomeError) + +class MembersSetPermissionsArg(bb.Struct): + """ + Exactly one of team_member_id, email, or external_id must be provided to + identify the user account. + + :ivar user: Identity of user whose role will be set. + :ivar new_role: The new role of the member. + """ + + __slots__ = [ + '_user_value', + '_user_present', + '_new_role_value', + '_new_role_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None, + new_role=None): + self._user_value = None + self._user_present = False + self._new_role_value = None + self._new_role_present = False + if user is not None: + self.user = user + if new_role is not None: + self.new_role = new_role + + @property + def user(self): + """ + Identity of user whose role will be set. + + :rtype: UserSelectorArg + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + @property + def new_role(self): + """ + The new role of the member. + + :rtype: AdminTier + """ + if self._new_role_present: + return self._new_role_value + else: + raise AttributeError("missing required field 'new_role'") + + @new_role.setter + def new_role(self, val): + self._new_role_validator.validate_type_only(val) + self._new_role_value = val + self._new_role_present = True + + @new_role.deleter + def new_role(self): + self._new_role_value = None + self._new_role_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersSetPermissionsArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersSetPermissionsArg(user={!r}, new_role={!r})'.format( + self._user_value, + self._new_role_value, + ) + +MembersSetPermissionsArg_validator = bv.Struct(MembersSetPermissionsArg) + +class MembersSetPermissionsError(UserSelectorError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar last_admin: Cannot remove the admin setting of the last admin. + :ivar user_not_in_team: The user is not a member of the team. + :ivar cannot_set_permissions: Cannot remove/grant permissions. + :ivar team_license_limit: Team is full. The organization has no available + licenses. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + last_admin = None + # Attribute is overwritten below the class definition + user_not_in_team = None + # Attribute is overwritten below the class definition + cannot_set_permissions = None + # Attribute is overwritten below the class definition + team_license_limit = None + # Attribute is overwritten below the class definition + other = None + + def is_last_admin(self): + """ + Check if the union tag is ``last_admin``. + + :rtype: bool + """ + return self._tag == 'last_admin' + + def is_user_not_in_team(self): + """ + Check if the union tag is ``user_not_in_team``. + + :rtype: bool + """ + return self._tag == 'user_not_in_team' + + def is_cannot_set_permissions(self): + """ + Check if the union tag is ``cannot_set_permissions``. + + :rtype: bool + """ + return self._tag == 'cannot_set_permissions' + + def is_team_license_limit(self): + """ + Check if the union tag is ``team_license_limit``. + + :rtype: bool + """ + return self._tag == 'team_license_limit' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersSetPermissionsError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersSetPermissionsError(%r, %r)' % (self._tag, self._value) + +MembersSetPermissionsError_validator = bv.Union(MembersSetPermissionsError) + +class MembersSetPermissionsResult(bb.Struct): + """ + :ivar team_member_id: The member ID of the user to which the change was + applied. + :ivar role: The role after the change. + """ + + __slots__ = [ + '_team_member_id_value', + '_team_member_id_present', + '_role_value', + '_role_present', + ] + + _has_required_fields = True + + def __init__(self, + team_member_id=None, + role=None): + self._team_member_id_value = None + self._team_member_id_present = False + self._role_value = None + self._role_present = False + if team_member_id is not None: + self.team_member_id = team_member_id + if role is not None: + self.role = role + + @property + def team_member_id(self): + """ + The member ID of the user to which the change was applied. + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + raise AttributeError("missing required field 'team_member_id'") + + @team_member_id.setter + def team_member_id(self, val): + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + @property + def role(self): + """ + The role after the change. + + :rtype: AdminTier + """ + if self._role_present: + return self._role_value + else: + raise AttributeError("missing required field 'role'") + + @role.setter + def role(self, val): + self._role_validator.validate_type_only(val) + self._role_value = val + self._role_present = True + + @role.deleter + def role(self): + self._role_value = None + self._role_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersSetPermissionsResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersSetPermissionsResult(team_member_id={!r}, role={!r})'.format( + self._team_member_id_value, + self._role_value, + ) + +MembersSetPermissionsResult_validator = bv.Struct(MembersSetPermissionsResult) + +class MembersSetProfileArg(bb.Struct): + """ + Exactly one of team_member_id, email, or external_id must be provided to + identify the user account. At least one of new_email, new_external_id, + new_given_name, and/or new_surname must be provided. + + :ivar user: Identity of user whose profile will be set. + :ivar new_email: New email for member. + :ivar new_external_id: New external ID for member. + :ivar new_given_name: New given name for member. + :ivar new_surname: New surname for member. + :ivar new_persistent_id: New persistent ID. This field only available to + teams using persistent ID SAML configuration. + :ivar new_is_directory_restricted: New value for whether the user is a + directory restricted user. + """ + + __slots__ = [ + '_user_value', + '_user_present', + '_new_email_value', + '_new_email_present', + '_new_external_id_value', + '_new_external_id_present', + '_new_given_name_value', + '_new_given_name_present', + '_new_surname_value', + '_new_surname_present', + '_new_persistent_id_value', + '_new_persistent_id_present', + '_new_is_directory_restricted_value', + '_new_is_directory_restricted_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None, + new_email=None, + new_external_id=None, + new_given_name=None, + new_surname=None, + new_persistent_id=None, + new_is_directory_restricted=None): + self._user_value = None + self._user_present = False + self._new_email_value = None + self._new_email_present = False + self._new_external_id_value = None + self._new_external_id_present = False + self._new_given_name_value = None + self._new_given_name_present = False + self._new_surname_value = None + self._new_surname_present = False + self._new_persistent_id_value = None + self._new_persistent_id_present = False + self._new_is_directory_restricted_value = None + self._new_is_directory_restricted_present = False + if user is not None: + self.user = user + if new_email is not None: + self.new_email = new_email + if new_external_id is not None: + self.new_external_id = new_external_id + if new_given_name is not None: + self.new_given_name = new_given_name + if new_surname is not None: + self.new_surname = new_surname + if new_persistent_id is not None: + self.new_persistent_id = new_persistent_id + if new_is_directory_restricted is not None: + self.new_is_directory_restricted = new_is_directory_restricted + + @property + def user(self): + """ + Identity of user whose profile will be set. + + :rtype: UserSelectorArg + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + @property + def new_email(self): + """ + New email for member. + + :rtype: str + """ + if self._new_email_present: + return self._new_email_value + else: + return None + + @new_email.setter + def new_email(self, val): + if val is None: + del self.new_email + return + val = self._new_email_validator.validate(val) + self._new_email_value = val + self._new_email_present = True + + @new_email.deleter + def new_email(self): + self._new_email_value = None + self._new_email_present = False + + @property + def new_external_id(self): + """ + New external ID for member. + + :rtype: str + """ + if self._new_external_id_present: + return self._new_external_id_value + else: + return None + + @new_external_id.setter + def new_external_id(self, val): + if val is None: + del self.new_external_id + return + val = self._new_external_id_validator.validate(val) + self._new_external_id_value = val + self._new_external_id_present = True + + @new_external_id.deleter + def new_external_id(self): + self._new_external_id_value = None + self._new_external_id_present = False + + @property + def new_given_name(self): + """ + New given name for member. + + :rtype: str + """ + if self._new_given_name_present: + return self._new_given_name_value + else: + return None + + @new_given_name.setter + def new_given_name(self, val): + if val is None: + del self.new_given_name + return + val = self._new_given_name_validator.validate(val) + self._new_given_name_value = val + self._new_given_name_present = True + + @new_given_name.deleter + def new_given_name(self): + self._new_given_name_value = None + self._new_given_name_present = False + + @property + def new_surname(self): + """ + New surname for member. + + :rtype: str + """ + if self._new_surname_present: + return self._new_surname_value + else: + return None + + @new_surname.setter + def new_surname(self, val): + if val is None: + del self.new_surname + return + val = self._new_surname_validator.validate(val) + self._new_surname_value = val + self._new_surname_present = True + + @new_surname.deleter + def new_surname(self): + self._new_surname_value = None + self._new_surname_present = False + + @property + def new_persistent_id(self): + """ + New persistent ID. This field only available to teams using persistent + ID SAML configuration. + + :rtype: str + """ + if self._new_persistent_id_present: + return self._new_persistent_id_value + else: + return None + + @new_persistent_id.setter + def new_persistent_id(self, val): + if val is None: + del self.new_persistent_id + return + val = self._new_persistent_id_validator.validate(val) + self._new_persistent_id_value = val + self._new_persistent_id_present = True + + @new_persistent_id.deleter + def new_persistent_id(self): + self._new_persistent_id_value = None + self._new_persistent_id_present = False + + @property + def new_is_directory_restricted(self): + """ + New value for whether the user is a directory restricted user. + + :rtype: bool + """ + if self._new_is_directory_restricted_present: + return self._new_is_directory_restricted_value + else: + return None + + @new_is_directory_restricted.setter + def new_is_directory_restricted(self, val): + if val is None: + del self.new_is_directory_restricted + return + val = self._new_is_directory_restricted_validator.validate(val) + self._new_is_directory_restricted_value = val + self._new_is_directory_restricted_present = True + + @new_is_directory_restricted.deleter + def new_is_directory_restricted(self): + self._new_is_directory_restricted_value = None + self._new_is_directory_restricted_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersSetProfileArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersSetProfileArg(user={!r}, new_email={!r}, new_external_id={!r}, new_given_name={!r}, new_surname={!r}, new_persistent_id={!r}, new_is_directory_restricted={!r})'.format( + self._user_value, + self._new_email_value, + self._new_external_id_value, + self._new_given_name_value, + self._new_surname_value, + self._new_persistent_id_value, + self._new_is_directory_restricted_value, + ) + +MembersSetProfileArg_validator = bv.Struct(MembersSetProfileArg) + +class MembersSetProfileError(MemberSelectorError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar external_id_and_new_external_id_unsafe: It is unsafe to use both + external_id and new_external_id. + :ivar no_new_data_specified: None of new_email, new_given_name, new_surname, + or new_external_id are specified. + :ivar email_reserved_for_other_user: Email is already reserved for another + user. + :ivar external_id_used_by_other_user: The external ID is already in use by + another team member. + :ivar set_profile_disallowed: Modifying deleted users is not allowed. + :ivar param_cannot_be_empty: Parameter new_email cannot be empty. + :ivar persistent_id_disabled: Persistent ID is only available to teams with + persistent ID SAML configuration. Please contact Dropbox for more + information. + :ivar persistent_id_used_by_other_user: The persistent ID is already in use + by another team member. + :ivar directory_restricted_off: Directory Restrictions option is not + available. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + external_id_and_new_external_id_unsafe = None + # Attribute is overwritten below the class definition + no_new_data_specified = None + # Attribute is overwritten below the class definition + email_reserved_for_other_user = None + # Attribute is overwritten below the class definition + external_id_used_by_other_user = None + # Attribute is overwritten below the class definition + set_profile_disallowed = None + # Attribute is overwritten below the class definition + param_cannot_be_empty = None + # Attribute is overwritten below the class definition + persistent_id_disabled = None + # Attribute is overwritten below the class definition + persistent_id_used_by_other_user = None + # Attribute is overwritten below the class definition + directory_restricted_off = None + # Attribute is overwritten below the class definition + other = None + + def is_external_id_and_new_external_id_unsafe(self): + """ + Check if the union tag is ``external_id_and_new_external_id_unsafe``. + + :rtype: bool + """ + return self._tag == 'external_id_and_new_external_id_unsafe' + + def is_no_new_data_specified(self): + """ + Check if the union tag is ``no_new_data_specified``. + + :rtype: bool + """ + return self._tag == 'no_new_data_specified' + + def is_email_reserved_for_other_user(self): + """ + Check if the union tag is ``email_reserved_for_other_user``. + + :rtype: bool + """ + return self._tag == 'email_reserved_for_other_user' + + def is_external_id_used_by_other_user(self): + """ + Check if the union tag is ``external_id_used_by_other_user``. + + :rtype: bool + """ + return self._tag == 'external_id_used_by_other_user' + + def is_set_profile_disallowed(self): + """ + Check if the union tag is ``set_profile_disallowed``. + + :rtype: bool + """ + return self._tag == 'set_profile_disallowed' + + def is_param_cannot_be_empty(self): + """ + Check if the union tag is ``param_cannot_be_empty``. + + :rtype: bool + """ + return self._tag == 'param_cannot_be_empty' + + def is_persistent_id_disabled(self): + """ + Check if the union tag is ``persistent_id_disabled``. + + :rtype: bool + """ + return self._tag == 'persistent_id_disabled' + + def is_persistent_id_used_by_other_user(self): + """ + Check if the union tag is ``persistent_id_used_by_other_user``. + + :rtype: bool + """ + return self._tag == 'persistent_id_used_by_other_user' + + def is_directory_restricted_off(self): + """ + Check if the union tag is ``directory_restricted_off``. + + :rtype: bool + """ + return self._tag == 'directory_restricted_off' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersSetProfileError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersSetProfileError(%r, %r)' % (self._tag, self._value) + +MembersSetProfileError_validator = bv.Union(MembersSetProfileError) + +class MembersSuspendError(MembersDeactivateError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar suspend_inactive_user: The user is not active, so it cannot be + suspended. + :ivar suspend_last_admin: The user is the last admin of the team, so it + cannot be suspended. + :ivar team_license_limit: Team is full. The organization has no available + licenses. + """ + + # Attribute is overwritten below the class definition + suspend_inactive_user = None + # Attribute is overwritten below the class definition + suspend_last_admin = None + # Attribute is overwritten below the class definition + team_license_limit = None + + def is_suspend_inactive_user(self): + """ + Check if the union tag is ``suspend_inactive_user``. + + :rtype: bool + """ + return self._tag == 'suspend_inactive_user' + + def is_suspend_last_admin(self): + """ + Check if the union tag is ``suspend_last_admin``. + + :rtype: bool + """ + return self._tag == 'suspend_last_admin' + + def is_team_license_limit(self): + """ + Check if the union tag is ``team_license_limit``. + + :rtype: bool + """ + return self._tag == 'team_license_limit' + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersSuspendError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersSuspendError(%r, %r)' % (self._tag, self._value) + +MembersSuspendError_validator = bv.Union(MembersSuspendError) + +class MembersTransferFormerMembersFilesError(MembersTransferFilesError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar user_data_is_being_transferred: The user's data is being transferred. + Please wait some time before retrying. + :ivar user_not_removed: No matching removed user found for the argument + user. + :ivar user_data_cannot_be_transferred: User files aren't transferable + anymore. + :ivar user_data_already_transferred: User's data has already been + transferred to another user. + """ + + # Attribute is overwritten below the class definition + user_data_is_being_transferred = None + # Attribute is overwritten below the class definition + user_not_removed = None + # Attribute is overwritten below the class definition + user_data_cannot_be_transferred = None + # Attribute is overwritten below the class definition + user_data_already_transferred = None + + def is_user_data_is_being_transferred(self): + """ + Check if the union tag is ``user_data_is_being_transferred``. + + :rtype: bool + """ + return self._tag == 'user_data_is_being_transferred' + + def is_user_not_removed(self): + """ + Check if the union tag is ``user_not_removed``. + + :rtype: bool + """ + return self._tag == 'user_not_removed' + + def is_user_data_cannot_be_transferred(self): + """ + Check if the union tag is ``user_data_cannot_be_transferred``. + + :rtype: bool + """ + return self._tag == 'user_data_cannot_be_transferred' + + def is_user_data_already_transferred(self): + """ + Check if the union tag is ``user_data_already_transferred``. + + :rtype: bool + """ + return self._tag == 'user_data_already_transferred' + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersTransferFormerMembersFilesError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersTransferFormerMembersFilesError(%r, %r)' % (self._tag, self._value) + +MembersTransferFormerMembersFilesError_validator = bv.Union(MembersTransferFormerMembersFilesError) + +class MembersUnsuspendArg(bb.Struct): + """ + Exactly one of team_member_id, email, or external_id must be provided to + identify the user account. + + :ivar user: Identity of user to unsuspend. + """ + + __slots__ = [ + '_user_value', + '_user_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None): + self._user_value = None + self._user_present = False + if user is not None: + self.user = user + + @property + def user(self): + """ + Identity of user to unsuspend. + + :rtype: UserSelectorArg + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersUnsuspendArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersUnsuspendArg(user={!r})'.format( + self._user_value, + ) + +MembersUnsuspendArg_validator = bv.Struct(MembersUnsuspendArg) + +class MembersUnsuspendError(MembersDeactivateError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar unsuspend_non_suspended_member: The user is unsuspended, so it cannot + be unsuspended again. + :ivar team_license_limit: Team is full. The organization has no available + licenses. + """ + + # Attribute is overwritten below the class definition + unsuspend_non_suspended_member = None + # Attribute is overwritten below the class definition + team_license_limit = None + + def is_unsuspend_non_suspended_member(self): + """ + Check if the union tag is ``unsuspend_non_suspended_member``. + + :rtype: bool + """ + return self._tag == 'unsuspend_non_suspended_member' + + def is_team_license_limit(self): + """ + Check if the union tag is ``team_license_limit``. + + :rtype: bool + """ + return self._tag == 'team_license_limit' + + def _process_custom_annotations(self, annotation_type, processor): + super(MembersUnsuspendError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MembersUnsuspendError(%r, %r)' % (self._tag, self._value) + +MembersUnsuspendError_validator = bv.Union(MembersUnsuspendError) + +class MobileClientPlatform(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar iphone: Official Dropbox iPhone client. + :ivar ipad: Official Dropbox iPad client. + :ivar android: Official Dropbox Android client. + :ivar windows_phone: Official Dropbox Windows phone client. + :ivar blackberry: Official Dropbox Blackberry client. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + iphone = None + # Attribute is overwritten below the class definition + ipad = None + # Attribute is overwritten below the class definition + android = None + # Attribute is overwritten below the class definition + windows_phone = None + # Attribute is overwritten below the class definition + blackberry = None + # Attribute is overwritten below the class definition + other = None + + def is_iphone(self): + """ + Check if the union tag is ``iphone``. + + :rtype: bool + """ + return self._tag == 'iphone' + + def is_ipad(self): + """ + Check if the union tag is ``ipad``. + + :rtype: bool + """ + return self._tag == 'ipad' + + def is_android(self): + """ + Check if the union tag is ``android``. + + :rtype: bool + """ + return self._tag == 'android' + + def is_windows_phone(self): + """ + Check if the union tag is ``windows_phone``. + + :rtype: bool + """ + return self._tag == 'windows_phone' + + def is_blackberry(self): + """ + Check if the union tag is ``blackberry``. + + :rtype: bool + """ + return self._tag == 'blackberry' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(MobileClientPlatform, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MobileClientPlatform(%r, %r)' % (self._tag, self._value) + +MobileClientPlatform_validator = bv.Union(MobileClientPlatform) + +class MobileClientSession(DeviceSession): + """ + Information about linked Dropbox mobile client sessions. + + :ivar device_name: The device name. + :ivar client_type: The mobile application type. + :ivar client_version: The dropbox client version. + :ivar os_version: The hosting OS version. + :ivar last_carrier: last carrier used by the device. + """ + + __slots__ = [ + '_device_name_value', + '_device_name_present', + '_client_type_value', + '_client_type_present', + '_client_version_value', + '_client_version_present', + '_os_version_value', + '_os_version_present', + '_last_carrier_value', + '_last_carrier_present', + ] + + _has_required_fields = True + + def __init__(self, + session_id=None, + device_name=None, + client_type=None, + ip_address=None, + country=None, + created=None, + updated=None, + client_version=None, + os_version=None, + last_carrier=None): + super(MobileClientSession, self).__init__(session_id, + ip_address, + country, + created, + updated) + self._device_name_value = None + self._device_name_present = False + self._client_type_value = None + self._client_type_present = False + self._client_version_value = None + self._client_version_present = False + self._os_version_value = None + self._os_version_present = False + self._last_carrier_value = None + self._last_carrier_present = False + if device_name is not None: + self.device_name = device_name + if client_type is not None: + self.client_type = client_type + if client_version is not None: + self.client_version = client_version + if os_version is not None: + self.os_version = os_version + if last_carrier is not None: + self.last_carrier = last_carrier + + @property + def device_name(self): + """ + The device name. + + :rtype: str + """ + if self._device_name_present: + return self._device_name_value + else: + raise AttributeError("missing required field 'device_name'") + + @device_name.setter + def device_name(self, val): + val = self._device_name_validator.validate(val) + self._device_name_value = val + self._device_name_present = True + + @device_name.deleter + def device_name(self): + self._device_name_value = None + self._device_name_present = False + + @property + def client_type(self): + """ + The mobile application type. + + :rtype: MobileClientPlatform + """ + if self._client_type_present: + return self._client_type_value + else: + raise AttributeError("missing required field 'client_type'") + + @client_type.setter + def client_type(self, val): + self._client_type_validator.validate_type_only(val) + self._client_type_value = val + self._client_type_present = True + + @client_type.deleter + def client_type(self): + self._client_type_value = None + self._client_type_present = False + + @property + def client_version(self): + """ + The dropbox client version. + + :rtype: str + """ + if self._client_version_present: + return self._client_version_value + else: + return None + + @client_version.setter + def client_version(self, val): + if val is None: + del self.client_version + return + val = self._client_version_validator.validate(val) + self._client_version_value = val + self._client_version_present = True + + @client_version.deleter + def client_version(self): + self._client_version_value = None + self._client_version_present = False + + @property + def os_version(self): + """ + The hosting OS version. + + :rtype: str + """ + if self._os_version_present: + return self._os_version_value + else: + return None + + @os_version.setter + def os_version(self, val): + if val is None: + del self.os_version + return + val = self._os_version_validator.validate(val) + self._os_version_value = val + self._os_version_present = True + + @os_version.deleter + def os_version(self): + self._os_version_value = None + self._os_version_present = False + + @property + def last_carrier(self): + """ + last carrier used by the device. + + :rtype: str + """ + if self._last_carrier_present: + return self._last_carrier_value + else: + return None + + @last_carrier.setter + def last_carrier(self, val): + if val is None: + del self.last_carrier + return + val = self._last_carrier_validator.validate(val) + self._last_carrier_value = val + self._last_carrier_present = True + + @last_carrier.deleter + def last_carrier(self): + self._last_carrier_value = None + self._last_carrier_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MobileClientSession, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MobileClientSession(session_id={!r}, device_name={!r}, client_type={!r}, ip_address={!r}, country={!r}, created={!r}, updated={!r}, client_version={!r}, os_version={!r}, last_carrier={!r})'.format( + self._session_id_value, + self._device_name_value, + self._client_type_value, + self._ip_address_value, + self._country_value, + self._created_value, + self._updated_value, + self._client_version_value, + self._os_version_value, + self._last_carrier_value, + ) + +MobileClientSession_validator = bv.Struct(MobileClientSession) + +class NamespaceMetadata(bb.Struct): + """ + Properties of a namespace. + + :ivar name: The name of this namespace. + :ivar namespace_id: The ID of this namespace. + :ivar namespace_type: The type of this namespace. + :ivar team_member_id: If this is a team member or app folder, the ID of the + owning team member. Otherwise, this field is not present. + """ + + __slots__ = [ + '_name_value', + '_name_present', + '_namespace_id_value', + '_namespace_id_present', + '_namespace_type_value', + '_namespace_type_present', + '_team_member_id_value', + '_team_member_id_present', + ] + + _has_required_fields = True + + def __init__(self, + name=None, + namespace_id=None, + namespace_type=None, + team_member_id=None): + self._name_value = None + self._name_present = False + self._namespace_id_value = None + self._namespace_id_present = False + self._namespace_type_value = None + self._namespace_type_present = False + self._team_member_id_value = None + self._team_member_id_present = False + if name is not None: + self.name = name + if namespace_id is not None: + self.namespace_id = namespace_id + if namespace_type is not None: + self.namespace_type = namespace_type + if team_member_id is not None: + self.team_member_id = team_member_id + + @property + def name(self): + """ + The name of this namespace. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def namespace_id(self): + """ + The ID of this namespace. + + :rtype: str + """ + if self._namespace_id_present: + return self._namespace_id_value + else: + raise AttributeError("missing required field 'namespace_id'") + + @namespace_id.setter + def namespace_id(self, val): + val = self._namespace_id_validator.validate(val) + self._namespace_id_value = val + self._namespace_id_present = True + + @namespace_id.deleter + def namespace_id(self): + self._namespace_id_value = None + self._namespace_id_present = False + + @property + def namespace_type(self): + """ + The type of this namespace. + + :rtype: NamespaceType + """ + if self._namespace_type_present: + return self._namespace_type_value + else: + raise AttributeError("missing required field 'namespace_type'") + + @namespace_type.setter + def namespace_type(self, val): + self._namespace_type_validator.validate_type_only(val) + self._namespace_type_value = val + self._namespace_type_present = True + + @namespace_type.deleter + def namespace_type(self): + self._namespace_type_value = None + self._namespace_type_present = False + + @property + def team_member_id(self): + """ + If this is a team member or app folder, the ID of the owning team + member. Otherwise, this field is not present. + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + return None + + @team_member_id.setter + def team_member_id(self, val): + if val is None: + del self.team_member_id + return + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(NamespaceMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'NamespaceMetadata(name={!r}, namespace_id={!r}, namespace_type={!r}, team_member_id={!r})'.format( + self._name_value, + self._namespace_id_value, + self._namespace_type_value, + self._team_member_id_value, + ) + +NamespaceMetadata_validator = bv.Struct(NamespaceMetadata) + +class NamespaceType(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar app_folder: App sandbox folder. + :ivar shared_folder: Shared folder. + :ivar team_folder: Top-level team-owned folder. + :ivar team_member_folder: Team member's home folder. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + app_folder = None + # Attribute is overwritten below the class definition + shared_folder = None + # Attribute is overwritten below the class definition + team_folder = None + # Attribute is overwritten below the class definition + team_member_folder = None + # Attribute is overwritten below the class definition + other = None + + def is_app_folder(self): + """ + Check if the union tag is ``app_folder``. + + :rtype: bool + """ + return self._tag == 'app_folder' + + def is_shared_folder(self): + """ + Check if the union tag is ``shared_folder``. + + :rtype: bool + """ + return self._tag == 'shared_folder' + + def is_team_folder(self): + """ + Check if the union tag is ``team_folder``. + + :rtype: bool + """ + return self._tag == 'team_folder' + + def is_team_member_folder(self): + """ + Check if the union tag is ``team_member_folder``. + + :rtype: bool + """ + return self._tag == 'team_member_folder' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(NamespaceType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'NamespaceType(%r, %r)' % (self._tag, self._value) + +NamespaceType_validator = bv.Union(NamespaceType) + +class RemoveCustomQuotaResult(bb.Union): + """ + User result for setting member custom quota. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar UserSelectorArg success: Successfully removed user. + :ivar UserSelectorArg invalid_user: Invalid user (not in team). + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def success(cls, val): + """ + Create an instance of this class set to the ``success`` tag with value + ``val``. + + :param UserSelectorArg val: + :rtype: RemoveCustomQuotaResult + """ + return cls('success', val) + + @classmethod + def invalid_user(cls, val): + """ + Create an instance of this class set to the ``invalid_user`` tag with + value ``val``. + + :param UserSelectorArg val: + :rtype: RemoveCustomQuotaResult + """ + return cls('invalid_user', val) + + def is_success(self): + """ + Check if the union tag is ``success``. + + :rtype: bool + """ + return self._tag == 'success' + + def is_invalid_user(self): + """ + Check if the union tag is ``invalid_user``. + + :rtype: bool + """ + return self._tag == 'invalid_user' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_success(self): + """ + Successfully removed user. + + Only call this if :meth:`is_success` is true. + + :rtype: UserSelectorArg + """ + if not self.is_success(): + raise AttributeError("tag 'success' not set") + return self._value + + def get_invalid_user(self): + """ + Invalid user (not in team). + + Only call this if :meth:`is_invalid_user` is true. + + :rtype: UserSelectorArg + """ + if not self.is_invalid_user(): + raise AttributeError("tag 'invalid_user' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(RemoveCustomQuotaResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RemoveCustomQuotaResult(%r, %r)' % (self._tag, self._value) + +RemoveCustomQuotaResult_validator = bv.Union(RemoveCustomQuotaResult) + +class RemovedStatus(bb.Struct): + """ + :ivar is_recoverable: True if the removed team member is recoverable. + :ivar is_disconnected: True if the team member's account was converted to + individual account. + """ + + __slots__ = [ + '_is_recoverable_value', + '_is_recoverable_present', + '_is_disconnected_value', + '_is_disconnected_present', + ] + + _has_required_fields = True + + def __init__(self, + is_recoverable=None, + is_disconnected=None): + self._is_recoverable_value = None + self._is_recoverable_present = False + self._is_disconnected_value = None + self._is_disconnected_present = False + if is_recoverable is not None: + self.is_recoverable = is_recoverable + if is_disconnected is not None: + self.is_disconnected = is_disconnected + + @property + def is_recoverable(self): + """ + True if the removed team member is recoverable. + + :rtype: bool + """ + if self._is_recoverable_present: + return self._is_recoverable_value + else: + raise AttributeError("missing required field 'is_recoverable'") + + @is_recoverable.setter + def is_recoverable(self, val): + val = self._is_recoverable_validator.validate(val) + self._is_recoverable_value = val + self._is_recoverable_present = True + + @is_recoverable.deleter + def is_recoverable(self): + self._is_recoverable_value = None + self._is_recoverable_present = False + + @property + def is_disconnected(self): + """ + True if the team member's account was converted to individual account. + + :rtype: bool + """ + if self._is_disconnected_present: + return self._is_disconnected_value + else: + raise AttributeError("missing required field 'is_disconnected'") + + @is_disconnected.setter + def is_disconnected(self, val): + val = self._is_disconnected_validator.validate(val) + self._is_disconnected_value = val + self._is_disconnected_present = True + + @is_disconnected.deleter + def is_disconnected(self): + self._is_disconnected_value = None + self._is_disconnected_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RemovedStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RemovedStatus(is_recoverable={!r}, is_disconnected={!r})'.format( + self._is_recoverable_value, + self._is_disconnected_value, + ) + +RemovedStatus_validator = bv.Struct(RemovedStatus) + +class RevokeDesktopClientArg(DeviceSessionArg): + """ + :ivar delete_on_unlink: Whether to delete all files of the account (this is + possible only if supported by the desktop client and will be made the + next time the client access the account). + """ + + __slots__ = [ + '_delete_on_unlink_value', + '_delete_on_unlink_present', + ] + + _has_required_fields = True + + def __init__(self, + session_id=None, + team_member_id=None, + delete_on_unlink=None): + super(RevokeDesktopClientArg, self).__init__(session_id, + team_member_id) + self._delete_on_unlink_value = None + self._delete_on_unlink_present = False + if delete_on_unlink is not None: + self.delete_on_unlink = delete_on_unlink + + @property + def delete_on_unlink(self): + """ + Whether to delete all files of the account (this is possible only if + supported by the desktop client and will be made the next time the + client access the account). + + :rtype: bool + """ + if self._delete_on_unlink_present: + return self._delete_on_unlink_value + else: + return False + + @delete_on_unlink.setter + def delete_on_unlink(self, val): + val = self._delete_on_unlink_validator.validate(val) + self._delete_on_unlink_value = val + self._delete_on_unlink_present = True + + @delete_on_unlink.deleter + def delete_on_unlink(self): + self._delete_on_unlink_value = None + self._delete_on_unlink_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RevokeDesktopClientArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RevokeDesktopClientArg(session_id={!r}, team_member_id={!r}, delete_on_unlink={!r})'.format( + self._session_id_value, + self._team_member_id_value, + self._delete_on_unlink_value, + ) + +RevokeDesktopClientArg_validator = bv.Struct(RevokeDesktopClientArg) + +class RevokeDeviceSessionArg(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar DeviceSessionArg web_session: End an active session. + :ivar RevokeDesktopClientArg desktop_client: Unlink a linked desktop device. + :ivar DeviceSessionArg mobile_client: Unlink a linked mobile device. + """ + + _catch_all = None + + @classmethod + def web_session(cls, val): + """ + Create an instance of this class set to the ``web_session`` tag with + value ``val``. + + :param DeviceSessionArg val: + :rtype: RevokeDeviceSessionArg + """ + return cls('web_session', val) + + @classmethod + def desktop_client(cls, val): + """ + Create an instance of this class set to the ``desktop_client`` tag with + value ``val``. + + :param RevokeDesktopClientArg val: + :rtype: RevokeDeviceSessionArg + """ + return cls('desktop_client', val) + + @classmethod + def mobile_client(cls, val): + """ + Create an instance of this class set to the ``mobile_client`` tag with + value ``val``. + + :param DeviceSessionArg val: + :rtype: RevokeDeviceSessionArg + """ + return cls('mobile_client', val) + + def is_web_session(self): + """ + Check if the union tag is ``web_session``. + + :rtype: bool + """ + return self._tag == 'web_session' + + def is_desktop_client(self): + """ + Check if the union tag is ``desktop_client``. + + :rtype: bool + """ + return self._tag == 'desktop_client' + + def is_mobile_client(self): + """ + Check if the union tag is ``mobile_client``. + + :rtype: bool + """ + return self._tag == 'mobile_client' + + def get_web_session(self): + """ + End an active session. + + Only call this if :meth:`is_web_session` is true. + + :rtype: DeviceSessionArg + """ + if not self.is_web_session(): + raise AttributeError("tag 'web_session' not set") + return self._value + + def get_desktop_client(self): + """ + Unlink a linked desktop device. + + Only call this if :meth:`is_desktop_client` is true. + + :rtype: RevokeDesktopClientArg + """ + if not self.is_desktop_client(): + raise AttributeError("tag 'desktop_client' not set") + return self._value + + def get_mobile_client(self): + """ + Unlink a linked mobile device. + + Only call this if :meth:`is_mobile_client` is true. + + :rtype: DeviceSessionArg + """ + if not self.is_mobile_client(): + raise AttributeError("tag 'mobile_client' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(RevokeDeviceSessionArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RevokeDeviceSessionArg(%r, %r)' % (self._tag, self._value) + +RevokeDeviceSessionArg_validator = bv.Union(RevokeDeviceSessionArg) + +class RevokeDeviceSessionBatchArg(bb.Struct): + + __slots__ = [ + '_revoke_devices_value', + '_revoke_devices_present', + ] + + _has_required_fields = True + + def __init__(self, + revoke_devices=None): + self._revoke_devices_value = None + self._revoke_devices_present = False + if revoke_devices is not None: + self.revoke_devices = revoke_devices + + @property + def revoke_devices(self): + """ + :rtype: list of [RevokeDeviceSessionArg] + """ + if self._revoke_devices_present: + return self._revoke_devices_value + else: + raise AttributeError("missing required field 'revoke_devices'") + + @revoke_devices.setter + def revoke_devices(self, val): + val = self._revoke_devices_validator.validate(val) + self._revoke_devices_value = val + self._revoke_devices_present = True + + @revoke_devices.deleter + def revoke_devices(self): + self._revoke_devices_value = None + self._revoke_devices_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RevokeDeviceSessionBatchArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RevokeDeviceSessionBatchArg(revoke_devices={!r})'.format( + self._revoke_devices_value, + ) + +RevokeDeviceSessionBatchArg_validator = bv.Struct(RevokeDeviceSessionBatchArg) + +class RevokeDeviceSessionBatchError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(RevokeDeviceSessionBatchError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RevokeDeviceSessionBatchError(%r, %r)' % (self._tag, self._value) + +RevokeDeviceSessionBatchError_validator = bv.Union(RevokeDeviceSessionBatchError) + +class RevokeDeviceSessionBatchResult(bb.Struct): + + __slots__ = [ + '_revoke_devices_status_value', + '_revoke_devices_status_present', + ] + + _has_required_fields = True + + def __init__(self, + revoke_devices_status=None): + self._revoke_devices_status_value = None + self._revoke_devices_status_present = False + if revoke_devices_status is not None: + self.revoke_devices_status = revoke_devices_status + + @property + def revoke_devices_status(self): + """ + :rtype: list of [RevokeDeviceSessionStatus] + """ + if self._revoke_devices_status_present: + return self._revoke_devices_status_value + else: + raise AttributeError("missing required field 'revoke_devices_status'") + + @revoke_devices_status.setter + def revoke_devices_status(self, val): + val = self._revoke_devices_status_validator.validate(val) + self._revoke_devices_status_value = val + self._revoke_devices_status_present = True + + @revoke_devices_status.deleter + def revoke_devices_status(self): + self._revoke_devices_status_value = None + self._revoke_devices_status_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RevokeDeviceSessionBatchResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RevokeDeviceSessionBatchResult(revoke_devices_status={!r})'.format( + self._revoke_devices_status_value, + ) + +RevokeDeviceSessionBatchResult_validator = bv.Struct(RevokeDeviceSessionBatchResult) + +class RevokeDeviceSessionError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar device_session_not_found: Device session not found. + :ivar member_not_found: Member not found. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + device_session_not_found = None + # Attribute is overwritten below the class definition + member_not_found = None + # Attribute is overwritten below the class definition + other = None + + def is_device_session_not_found(self): + """ + Check if the union tag is ``device_session_not_found``. + + :rtype: bool + """ + return self._tag == 'device_session_not_found' + + def is_member_not_found(self): + """ + Check if the union tag is ``member_not_found``. + + :rtype: bool + """ + return self._tag == 'member_not_found' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(RevokeDeviceSessionError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RevokeDeviceSessionError(%r, %r)' % (self._tag, self._value) + +RevokeDeviceSessionError_validator = bv.Union(RevokeDeviceSessionError) + +class RevokeDeviceSessionStatus(bb.Struct): + """ + :ivar success: Result of the revoking request. + :ivar error_type: The error cause in case of a failure. + """ + + __slots__ = [ + '_success_value', + '_success_present', + '_error_type_value', + '_error_type_present', + ] + + _has_required_fields = True + + def __init__(self, + success=None, + error_type=None): + self._success_value = None + self._success_present = False + self._error_type_value = None + self._error_type_present = False + if success is not None: + self.success = success + if error_type is not None: + self.error_type = error_type + + @property + def success(self): + """ + Result of the revoking request. + + :rtype: bool + """ + if self._success_present: + return self._success_value + else: + raise AttributeError("missing required field 'success'") + + @success.setter + def success(self, val): + val = self._success_validator.validate(val) + self._success_value = val + self._success_present = True + + @success.deleter + def success(self): + self._success_value = None + self._success_present = False + + @property + def error_type(self): + """ + The error cause in case of a failure. + + :rtype: RevokeDeviceSessionError + """ + if self._error_type_present: + return self._error_type_value + else: + return None + + @error_type.setter + def error_type(self, val): + if val is None: + del self.error_type + return + self._error_type_validator.validate_type_only(val) + self._error_type_value = val + self._error_type_present = True + + @error_type.deleter + def error_type(self): + self._error_type_value = None + self._error_type_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RevokeDeviceSessionStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RevokeDeviceSessionStatus(success={!r}, error_type={!r})'.format( + self._success_value, + self._error_type_value, + ) + +RevokeDeviceSessionStatus_validator = bv.Struct(RevokeDeviceSessionStatus) + +class RevokeLinkedApiAppArg(bb.Struct): + """ + :ivar app_id: The application's unique id. + :ivar team_member_id: The unique id of the member owning the device. + :ivar keep_app_folder: Whether to keep the application dedicated folder (in + case the application uses one). + """ + + __slots__ = [ + '_app_id_value', + '_app_id_present', + '_team_member_id_value', + '_team_member_id_present', + '_keep_app_folder_value', + '_keep_app_folder_present', + ] + + _has_required_fields = True + + def __init__(self, + app_id=None, + team_member_id=None, + keep_app_folder=None): + self._app_id_value = None + self._app_id_present = False + self._team_member_id_value = None + self._team_member_id_present = False + self._keep_app_folder_value = None + self._keep_app_folder_present = False + if app_id is not None: + self.app_id = app_id + if team_member_id is not None: + self.team_member_id = team_member_id + if keep_app_folder is not None: + self.keep_app_folder = keep_app_folder + + @property + def app_id(self): + """ + The application's unique id. + + :rtype: str + """ + if self._app_id_present: + return self._app_id_value + else: + raise AttributeError("missing required field 'app_id'") + + @app_id.setter + def app_id(self, val): + val = self._app_id_validator.validate(val) + self._app_id_value = val + self._app_id_present = True + + @app_id.deleter + def app_id(self): + self._app_id_value = None + self._app_id_present = False + + @property + def team_member_id(self): + """ + The unique id of the member owning the device. + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + raise AttributeError("missing required field 'team_member_id'") + + @team_member_id.setter + def team_member_id(self, val): + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + @property + def keep_app_folder(self): + """ + Whether to keep the application dedicated folder (in case the + application uses one). + + :rtype: bool + """ + if self._keep_app_folder_present: + return self._keep_app_folder_value + else: + return True + + @keep_app_folder.setter + def keep_app_folder(self, val): + val = self._keep_app_folder_validator.validate(val) + self._keep_app_folder_value = val + self._keep_app_folder_present = True + + @keep_app_folder.deleter + def keep_app_folder(self): + self._keep_app_folder_value = None + self._keep_app_folder_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RevokeLinkedApiAppArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RevokeLinkedApiAppArg(app_id={!r}, team_member_id={!r}, keep_app_folder={!r})'.format( + self._app_id_value, + self._team_member_id_value, + self._keep_app_folder_value, + ) + +RevokeLinkedApiAppArg_validator = bv.Struct(RevokeLinkedApiAppArg) + +class RevokeLinkedApiAppBatchArg(bb.Struct): + + __slots__ = [ + '_revoke_linked_app_value', + '_revoke_linked_app_present', + ] + + _has_required_fields = True + + def __init__(self, + revoke_linked_app=None): + self._revoke_linked_app_value = None + self._revoke_linked_app_present = False + if revoke_linked_app is not None: + self.revoke_linked_app = revoke_linked_app + + @property + def revoke_linked_app(self): + """ + :rtype: list of [RevokeLinkedApiAppArg] + """ + if self._revoke_linked_app_present: + return self._revoke_linked_app_value + else: + raise AttributeError("missing required field 'revoke_linked_app'") + + @revoke_linked_app.setter + def revoke_linked_app(self, val): + val = self._revoke_linked_app_validator.validate(val) + self._revoke_linked_app_value = val + self._revoke_linked_app_present = True + + @revoke_linked_app.deleter + def revoke_linked_app(self): + self._revoke_linked_app_value = None + self._revoke_linked_app_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RevokeLinkedApiAppBatchArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RevokeLinkedApiAppBatchArg(revoke_linked_app={!r})'.format( + self._revoke_linked_app_value, + ) + +RevokeLinkedApiAppBatchArg_validator = bv.Struct(RevokeLinkedApiAppBatchArg) + +class RevokeLinkedAppBatchError(bb.Union): + """ + Error returned by + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_revoke_linked_app_batch`. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(RevokeLinkedAppBatchError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RevokeLinkedAppBatchError(%r, %r)' % (self._tag, self._value) + +RevokeLinkedAppBatchError_validator = bv.Union(RevokeLinkedAppBatchError) + +class RevokeLinkedAppBatchResult(bb.Struct): + + __slots__ = [ + '_revoke_linked_app_status_value', + '_revoke_linked_app_status_present', + ] + + _has_required_fields = True + + def __init__(self, + revoke_linked_app_status=None): + self._revoke_linked_app_status_value = None + self._revoke_linked_app_status_present = False + if revoke_linked_app_status is not None: + self.revoke_linked_app_status = revoke_linked_app_status + + @property + def revoke_linked_app_status(self): + """ + :rtype: list of [RevokeLinkedAppStatus] + """ + if self._revoke_linked_app_status_present: + return self._revoke_linked_app_status_value + else: + raise AttributeError("missing required field 'revoke_linked_app_status'") + + @revoke_linked_app_status.setter + def revoke_linked_app_status(self, val): + val = self._revoke_linked_app_status_validator.validate(val) + self._revoke_linked_app_status_value = val + self._revoke_linked_app_status_present = True + + @revoke_linked_app_status.deleter + def revoke_linked_app_status(self): + self._revoke_linked_app_status_value = None + self._revoke_linked_app_status_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RevokeLinkedAppBatchResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RevokeLinkedAppBatchResult(revoke_linked_app_status={!r})'.format( + self._revoke_linked_app_status_value, + ) + +RevokeLinkedAppBatchResult_validator = bv.Struct(RevokeLinkedAppBatchResult) + +class RevokeLinkedAppError(bb.Union): + """ + Error returned by + :meth:`dropbox.dropbox.Dropbox.team_linked_apps_revoke_linked_app`. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar app_not_found: Application not found. + :ivar member_not_found: Member not found. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + app_not_found = None + # Attribute is overwritten below the class definition + member_not_found = None + # Attribute is overwritten below the class definition + other = None + + def is_app_not_found(self): + """ + Check if the union tag is ``app_not_found``. + + :rtype: bool + """ + return self._tag == 'app_not_found' + + def is_member_not_found(self): + """ + Check if the union tag is ``member_not_found``. + + :rtype: bool + """ + return self._tag == 'member_not_found' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(RevokeLinkedAppError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RevokeLinkedAppError(%r, %r)' % (self._tag, self._value) + +RevokeLinkedAppError_validator = bv.Union(RevokeLinkedAppError) + +class RevokeLinkedAppStatus(bb.Struct): + """ + :ivar success: Result of the revoking request. + :ivar error_type: The error cause in case of a failure. + """ + + __slots__ = [ + '_success_value', + '_success_present', + '_error_type_value', + '_error_type_present', + ] + + _has_required_fields = True + + def __init__(self, + success=None, + error_type=None): + self._success_value = None + self._success_present = False + self._error_type_value = None + self._error_type_present = False + if success is not None: + self.success = success + if error_type is not None: + self.error_type = error_type + + @property + def success(self): + """ + Result of the revoking request. + + :rtype: bool + """ + if self._success_present: + return self._success_value + else: + raise AttributeError("missing required field 'success'") + + @success.setter + def success(self, val): + val = self._success_validator.validate(val) + self._success_value = val + self._success_present = True + + @success.deleter + def success(self): + self._success_value = None + self._success_present = False + + @property + def error_type(self): + """ + The error cause in case of a failure. + + :rtype: RevokeLinkedAppError + """ + if self._error_type_present: + return self._error_type_value + else: + return None + + @error_type.setter + def error_type(self, val): + if val is None: + del self.error_type + return + self._error_type_validator.validate_type_only(val) + self._error_type_value = val + self._error_type_present = True + + @error_type.deleter + def error_type(self): + self._error_type_value = None + self._error_type_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RevokeLinkedAppStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RevokeLinkedAppStatus(success={!r}, error_type={!r})'.format( + self._success_value, + self._error_type_value, + ) + +RevokeLinkedAppStatus_validator = bv.Struct(RevokeLinkedAppStatus) + +class SetCustomQuotaArg(bb.Struct): + """ + :ivar users_and_quotas: List of users and their custom quotas. + """ + + __slots__ = [ + '_users_and_quotas_value', + '_users_and_quotas_present', + ] + + _has_required_fields = True + + def __init__(self, + users_and_quotas=None): + self._users_and_quotas_value = None + self._users_and_quotas_present = False + if users_and_quotas is not None: + self.users_and_quotas = users_and_quotas + + @property + def users_and_quotas(self): + """ + List of users and their custom quotas. + + :rtype: list of [UserCustomQuotaArg] + """ + if self._users_and_quotas_present: + return self._users_and_quotas_value + else: + raise AttributeError("missing required field 'users_and_quotas'") + + @users_and_quotas.setter + def users_and_quotas(self, val): + val = self._users_and_quotas_validator.validate(val) + self._users_and_quotas_value = val + self._users_and_quotas_present = True + + @users_and_quotas.deleter + def users_and_quotas(self): + self._users_and_quotas_value = None + self._users_and_quotas_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SetCustomQuotaArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SetCustomQuotaArg(users_and_quotas={!r})'.format( + self._users_and_quotas_value, + ) + +SetCustomQuotaArg_validator = bv.Struct(SetCustomQuotaArg) + +class SetCustomQuotaError(CustomQuotaError): + """ + Error returned when setting member custom quota. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar some_users_are_excluded: Some of the users are on the excluded users + list and can't have custom quota set. + """ + + # Attribute is overwritten below the class definition + some_users_are_excluded = None + + def is_some_users_are_excluded(self): + """ + Check if the union tag is ``some_users_are_excluded``. + + :rtype: bool + """ + return self._tag == 'some_users_are_excluded' + + def _process_custom_annotations(self, annotation_type, processor): + super(SetCustomQuotaError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SetCustomQuotaError(%r, %r)' % (self._tag, self._value) + +SetCustomQuotaError_validator = bv.Union(SetCustomQuotaError) + +class StorageBucket(bb.Struct): + """ + Describes the number of users in a specific storage bucket. + + :ivar bucket: The name of the storage bucket. For example, '1G' is a bucket + of users with storage size up to 1 Giga. + :ivar users: The number of people whose storage is in the range of this + storage bucket. + """ + + __slots__ = [ + '_bucket_value', + '_bucket_present', + '_users_value', + '_users_present', + ] + + _has_required_fields = True + + def __init__(self, + bucket=None, + users=None): + self._bucket_value = None + self._bucket_present = False + self._users_value = None + self._users_present = False + if bucket is not None: + self.bucket = bucket + if users is not None: + self.users = users + + @property + def bucket(self): + """ + The name of the storage bucket. For example, '1G' is a bucket of users + with storage size up to 1 Giga. + + :rtype: str + """ + if self._bucket_present: + return self._bucket_value + else: + raise AttributeError("missing required field 'bucket'") + + @bucket.setter + def bucket(self, val): + val = self._bucket_validator.validate(val) + self._bucket_value = val + self._bucket_present = True + + @bucket.deleter + def bucket(self): + self._bucket_value = None + self._bucket_present = False + + @property + def users(self): + """ + The number of people whose storage is in the range of this storage + bucket. + + :rtype: int + """ + if self._users_present: + return self._users_value + else: + raise AttributeError("missing required field 'users'") + + @users.setter + def users(self, val): + val = self._users_validator.validate(val) + self._users_value = val + self._users_present = True + + @users.deleter + def users(self): + self._users_value = None + self._users_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(StorageBucket, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'StorageBucket(bucket={!r}, users={!r})'.format( + self._bucket_value, + self._users_value, + ) + +StorageBucket_validator = bv.Struct(StorageBucket) + +class TeamFolderAccessError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_team_folder_id: The team folder ID is invalid. + :ivar no_access: The authenticated app does not have permission to manage + that team folder. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_team_folder_id = None + # Attribute is overwritten below the class definition + no_access = None + # Attribute is overwritten below the class definition + other = None + + def is_invalid_team_folder_id(self): + """ + Check if the union tag is ``invalid_team_folder_id``. + + :rtype: bool + """ + return self._tag == 'invalid_team_folder_id' + + def is_no_access(self): + """ + Check if the union tag is ``no_access``. + + :rtype: bool + """ + return self._tag == 'no_access' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderAccessError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderAccessError(%r, %r)' % (self._tag, self._value) + +TeamFolderAccessError_validator = bv.Union(TeamFolderAccessError) + +class TeamFolderActivateError(BaseTeamFolderError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderActivateError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderActivateError(%r, %r)' % (self._tag, self._value) + +TeamFolderActivateError_validator = bv.Union(TeamFolderActivateError) + +class TeamFolderIdArg(bb.Struct): + """ + :ivar team_folder_id: The ID of the team folder. + """ + + __slots__ = [ + '_team_folder_id_value', + '_team_folder_id_present', + ] + + _has_required_fields = True + + def __init__(self, + team_folder_id=None): + self._team_folder_id_value = None + self._team_folder_id_present = False + if team_folder_id is not None: + self.team_folder_id = team_folder_id + + @property + def team_folder_id(self): + """ + The ID of the team folder. + + :rtype: str + """ + if self._team_folder_id_present: + return self._team_folder_id_value + else: + raise AttributeError("missing required field 'team_folder_id'") + + @team_folder_id.setter + def team_folder_id(self, val): + val = self._team_folder_id_validator.validate(val) + self._team_folder_id_value = val + self._team_folder_id_present = True + + @team_folder_id.deleter + def team_folder_id(self): + self._team_folder_id_value = None + self._team_folder_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderIdArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderIdArg(team_folder_id={!r})'.format( + self._team_folder_id_value, + ) + +TeamFolderIdArg_validator = bv.Struct(TeamFolderIdArg) + +class TeamFolderArchiveArg(TeamFolderIdArg): + """ + :ivar force_async_off: Whether to force the archive to happen synchronously. + """ + + __slots__ = [ + '_force_async_off_value', + '_force_async_off_present', + ] + + _has_required_fields = True + + def __init__(self, + team_folder_id=None, + force_async_off=None): + super(TeamFolderArchiveArg, self).__init__(team_folder_id) + self._force_async_off_value = None + self._force_async_off_present = False + if force_async_off is not None: + self.force_async_off = force_async_off + + @property + def force_async_off(self): + """ + Whether to force the archive to happen synchronously. + + :rtype: bool + """ + if self._force_async_off_present: + return self._force_async_off_value + else: + return False + + @force_async_off.setter + def force_async_off(self, val): + val = self._force_async_off_validator.validate(val) + self._force_async_off_value = val + self._force_async_off_present = True + + @force_async_off.deleter + def force_async_off(self): + self._force_async_off_value = None + self._force_async_off_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderArchiveArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderArchiveArg(team_folder_id={!r}, force_async_off={!r})'.format( + self._team_folder_id_value, + self._force_async_off_value, + ) + +TeamFolderArchiveArg_validator = bv.Struct(TeamFolderArchiveArg) + +class TeamFolderArchiveError(BaseTeamFolderError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderArchiveError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderArchiveError(%r, %r)' % (self._tag, self._value) + +TeamFolderArchiveError_validator = bv.Union(TeamFolderArchiveError) + +class TeamFolderArchiveJobStatus(async_.PollResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar TeamFolderMetadata complete: The archive job has finished. The value + is the metadata for the resulting team folder. + :ivar TeamFolderArchiveError failed: Error occurred while performing an + asynchronous job from + :meth:`dropbox.dropbox.Dropbox.team_team_folder_archive`. + """ + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param TeamFolderMetadata val: + :rtype: TeamFolderArchiveJobStatus + """ + return cls('complete', val) + + @classmethod + def failed(cls, val): + """ + Create an instance of this class set to the ``failed`` tag with value + ``val``. + + :param TeamFolderArchiveError val: + :rtype: TeamFolderArchiveJobStatus + """ + return cls('failed', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def is_failed(self): + """ + Check if the union tag is ``failed``. + + :rtype: bool + """ + return self._tag == 'failed' + + def get_complete(self): + """ + The archive job has finished. The value is the metadata for the + resulting team folder. + + Only call this if :meth:`is_complete` is true. + + :rtype: TeamFolderMetadata + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def get_failed(self): + """ + Error occurred while performing an asynchronous job from + :meth:`dropbox.dropbox.Dropbox.team_team_folder_archive`. + + Only call this if :meth:`is_failed` is true. + + :rtype: TeamFolderArchiveError + """ + if not self.is_failed(): + raise AttributeError("tag 'failed' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderArchiveJobStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderArchiveJobStatus(%r, %r)' % (self._tag, self._value) + +TeamFolderArchiveJobStatus_validator = bv.Union(TeamFolderArchiveJobStatus) + +class TeamFolderArchiveLaunch(async_.LaunchResultBase): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + @classmethod + def complete(cls, val): + """ + Create an instance of this class set to the ``complete`` tag with value + ``val``. + + :param TeamFolderMetadata val: + :rtype: TeamFolderArchiveLaunch + """ + return cls('complete', val) + + def is_complete(self): + """ + Check if the union tag is ``complete``. + + :rtype: bool + """ + return self._tag == 'complete' + + def get_complete(self): + """ + Only call this if :meth:`is_complete` is true. + + :rtype: TeamFolderMetadata + """ + if not self.is_complete(): + raise AttributeError("tag 'complete' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderArchiveLaunch, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderArchiveLaunch(%r, %r)' % (self._tag, self._value) + +TeamFolderArchiveLaunch_validator = bv.Union(TeamFolderArchiveLaunch) + +class TeamFolderCreateArg(bb.Struct): + """ + :ivar name: Name for the new team folder. + :ivar sync_setting: The sync setting to apply to this team folder. Only + permitted if the team has team selective sync enabled. + """ + + __slots__ = [ + '_name_value', + '_name_present', + '_sync_setting_value', + '_sync_setting_present', + ] + + _has_required_fields = True + + def __init__(self, + name=None, + sync_setting=None): + self._name_value = None + self._name_present = False + self._sync_setting_value = None + self._sync_setting_present = False + if name is not None: + self.name = name + if sync_setting is not None: + self.sync_setting = sync_setting + + @property + def name(self): + """ + Name for the new team folder. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def sync_setting(self): + """ + The sync setting to apply to this team folder. Only permitted if the + team has team selective sync enabled. + + :rtype: files.SyncSettingArg + """ + if self._sync_setting_present: + return self._sync_setting_value + else: + return None + + @sync_setting.setter + def sync_setting(self, val): + if val is None: + del self.sync_setting + return + self._sync_setting_validator.validate_type_only(val) + self._sync_setting_value = val + self._sync_setting_present = True + + @sync_setting.deleter + def sync_setting(self): + self._sync_setting_value = None + self._sync_setting_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderCreateArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderCreateArg(name={!r}, sync_setting={!r})'.format( + self._name_value, + self._sync_setting_value, + ) + +TeamFolderCreateArg_validator = bv.Struct(TeamFolderCreateArg) + +class TeamFolderCreateError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_folder_name: The provided name cannot be used. + :ivar folder_name_already_used: There is already a team folder with the + provided name. + :ivar folder_name_reserved: The provided name cannot be used because it is + reserved. + :ivar SyncSettingsError sync_settings_error: An error occurred setting the + sync settings. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_folder_name = None + # Attribute is overwritten below the class definition + folder_name_already_used = None + # Attribute is overwritten below the class definition + folder_name_reserved = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def sync_settings_error(cls, val): + """ + Create an instance of this class set to the ``sync_settings_error`` tag + with value ``val``. + + :param files.SyncSettingsError val: + :rtype: TeamFolderCreateError + """ + return cls('sync_settings_error', val) + + def is_invalid_folder_name(self): + """ + Check if the union tag is ``invalid_folder_name``. + + :rtype: bool + """ + return self._tag == 'invalid_folder_name' + + def is_folder_name_already_used(self): + """ + Check if the union tag is ``folder_name_already_used``. + + :rtype: bool + """ + return self._tag == 'folder_name_already_used' + + def is_folder_name_reserved(self): + """ + Check if the union tag is ``folder_name_reserved``. + + :rtype: bool + """ + return self._tag == 'folder_name_reserved' + + def is_sync_settings_error(self): + """ + Check if the union tag is ``sync_settings_error``. + + :rtype: bool + """ + return self._tag == 'sync_settings_error' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_sync_settings_error(self): + """ + An error occurred setting the sync settings. + + Only call this if :meth:`is_sync_settings_error` is true. + + :rtype: files.SyncSettingsError + """ + if not self.is_sync_settings_error(): + raise AttributeError("tag 'sync_settings_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderCreateError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderCreateError(%r, %r)' % (self._tag, self._value) + +TeamFolderCreateError_validator = bv.Union(TeamFolderCreateError) + +class TeamFolderGetInfoItem(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar str id_not_found: An ID that was provided as a parameter to + :route:`team_folder/get_info` did not match any of the team's team + folders. + :ivar TeamFolderMetadata team_folder_metadata: Properties of a team folder. + """ + + _catch_all = None + + @classmethod + def id_not_found(cls, val): + """ + Create an instance of this class set to the ``id_not_found`` tag with + value ``val``. + + :param str val: + :rtype: TeamFolderGetInfoItem + """ + return cls('id_not_found', val) + + @classmethod + def team_folder_metadata(cls, val): + """ + Create an instance of this class set to the ``team_folder_metadata`` tag + with value ``val``. + + :param TeamFolderMetadata val: + :rtype: TeamFolderGetInfoItem + """ + return cls('team_folder_metadata', val) + + def is_id_not_found(self): + """ + Check if the union tag is ``id_not_found``. + + :rtype: bool + """ + return self._tag == 'id_not_found' + + def is_team_folder_metadata(self): + """ + Check if the union tag is ``team_folder_metadata``. + + :rtype: bool + """ + return self._tag == 'team_folder_metadata' + + def get_id_not_found(self): + """ + An ID that was provided as a parameter to + :meth:`dropbox.dropbox.Dropbox.team_team_folder_get_info` did not match + any of the team's team folders. + + Only call this if :meth:`is_id_not_found` is true. + + :rtype: str + """ + if not self.is_id_not_found(): + raise AttributeError("tag 'id_not_found' not set") + return self._value + + def get_team_folder_metadata(self): + """ + Properties of a team folder. + + Only call this if :meth:`is_team_folder_metadata` is true. + + :rtype: TeamFolderMetadata + """ + if not self.is_team_folder_metadata(): + raise AttributeError("tag 'team_folder_metadata' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderGetInfoItem, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderGetInfoItem(%r, %r)' % (self._tag, self._value) + +TeamFolderGetInfoItem_validator = bv.Union(TeamFolderGetInfoItem) + +class TeamFolderIdListArg(bb.Struct): + """ + :ivar team_folder_ids: The list of team folder IDs. + """ + + __slots__ = [ + '_team_folder_ids_value', + '_team_folder_ids_present', + ] + + _has_required_fields = True + + def __init__(self, + team_folder_ids=None): + self._team_folder_ids_value = None + self._team_folder_ids_present = False + if team_folder_ids is not None: + self.team_folder_ids = team_folder_ids + + @property + def team_folder_ids(self): + """ + The list of team folder IDs. + + :rtype: list of [str] + """ + if self._team_folder_ids_present: + return self._team_folder_ids_value + else: + raise AttributeError("missing required field 'team_folder_ids'") + + @team_folder_ids.setter + def team_folder_ids(self, val): + val = self._team_folder_ids_validator.validate(val) + self._team_folder_ids_value = val + self._team_folder_ids_present = True + + @team_folder_ids.deleter + def team_folder_ids(self): + self._team_folder_ids_value = None + self._team_folder_ids_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderIdListArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderIdListArg(team_folder_ids={!r})'.format( + self._team_folder_ids_value, + ) + +TeamFolderIdListArg_validator = bv.Struct(TeamFolderIdListArg) + +class TeamFolderInvalidStatusError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar active: The folder is active and the operation did not succeed. + :ivar archived: The folder is archived and the operation did not succeed. + :ivar archive_in_progress: The folder is being archived and the operation + did not succeed. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + active = None + # Attribute is overwritten below the class definition + archived = None + # Attribute is overwritten below the class definition + archive_in_progress = None + # Attribute is overwritten below the class definition + other = None + + def is_active(self): + """ + Check if the union tag is ``active``. + + :rtype: bool + """ + return self._tag == 'active' + + def is_archived(self): + """ + Check if the union tag is ``archived``. + + :rtype: bool + """ + return self._tag == 'archived' + + def is_archive_in_progress(self): + """ + Check if the union tag is ``archive_in_progress``. + + :rtype: bool + """ + return self._tag == 'archive_in_progress' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderInvalidStatusError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderInvalidStatusError(%r, %r)' % (self._tag, self._value) + +TeamFolderInvalidStatusError_validator = bv.Union(TeamFolderInvalidStatusError) + +class TeamFolderListArg(bb.Struct): + """ + :ivar limit: The maximum number of results to return per request. + """ + + __slots__ = [ + '_limit_value', + '_limit_present', + ] + + _has_required_fields = False + + def __init__(self, + limit=None): + self._limit_value = None + self._limit_present = False + if limit is not None: + self.limit = limit + + @property + def limit(self): + """ + The maximum number of results to return per request. + + :rtype: int + """ + if self._limit_present: + return self._limit_value + else: + return 1000 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderListArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderListArg(limit={!r})'.format( + self._limit_value, + ) + +TeamFolderListArg_validator = bv.Struct(TeamFolderListArg) + +class TeamFolderListContinueArg(bb.Struct): + """ + :ivar cursor: Indicates from what point to get the next set of team folders. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + Indicates from what point to get the next set of team folders. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderListContinueArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderListContinueArg(cursor={!r})'.format( + self._cursor_value, + ) + +TeamFolderListContinueArg_validator = bv.Struct(TeamFolderListContinueArg) + +class TeamFolderListContinueError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_cursor: The cursor is invalid. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_cursor = None + # Attribute is overwritten below the class definition + other = None + + def is_invalid_cursor(self): + """ + Check if the union tag is ``invalid_cursor``. + + :rtype: bool + """ + return self._tag == 'invalid_cursor' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderListContinueError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderListContinueError(%r, %r)' % (self._tag, self._value) + +TeamFolderListContinueError_validator = bv.Union(TeamFolderListContinueError) + +class TeamFolderListError(bb.Struct): + + __slots__ = [ + '_access_error_value', + '_access_error_present', + ] + + _has_required_fields = True + + def __init__(self, + access_error=None): + self._access_error_value = None + self._access_error_present = False + if access_error is not None: + self.access_error = access_error + + @property + def access_error(self): + """ + :rtype: TeamFolderAccessError + """ + if self._access_error_present: + return self._access_error_value + else: + raise AttributeError("missing required field 'access_error'") + + @access_error.setter + def access_error(self, val): + self._access_error_validator.validate_type_only(val) + self._access_error_value = val + self._access_error_present = True + + @access_error.deleter + def access_error(self): + self._access_error_value = None + self._access_error_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderListError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderListError(access_error={!r})'.format( + self._access_error_value, + ) + +TeamFolderListError_validator = bv.Struct(TeamFolderListError) + +class TeamFolderListResult(bb.Struct): + """ + Result for :meth:`dropbox.dropbox.Dropbox.team_team_folder_list` and + :meth:`dropbox.dropbox.Dropbox.team_team_folder_list_continue`. + + :ivar team_folders: List of all team folders in the authenticated team. + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_team_folder_list_continue` to obtain + additional team folders. + :ivar has_more: Is true if there are additional team folders that have not + been returned yet. An additional call to + :meth:`dropbox.dropbox.Dropbox.team_team_folder_list_continue` can + retrieve them. + """ + + __slots__ = [ + '_team_folders_value', + '_team_folders_present', + '_cursor_value', + '_cursor_present', + '_has_more_value', + '_has_more_present', + ] + + _has_required_fields = True + + def __init__(self, + team_folders=None, + cursor=None, + has_more=None): + self._team_folders_value = None + self._team_folders_present = False + self._cursor_value = None + self._cursor_present = False + self._has_more_value = None + self._has_more_present = False + if team_folders is not None: + self.team_folders = team_folders + if cursor is not None: + self.cursor = cursor + if has_more is not None: + self.has_more = has_more + + @property + def team_folders(self): + """ + List of all team folders in the authenticated team. + + :rtype: list of [TeamFolderMetadata] + """ + if self._team_folders_present: + return self._team_folders_value + else: + raise AttributeError("missing required field 'team_folders'") + + @team_folders.setter + def team_folders(self, val): + val = self._team_folders_validator.validate(val) + self._team_folders_value = val + self._team_folders_present = True + + @team_folders.deleter + def team_folders(self): + self._team_folders_value = None + self._team_folders_present = False + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_team_folder_list_continue` to obtain + additional team folders. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def has_more(self): + """ + Is true if there are additional team folders that have not been returned + yet. An additional call to + :meth:`dropbox.dropbox.Dropbox.team_team_folder_list_continue` can + retrieve them. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderListResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderListResult(team_folders={!r}, cursor={!r}, has_more={!r})'.format( + self._team_folders_value, + self._cursor_value, + self._has_more_value, + ) + +TeamFolderListResult_validator = bv.Struct(TeamFolderListResult) + +class TeamFolderMetadata(bb.Struct): + """ + Properties of a team folder. + + :ivar team_folder_id: The ID of the team folder. + :ivar name: The name of the team folder. + :ivar status: The status of the team folder. + :ivar is_team_shared_dropbox: True if this team folder is a shared team + root. + :ivar sync_setting: The sync setting applied to this team folder. + :ivar content_sync_settings: Sync settings applied to contents of this team + folder. + """ + + __slots__ = [ + '_team_folder_id_value', + '_team_folder_id_present', + '_name_value', + '_name_present', + '_status_value', + '_status_present', + '_is_team_shared_dropbox_value', + '_is_team_shared_dropbox_present', + '_sync_setting_value', + '_sync_setting_present', + '_content_sync_settings_value', + '_content_sync_settings_present', + ] + + _has_required_fields = True + + def __init__(self, + team_folder_id=None, + name=None, + status=None, + is_team_shared_dropbox=None, + sync_setting=None, + content_sync_settings=None): + self._team_folder_id_value = None + self._team_folder_id_present = False + self._name_value = None + self._name_present = False + self._status_value = None + self._status_present = False + self._is_team_shared_dropbox_value = None + self._is_team_shared_dropbox_present = False + self._sync_setting_value = None + self._sync_setting_present = False + self._content_sync_settings_value = None + self._content_sync_settings_present = False + if team_folder_id is not None: + self.team_folder_id = team_folder_id + if name is not None: + self.name = name + if status is not None: + self.status = status + if is_team_shared_dropbox is not None: + self.is_team_shared_dropbox = is_team_shared_dropbox + if sync_setting is not None: + self.sync_setting = sync_setting + if content_sync_settings is not None: + self.content_sync_settings = content_sync_settings + + @property + def team_folder_id(self): + """ + The ID of the team folder. + + :rtype: str + """ + if self._team_folder_id_present: + return self._team_folder_id_value + else: + raise AttributeError("missing required field 'team_folder_id'") + + @team_folder_id.setter + def team_folder_id(self, val): + val = self._team_folder_id_validator.validate(val) + self._team_folder_id_value = val + self._team_folder_id_present = True + + @team_folder_id.deleter + def team_folder_id(self): + self._team_folder_id_value = None + self._team_folder_id_present = False + + @property + def name(self): + """ + The name of the team folder. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def status(self): + """ + The status of the team folder. + + :rtype: TeamFolderStatus + """ + if self._status_present: + return self._status_value + else: + raise AttributeError("missing required field 'status'") + + @status.setter + def status(self, val): + self._status_validator.validate_type_only(val) + self._status_value = val + self._status_present = True + + @status.deleter + def status(self): + self._status_value = None + self._status_present = False + + @property + def is_team_shared_dropbox(self): + """ + True if this team folder is a shared team root. + + :rtype: bool + """ + if self._is_team_shared_dropbox_present: + return self._is_team_shared_dropbox_value + else: + raise AttributeError("missing required field 'is_team_shared_dropbox'") + + @is_team_shared_dropbox.setter + def is_team_shared_dropbox(self, val): + val = self._is_team_shared_dropbox_validator.validate(val) + self._is_team_shared_dropbox_value = val + self._is_team_shared_dropbox_present = True + + @is_team_shared_dropbox.deleter + def is_team_shared_dropbox(self): + self._is_team_shared_dropbox_value = None + self._is_team_shared_dropbox_present = False + + @property + def sync_setting(self): + """ + The sync setting applied to this team folder. + + :rtype: files.SyncSetting + """ + if self._sync_setting_present: + return self._sync_setting_value + else: + raise AttributeError("missing required field 'sync_setting'") + + @sync_setting.setter + def sync_setting(self, val): + self._sync_setting_validator.validate_type_only(val) + self._sync_setting_value = val + self._sync_setting_present = True + + @sync_setting.deleter + def sync_setting(self): + self._sync_setting_value = None + self._sync_setting_present = False + + @property + def content_sync_settings(self): + """ + Sync settings applied to contents of this team folder. + + :rtype: list of [files.ContentSyncSetting] + """ + if self._content_sync_settings_present: + return self._content_sync_settings_value + else: + raise AttributeError("missing required field 'content_sync_settings'") + + @content_sync_settings.setter + def content_sync_settings(self, val): + val = self._content_sync_settings_validator.validate(val) + self._content_sync_settings_value = val + self._content_sync_settings_present = True + + @content_sync_settings.deleter + def content_sync_settings(self): + self._content_sync_settings_value = None + self._content_sync_settings_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderMetadata, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderMetadata(team_folder_id={!r}, name={!r}, status={!r}, is_team_shared_dropbox={!r}, sync_setting={!r}, content_sync_settings={!r})'.format( + self._team_folder_id_value, + self._name_value, + self._status_value, + self._is_team_shared_dropbox_value, + self._sync_setting_value, + self._content_sync_settings_value, + ) + +TeamFolderMetadata_validator = bv.Struct(TeamFolderMetadata) + +class TeamFolderPermanentlyDeleteError(BaseTeamFolderError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderPermanentlyDeleteError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderPermanentlyDeleteError(%r, %r)' % (self._tag, self._value) + +TeamFolderPermanentlyDeleteError_validator = bv.Union(TeamFolderPermanentlyDeleteError) + +class TeamFolderRenameArg(TeamFolderIdArg): + """ + :ivar name: New team folder name. + """ + + __slots__ = [ + '_name_value', + '_name_present', + ] + + _has_required_fields = True + + def __init__(self, + team_folder_id=None, + name=None): + super(TeamFolderRenameArg, self).__init__(team_folder_id) + self._name_value = None + self._name_present = False + if name is not None: + self.name = name + + @property + def name(self): + """ + New team folder name. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderRenameArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderRenameArg(team_folder_id={!r}, name={!r})'.format( + self._team_folder_id_value, + self._name_value, + ) + +TeamFolderRenameArg_validator = bv.Struct(TeamFolderRenameArg) + +class TeamFolderRenameError(BaseTeamFolderError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_folder_name: The provided folder name cannot be used. + :ivar folder_name_already_used: There is already a team folder with the same + name. + :ivar folder_name_reserved: The provided name cannot be used because it is + reserved. + """ + + # Attribute is overwritten below the class definition + invalid_folder_name = None + # Attribute is overwritten below the class definition + folder_name_already_used = None + # Attribute is overwritten below the class definition + folder_name_reserved = None + + def is_invalid_folder_name(self): + """ + Check if the union tag is ``invalid_folder_name``. + + :rtype: bool + """ + return self._tag == 'invalid_folder_name' + + def is_folder_name_already_used(self): + """ + Check if the union tag is ``folder_name_already_used``. + + :rtype: bool + """ + return self._tag == 'folder_name_already_used' + + def is_folder_name_reserved(self): + """ + Check if the union tag is ``folder_name_reserved``. + + :rtype: bool + """ + return self._tag == 'folder_name_reserved' + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderRenameError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderRenameError(%r, %r)' % (self._tag, self._value) + +TeamFolderRenameError_validator = bv.Union(TeamFolderRenameError) + +class TeamFolderStatus(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar active: The team folder and sub-folders are available to all members. + :ivar archived: The team folder is not accessible outside of the team folder + manager. + :ivar archive_in_progress: The team folder is not accessible outside of the + team folder manager. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + active = None + # Attribute is overwritten below the class definition + archived = None + # Attribute is overwritten below the class definition + archive_in_progress = None + # Attribute is overwritten below the class definition + other = None + + def is_active(self): + """ + Check if the union tag is ``active``. + + :rtype: bool + """ + return self._tag == 'active' + + def is_archived(self): + """ + Check if the union tag is ``archived``. + + :rtype: bool + """ + return self._tag == 'archived' + + def is_archive_in_progress(self): + """ + Check if the union tag is ``archive_in_progress``. + + :rtype: bool + """ + return self._tag == 'archive_in_progress' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderStatus(%r, %r)' % (self._tag, self._value) + +TeamFolderStatus_validator = bv.Union(TeamFolderStatus) + +class TeamFolderTeamSharedDropboxError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar disallowed: This action is not allowed for a shared team root. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disallowed = None + # Attribute is overwritten below the class definition + other = None + + def is_disallowed(self): + """ + Check if the union tag is ``disallowed``. + + :rtype: bool + """ + return self._tag == 'disallowed' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderTeamSharedDropboxError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderTeamSharedDropboxError(%r, %r)' % (self._tag, self._value) + +TeamFolderTeamSharedDropboxError_validator = bv.Union(TeamFolderTeamSharedDropboxError) + +class TeamFolderUpdateSyncSettingsArg(TeamFolderIdArg): + """ + :ivar sync_setting: Sync setting to apply to the team folder itself. Only + meaningful if the team folder is not a shared team root. + :ivar content_sync_settings: Sync settings to apply to contents of this team + folder. + """ + + __slots__ = [ + '_sync_setting_value', + '_sync_setting_present', + '_content_sync_settings_value', + '_content_sync_settings_present', + ] + + _has_required_fields = True + + def __init__(self, + team_folder_id=None, + sync_setting=None, + content_sync_settings=None): + super(TeamFolderUpdateSyncSettingsArg, self).__init__(team_folder_id) + self._sync_setting_value = None + self._sync_setting_present = False + self._content_sync_settings_value = None + self._content_sync_settings_present = False + if sync_setting is not None: + self.sync_setting = sync_setting + if content_sync_settings is not None: + self.content_sync_settings = content_sync_settings + + @property + def sync_setting(self): + """ + Sync setting to apply to the team folder itself. Only meaningful if the + team folder is not a shared team root. + + :rtype: files.SyncSettingArg + """ + if self._sync_setting_present: + return self._sync_setting_value + else: + return None + + @sync_setting.setter + def sync_setting(self, val): + if val is None: + del self.sync_setting + return + self._sync_setting_validator.validate_type_only(val) + self._sync_setting_value = val + self._sync_setting_present = True + + @sync_setting.deleter + def sync_setting(self): + self._sync_setting_value = None + self._sync_setting_present = False + + @property + def content_sync_settings(self): + """ + Sync settings to apply to contents of this team folder. + + :rtype: list of [files.ContentSyncSettingArg] + """ + if self._content_sync_settings_present: + return self._content_sync_settings_value + else: + return None + + @content_sync_settings.setter + def content_sync_settings(self, val): + if val is None: + del self.content_sync_settings + return + val = self._content_sync_settings_validator.validate(val) + self._content_sync_settings_value = val + self._content_sync_settings_present = True + + @content_sync_settings.deleter + def content_sync_settings(self): + self._content_sync_settings_value = None + self._content_sync_settings_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderUpdateSyncSettingsArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderUpdateSyncSettingsArg(team_folder_id={!r}, sync_setting={!r}, content_sync_settings={!r})'.format( + self._team_folder_id_value, + self._sync_setting_value, + self._content_sync_settings_value, + ) + +TeamFolderUpdateSyncSettingsArg_validator = bv.Struct(TeamFolderUpdateSyncSettingsArg) + +class TeamFolderUpdateSyncSettingsError(BaseTeamFolderError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar SyncSettingsError sync_settings_error: An error occurred setting the + sync settings. + """ + + @classmethod + def sync_settings_error(cls, val): + """ + Create an instance of this class set to the ``sync_settings_error`` tag + with value ``val``. + + :param files.SyncSettingsError val: + :rtype: TeamFolderUpdateSyncSettingsError + """ + return cls('sync_settings_error', val) + + def is_sync_settings_error(self): + """ + Check if the union tag is ``sync_settings_error``. + + :rtype: bool + """ + return self._tag == 'sync_settings_error' + + def get_sync_settings_error(self): + """ + An error occurred setting the sync settings. + + Only call this if :meth:`is_sync_settings_error` is true. + + :rtype: files.SyncSettingsError + """ + if not self.is_sync_settings_error(): + raise AttributeError("tag 'sync_settings_error' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderUpdateSyncSettingsError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderUpdateSyncSettingsError(%r, %r)' % (self._tag, self._value) + +TeamFolderUpdateSyncSettingsError_validator = bv.Union(TeamFolderUpdateSyncSettingsError) + +class TeamGetInfoResult(bb.Struct): + """ + :ivar name: The name of the team. + :ivar team_id: The ID of the team. + :ivar num_licensed_users: The number of licenses available to the team. + :ivar num_provisioned_users: The number of accounts that have been invited + or are already active members of the team. + """ + + __slots__ = [ + '_name_value', + '_name_present', + '_team_id_value', + '_team_id_present', + '_num_licensed_users_value', + '_num_licensed_users_present', + '_num_provisioned_users_value', + '_num_provisioned_users_present', + '_policies_value', + '_policies_present', + ] + + _has_required_fields = True + + def __init__(self, + name=None, + team_id=None, + num_licensed_users=None, + num_provisioned_users=None, + policies=None): + self._name_value = None + self._name_present = False + self._team_id_value = None + self._team_id_present = False + self._num_licensed_users_value = None + self._num_licensed_users_present = False + self._num_provisioned_users_value = None + self._num_provisioned_users_present = False + self._policies_value = None + self._policies_present = False + if name is not None: + self.name = name + if team_id is not None: + self.team_id = team_id + if num_licensed_users is not None: + self.num_licensed_users = num_licensed_users + if num_provisioned_users is not None: + self.num_provisioned_users = num_provisioned_users + if policies is not None: + self.policies = policies + + @property + def name(self): + """ + The name of the team. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def team_id(self): + """ + The ID of the team. + + :rtype: str + """ + if self._team_id_present: + return self._team_id_value + else: + raise AttributeError("missing required field 'team_id'") + + @team_id.setter + def team_id(self, val): + val = self._team_id_validator.validate(val) + self._team_id_value = val + self._team_id_present = True + + @team_id.deleter + def team_id(self): + self._team_id_value = None + self._team_id_present = False + + @property + def num_licensed_users(self): + """ + The number of licenses available to the team. + + :rtype: int + """ + if self._num_licensed_users_present: + return self._num_licensed_users_value + else: + raise AttributeError("missing required field 'num_licensed_users'") + + @num_licensed_users.setter + def num_licensed_users(self, val): + val = self._num_licensed_users_validator.validate(val) + self._num_licensed_users_value = val + self._num_licensed_users_present = True + + @num_licensed_users.deleter + def num_licensed_users(self): + self._num_licensed_users_value = None + self._num_licensed_users_present = False + + @property + def num_provisioned_users(self): + """ + The number of accounts that have been invited or are already active + members of the team. + + :rtype: int + """ + if self._num_provisioned_users_present: + return self._num_provisioned_users_value + else: + raise AttributeError("missing required field 'num_provisioned_users'") + + @num_provisioned_users.setter + def num_provisioned_users(self, val): + val = self._num_provisioned_users_validator.validate(val) + self._num_provisioned_users_value = val + self._num_provisioned_users_present = True + + @num_provisioned_users.deleter + def num_provisioned_users(self): + self._num_provisioned_users_value = None + self._num_provisioned_users_present = False + + @property + def policies(self): + """ + :rtype: team_policies.TeamMemberPolicies + """ + if self._policies_present: + return self._policies_value + else: + raise AttributeError("missing required field 'policies'") + + @policies.setter + def policies(self, val): + self._policies_validator.validate_type_only(val) + self._policies_value = val + self._policies_present = True + + @policies.deleter + def policies(self): + self._policies_value = None + self._policies_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamGetInfoResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamGetInfoResult(name={!r}, team_id={!r}, num_licensed_users={!r}, num_provisioned_users={!r}, policies={!r})'.format( + self._name_value, + self._team_id_value, + self._num_licensed_users_value, + self._num_provisioned_users_value, + self._policies_value, + ) + +TeamGetInfoResult_validator = bv.Struct(TeamGetInfoResult) + +class TeamMemberInfo(bb.Struct): + """ + Information about a team member. + + :ivar profile: Profile of a user as a member of a team. + :ivar role: The user's role in the team. + """ + + __slots__ = [ + '_profile_value', + '_profile_present', + '_role_value', + '_role_present', + ] + + _has_required_fields = True + + def __init__(self, + profile=None, + role=None): + self._profile_value = None + self._profile_present = False + self._role_value = None + self._role_present = False + if profile is not None: + self.profile = profile + if role is not None: + self.role = role + + @property + def profile(self): + """ + Profile of a user as a member of a team. + + :rtype: TeamMemberProfile + """ + if self._profile_present: + return self._profile_value + else: + raise AttributeError("missing required field 'profile'") + + @profile.setter + def profile(self, val): + self._profile_validator.validate_type_only(val) + self._profile_value = val + self._profile_present = True + + @profile.deleter + def profile(self): + self._profile_value = None + self._profile_present = False + + @property + def role(self): + """ + The user's role in the team. + + :rtype: AdminTier + """ + if self._role_present: + return self._role_value + else: + raise AttributeError("missing required field 'role'") + + @role.setter + def role(self, val): + self._role_validator.validate_type_only(val) + self._role_value = val + self._role_present = True + + @role.deleter + def role(self): + self._role_value = None + self._role_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamMemberInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamMemberInfo(profile={!r}, role={!r})'.format( + self._profile_value, + self._role_value, + ) + +TeamMemberInfo_validator = bv.Struct(TeamMemberInfo) + +class TeamMemberProfile(MemberProfile): + """ + Profile of a user as a member of a team. + + :ivar groups: List of group IDs of groups that the user belongs to. + :ivar member_folder_id: The namespace id of the user's root folder. + """ + + __slots__ = [ + '_groups_value', + '_groups_present', + '_member_folder_id_value', + '_member_folder_id_present', + ] + + _has_required_fields = True + + def __init__(self, + team_member_id=None, + email=None, + email_verified=None, + status=None, + name=None, + membership_type=None, + groups=None, + member_folder_id=None, + external_id=None, + account_id=None, + joined_on=None, + persistent_id=None, + is_directory_restricted=None): + super(TeamMemberProfile, self).__init__(team_member_id, + email, + email_verified, + status, + name, + membership_type, + external_id, + account_id, + joined_on, + persistent_id, + is_directory_restricted) + self._groups_value = None + self._groups_present = False + self._member_folder_id_value = None + self._member_folder_id_present = False + if groups is not None: + self.groups = groups + if member_folder_id is not None: + self.member_folder_id = member_folder_id + + @property + def groups(self): + """ + List of group IDs of groups that the user belongs to. + + :rtype: list of [str] + """ + if self._groups_present: + return self._groups_value + else: + raise AttributeError("missing required field 'groups'") + + @groups.setter + def groups(self, val): + val = self._groups_validator.validate(val) + self._groups_value = val + self._groups_present = True + + @groups.deleter + def groups(self): + self._groups_value = None + self._groups_present = False + + @property + def member_folder_id(self): + """ + The namespace id of the user's root folder. + + :rtype: str + """ + if self._member_folder_id_present: + return self._member_folder_id_value + else: + raise AttributeError("missing required field 'member_folder_id'") + + @member_folder_id.setter + def member_folder_id(self, val): + val = self._member_folder_id_validator.validate(val) + self._member_folder_id_value = val + self._member_folder_id_present = True + + @member_folder_id.deleter + def member_folder_id(self): + self._member_folder_id_value = None + self._member_folder_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamMemberProfile, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamMemberProfile(team_member_id={!r}, email={!r}, email_verified={!r}, status={!r}, name={!r}, membership_type={!r}, groups={!r}, member_folder_id={!r}, external_id={!r}, account_id={!r}, joined_on={!r}, persistent_id={!r}, is_directory_restricted={!r})'.format( + self._team_member_id_value, + self._email_value, + self._email_verified_value, + self._status_value, + self._name_value, + self._membership_type_value, + self._groups_value, + self._member_folder_id_value, + self._external_id_value, + self._account_id_value, + self._joined_on_value, + self._persistent_id_value, + self._is_directory_restricted_value, + ) + +TeamMemberProfile_validator = bv.Struct(TeamMemberProfile) + +class TeamMemberStatus(bb.Union): + """ + The user's status as a member of a specific team. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar active: User has successfully joined the team. + :ivar invited: User has been invited to a team, but has not joined the team + yet. + :ivar suspended: User is no longer a member of the team, but the account can + be un-suspended, re-establishing the user as a team member. + :ivar RemovedStatus removed: User is no longer a member of the team. Removed + users are only listed when include_removed is true in members/list. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + active = None + # Attribute is overwritten below the class definition + invited = None + # Attribute is overwritten below the class definition + suspended = None + + @classmethod + def removed(cls, val): + """ + Create an instance of this class set to the ``removed`` tag with value + ``val``. + + :param RemovedStatus val: + :rtype: TeamMemberStatus + """ + return cls('removed', val) + + def is_active(self): + """ + Check if the union tag is ``active``. + + :rtype: bool + """ + return self._tag == 'active' + + def is_invited(self): + """ + Check if the union tag is ``invited``. + + :rtype: bool + """ + return self._tag == 'invited' + + def is_suspended(self): + """ + Check if the union tag is ``suspended``. + + :rtype: bool + """ + return self._tag == 'suspended' + + def is_removed(self): + """ + Check if the union tag is ``removed``. + + :rtype: bool + """ + return self._tag == 'removed' + + def get_removed(self): + """ + User is no longer a member of the team. Removed users are only listed + when include_removed is true in members/list. + + Only call this if :meth:`is_removed` is true. + + :rtype: RemovedStatus + """ + if not self.is_removed(): + raise AttributeError("tag 'removed' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamMemberStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamMemberStatus(%r, %r)' % (self._tag, self._value) + +TeamMemberStatus_validator = bv.Union(TeamMemberStatus) + +class TeamMembershipType(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar full: User uses a license and has full access to team resources like + the shared quota. + :ivar limited: User does not have access to the shared quota and team admins + have restricted administrative control. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + full = None + # Attribute is overwritten below the class definition + limited = None + + def is_full(self): + """ + Check if the union tag is ``full``. + + :rtype: bool + """ + return self._tag == 'full' + + def is_limited(self): + """ + Check if the union tag is ``limited``. + + :rtype: bool + """ + return self._tag == 'limited' + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamMembershipType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamMembershipType(%r, %r)' % (self._tag, self._value) + +TeamMembershipType_validator = bv.Union(TeamMembershipType) + +class TeamNamespacesListArg(bb.Struct): + """ + :ivar limit: Specifying a value here has no effect. + """ + + __slots__ = [ + '_limit_value', + '_limit_present', + ] + + _has_required_fields = False + + def __init__(self, + limit=None): + self._limit_value = None + self._limit_present = False + if limit is not None: + self.limit = limit + + @property + def limit(self): + """ + Specifying a value here has no effect. + + :rtype: int + """ + if self._limit_present: + return self._limit_value + else: + return 1000 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamNamespacesListArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamNamespacesListArg(limit={!r})'.format( + self._limit_value, + ) + +TeamNamespacesListArg_validator = bv.Struct(TeamNamespacesListArg) + +class TeamNamespacesListContinueArg(bb.Struct): + """ + :ivar cursor: Indicates from what point to get the next set of + team-accessible namespaces. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + Indicates from what point to get the next set of team-accessible + namespaces. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamNamespacesListContinueArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamNamespacesListContinueArg(cursor={!r})'.format( + self._cursor_value, + ) + +TeamNamespacesListContinueArg_validator = bv.Struct(TeamNamespacesListContinueArg) + +class TeamNamespacesListError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_arg: Argument passed in is invalid. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + invalid_arg = None + # Attribute is overwritten below the class definition + other = None + + def is_invalid_arg(self): + """ + Check if the union tag is ``invalid_arg``. + + :rtype: bool + """ + return self._tag == 'invalid_arg' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamNamespacesListError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamNamespacesListError(%r, %r)' % (self._tag, self._value) + +TeamNamespacesListError_validator = bv.Union(TeamNamespacesListError) + +class TeamNamespacesListContinueError(TeamNamespacesListError): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar invalid_cursor: The cursor is invalid. + """ + + # Attribute is overwritten below the class definition + invalid_cursor = None + + def is_invalid_cursor(self): + """ + Check if the union tag is ``invalid_cursor``. + + :rtype: bool + """ + return self._tag == 'invalid_cursor' + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamNamespacesListContinueError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamNamespacesListContinueError(%r, %r)' % (self._tag, self._value) + +TeamNamespacesListContinueError_validator = bv.Union(TeamNamespacesListContinueError) + +class TeamNamespacesListResult(bb.Struct): + """ + Result for :meth:`dropbox.dropbox.Dropbox.team_namespaces_list`. + + :ivar namespaces: List of all namespaces the team can access. + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_namespaces_list_continue` to obtain + additional namespaces. Note that duplicate namespaces may be returned. + :ivar has_more: Is true if there are additional namespaces that have not + been returned yet. + """ + + __slots__ = [ + '_namespaces_value', + '_namespaces_present', + '_cursor_value', + '_cursor_present', + '_has_more_value', + '_has_more_present', + ] + + _has_required_fields = True + + def __init__(self, + namespaces=None, + cursor=None, + has_more=None): + self._namespaces_value = None + self._namespaces_present = False + self._cursor_value = None + self._cursor_present = False + self._has_more_value = None + self._has_more_present = False + if namespaces is not None: + self.namespaces = namespaces + if cursor is not None: + self.cursor = cursor + if has_more is not None: + self.has_more = has_more + + @property + def namespaces(self): + """ + List of all namespaces the team can access. + + :rtype: list of [NamespaceMetadata] + """ + if self._namespaces_present: + return self._namespaces_value + else: + raise AttributeError("missing required field 'namespaces'") + + @namespaces.setter + def namespaces(self, val): + val = self._namespaces_validator.validate(val) + self._namespaces_value = val + self._namespaces_present = True + + @namespaces.deleter + def namespaces(self): + self._namespaces_value = None + self._namespaces_present = False + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_namespaces_list_continue` to obtain + additional namespaces. Note that duplicate namespaces may be returned. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def has_more(self): + """ + Is true if there are additional namespaces that have not been returned + yet. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamNamespacesListResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamNamespacesListResult(namespaces={!r}, cursor={!r}, has_more={!r})'.format( + self._namespaces_value, + self._cursor_value, + self._has_more_value, + ) + +TeamNamespacesListResult_validator = bv.Struct(TeamNamespacesListResult) + +class TokenGetAuthenticatedAdminError(bb.Union): + """ + Error returned by + :meth:`dropbox.dropbox.Dropbox.team_token_get_authenticated_admin`. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar mapping_not_found: The current token is not associated with a team + admin, because mappings were not recorded when the token was created. + Consider re-authorizing a new access token to record its authenticating + admin. + :ivar admin_not_active: Either the team admin that authorized this token is + no longer an active member of the team or no longer a team admin. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + mapping_not_found = None + # Attribute is overwritten below the class definition + admin_not_active = None + # Attribute is overwritten below the class definition + other = None + + def is_mapping_not_found(self): + """ + Check if the union tag is ``mapping_not_found``. + + :rtype: bool + """ + return self._tag == 'mapping_not_found' + + def is_admin_not_active(self): + """ + Check if the union tag is ``admin_not_active``. + + :rtype: bool + """ + return self._tag == 'admin_not_active' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(TokenGetAuthenticatedAdminError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TokenGetAuthenticatedAdminError(%r, %r)' % (self._tag, self._value) + +TokenGetAuthenticatedAdminError_validator = bv.Union(TokenGetAuthenticatedAdminError) + +class TokenGetAuthenticatedAdminResult(bb.Struct): + """ + Results for + :meth:`dropbox.dropbox.Dropbox.team_token_get_authenticated_admin`. + + :ivar admin_profile: The admin who authorized the token. + """ + + __slots__ = [ + '_admin_profile_value', + '_admin_profile_present', + ] + + _has_required_fields = True + + def __init__(self, + admin_profile=None): + self._admin_profile_value = None + self._admin_profile_present = False + if admin_profile is not None: + self.admin_profile = admin_profile + + @property + def admin_profile(self): + """ + The admin who authorized the token. + + :rtype: TeamMemberProfile + """ + if self._admin_profile_present: + return self._admin_profile_value + else: + raise AttributeError("missing required field 'admin_profile'") + + @admin_profile.setter + def admin_profile(self, val): + self._admin_profile_validator.validate_type_only(val) + self._admin_profile_value = val + self._admin_profile_present = True + + @admin_profile.deleter + def admin_profile(self): + self._admin_profile_value = None + self._admin_profile_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TokenGetAuthenticatedAdminResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TokenGetAuthenticatedAdminResult(admin_profile={!r})'.format( + self._admin_profile_value, + ) + +TokenGetAuthenticatedAdminResult_validator = bv.Struct(TokenGetAuthenticatedAdminResult) + +class UploadApiRateLimitValue(bb.Union): + """ + The value for ``Feature.upload_api_rate_limit``. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar unlimited: This team has unlimited upload API quota. So far both + server version account and legacy account type have unlimited monthly + upload api quota. + :ivar int limit: The number of upload API calls allowed per month. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + unlimited = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def limit(cls, val): + """ + Create an instance of this class set to the ``limit`` tag with value + ``val``. + + :param int val: + :rtype: UploadApiRateLimitValue + """ + return cls('limit', val) + + def is_unlimited(self): + """ + Check if the union tag is ``unlimited``. + + :rtype: bool + """ + return self._tag == 'unlimited' + + def is_limit(self): + """ + Check if the union tag is ``limit``. + + :rtype: bool + """ + return self._tag == 'limit' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_limit(self): + """ + The number of upload API calls allowed per month. + + Only call this if :meth:`is_limit` is true. + + :rtype: int + """ + if not self.is_limit(): + raise AttributeError("tag 'limit' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(UploadApiRateLimitValue, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UploadApiRateLimitValue(%r, %r)' % (self._tag, self._value) + +UploadApiRateLimitValue_validator = bv.Union(UploadApiRateLimitValue) + +class UserCustomQuotaArg(bb.Struct): + """ + User and their required custom quota in GB (1 TB = 1024 GB). + """ + + __slots__ = [ + '_user_value', + '_user_present', + '_quota_gb_value', + '_quota_gb_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None, + quota_gb=None): + self._user_value = None + self._user_present = False + self._quota_gb_value = None + self._quota_gb_present = False + if user is not None: + self.user = user + if quota_gb is not None: + self.quota_gb = quota_gb + + @property + def user(self): + """ + :rtype: UserSelectorArg + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + @property + def quota_gb(self): + """ + :rtype: int + """ + if self._quota_gb_present: + return self._quota_gb_value + else: + raise AttributeError("missing required field 'quota_gb'") + + @quota_gb.setter + def quota_gb(self, val): + val = self._quota_gb_validator.validate(val) + self._quota_gb_value = val + self._quota_gb_present = True + + @quota_gb.deleter + def quota_gb(self): + self._quota_gb_value = None + self._quota_gb_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UserCustomQuotaArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UserCustomQuotaArg(user={!r}, quota_gb={!r})'.format( + self._user_value, + self._quota_gb_value, + ) + +UserCustomQuotaArg_validator = bv.Struct(UserCustomQuotaArg) + +class UserCustomQuotaResult(bb.Struct): + """ + User and their custom quota in GB (1 TB = 1024 GB). No quota returns if the + user has no custom quota set. + """ + + __slots__ = [ + '_user_value', + '_user_present', + '_quota_gb_value', + '_quota_gb_present', + ] + + _has_required_fields = True + + def __init__(self, + user=None, + quota_gb=None): + self._user_value = None + self._user_present = False + self._quota_gb_value = None + self._quota_gb_present = False + if user is not None: + self.user = user + if quota_gb is not None: + self.quota_gb = quota_gb + + @property + def user(self): + """ + :rtype: UserSelectorArg + """ + if self._user_present: + return self._user_value + else: + raise AttributeError("missing required field 'user'") + + @user.setter + def user(self, val): + self._user_validator.validate_type_only(val) + self._user_value = val + self._user_present = True + + @user.deleter + def user(self): + self._user_value = None + self._user_present = False + + @property + def quota_gb(self): + """ + :rtype: int + """ + if self._quota_gb_present: + return self._quota_gb_value + else: + return None + + @quota_gb.setter + def quota_gb(self, val): + if val is None: + del self.quota_gb + return + val = self._quota_gb_validator.validate(val) + self._quota_gb_value = val + self._quota_gb_present = True + + @quota_gb.deleter + def quota_gb(self): + self._quota_gb_value = None + self._quota_gb_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UserCustomQuotaResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UserCustomQuotaResult(user={!r}, quota_gb={!r})'.format( + self._user_value, + self._quota_gb_value, + ) + +UserCustomQuotaResult_validator = bv.Struct(UserCustomQuotaResult) + +class UserSelectorArg(bb.Union): + """ + Argument for selecting a single user, either by team_member_id, external_id + or email. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = None + + @classmethod + def team_member_id(cls, val): + """ + Create an instance of this class set to the ``team_member_id`` tag with + value ``val``. + + :param str val: + :rtype: UserSelectorArg + """ + return cls('team_member_id', val) + + @classmethod + def external_id(cls, val): + """ + Create an instance of this class set to the ``external_id`` tag with + value ``val``. + + :param str val: + :rtype: UserSelectorArg + """ + return cls('external_id', val) + + @classmethod + def email(cls, val): + """ + Create an instance of this class set to the ``email`` tag with value + ``val``. + + :param str val: + :rtype: UserSelectorArg + """ + return cls('email', val) + + def is_team_member_id(self): + """ + Check if the union tag is ``team_member_id``. + + :rtype: bool + """ + return self._tag == 'team_member_id' + + def is_external_id(self): + """ + Check if the union tag is ``external_id``. + + :rtype: bool + """ + return self._tag == 'external_id' + + def is_email(self): + """ + Check if the union tag is ``email``. + + :rtype: bool + """ + return self._tag == 'email' + + def get_team_member_id(self): + """ + Only call this if :meth:`is_team_member_id` is true. + + :rtype: str + """ + if not self.is_team_member_id(): + raise AttributeError("tag 'team_member_id' not set") + return self._value + + def get_external_id(self): + """ + Only call this if :meth:`is_external_id` is true. + + :rtype: str + """ + if not self.is_external_id(): + raise AttributeError("tag 'external_id' not set") + return self._value + + def get_email(self): + """ + Only call this if :meth:`is_email` is true. + + :rtype: str + """ + if not self.is_email(): + raise AttributeError("tag 'email' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(UserSelectorArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UserSelectorArg(%r, %r)' % (self._tag, self._value) + +UserSelectorArg_validator = bv.Union(UserSelectorArg) + +class UsersSelectorArg(bb.Union): + """ + Argument for selecting a list of users, either by team_member_ids, + external_ids or emails. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar list of [str] team_member_ids: List of member IDs. + :ivar list of [str] external_ids: List of external user IDs. + :ivar list of [str] emails: List of email addresses. + """ + + _catch_all = None + + @classmethod + def team_member_ids(cls, val): + """ + Create an instance of this class set to the ``team_member_ids`` tag with + value ``val``. + + :param list of [str] val: + :rtype: UsersSelectorArg + """ + return cls('team_member_ids', val) + + @classmethod + def external_ids(cls, val): + """ + Create an instance of this class set to the ``external_ids`` tag with + value ``val``. + + :param list of [str] val: + :rtype: UsersSelectorArg + """ + return cls('external_ids', val) + + @classmethod + def emails(cls, val): + """ + Create an instance of this class set to the ``emails`` tag with value + ``val``. + + :param list of [str] val: + :rtype: UsersSelectorArg + """ + return cls('emails', val) + + def is_team_member_ids(self): + """ + Check if the union tag is ``team_member_ids``. + + :rtype: bool + """ + return self._tag == 'team_member_ids' + + def is_external_ids(self): + """ + Check if the union tag is ``external_ids``. + + :rtype: bool + """ + return self._tag == 'external_ids' + + def is_emails(self): + """ + Check if the union tag is ``emails``. + + :rtype: bool + """ + return self._tag == 'emails' + + def get_team_member_ids(self): + """ + List of member IDs. + + Only call this if :meth:`is_team_member_ids` is true. + + :rtype: list of [str] + """ + if not self.is_team_member_ids(): + raise AttributeError("tag 'team_member_ids' not set") + return self._value + + def get_external_ids(self): + """ + List of external user IDs. + + Only call this if :meth:`is_external_ids` is true. + + :rtype: list of [str] + """ + if not self.is_external_ids(): + raise AttributeError("tag 'external_ids' not set") + return self._value + + def get_emails(self): + """ + List of email addresses. + + Only call this if :meth:`is_emails` is true. + + :rtype: list of [str] + """ + if not self.is_emails(): + raise AttributeError("tag 'emails' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(UsersSelectorArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UsersSelectorArg(%r, %r)' % (self._tag, self._value) + +UsersSelectorArg_validator = bv.Union(UsersSelectorArg) + +GroupsGetInfoResult_validator = bv.List(GroupsGetInfoItem_validator) +MembersGetInfoResult_validator = bv.List(MembersGetInfoItem_validator) +NumberPerDay_validator = bv.List(bv.Nullable(bv.UInt64())) +UserQuota_validator = bv.UInt32(min_value=15) +DeviceSession._session_id_validator = bv.String() +DeviceSession._ip_address_validator = bv.Nullable(bv.String()) +DeviceSession._country_validator = bv.Nullable(bv.String()) +DeviceSession._created_validator = bv.Nullable(common.DropboxTimestamp_validator) +DeviceSession._updated_validator = bv.Nullable(common.DropboxTimestamp_validator) +DeviceSession._all_field_names_ = set([ + 'session_id', + 'ip_address', + 'country', + 'created', + 'updated', +]) +DeviceSession._all_fields_ = [ + ('session_id', DeviceSession._session_id_validator), + ('ip_address', DeviceSession._ip_address_validator), + ('country', DeviceSession._country_validator), + ('created', DeviceSession._created_validator), + ('updated', DeviceSession._updated_validator), +] + +ActiveWebSession._user_agent_validator = bv.String() +ActiveWebSession._os_validator = bv.String() +ActiveWebSession._browser_validator = bv.String() +ActiveWebSession._expires_validator = bv.Nullable(common.DropboxTimestamp_validator) +ActiveWebSession._all_field_names_ = DeviceSession._all_field_names_.union(set([ + 'user_agent', + 'os', + 'browser', + 'expires', +])) +ActiveWebSession._all_fields_ = DeviceSession._all_fields_ + [ + ('user_agent', ActiveWebSession._user_agent_validator), + ('os', ActiveWebSession._os_validator), + ('browser', ActiveWebSession._browser_validator), + ('expires', ActiveWebSession._expires_validator), +] + +AdminTier._team_admin_validator = bv.Void() +AdminTier._user_management_admin_validator = bv.Void() +AdminTier._support_admin_validator = bv.Void() +AdminTier._member_only_validator = bv.Void() +AdminTier._tagmap = { + 'team_admin': AdminTier._team_admin_validator, + 'user_management_admin': AdminTier._user_management_admin_validator, + 'support_admin': AdminTier._support_admin_validator, + 'member_only': AdminTier._member_only_validator, +} + +AdminTier.team_admin = AdminTier('team_admin') +AdminTier.user_management_admin = AdminTier('user_management_admin') +AdminTier.support_admin = AdminTier('support_admin') +AdminTier.member_only = AdminTier('member_only') + +ApiApp._app_id_validator = bv.String() +ApiApp._app_name_validator = bv.String() +ApiApp._publisher_validator = bv.Nullable(bv.String()) +ApiApp._publisher_url_validator = bv.Nullable(bv.String()) +ApiApp._linked_validator = bv.Nullable(common.DropboxTimestamp_validator) +ApiApp._is_app_folder_validator = bv.Boolean() +ApiApp._all_field_names_ = set([ + 'app_id', + 'app_name', + 'publisher', + 'publisher_url', + 'linked', + 'is_app_folder', +]) +ApiApp._all_fields_ = [ + ('app_id', ApiApp._app_id_validator), + ('app_name', ApiApp._app_name_validator), + ('publisher', ApiApp._publisher_validator), + ('publisher_url', ApiApp._publisher_url_validator), + ('linked', ApiApp._linked_validator), + ('is_app_folder', ApiApp._is_app_folder_validator), +] + +BaseDfbReport._start_date_validator = bv.String() +BaseDfbReport._all_field_names_ = set(['start_date']) +BaseDfbReport._all_fields_ = [('start_date', BaseDfbReport._start_date_validator)] + +BaseTeamFolderError._access_error_validator = TeamFolderAccessError_validator +BaseTeamFolderError._status_error_validator = TeamFolderInvalidStatusError_validator +BaseTeamFolderError._team_shared_dropbox_error_validator = TeamFolderTeamSharedDropboxError_validator +BaseTeamFolderError._other_validator = bv.Void() +BaseTeamFolderError._tagmap = { + 'access_error': BaseTeamFolderError._access_error_validator, + 'status_error': BaseTeamFolderError._status_error_validator, + 'team_shared_dropbox_error': BaseTeamFolderError._team_shared_dropbox_error_validator, + 'other': BaseTeamFolderError._other_validator, +} + +BaseTeamFolderError.other = BaseTeamFolderError('other') + +CustomQuotaError._too_many_users_validator = bv.Void() +CustomQuotaError._other_validator = bv.Void() +CustomQuotaError._tagmap = { + 'too_many_users': CustomQuotaError._too_many_users_validator, + 'other': CustomQuotaError._other_validator, +} + +CustomQuotaError.too_many_users = CustomQuotaError('too_many_users') +CustomQuotaError.other = CustomQuotaError('other') + +CustomQuotaResult._success_validator = UserCustomQuotaResult_validator +CustomQuotaResult._invalid_user_validator = UserSelectorArg_validator +CustomQuotaResult._other_validator = bv.Void() +CustomQuotaResult._tagmap = { + 'success': CustomQuotaResult._success_validator, + 'invalid_user': CustomQuotaResult._invalid_user_validator, + 'other': CustomQuotaResult._other_validator, +} + +CustomQuotaResult.other = CustomQuotaResult('other') + +CustomQuotaUsersArg._users_validator = bv.List(UserSelectorArg_validator) +CustomQuotaUsersArg._all_field_names_ = set(['users']) +CustomQuotaUsersArg._all_fields_ = [('users', CustomQuotaUsersArg._users_validator)] + +DateRange._start_date_validator = bv.Nullable(common.Date_validator) +DateRange._end_date_validator = bv.Nullable(common.Date_validator) +DateRange._all_field_names_ = set([ + 'start_date', + 'end_date', +]) +DateRange._all_fields_ = [ + ('start_date', DateRange._start_date_validator), + ('end_date', DateRange._end_date_validator), +] + +DateRangeError._other_validator = bv.Void() +DateRangeError._tagmap = { + 'other': DateRangeError._other_validator, +} + +DateRangeError.other = DateRangeError('other') + +DesktopClientSession._host_name_validator = bv.String() +DesktopClientSession._client_type_validator = DesktopPlatform_validator +DesktopClientSession._client_version_validator = bv.String() +DesktopClientSession._platform_validator = bv.String() +DesktopClientSession._is_delete_on_unlink_supported_validator = bv.Boolean() +DesktopClientSession._all_field_names_ = DeviceSession._all_field_names_.union(set([ + 'host_name', + 'client_type', + 'client_version', + 'platform', + 'is_delete_on_unlink_supported', +])) +DesktopClientSession._all_fields_ = DeviceSession._all_fields_ + [ + ('host_name', DesktopClientSession._host_name_validator), + ('client_type', DesktopClientSession._client_type_validator), + ('client_version', DesktopClientSession._client_version_validator), + ('platform', DesktopClientSession._platform_validator), + ('is_delete_on_unlink_supported', DesktopClientSession._is_delete_on_unlink_supported_validator), +] + +DesktopPlatform._windows_validator = bv.Void() +DesktopPlatform._mac_validator = bv.Void() +DesktopPlatform._linux_validator = bv.Void() +DesktopPlatform._other_validator = bv.Void() +DesktopPlatform._tagmap = { + 'windows': DesktopPlatform._windows_validator, + 'mac': DesktopPlatform._mac_validator, + 'linux': DesktopPlatform._linux_validator, + 'other': DesktopPlatform._other_validator, +} + +DesktopPlatform.windows = DesktopPlatform('windows') +DesktopPlatform.mac = DesktopPlatform('mac') +DesktopPlatform.linux = DesktopPlatform('linux') +DesktopPlatform.other = DesktopPlatform('other') + +DeviceSessionArg._session_id_validator = bv.String() +DeviceSessionArg._team_member_id_validator = bv.String() +DeviceSessionArg._all_field_names_ = set([ + 'session_id', + 'team_member_id', +]) +DeviceSessionArg._all_fields_ = [ + ('session_id', DeviceSessionArg._session_id_validator), + ('team_member_id', DeviceSessionArg._team_member_id_validator), +] + +DevicesActive._windows_validator = NumberPerDay_validator +DevicesActive._macos_validator = NumberPerDay_validator +DevicesActive._linux_validator = NumberPerDay_validator +DevicesActive._ios_validator = NumberPerDay_validator +DevicesActive._android_validator = NumberPerDay_validator +DevicesActive._other_validator = NumberPerDay_validator +DevicesActive._total_validator = NumberPerDay_validator +DevicesActive._all_field_names_ = set([ + 'windows', + 'macos', + 'linux', + 'ios', + 'android', + 'other', + 'total', +]) +DevicesActive._all_fields_ = [ + ('windows', DevicesActive._windows_validator), + ('macos', DevicesActive._macos_validator), + ('linux', DevicesActive._linux_validator), + ('ios', DevicesActive._ios_validator), + ('android', DevicesActive._android_validator), + ('other', DevicesActive._other_validator), + ('total', DevicesActive._total_validator), +] + +ExcludedUsersListArg._limit_validator = bv.UInt32(min_value=1, max_value=1000) +ExcludedUsersListArg._all_field_names_ = set(['limit']) +ExcludedUsersListArg._all_fields_ = [('limit', ExcludedUsersListArg._limit_validator)] + +ExcludedUsersListContinueArg._cursor_validator = bv.String() +ExcludedUsersListContinueArg._all_field_names_ = set(['cursor']) +ExcludedUsersListContinueArg._all_fields_ = [('cursor', ExcludedUsersListContinueArg._cursor_validator)] + +ExcludedUsersListContinueError._invalid_cursor_validator = bv.Void() +ExcludedUsersListContinueError._other_validator = bv.Void() +ExcludedUsersListContinueError._tagmap = { + 'invalid_cursor': ExcludedUsersListContinueError._invalid_cursor_validator, + 'other': ExcludedUsersListContinueError._other_validator, +} + +ExcludedUsersListContinueError.invalid_cursor = ExcludedUsersListContinueError('invalid_cursor') +ExcludedUsersListContinueError.other = ExcludedUsersListContinueError('other') + +ExcludedUsersListError._list_error_validator = bv.Void() +ExcludedUsersListError._other_validator = bv.Void() +ExcludedUsersListError._tagmap = { + 'list_error': ExcludedUsersListError._list_error_validator, + 'other': ExcludedUsersListError._other_validator, +} + +ExcludedUsersListError.list_error = ExcludedUsersListError('list_error') +ExcludedUsersListError.other = ExcludedUsersListError('other') + +ExcludedUsersListResult._users_validator = bv.List(MemberProfile_validator) +ExcludedUsersListResult._cursor_validator = bv.Nullable(bv.String()) +ExcludedUsersListResult._has_more_validator = bv.Boolean() +ExcludedUsersListResult._all_field_names_ = set([ + 'users', + 'cursor', + 'has_more', +]) +ExcludedUsersListResult._all_fields_ = [ + ('users', ExcludedUsersListResult._users_validator), + ('cursor', ExcludedUsersListResult._cursor_validator), + ('has_more', ExcludedUsersListResult._has_more_validator), +] + +ExcludedUsersUpdateArg._users_validator = bv.Nullable(bv.List(UserSelectorArg_validator)) +ExcludedUsersUpdateArg._all_field_names_ = set(['users']) +ExcludedUsersUpdateArg._all_fields_ = [('users', ExcludedUsersUpdateArg._users_validator)] + +ExcludedUsersUpdateError._users_not_in_team_validator = bv.Void() +ExcludedUsersUpdateError._too_many_users_validator = bv.Void() +ExcludedUsersUpdateError._other_validator = bv.Void() +ExcludedUsersUpdateError._tagmap = { + 'users_not_in_team': ExcludedUsersUpdateError._users_not_in_team_validator, + 'too_many_users': ExcludedUsersUpdateError._too_many_users_validator, + 'other': ExcludedUsersUpdateError._other_validator, +} + +ExcludedUsersUpdateError.users_not_in_team = ExcludedUsersUpdateError('users_not_in_team') +ExcludedUsersUpdateError.too_many_users = ExcludedUsersUpdateError('too_many_users') +ExcludedUsersUpdateError.other = ExcludedUsersUpdateError('other') + +ExcludedUsersUpdateResult._status_validator = ExcludedUsersUpdateStatus_validator +ExcludedUsersUpdateResult._all_field_names_ = set(['status']) +ExcludedUsersUpdateResult._all_fields_ = [('status', ExcludedUsersUpdateResult._status_validator)] + +ExcludedUsersUpdateStatus._success_validator = bv.Void() +ExcludedUsersUpdateStatus._other_validator = bv.Void() +ExcludedUsersUpdateStatus._tagmap = { + 'success': ExcludedUsersUpdateStatus._success_validator, + 'other': ExcludedUsersUpdateStatus._other_validator, +} + +ExcludedUsersUpdateStatus.success = ExcludedUsersUpdateStatus('success') +ExcludedUsersUpdateStatus.other = ExcludedUsersUpdateStatus('other') + +Feature._upload_api_rate_limit_validator = bv.Void() +Feature._has_team_shared_dropbox_validator = bv.Void() +Feature._has_team_file_events_validator = bv.Void() +Feature._has_team_selective_sync_validator = bv.Void() +Feature._other_validator = bv.Void() +Feature._tagmap = { + 'upload_api_rate_limit': Feature._upload_api_rate_limit_validator, + 'has_team_shared_dropbox': Feature._has_team_shared_dropbox_validator, + 'has_team_file_events': Feature._has_team_file_events_validator, + 'has_team_selective_sync': Feature._has_team_selective_sync_validator, + 'other': Feature._other_validator, +} + +Feature.upload_api_rate_limit = Feature('upload_api_rate_limit') +Feature.has_team_shared_dropbox = Feature('has_team_shared_dropbox') +Feature.has_team_file_events = Feature('has_team_file_events') +Feature.has_team_selective_sync = Feature('has_team_selective_sync') +Feature.other = Feature('other') + +FeatureValue._upload_api_rate_limit_validator = UploadApiRateLimitValue_validator +FeatureValue._has_team_shared_dropbox_validator = HasTeamSharedDropboxValue_validator +FeatureValue._has_team_file_events_validator = HasTeamFileEventsValue_validator +FeatureValue._has_team_selective_sync_validator = HasTeamSelectiveSyncValue_validator +FeatureValue._other_validator = bv.Void() +FeatureValue._tagmap = { + 'upload_api_rate_limit': FeatureValue._upload_api_rate_limit_validator, + 'has_team_shared_dropbox': FeatureValue._has_team_shared_dropbox_validator, + 'has_team_file_events': FeatureValue._has_team_file_events_validator, + 'has_team_selective_sync': FeatureValue._has_team_selective_sync_validator, + 'other': FeatureValue._other_validator, +} + +FeatureValue.other = FeatureValue('other') + +FeaturesGetValuesBatchArg._features_validator = bv.List(Feature_validator) +FeaturesGetValuesBatchArg._all_field_names_ = set(['features']) +FeaturesGetValuesBatchArg._all_fields_ = [('features', FeaturesGetValuesBatchArg._features_validator)] + +FeaturesGetValuesBatchError._empty_features_list_validator = bv.Void() +FeaturesGetValuesBatchError._other_validator = bv.Void() +FeaturesGetValuesBatchError._tagmap = { + 'empty_features_list': FeaturesGetValuesBatchError._empty_features_list_validator, + 'other': FeaturesGetValuesBatchError._other_validator, +} + +FeaturesGetValuesBatchError.empty_features_list = FeaturesGetValuesBatchError('empty_features_list') +FeaturesGetValuesBatchError.other = FeaturesGetValuesBatchError('other') + +FeaturesGetValuesBatchResult._values_validator = bv.List(FeatureValue_validator) +FeaturesGetValuesBatchResult._all_field_names_ = set(['values']) +FeaturesGetValuesBatchResult._all_fields_ = [('values', FeaturesGetValuesBatchResult._values_validator)] + +GetActivityReport._adds_validator = NumberPerDay_validator +GetActivityReport._edits_validator = NumberPerDay_validator +GetActivityReport._deletes_validator = NumberPerDay_validator +GetActivityReport._active_users_28_day_validator = NumberPerDay_validator +GetActivityReport._active_users_7_day_validator = NumberPerDay_validator +GetActivityReport._active_users_1_day_validator = NumberPerDay_validator +GetActivityReport._active_shared_folders_28_day_validator = NumberPerDay_validator +GetActivityReport._active_shared_folders_7_day_validator = NumberPerDay_validator +GetActivityReport._active_shared_folders_1_day_validator = NumberPerDay_validator +GetActivityReport._shared_links_created_validator = NumberPerDay_validator +GetActivityReport._shared_links_viewed_by_team_validator = NumberPerDay_validator +GetActivityReport._shared_links_viewed_by_outside_user_validator = NumberPerDay_validator +GetActivityReport._shared_links_viewed_by_not_logged_in_validator = NumberPerDay_validator +GetActivityReport._shared_links_viewed_total_validator = NumberPerDay_validator +GetActivityReport._all_field_names_ = BaseDfbReport._all_field_names_.union(set([ + 'adds', + 'edits', + 'deletes', + 'active_users_28_day', + 'active_users_7_day', + 'active_users_1_day', + 'active_shared_folders_28_day', + 'active_shared_folders_7_day', + 'active_shared_folders_1_day', + 'shared_links_created', + 'shared_links_viewed_by_team', + 'shared_links_viewed_by_outside_user', + 'shared_links_viewed_by_not_logged_in', + 'shared_links_viewed_total', +])) +GetActivityReport._all_fields_ = BaseDfbReport._all_fields_ + [ + ('adds', GetActivityReport._adds_validator), + ('edits', GetActivityReport._edits_validator), + ('deletes', GetActivityReport._deletes_validator), + ('active_users_28_day', GetActivityReport._active_users_28_day_validator), + ('active_users_7_day', GetActivityReport._active_users_7_day_validator), + ('active_users_1_day', GetActivityReport._active_users_1_day_validator), + ('active_shared_folders_28_day', GetActivityReport._active_shared_folders_28_day_validator), + ('active_shared_folders_7_day', GetActivityReport._active_shared_folders_7_day_validator), + ('active_shared_folders_1_day', GetActivityReport._active_shared_folders_1_day_validator), + ('shared_links_created', GetActivityReport._shared_links_created_validator), + ('shared_links_viewed_by_team', GetActivityReport._shared_links_viewed_by_team_validator), + ('shared_links_viewed_by_outside_user', GetActivityReport._shared_links_viewed_by_outside_user_validator), + ('shared_links_viewed_by_not_logged_in', GetActivityReport._shared_links_viewed_by_not_logged_in_validator), + ('shared_links_viewed_total', GetActivityReport._shared_links_viewed_total_validator), +] + +GetDevicesReport._active_1_day_validator = DevicesActive_validator +GetDevicesReport._active_7_day_validator = DevicesActive_validator +GetDevicesReport._active_28_day_validator = DevicesActive_validator +GetDevicesReport._all_field_names_ = BaseDfbReport._all_field_names_.union(set([ + 'active_1_day', + 'active_7_day', + 'active_28_day', +])) +GetDevicesReport._all_fields_ = BaseDfbReport._all_fields_ + [ + ('active_1_day', GetDevicesReport._active_1_day_validator), + ('active_7_day', GetDevicesReport._active_7_day_validator), + ('active_28_day', GetDevicesReport._active_28_day_validator), +] + +GetMembershipReport._team_size_validator = NumberPerDay_validator +GetMembershipReport._pending_invites_validator = NumberPerDay_validator +GetMembershipReport._members_joined_validator = NumberPerDay_validator +GetMembershipReport._suspended_members_validator = NumberPerDay_validator +GetMembershipReport._licenses_validator = NumberPerDay_validator +GetMembershipReport._all_field_names_ = BaseDfbReport._all_field_names_.union(set([ + 'team_size', + 'pending_invites', + 'members_joined', + 'suspended_members', + 'licenses', +])) +GetMembershipReport._all_fields_ = BaseDfbReport._all_fields_ + [ + ('team_size', GetMembershipReport._team_size_validator), + ('pending_invites', GetMembershipReport._pending_invites_validator), + ('members_joined', GetMembershipReport._members_joined_validator), + ('suspended_members', GetMembershipReport._suspended_members_validator), + ('licenses', GetMembershipReport._licenses_validator), +] + +GetStorageReport._total_usage_validator = NumberPerDay_validator +GetStorageReport._shared_usage_validator = NumberPerDay_validator +GetStorageReport._unshared_usage_validator = NumberPerDay_validator +GetStorageReport._shared_folders_validator = NumberPerDay_validator +GetStorageReport._member_storage_map_validator = bv.List(bv.List(StorageBucket_validator)) +GetStorageReport._all_field_names_ = BaseDfbReport._all_field_names_.union(set([ + 'total_usage', + 'shared_usage', + 'unshared_usage', + 'shared_folders', + 'member_storage_map', +])) +GetStorageReport._all_fields_ = BaseDfbReport._all_fields_ + [ + ('total_usage', GetStorageReport._total_usage_validator), + ('shared_usage', GetStorageReport._shared_usage_validator), + ('unshared_usage', GetStorageReport._unshared_usage_validator), + ('shared_folders', GetStorageReport._shared_folders_validator), + ('member_storage_map', GetStorageReport._member_storage_map_validator), +] + +GroupAccessType._member_validator = bv.Void() +GroupAccessType._owner_validator = bv.Void() +GroupAccessType._tagmap = { + 'member': GroupAccessType._member_validator, + 'owner': GroupAccessType._owner_validator, +} + +GroupAccessType.member = GroupAccessType('member') +GroupAccessType.owner = GroupAccessType('owner') + +GroupCreateArg._group_name_validator = bv.String() +GroupCreateArg._group_external_id_validator = bv.Nullable(team_common.GroupExternalId_validator) +GroupCreateArg._group_management_type_validator = bv.Nullable(team_common.GroupManagementType_validator) +GroupCreateArg._all_field_names_ = set([ + 'group_name', + 'group_external_id', + 'group_management_type', +]) +GroupCreateArg._all_fields_ = [ + ('group_name', GroupCreateArg._group_name_validator), + ('group_external_id', GroupCreateArg._group_external_id_validator), + ('group_management_type', GroupCreateArg._group_management_type_validator), +] + +GroupCreateError._group_name_already_used_validator = bv.Void() +GroupCreateError._group_name_invalid_validator = bv.Void() +GroupCreateError._external_id_already_in_use_validator = bv.Void() +GroupCreateError._system_managed_group_disallowed_validator = bv.Void() +GroupCreateError._other_validator = bv.Void() +GroupCreateError._tagmap = { + 'group_name_already_used': GroupCreateError._group_name_already_used_validator, + 'group_name_invalid': GroupCreateError._group_name_invalid_validator, + 'external_id_already_in_use': GroupCreateError._external_id_already_in_use_validator, + 'system_managed_group_disallowed': GroupCreateError._system_managed_group_disallowed_validator, + 'other': GroupCreateError._other_validator, +} + +GroupCreateError.group_name_already_used = GroupCreateError('group_name_already_used') +GroupCreateError.group_name_invalid = GroupCreateError('group_name_invalid') +GroupCreateError.external_id_already_in_use = GroupCreateError('external_id_already_in_use') +GroupCreateError.system_managed_group_disallowed = GroupCreateError('system_managed_group_disallowed') +GroupCreateError.other = GroupCreateError('other') + +GroupSelectorError._group_not_found_validator = bv.Void() +GroupSelectorError._other_validator = bv.Void() +GroupSelectorError._tagmap = { + 'group_not_found': GroupSelectorError._group_not_found_validator, + 'other': GroupSelectorError._other_validator, +} + +GroupSelectorError.group_not_found = GroupSelectorError('group_not_found') +GroupSelectorError.other = GroupSelectorError('other') + +GroupSelectorWithTeamGroupError._system_managed_group_disallowed_validator = bv.Void() +GroupSelectorWithTeamGroupError._tagmap = { + 'system_managed_group_disallowed': GroupSelectorWithTeamGroupError._system_managed_group_disallowed_validator, +} +GroupSelectorWithTeamGroupError._tagmap.update(GroupSelectorError._tagmap) + +GroupSelectorWithTeamGroupError.system_managed_group_disallowed = GroupSelectorWithTeamGroupError('system_managed_group_disallowed') + +GroupDeleteError._group_already_deleted_validator = bv.Void() +GroupDeleteError._tagmap = { + 'group_already_deleted': GroupDeleteError._group_already_deleted_validator, +} +GroupDeleteError._tagmap.update(GroupSelectorWithTeamGroupError._tagmap) + +GroupDeleteError.group_already_deleted = GroupDeleteError('group_already_deleted') + +GroupFullInfo._members_validator = bv.Nullable(bv.List(GroupMemberInfo_validator)) +GroupFullInfo._created_validator = bv.UInt64() +GroupFullInfo._all_field_names_ = team_common.GroupSummary._all_field_names_.union(set([ + 'members', + 'created', +])) +GroupFullInfo._all_fields_ = team_common.GroupSummary._all_fields_ + [ + ('members', GroupFullInfo._members_validator), + ('created', GroupFullInfo._created_validator), +] + +GroupMemberInfo._profile_validator = MemberProfile_validator +GroupMemberInfo._access_type_validator = GroupAccessType_validator +GroupMemberInfo._all_field_names_ = set([ + 'profile', + 'access_type', +]) +GroupMemberInfo._all_fields_ = [ + ('profile', GroupMemberInfo._profile_validator), + ('access_type', GroupMemberInfo._access_type_validator), +] + +GroupMemberSelector._group_validator = GroupSelector_validator +GroupMemberSelector._user_validator = UserSelectorArg_validator +GroupMemberSelector._all_field_names_ = set([ + 'group', + 'user', +]) +GroupMemberSelector._all_fields_ = [ + ('group', GroupMemberSelector._group_validator), + ('user', GroupMemberSelector._user_validator), +] + +GroupMemberSelectorError._member_not_in_group_validator = bv.Void() +GroupMemberSelectorError._tagmap = { + 'member_not_in_group': GroupMemberSelectorError._member_not_in_group_validator, +} +GroupMemberSelectorError._tagmap.update(GroupSelectorWithTeamGroupError._tagmap) + +GroupMemberSelectorError.member_not_in_group = GroupMemberSelectorError('member_not_in_group') + +GroupMemberSetAccessTypeError._user_cannot_be_manager_of_company_managed_group_validator = bv.Void() +GroupMemberSetAccessTypeError._tagmap = { + 'user_cannot_be_manager_of_company_managed_group': GroupMemberSetAccessTypeError._user_cannot_be_manager_of_company_managed_group_validator, +} +GroupMemberSetAccessTypeError._tagmap.update(GroupMemberSelectorError._tagmap) + +GroupMemberSetAccessTypeError.user_cannot_be_manager_of_company_managed_group = GroupMemberSetAccessTypeError('user_cannot_be_manager_of_company_managed_group') + +IncludeMembersArg._return_members_validator = bv.Boolean() +IncludeMembersArg._all_field_names_ = set(['return_members']) +IncludeMembersArg._all_fields_ = [('return_members', IncludeMembersArg._return_members_validator)] + +GroupMembersAddArg._group_validator = GroupSelector_validator +GroupMembersAddArg._members_validator = bv.List(MemberAccess_validator) +GroupMembersAddArg._all_field_names_ = IncludeMembersArg._all_field_names_.union(set([ + 'group', + 'members', +])) +GroupMembersAddArg._all_fields_ = IncludeMembersArg._all_fields_ + [ + ('group', GroupMembersAddArg._group_validator), + ('members', GroupMembersAddArg._members_validator), +] + +GroupMembersAddError._duplicate_user_validator = bv.Void() +GroupMembersAddError._group_not_in_team_validator = bv.Void() +GroupMembersAddError._members_not_in_team_validator = bv.List(bv.String()) +GroupMembersAddError._users_not_found_validator = bv.List(bv.String()) +GroupMembersAddError._user_must_be_active_to_be_owner_validator = bv.Void() +GroupMembersAddError._user_cannot_be_manager_of_company_managed_group_validator = bv.List(bv.String()) +GroupMembersAddError._tagmap = { + 'duplicate_user': GroupMembersAddError._duplicate_user_validator, + 'group_not_in_team': GroupMembersAddError._group_not_in_team_validator, + 'members_not_in_team': GroupMembersAddError._members_not_in_team_validator, + 'users_not_found': GroupMembersAddError._users_not_found_validator, + 'user_must_be_active_to_be_owner': GroupMembersAddError._user_must_be_active_to_be_owner_validator, + 'user_cannot_be_manager_of_company_managed_group': GroupMembersAddError._user_cannot_be_manager_of_company_managed_group_validator, +} +GroupMembersAddError._tagmap.update(GroupSelectorWithTeamGroupError._tagmap) + +GroupMembersAddError.duplicate_user = GroupMembersAddError('duplicate_user') +GroupMembersAddError.group_not_in_team = GroupMembersAddError('group_not_in_team') +GroupMembersAddError.user_must_be_active_to_be_owner = GroupMembersAddError('user_must_be_active_to_be_owner') + +GroupMembersChangeResult._group_info_validator = GroupFullInfo_validator +GroupMembersChangeResult._async_job_id_validator = async_.AsyncJobId_validator +GroupMembersChangeResult._all_field_names_ = set([ + 'group_info', + 'async_job_id', +]) +GroupMembersChangeResult._all_fields_ = [ + ('group_info', GroupMembersChangeResult._group_info_validator), + ('async_job_id', GroupMembersChangeResult._async_job_id_validator), +] + +GroupMembersRemoveArg._group_validator = GroupSelector_validator +GroupMembersRemoveArg._users_validator = bv.List(UserSelectorArg_validator) +GroupMembersRemoveArg._all_field_names_ = IncludeMembersArg._all_field_names_.union(set([ + 'group', + 'users', +])) +GroupMembersRemoveArg._all_fields_ = IncludeMembersArg._all_fields_ + [ + ('group', GroupMembersRemoveArg._group_validator), + ('users', GroupMembersRemoveArg._users_validator), +] + +GroupMembersSelectorError._member_not_in_group_validator = bv.Void() +GroupMembersSelectorError._tagmap = { + 'member_not_in_group': GroupMembersSelectorError._member_not_in_group_validator, +} +GroupMembersSelectorError._tagmap.update(GroupSelectorWithTeamGroupError._tagmap) + +GroupMembersSelectorError.member_not_in_group = GroupMembersSelectorError('member_not_in_group') + +GroupMembersRemoveError._group_not_in_team_validator = bv.Void() +GroupMembersRemoveError._members_not_in_team_validator = bv.List(bv.String()) +GroupMembersRemoveError._users_not_found_validator = bv.List(bv.String()) +GroupMembersRemoveError._tagmap = { + 'group_not_in_team': GroupMembersRemoveError._group_not_in_team_validator, + 'members_not_in_team': GroupMembersRemoveError._members_not_in_team_validator, + 'users_not_found': GroupMembersRemoveError._users_not_found_validator, +} +GroupMembersRemoveError._tagmap.update(GroupMembersSelectorError._tagmap) + +GroupMembersRemoveError.group_not_in_team = GroupMembersRemoveError('group_not_in_team') + +GroupMembersSelector._group_validator = GroupSelector_validator +GroupMembersSelector._users_validator = UsersSelectorArg_validator +GroupMembersSelector._all_field_names_ = set([ + 'group', + 'users', +]) +GroupMembersSelector._all_fields_ = [ + ('group', GroupMembersSelector._group_validator), + ('users', GroupMembersSelector._users_validator), +] + +GroupMembersSetAccessTypeArg._access_type_validator = GroupAccessType_validator +GroupMembersSetAccessTypeArg._return_members_validator = bv.Boolean() +GroupMembersSetAccessTypeArg._all_field_names_ = GroupMemberSelector._all_field_names_.union(set([ + 'access_type', + 'return_members', +])) +GroupMembersSetAccessTypeArg._all_fields_ = GroupMemberSelector._all_fields_ + [ + ('access_type', GroupMembersSetAccessTypeArg._access_type_validator), + ('return_members', GroupMembersSetAccessTypeArg._return_members_validator), +] + +GroupSelector._group_id_validator = team_common.GroupId_validator +GroupSelector._group_external_id_validator = team_common.GroupExternalId_validator +GroupSelector._tagmap = { + 'group_id': GroupSelector._group_id_validator, + 'group_external_id': GroupSelector._group_external_id_validator, +} + +GroupUpdateArgs._group_validator = GroupSelector_validator +GroupUpdateArgs._new_group_name_validator = bv.Nullable(bv.String()) +GroupUpdateArgs._new_group_external_id_validator = bv.Nullable(team_common.GroupExternalId_validator) +GroupUpdateArgs._new_group_management_type_validator = bv.Nullable(team_common.GroupManagementType_validator) +GroupUpdateArgs._all_field_names_ = IncludeMembersArg._all_field_names_.union(set([ + 'group', + 'new_group_name', + 'new_group_external_id', + 'new_group_management_type', +])) +GroupUpdateArgs._all_fields_ = IncludeMembersArg._all_fields_ + [ + ('group', GroupUpdateArgs._group_validator), + ('new_group_name', GroupUpdateArgs._new_group_name_validator), + ('new_group_external_id', GroupUpdateArgs._new_group_external_id_validator), + ('new_group_management_type', GroupUpdateArgs._new_group_management_type_validator), +] + +GroupUpdateError._group_name_already_used_validator = bv.Void() +GroupUpdateError._group_name_invalid_validator = bv.Void() +GroupUpdateError._external_id_already_in_use_validator = bv.Void() +GroupUpdateError._tagmap = { + 'group_name_already_used': GroupUpdateError._group_name_already_used_validator, + 'group_name_invalid': GroupUpdateError._group_name_invalid_validator, + 'external_id_already_in_use': GroupUpdateError._external_id_already_in_use_validator, +} +GroupUpdateError._tagmap.update(GroupSelectorWithTeamGroupError._tagmap) + +GroupUpdateError.group_name_already_used = GroupUpdateError('group_name_already_used') +GroupUpdateError.group_name_invalid = GroupUpdateError('group_name_invalid') +GroupUpdateError.external_id_already_in_use = GroupUpdateError('external_id_already_in_use') + +GroupsGetInfoError._group_not_on_team_validator = bv.Void() +GroupsGetInfoError._other_validator = bv.Void() +GroupsGetInfoError._tagmap = { + 'group_not_on_team': GroupsGetInfoError._group_not_on_team_validator, + 'other': GroupsGetInfoError._other_validator, +} + +GroupsGetInfoError.group_not_on_team = GroupsGetInfoError('group_not_on_team') +GroupsGetInfoError.other = GroupsGetInfoError('other') + +GroupsGetInfoItem._id_not_found_validator = bv.String() +GroupsGetInfoItem._group_info_validator = GroupFullInfo_validator +GroupsGetInfoItem._tagmap = { + 'id_not_found': GroupsGetInfoItem._id_not_found_validator, + 'group_info': GroupsGetInfoItem._group_info_validator, +} + +GroupsListArg._limit_validator = bv.UInt32(min_value=1, max_value=1000) +GroupsListArg._all_field_names_ = set(['limit']) +GroupsListArg._all_fields_ = [('limit', GroupsListArg._limit_validator)] + +GroupsListContinueArg._cursor_validator = bv.String() +GroupsListContinueArg._all_field_names_ = set(['cursor']) +GroupsListContinueArg._all_fields_ = [('cursor', GroupsListContinueArg._cursor_validator)] + +GroupsListContinueError._invalid_cursor_validator = bv.Void() +GroupsListContinueError._other_validator = bv.Void() +GroupsListContinueError._tagmap = { + 'invalid_cursor': GroupsListContinueError._invalid_cursor_validator, + 'other': GroupsListContinueError._other_validator, +} + +GroupsListContinueError.invalid_cursor = GroupsListContinueError('invalid_cursor') +GroupsListContinueError.other = GroupsListContinueError('other') + +GroupsListResult._groups_validator = bv.List(team_common.GroupSummary_validator) +GroupsListResult._cursor_validator = bv.String() +GroupsListResult._has_more_validator = bv.Boolean() +GroupsListResult._all_field_names_ = set([ + 'groups', + 'cursor', + 'has_more', +]) +GroupsListResult._all_fields_ = [ + ('groups', GroupsListResult._groups_validator), + ('cursor', GroupsListResult._cursor_validator), + ('has_more', GroupsListResult._has_more_validator), +] + +GroupsMembersListArg._group_validator = GroupSelector_validator +GroupsMembersListArg._limit_validator = bv.UInt32(min_value=1, max_value=1000) +GroupsMembersListArg._all_field_names_ = set([ + 'group', + 'limit', +]) +GroupsMembersListArg._all_fields_ = [ + ('group', GroupsMembersListArg._group_validator), + ('limit', GroupsMembersListArg._limit_validator), +] + +GroupsMembersListContinueArg._cursor_validator = bv.String() +GroupsMembersListContinueArg._all_field_names_ = set(['cursor']) +GroupsMembersListContinueArg._all_fields_ = [('cursor', GroupsMembersListContinueArg._cursor_validator)] + +GroupsMembersListContinueError._invalid_cursor_validator = bv.Void() +GroupsMembersListContinueError._other_validator = bv.Void() +GroupsMembersListContinueError._tagmap = { + 'invalid_cursor': GroupsMembersListContinueError._invalid_cursor_validator, + 'other': GroupsMembersListContinueError._other_validator, +} + +GroupsMembersListContinueError.invalid_cursor = GroupsMembersListContinueError('invalid_cursor') +GroupsMembersListContinueError.other = GroupsMembersListContinueError('other') + +GroupsMembersListResult._members_validator = bv.List(GroupMemberInfo_validator) +GroupsMembersListResult._cursor_validator = bv.String() +GroupsMembersListResult._has_more_validator = bv.Boolean() +GroupsMembersListResult._all_field_names_ = set([ + 'members', + 'cursor', + 'has_more', +]) +GroupsMembersListResult._all_fields_ = [ + ('members', GroupsMembersListResult._members_validator), + ('cursor', GroupsMembersListResult._cursor_validator), + ('has_more', GroupsMembersListResult._has_more_validator), +] + +GroupsPollError._access_denied_validator = bv.Void() +GroupsPollError._tagmap = { + 'access_denied': GroupsPollError._access_denied_validator, +} +GroupsPollError._tagmap.update(async_.PollError._tagmap) + +GroupsPollError.access_denied = GroupsPollError('access_denied') + +GroupsSelector._group_ids_validator = bv.List(team_common.GroupId_validator) +GroupsSelector._group_external_ids_validator = bv.List(bv.String()) +GroupsSelector._tagmap = { + 'group_ids': GroupsSelector._group_ids_validator, + 'group_external_ids': GroupsSelector._group_external_ids_validator, +} + +HasTeamFileEventsValue._enabled_validator = bv.Boolean() +HasTeamFileEventsValue._other_validator = bv.Void() +HasTeamFileEventsValue._tagmap = { + 'enabled': HasTeamFileEventsValue._enabled_validator, + 'other': HasTeamFileEventsValue._other_validator, +} + +HasTeamFileEventsValue.other = HasTeamFileEventsValue('other') + +HasTeamSelectiveSyncValue._has_team_selective_sync_validator = bv.Boolean() +HasTeamSelectiveSyncValue._other_validator = bv.Void() +HasTeamSelectiveSyncValue._tagmap = { + 'has_team_selective_sync': HasTeamSelectiveSyncValue._has_team_selective_sync_validator, + 'other': HasTeamSelectiveSyncValue._other_validator, +} + +HasTeamSelectiveSyncValue.other = HasTeamSelectiveSyncValue('other') + +HasTeamSharedDropboxValue._has_team_shared_dropbox_validator = bv.Boolean() +HasTeamSharedDropboxValue._other_validator = bv.Void() +HasTeamSharedDropboxValue._tagmap = { + 'has_team_shared_dropbox': HasTeamSharedDropboxValue._has_team_shared_dropbox_validator, + 'other': HasTeamSharedDropboxValue._other_validator, +} + +HasTeamSharedDropboxValue.other = HasTeamSharedDropboxValue('other') + +ListMemberAppsArg._team_member_id_validator = bv.String() +ListMemberAppsArg._all_field_names_ = set(['team_member_id']) +ListMemberAppsArg._all_fields_ = [('team_member_id', ListMemberAppsArg._team_member_id_validator)] + +ListMemberAppsError._member_not_found_validator = bv.Void() +ListMemberAppsError._other_validator = bv.Void() +ListMemberAppsError._tagmap = { + 'member_not_found': ListMemberAppsError._member_not_found_validator, + 'other': ListMemberAppsError._other_validator, +} + +ListMemberAppsError.member_not_found = ListMemberAppsError('member_not_found') +ListMemberAppsError.other = ListMemberAppsError('other') + +ListMemberAppsResult._linked_api_apps_validator = bv.List(ApiApp_validator) +ListMemberAppsResult._all_field_names_ = set(['linked_api_apps']) +ListMemberAppsResult._all_fields_ = [('linked_api_apps', ListMemberAppsResult._linked_api_apps_validator)] + +ListMemberDevicesArg._team_member_id_validator = bv.String() +ListMemberDevicesArg._include_web_sessions_validator = bv.Boolean() +ListMemberDevicesArg._include_desktop_clients_validator = bv.Boolean() +ListMemberDevicesArg._include_mobile_clients_validator = bv.Boolean() +ListMemberDevicesArg._all_field_names_ = set([ + 'team_member_id', + 'include_web_sessions', + 'include_desktop_clients', + 'include_mobile_clients', +]) +ListMemberDevicesArg._all_fields_ = [ + ('team_member_id', ListMemberDevicesArg._team_member_id_validator), + ('include_web_sessions', ListMemberDevicesArg._include_web_sessions_validator), + ('include_desktop_clients', ListMemberDevicesArg._include_desktop_clients_validator), + ('include_mobile_clients', ListMemberDevicesArg._include_mobile_clients_validator), +] + +ListMemberDevicesError._member_not_found_validator = bv.Void() +ListMemberDevicesError._other_validator = bv.Void() +ListMemberDevicesError._tagmap = { + 'member_not_found': ListMemberDevicesError._member_not_found_validator, + 'other': ListMemberDevicesError._other_validator, +} + +ListMemberDevicesError.member_not_found = ListMemberDevicesError('member_not_found') +ListMemberDevicesError.other = ListMemberDevicesError('other') + +ListMemberDevicesResult._active_web_sessions_validator = bv.Nullable(bv.List(ActiveWebSession_validator)) +ListMemberDevicesResult._desktop_client_sessions_validator = bv.Nullable(bv.List(DesktopClientSession_validator)) +ListMemberDevicesResult._mobile_client_sessions_validator = bv.Nullable(bv.List(MobileClientSession_validator)) +ListMemberDevicesResult._all_field_names_ = set([ + 'active_web_sessions', + 'desktop_client_sessions', + 'mobile_client_sessions', +]) +ListMemberDevicesResult._all_fields_ = [ + ('active_web_sessions', ListMemberDevicesResult._active_web_sessions_validator), + ('desktop_client_sessions', ListMemberDevicesResult._desktop_client_sessions_validator), + ('mobile_client_sessions', ListMemberDevicesResult._mobile_client_sessions_validator), +] + +ListMembersAppsArg._cursor_validator = bv.Nullable(bv.String()) +ListMembersAppsArg._all_field_names_ = set(['cursor']) +ListMembersAppsArg._all_fields_ = [('cursor', ListMembersAppsArg._cursor_validator)] + +ListMembersAppsError._reset_validator = bv.Void() +ListMembersAppsError._other_validator = bv.Void() +ListMembersAppsError._tagmap = { + 'reset': ListMembersAppsError._reset_validator, + 'other': ListMembersAppsError._other_validator, +} + +ListMembersAppsError.reset = ListMembersAppsError('reset') +ListMembersAppsError.other = ListMembersAppsError('other') + +ListMembersAppsResult._apps_validator = bv.List(MemberLinkedApps_validator) +ListMembersAppsResult._has_more_validator = bv.Boolean() +ListMembersAppsResult._cursor_validator = bv.Nullable(bv.String()) +ListMembersAppsResult._all_field_names_ = set([ + 'apps', + 'has_more', + 'cursor', +]) +ListMembersAppsResult._all_fields_ = [ + ('apps', ListMembersAppsResult._apps_validator), + ('has_more', ListMembersAppsResult._has_more_validator), + ('cursor', ListMembersAppsResult._cursor_validator), +] + +ListMembersDevicesArg._cursor_validator = bv.Nullable(bv.String()) +ListMembersDevicesArg._include_web_sessions_validator = bv.Boolean() +ListMembersDevicesArg._include_desktop_clients_validator = bv.Boolean() +ListMembersDevicesArg._include_mobile_clients_validator = bv.Boolean() +ListMembersDevicesArg._all_field_names_ = set([ + 'cursor', + 'include_web_sessions', + 'include_desktop_clients', + 'include_mobile_clients', +]) +ListMembersDevicesArg._all_fields_ = [ + ('cursor', ListMembersDevicesArg._cursor_validator), + ('include_web_sessions', ListMembersDevicesArg._include_web_sessions_validator), + ('include_desktop_clients', ListMembersDevicesArg._include_desktop_clients_validator), + ('include_mobile_clients', ListMembersDevicesArg._include_mobile_clients_validator), +] + +ListMembersDevicesError._reset_validator = bv.Void() +ListMembersDevicesError._other_validator = bv.Void() +ListMembersDevicesError._tagmap = { + 'reset': ListMembersDevicesError._reset_validator, + 'other': ListMembersDevicesError._other_validator, +} + +ListMembersDevicesError.reset = ListMembersDevicesError('reset') +ListMembersDevicesError.other = ListMembersDevicesError('other') + +ListMembersDevicesResult._devices_validator = bv.List(MemberDevices_validator) +ListMembersDevicesResult._has_more_validator = bv.Boolean() +ListMembersDevicesResult._cursor_validator = bv.Nullable(bv.String()) +ListMembersDevicesResult._all_field_names_ = set([ + 'devices', + 'has_more', + 'cursor', +]) +ListMembersDevicesResult._all_fields_ = [ + ('devices', ListMembersDevicesResult._devices_validator), + ('has_more', ListMembersDevicesResult._has_more_validator), + ('cursor', ListMembersDevicesResult._cursor_validator), +] + +ListTeamAppsArg._cursor_validator = bv.Nullable(bv.String()) +ListTeamAppsArg._all_field_names_ = set(['cursor']) +ListTeamAppsArg._all_fields_ = [('cursor', ListTeamAppsArg._cursor_validator)] + +ListTeamAppsError._reset_validator = bv.Void() +ListTeamAppsError._other_validator = bv.Void() +ListTeamAppsError._tagmap = { + 'reset': ListTeamAppsError._reset_validator, + 'other': ListTeamAppsError._other_validator, +} + +ListTeamAppsError.reset = ListTeamAppsError('reset') +ListTeamAppsError.other = ListTeamAppsError('other') + +ListTeamAppsResult._apps_validator = bv.List(MemberLinkedApps_validator) +ListTeamAppsResult._has_more_validator = bv.Boolean() +ListTeamAppsResult._cursor_validator = bv.Nullable(bv.String()) +ListTeamAppsResult._all_field_names_ = set([ + 'apps', + 'has_more', + 'cursor', +]) +ListTeamAppsResult._all_fields_ = [ + ('apps', ListTeamAppsResult._apps_validator), + ('has_more', ListTeamAppsResult._has_more_validator), + ('cursor', ListTeamAppsResult._cursor_validator), +] + +ListTeamDevicesArg._cursor_validator = bv.Nullable(bv.String()) +ListTeamDevicesArg._include_web_sessions_validator = bv.Boolean() +ListTeamDevicesArg._include_desktop_clients_validator = bv.Boolean() +ListTeamDevicesArg._include_mobile_clients_validator = bv.Boolean() +ListTeamDevicesArg._all_field_names_ = set([ + 'cursor', + 'include_web_sessions', + 'include_desktop_clients', + 'include_mobile_clients', +]) +ListTeamDevicesArg._all_fields_ = [ + ('cursor', ListTeamDevicesArg._cursor_validator), + ('include_web_sessions', ListTeamDevicesArg._include_web_sessions_validator), + ('include_desktop_clients', ListTeamDevicesArg._include_desktop_clients_validator), + ('include_mobile_clients', ListTeamDevicesArg._include_mobile_clients_validator), +] + +ListTeamDevicesError._reset_validator = bv.Void() +ListTeamDevicesError._other_validator = bv.Void() +ListTeamDevicesError._tagmap = { + 'reset': ListTeamDevicesError._reset_validator, + 'other': ListTeamDevicesError._other_validator, +} + +ListTeamDevicesError.reset = ListTeamDevicesError('reset') +ListTeamDevicesError.other = ListTeamDevicesError('other') + +ListTeamDevicesResult._devices_validator = bv.List(MemberDevices_validator) +ListTeamDevicesResult._has_more_validator = bv.Boolean() +ListTeamDevicesResult._cursor_validator = bv.Nullable(bv.String()) +ListTeamDevicesResult._all_field_names_ = set([ + 'devices', + 'has_more', + 'cursor', +]) +ListTeamDevicesResult._all_fields_ = [ + ('devices', ListTeamDevicesResult._devices_validator), + ('has_more', ListTeamDevicesResult._has_more_validator), + ('cursor', ListTeamDevicesResult._cursor_validator), +] + +MemberAccess._user_validator = UserSelectorArg_validator +MemberAccess._access_type_validator = GroupAccessType_validator +MemberAccess._all_field_names_ = set([ + 'user', + 'access_type', +]) +MemberAccess._all_fields_ = [ + ('user', MemberAccess._user_validator), + ('access_type', MemberAccess._access_type_validator), +] + +MemberAddArg._member_email_validator = common.EmailAddress_validator +MemberAddArg._member_given_name_validator = bv.Nullable(common.OptionalNamePart_validator) +MemberAddArg._member_surname_validator = bv.Nullable(common.OptionalNamePart_validator) +MemberAddArg._member_external_id_validator = bv.Nullable(team_common.MemberExternalId_validator) +MemberAddArg._member_persistent_id_validator = bv.Nullable(bv.String()) +MemberAddArg._send_welcome_email_validator = bv.Boolean() +MemberAddArg._role_validator = AdminTier_validator +MemberAddArg._is_directory_restricted_validator = bv.Nullable(bv.Boolean()) +MemberAddArg._all_field_names_ = set([ + 'member_email', + 'member_given_name', + 'member_surname', + 'member_external_id', + 'member_persistent_id', + 'send_welcome_email', + 'role', + 'is_directory_restricted', +]) +MemberAddArg._all_fields_ = [ + ('member_email', MemberAddArg._member_email_validator), + ('member_given_name', MemberAddArg._member_given_name_validator), + ('member_surname', MemberAddArg._member_surname_validator), + ('member_external_id', MemberAddArg._member_external_id_validator), + ('member_persistent_id', MemberAddArg._member_persistent_id_validator), + ('send_welcome_email', MemberAddArg._send_welcome_email_validator), + ('role', MemberAddArg._role_validator), + ('is_directory_restricted', MemberAddArg._is_directory_restricted_validator), +] + +MemberAddResult._success_validator = TeamMemberInfo_validator +MemberAddResult._team_license_limit_validator = common.EmailAddress_validator +MemberAddResult._free_team_member_limit_reached_validator = common.EmailAddress_validator +MemberAddResult._user_already_on_team_validator = common.EmailAddress_validator +MemberAddResult._user_on_another_team_validator = common.EmailAddress_validator +MemberAddResult._user_already_paired_validator = common.EmailAddress_validator +MemberAddResult._user_migration_failed_validator = common.EmailAddress_validator +MemberAddResult._duplicate_external_member_id_validator = common.EmailAddress_validator +MemberAddResult._duplicate_member_persistent_id_validator = common.EmailAddress_validator +MemberAddResult._persistent_id_disabled_validator = common.EmailAddress_validator +MemberAddResult._user_creation_failed_validator = common.EmailAddress_validator +MemberAddResult._tagmap = { + 'success': MemberAddResult._success_validator, + 'team_license_limit': MemberAddResult._team_license_limit_validator, + 'free_team_member_limit_reached': MemberAddResult._free_team_member_limit_reached_validator, + 'user_already_on_team': MemberAddResult._user_already_on_team_validator, + 'user_on_another_team': MemberAddResult._user_on_another_team_validator, + 'user_already_paired': MemberAddResult._user_already_paired_validator, + 'user_migration_failed': MemberAddResult._user_migration_failed_validator, + 'duplicate_external_member_id': MemberAddResult._duplicate_external_member_id_validator, + 'duplicate_member_persistent_id': MemberAddResult._duplicate_member_persistent_id_validator, + 'persistent_id_disabled': MemberAddResult._persistent_id_disabled_validator, + 'user_creation_failed': MemberAddResult._user_creation_failed_validator, +} + +MemberDevices._team_member_id_validator = bv.String() +MemberDevices._web_sessions_validator = bv.Nullable(bv.List(ActiveWebSession_validator)) +MemberDevices._desktop_clients_validator = bv.Nullable(bv.List(DesktopClientSession_validator)) +MemberDevices._mobile_clients_validator = bv.Nullable(bv.List(MobileClientSession_validator)) +MemberDevices._all_field_names_ = set([ + 'team_member_id', + 'web_sessions', + 'desktop_clients', + 'mobile_clients', +]) +MemberDevices._all_fields_ = [ + ('team_member_id', MemberDevices._team_member_id_validator), + ('web_sessions', MemberDevices._web_sessions_validator), + ('desktop_clients', MemberDevices._desktop_clients_validator), + ('mobile_clients', MemberDevices._mobile_clients_validator), +] + +MemberLinkedApps._team_member_id_validator = bv.String() +MemberLinkedApps._linked_api_apps_validator = bv.List(ApiApp_validator) +MemberLinkedApps._all_field_names_ = set([ + 'team_member_id', + 'linked_api_apps', +]) +MemberLinkedApps._all_fields_ = [ + ('team_member_id', MemberLinkedApps._team_member_id_validator), + ('linked_api_apps', MemberLinkedApps._linked_api_apps_validator), +] + +MemberProfile._team_member_id_validator = team_common.TeamMemberId_validator +MemberProfile._external_id_validator = bv.Nullable(bv.String()) +MemberProfile._account_id_validator = bv.Nullable(users_common.AccountId_validator) +MemberProfile._email_validator = bv.String() +MemberProfile._email_verified_validator = bv.Boolean() +MemberProfile._status_validator = TeamMemberStatus_validator +MemberProfile._name_validator = users.Name_validator +MemberProfile._membership_type_validator = TeamMembershipType_validator +MemberProfile._joined_on_validator = bv.Nullable(common.DropboxTimestamp_validator) +MemberProfile._persistent_id_validator = bv.Nullable(bv.String()) +MemberProfile._is_directory_restricted_validator = bv.Nullable(bv.Boolean()) +MemberProfile._all_field_names_ = set([ + 'team_member_id', + 'external_id', + 'account_id', + 'email', + 'email_verified', + 'status', + 'name', + 'membership_type', + 'joined_on', + 'persistent_id', + 'is_directory_restricted', +]) +MemberProfile._all_fields_ = [ + ('team_member_id', MemberProfile._team_member_id_validator), + ('external_id', MemberProfile._external_id_validator), + ('account_id', MemberProfile._account_id_validator), + ('email', MemberProfile._email_validator), + ('email_verified', MemberProfile._email_verified_validator), + ('status', MemberProfile._status_validator), + ('name', MemberProfile._name_validator), + ('membership_type', MemberProfile._membership_type_validator), + ('joined_on', MemberProfile._joined_on_validator), + ('persistent_id', MemberProfile._persistent_id_validator), + ('is_directory_restricted', MemberProfile._is_directory_restricted_validator), +] + +UserSelectorError._user_not_found_validator = bv.Void() +UserSelectorError._tagmap = { + 'user_not_found': UserSelectorError._user_not_found_validator, +} + +UserSelectorError.user_not_found = UserSelectorError('user_not_found') + +MemberSelectorError._user_not_in_team_validator = bv.Void() +MemberSelectorError._tagmap = { + 'user_not_in_team': MemberSelectorError._user_not_in_team_validator, +} +MemberSelectorError._tagmap.update(UserSelectorError._tagmap) + +MemberSelectorError.user_not_in_team = MemberSelectorError('user_not_in_team') + +MembersAddArg._new_members_validator = bv.List(MemberAddArg_validator) +MembersAddArg._force_async_validator = bv.Boolean() +MembersAddArg._all_field_names_ = set([ + 'new_members', + 'force_async', +]) +MembersAddArg._all_fields_ = [ + ('new_members', MembersAddArg._new_members_validator), + ('force_async', MembersAddArg._force_async_validator), +] + +MembersAddJobStatus._complete_validator = bv.List(MemberAddResult_validator) +MembersAddJobStatus._failed_validator = bv.String() +MembersAddJobStatus._tagmap = { + 'complete': MembersAddJobStatus._complete_validator, + 'failed': MembersAddJobStatus._failed_validator, +} +MembersAddJobStatus._tagmap.update(async_.PollResultBase._tagmap) + +MembersAddLaunch._complete_validator = bv.List(MemberAddResult_validator) +MembersAddLaunch._tagmap = { + 'complete': MembersAddLaunch._complete_validator, +} +MembersAddLaunch._tagmap.update(async_.LaunchResultBase._tagmap) + +MembersDeactivateBaseArg._user_validator = UserSelectorArg_validator +MembersDeactivateBaseArg._all_field_names_ = set(['user']) +MembersDeactivateBaseArg._all_fields_ = [('user', MembersDeactivateBaseArg._user_validator)] + +MembersDataTransferArg._transfer_dest_id_validator = UserSelectorArg_validator +MembersDataTransferArg._transfer_admin_id_validator = UserSelectorArg_validator +MembersDataTransferArg._all_field_names_ = MembersDeactivateBaseArg._all_field_names_.union(set([ + 'transfer_dest_id', + 'transfer_admin_id', +])) +MembersDataTransferArg._all_fields_ = MembersDeactivateBaseArg._all_fields_ + [ + ('transfer_dest_id', MembersDataTransferArg._transfer_dest_id_validator), + ('transfer_admin_id', MembersDataTransferArg._transfer_admin_id_validator), +] + +MembersDeactivateArg._wipe_data_validator = bv.Boolean() +MembersDeactivateArg._all_field_names_ = MembersDeactivateBaseArg._all_field_names_.union(set(['wipe_data'])) +MembersDeactivateArg._all_fields_ = MembersDeactivateBaseArg._all_fields_ + [('wipe_data', MembersDeactivateArg._wipe_data_validator)] + +MembersDeactivateError._user_not_in_team_validator = bv.Void() +MembersDeactivateError._other_validator = bv.Void() +MembersDeactivateError._tagmap = { + 'user_not_in_team': MembersDeactivateError._user_not_in_team_validator, + 'other': MembersDeactivateError._other_validator, +} +MembersDeactivateError._tagmap.update(UserSelectorError._tagmap) + +MembersDeactivateError.user_not_in_team = MembersDeactivateError('user_not_in_team') +MembersDeactivateError.other = MembersDeactivateError('other') + +MembersGetInfoArgs._members_validator = bv.List(UserSelectorArg_validator) +MembersGetInfoArgs._all_field_names_ = set(['members']) +MembersGetInfoArgs._all_fields_ = [('members', MembersGetInfoArgs._members_validator)] + +MembersGetInfoError._other_validator = bv.Void() +MembersGetInfoError._tagmap = { + 'other': MembersGetInfoError._other_validator, +} + +MembersGetInfoError.other = MembersGetInfoError('other') + +MembersGetInfoItem._id_not_found_validator = bv.String() +MembersGetInfoItem._member_info_validator = TeamMemberInfo_validator +MembersGetInfoItem._tagmap = { + 'id_not_found': MembersGetInfoItem._id_not_found_validator, + 'member_info': MembersGetInfoItem._member_info_validator, +} + +MembersListArg._limit_validator = bv.UInt32(min_value=1, max_value=1000) +MembersListArg._include_removed_validator = bv.Boolean() +MembersListArg._all_field_names_ = set([ + 'limit', + 'include_removed', +]) +MembersListArg._all_fields_ = [ + ('limit', MembersListArg._limit_validator), + ('include_removed', MembersListArg._include_removed_validator), +] + +MembersListContinueArg._cursor_validator = bv.String() +MembersListContinueArg._all_field_names_ = set(['cursor']) +MembersListContinueArg._all_fields_ = [('cursor', MembersListContinueArg._cursor_validator)] + +MembersListContinueError._invalid_cursor_validator = bv.Void() +MembersListContinueError._other_validator = bv.Void() +MembersListContinueError._tagmap = { + 'invalid_cursor': MembersListContinueError._invalid_cursor_validator, + 'other': MembersListContinueError._other_validator, +} + +MembersListContinueError.invalid_cursor = MembersListContinueError('invalid_cursor') +MembersListContinueError.other = MembersListContinueError('other') + +MembersListError._other_validator = bv.Void() +MembersListError._tagmap = { + 'other': MembersListError._other_validator, +} + +MembersListError.other = MembersListError('other') + +MembersListResult._members_validator = bv.List(TeamMemberInfo_validator) +MembersListResult._cursor_validator = bv.String() +MembersListResult._has_more_validator = bv.Boolean() +MembersListResult._all_field_names_ = set([ + 'members', + 'cursor', + 'has_more', +]) +MembersListResult._all_fields_ = [ + ('members', MembersListResult._members_validator), + ('cursor', MembersListResult._cursor_validator), + ('has_more', MembersListResult._has_more_validator), +] + +MembersRecoverArg._user_validator = UserSelectorArg_validator +MembersRecoverArg._all_field_names_ = set(['user']) +MembersRecoverArg._all_fields_ = [('user', MembersRecoverArg._user_validator)] + +MembersRecoverError._user_unrecoverable_validator = bv.Void() +MembersRecoverError._user_not_in_team_validator = bv.Void() +MembersRecoverError._team_license_limit_validator = bv.Void() +MembersRecoverError._other_validator = bv.Void() +MembersRecoverError._tagmap = { + 'user_unrecoverable': MembersRecoverError._user_unrecoverable_validator, + 'user_not_in_team': MembersRecoverError._user_not_in_team_validator, + 'team_license_limit': MembersRecoverError._team_license_limit_validator, + 'other': MembersRecoverError._other_validator, +} +MembersRecoverError._tagmap.update(UserSelectorError._tagmap) + +MembersRecoverError.user_unrecoverable = MembersRecoverError('user_unrecoverable') +MembersRecoverError.user_not_in_team = MembersRecoverError('user_not_in_team') +MembersRecoverError.team_license_limit = MembersRecoverError('team_license_limit') +MembersRecoverError.other = MembersRecoverError('other') + +MembersRemoveArg._transfer_dest_id_validator = bv.Nullable(UserSelectorArg_validator) +MembersRemoveArg._transfer_admin_id_validator = bv.Nullable(UserSelectorArg_validator) +MembersRemoveArg._keep_account_validator = bv.Boolean() +MembersRemoveArg._all_field_names_ = MembersDeactivateArg._all_field_names_.union(set([ + 'transfer_dest_id', + 'transfer_admin_id', + 'keep_account', +])) +MembersRemoveArg._all_fields_ = MembersDeactivateArg._all_fields_ + [ + ('transfer_dest_id', MembersRemoveArg._transfer_dest_id_validator), + ('transfer_admin_id', MembersRemoveArg._transfer_admin_id_validator), + ('keep_account', MembersRemoveArg._keep_account_validator), +] + +MembersTransferFilesError._removed_and_transfer_dest_should_differ_validator = bv.Void() +MembersTransferFilesError._removed_and_transfer_admin_should_differ_validator = bv.Void() +MembersTransferFilesError._transfer_dest_user_not_found_validator = bv.Void() +MembersTransferFilesError._transfer_dest_user_not_in_team_validator = bv.Void() +MembersTransferFilesError._transfer_admin_user_not_in_team_validator = bv.Void() +MembersTransferFilesError._transfer_admin_user_not_found_validator = bv.Void() +MembersTransferFilesError._unspecified_transfer_admin_id_validator = bv.Void() +MembersTransferFilesError._transfer_admin_is_not_admin_validator = bv.Void() +MembersTransferFilesError._recipient_not_verified_validator = bv.Void() +MembersTransferFilesError._tagmap = { + 'removed_and_transfer_dest_should_differ': MembersTransferFilesError._removed_and_transfer_dest_should_differ_validator, + 'removed_and_transfer_admin_should_differ': MembersTransferFilesError._removed_and_transfer_admin_should_differ_validator, + 'transfer_dest_user_not_found': MembersTransferFilesError._transfer_dest_user_not_found_validator, + 'transfer_dest_user_not_in_team': MembersTransferFilesError._transfer_dest_user_not_in_team_validator, + 'transfer_admin_user_not_in_team': MembersTransferFilesError._transfer_admin_user_not_in_team_validator, + 'transfer_admin_user_not_found': MembersTransferFilesError._transfer_admin_user_not_found_validator, + 'unspecified_transfer_admin_id': MembersTransferFilesError._unspecified_transfer_admin_id_validator, + 'transfer_admin_is_not_admin': MembersTransferFilesError._transfer_admin_is_not_admin_validator, + 'recipient_not_verified': MembersTransferFilesError._recipient_not_verified_validator, +} +MembersTransferFilesError._tagmap.update(MembersDeactivateError._tagmap) + +MembersTransferFilesError.removed_and_transfer_dest_should_differ = MembersTransferFilesError('removed_and_transfer_dest_should_differ') +MembersTransferFilesError.removed_and_transfer_admin_should_differ = MembersTransferFilesError('removed_and_transfer_admin_should_differ') +MembersTransferFilesError.transfer_dest_user_not_found = MembersTransferFilesError('transfer_dest_user_not_found') +MembersTransferFilesError.transfer_dest_user_not_in_team = MembersTransferFilesError('transfer_dest_user_not_in_team') +MembersTransferFilesError.transfer_admin_user_not_in_team = MembersTransferFilesError('transfer_admin_user_not_in_team') +MembersTransferFilesError.transfer_admin_user_not_found = MembersTransferFilesError('transfer_admin_user_not_found') +MembersTransferFilesError.unspecified_transfer_admin_id = MembersTransferFilesError('unspecified_transfer_admin_id') +MembersTransferFilesError.transfer_admin_is_not_admin = MembersTransferFilesError('transfer_admin_is_not_admin') +MembersTransferFilesError.recipient_not_verified = MembersTransferFilesError('recipient_not_verified') + +MembersRemoveError._remove_last_admin_validator = bv.Void() +MembersRemoveError._cannot_keep_account_and_transfer_validator = bv.Void() +MembersRemoveError._cannot_keep_account_and_delete_data_validator = bv.Void() +MembersRemoveError._email_address_too_long_to_be_disabled_validator = bv.Void() +MembersRemoveError._cannot_keep_invited_user_account_validator = bv.Void() +MembersRemoveError._tagmap = { + 'remove_last_admin': MembersRemoveError._remove_last_admin_validator, + 'cannot_keep_account_and_transfer': MembersRemoveError._cannot_keep_account_and_transfer_validator, + 'cannot_keep_account_and_delete_data': MembersRemoveError._cannot_keep_account_and_delete_data_validator, + 'email_address_too_long_to_be_disabled': MembersRemoveError._email_address_too_long_to_be_disabled_validator, + 'cannot_keep_invited_user_account': MembersRemoveError._cannot_keep_invited_user_account_validator, +} +MembersRemoveError._tagmap.update(MembersTransferFilesError._tagmap) + +MembersRemoveError.remove_last_admin = MembersRemoveError('remove_last_admin') +MembersRemoveError.cannot_keep_account_and_transfer = MembersRemoveError('cannot_keep_account_and_transfer') +MembersRemoveError.cannot_keep_account_and_delete_data = MembersRemoveError('cannot_keep_account_and_delete_data') +MembersRemoveError.email_address_too_long_to_be_disabled = MembersRemoveError('email_address_too_long_to_be_disabled') +MembersRemoveError.cannot_keep_invited_user_account = MembersRemoveError('cannot_keep_invited_user_account') + +MembersSendWelcomeError._other_validator = bv.Void() +MembersSendWelcomeError._tagmap = { + 'other': MembersSendWelcomeError._other_validator, +} +MembersSendWelcomeError._tagmap.update(MemberSelectorError._tagmap) + +MembersSendWelcomeError.other = MembersSendWelcomeError('other') + +MembersSetPermissionsArg._user_validator = UserSelectorArg_validator +MembersSetPermissionsArg._new_role_validator = AdminTier_validator +MembersSetPermissionsArg._all_field_names_ = set([ + 'user', + 'new_role', +]) +MembersSetPermissionsArg._all_fields_ = [ + ('user', MembersSetPermissionsArg._user_validator), + ('new_role', MembersSetPermissionsArg._new_role_validator), +] + +MembersSetPermissionsError._last_admin_validator = bv.Void() +MembersSetPermissionsError._user_not_in_team_validator = bv.Void() +MembersSetPermissionsError._cannot_set_permissions_validator = bv.Void() +MembersSetPermissionsError._team_license_limit_validator = bv.Void() +MembersSetPermissionsError._other_validator = bv.Void() +MembersSetPermissionsError._tagmap = { + 'last_admin': MembersSetPermissionsError._last_admin_validator, + 'user_not_in_team': MembersSetPermissionsError._user_not_in_team_validator, + 'cannot_set_permissions': MembersSetPermissionsError._cannot_set_permissions_validator, + 'team_license_limit': MembersSetPermissionsError._team_license_limit_validator, + 'other': MembersSetPermissionsError._other_validator, +} +MembersSetPermissionsError._tagmap.update(UserSelectorError._tagmap) + +MembersSetPermissionsError.last_admin = MembersSetPermissionsError('last_admin') +MembersSetPermissionsError.user_not_in_team = MembersSetPermissionsError('user_not_in_team') +MembersSetPermissionsError.cannot_set_permissions = MembersSetPermissionsError('cannot_set_permissions') +MembersSetPermissionsError.team_license_limit = MembersSetPermissionsError('team_license_limit') +MembersSetPermissionsError.other = MembersSetPermissionsError('other') + +MembersSetPermissionsResult._team_member_id_validator = team_common.TeamMemberId_validator +MembersSetPermissionsResult._role_validator = AdminTier_validator +MembersSetPermissionsResult._all_field_names_ = set([ + 'team_member_id', + 'role', +]) +MembersSetPermissionsResult._all_fields_ = [ + ('team_member_id', MembersSetPermissionsResult._team_member_id_validator), + ('role', MembersSetPermissionsResult._role_validator), +] + +MembersSetProfileArg._user_validator = UserSelectorArg_validator +MembersSetProfileArg._new_email_validator = bv.Nullable(common.EmailAddress_validator) +MembersSetProfileArg._new_external_id_validator = bv.Nullable(team_common.MemberExternalId_validator) +MembersSetProfileArg._new_given_name_validator = bv.Nullable(common.OptionalNamePart_validator) +MembersSetProfileArg._new_surname_validator = bv.Nullable(common.OptionalNamePart_validator) +MembersSetProfileArg._new_persistent_id_validator = bv.Nullable(bv.String()) +MembersSetProfileArg._new_is_directory_restricted_validator = bv.Nullable(bv.Boolean()) +MembersSetProfileArg._all_field_names_ = set([ + 'user', + 'new_email', + 'new_external_id', + 'new_given_name', + 'new_surname', + 'new_persistent_id', + 'new_is_directory_restricted', +]) +MembersSetProfileArg._all_fields_ = [ + ('user', MembersSetProfileArg._user_validator), + ('new_email', MembersSetProfileArg._new_email_validator), + ('new_external_id', MembersSetProfileArg._new_external_id_validator), + ('new_given_name', MembersSetProfileArg._new_given_name_validator), + ('new_surname', MembersSetProfileArg._new_surname_validator), + ('new_persistent_id', MembersSetProfileArg._new_persistent_id_validator), + ('new_is_directory_restricted', MembersSetProfileArg._new_is_directory_restricted_validator), +] + +MembersSetProfileError._external_id_and_new_external_id_unsafe_validator = bv.Void() +MembersSetProfileError._no_new_data_specified_validator = bv.Void() +MembersSetProfileError._email_reserved_for_other_user_validator = bv.Void() +MembersSetProfileError._external_id_used_by_other_user_validator = bv.Void() +MembersSetProfileError._set_profile_disallowed_validator = bv.Void() +MembersSetProfileError._param_cannot_be_empty_validator = bv.Void() +MembersSetProfileError._persistent_id_disabled_validator = bv.Void() +MembersSetProfileError._persistent_id_used_by_other_user_validator = bv.Void() +MembersSetProfileError._directory_restricted_off_validator = bv.Void() +MembersSetProfileError._other_validator = bv.Void() +MembersSetProfileError._tagmap = { + 'external_id_and_new_external_id_unsafe': MembersSetProfileError._external_id_and_new_external_id_unsafe_validator, + 'no_new_data_specified': MembersSetProfileError._no_new_data_specified_validator, + 'email_reserved_for_other_user': MembersSetProfileError._email_reserved_for_other_user_validator, + 'external_id_used_by_other_user': MembersSetProfileError._external_id_used_by_other_user_validator, + 'set_profile_disallowed': MembersSetProfileError._set_profile_disallowed_validator, + 'param_cannot_be_empty': MembersSetProfileError._param_cannot_be_empty_validator, + 'persistent_id_disabled': MembersSetProfileError._persistent_id_disabled_validator, + 'persistent_id_used_by_other_user': MembersSetProfileError._persistent_id_used_by_other_user_validator, + 'directory_restricted_off': MembersSetProfileError._directory_restricted_off_validator, + 'other': MembersSetProfileError._other_validator, +} +MembersSetProfileError._tagmap.update(MemberSelectorError._tagmap) + +MembersSetProfileError.external_id_and_new_external_id_unsafe = MembersSetProfileError('external_id_and_new_external_id_unsafe') +MembersSetProfileError.no_new_data_specified = MembersSetProfileError('no_new_data_specified') +MembersSetProfileError.email_reserved_for_other_user = MembersSetProfileError('email_reserved_for_other_user') +MembersSetProfileError.external_id_used_by_other_user = MembersSetProfileError('external_id_used_by_other_user') +MembersSetProfileError.set_profile_disallowed = MembersSetProfileError('set_profile_disallowed') +MembersSetProfileError.param_cannot_be_empty = MembersSetProfileError('param_cannot_be_empty') +MembersSetProfileError.persistent_id_disabled = MembersSetProfileError('persistent_id_disabled') +MembersSetProfileError.persistent_id_used_by_other_user = MembersSetProfileError('persistent_id_used_by_other_user') +MembersSetProfileError.directory_restricted_off = MembersSetProfileError('directory_restricted_off') +MembersSetProfileError.other = MembersSetProfileError('other') + +MembersSuspendError._suspend_inactive_user_validator = bv.Void() +MembersSuspendError._suspend_last_admin_validator = bv.Void() +MembersSuspendError._team_license_limit_validator = bv.Void() +MembersSuspendError._tagmap = { + 'suspend_inactive_user': MembersSuspendError._suspend_inactive_user_validator, + 'suspend_last_admin': MembersSuspendError._suspend_last_admin_validator, + 'team_license_limit': MembersSuspendError._team_license_limit_validator, +} +MembersSuspendError._tagmap.update(MembersDeactivateError._tagmap) + +MembersSuspendError.suspend_inactive_user = MembersSuspendError('suspend_inactive_user') +MembersSuspendError.suspend_last_admin = MembersSuspendError('suspend_last_admin') +MembersSuspendError.team_license_limit = MembersSuspendError('team_license_limit') + +MembersTransferFormerMembersFilesError._user_data_is_being_transferred_validator = bv.Void() +MembersTransferFormerMembersFilesError._user_not_removed_validator = bv.Void() +MembersTransferFormerMembersFilesError._user_data_cannot_be_transferred_validator = bv.Void() +MembersTransferFormerMembersFilesError._user_data_already_transferred_validator = bv.Void() +MembersTransferFormerMembersFilesError._tagmap = { + 'user_data_is_being_transferred': MembersTransferFormerMembersFilesError._user_data_is_being_transferred_validator, + 'user_not_removed': MembersTransferFormerMembersFilesError._user_not_removed_validator, + 'user_data_cannot_be_transferred': MembersTransferFormerMembersFilesError._user_data_cannot_be_transferred_validator, + 'user_data_already_transferred': MembersTransferFormerMembersFilesError._user_data_already_transferred_validator, +} +MembersTransferFormerMembersFilesError._tagmap.update(MembersTransferFilesError._tagmap) + +MembersTransferFormerMembersFilesError.user_data_is_being_transferred = MembersTransferFormerMembersFilesError('user_data_is_being_transferred') +MembersTransferFormerMembersFilesError.user_not_removed = MembersTransferFormerMembersFilesError('user_not_removed') +MembersTransferFormerMembersFilesError.user_data_cannot_be_transferred = MembersTransferFormerMembersFilesError('user_data_cannot_be_transferred') +MembersTransferFormerMembersFilesError.user_data_already_transferred = MembersTransferFormerMembersFilesError('user_data_already_transferred') + +MembersUnsuspendArg._user_validator = UserSelectorArg_validator +MembersUnsuspendArg._all_field_names_ = set(['user']) +MembersUnsuspendArg._all_fields_ = [('user', MembersUnsuspendArg._user_validator)] + +MembersUnsuspendError._unsuspend_non_suspended_member_validator = bv.Void() +MembersUnsuspendError._team_license_limit_validator = bv.Void() +MembersUnsuspendError._tagmap = { + 'unsuspend_non_suspended_member': MembersUnsuspendError._unsuspend_non_suspended_member_validator, + 'team_license_limit': MembersUnsuspendError._team_license_limit_validator, +} +MembersUnsuspendError._tagmap.update(MembersDeactivateError._tagmap) + +MembersUnsuspendError.unsuspend_non_suspended_member = MembersUnsuspendError('unsuspend_non_suspended_member') +MembersUnsuspendError.team_license_limit = MembersUnsuspendError('team_license_limit') + +MobileClientPlatform._iphone_validator = bv.Void() +MobileClientPlatform._ipad_validator = bv.Void() +MobileClientPlatform._android_validator = bv.Void() +MobileClientPlatform._windows_phone_validator = bv.Void() +MobileClientPlatform._blackberry_validator = bv.Void() +MobileClientPlatform._other_validator = bv.Void() +MobileClientPlatform._tagmap = { + 'iphone': MobileClientPlatform._iphone_validator, + 'ipad': MobileClientPlatform._ipad_validator, + 'android': MobileClientPlatform._android_validator, + 'windows_phone': MobileClientPlatform._windows_phone_validator, + 'blackberry': MobileClientPlatform._blackberry_validator, + 'other': MobileClientPlatform._other_validator, +} + +MobileClientPlatform.iphone = MobileClientPlatform('iphone') +MobileClientPlatform.ipad = MobileClientPlatform('ipad') +MobileClientPlatform.android = MobileClientPlatform('android') +MobileClientPlatform.windows_phone = MobileClientPlatform('windows_phone') +MobileClientPlatform.blackberry = MobileClientPlatform('blackberry') +MobileClientPlatform.other = MobileClientPlatform('other') + +MobileClientSession._device_name_validator = bv.String() +MobileClientSession._client_type_validator = MobileClientPlatform_validator +MobileClientSession._client_version_validator = bv.Nullable(bv.String()) +MobileClientSession._os_version_validator = bv.Nullable(bv.String()) +MobileClientSession._last_carrier_validator = bv.Nullable(bv.String()) +MobileClientSession._all_field_names_ = DeviceSession._all_field_names_.union(set([ + 'device_name', + 'client_type', + 'client_version', + 'os_version', + 'last_carrier', +])) +MobileClientSession._all_fields_ = DeviceSession._all_fields_ + [ + ('device_name', MobileClientSession._device_name_validator), + ('client_type', MobileClientSession._client_type_validator), + ('client_version', MobileClientSession._client_version_validator), + ('os_version', MobileClientSession._os_version_validator), + ('last_carrier', MobileClientSession._last_carrier_validator), +] + +NamespaceMetadata._name_validator = bv.String() +NamespaceMetadata._namespace_id_validator = common.SharedFolderId_validator +NamespaceMetadata._namespace_type_validator = NamespaceType_validator +NamespaceMetadata._team_member_id_validator = bv.Nullable(team_common.TeamMemberId_validator) +NamespaceMetadata._all_field_names_ = set([ + 'name', + 'namespace_id', + 'namespace_type', + 'team_member_id', +]) +NamespaceMetadata._all_fields_ = [ + ('name', NamespaceMetadata._name_validator), + ('namespace_id', NamespaceMetadata._namespace_id_validator), + ('namespace_type', NamespaceMetadata._namespace_type_validator), + ('team_member_id', NamespaceMetadata._team_member_id_validator), +] + +NamespaceType._app_folder_validator = bv.Void() +NamespaceType._shared_folder_validator = bv.Void() +NamespaceType._team_folder_validator = bv.Void() +NamespaceType._team_member_folder_validator = bv.Void() +NamespaceType._other_validator = bv.Void() +NamespaceType._tagmap = { + 'app_folder': NamespaceType._app_folder_validator, + 'shared_folder': NamespaceType._shared_folder_validator, + 'team_folder': NamespaceType._team_folder_validator, + 'team_member_folder': NamespaceType._team_member_folder_validator, + 'other': NamespaceType._other_validator, +} + +NamespaceType.app_folder = NamespaceType('app_folder') +NamespaceType.shared_folder = NamespaceType('shared_folder') +NamespaceType.team_folder = NamespaceType('team_folder') +NamespaceType.team_member_folder = NamespaceType('team_member_folder') +NamespaceType.other = NamespaceType('other') + +RemoveCustomQuotaResult._success_validator = UserSelectorArg_validator +RemoveCustomQuotaResult._invalid_user_validator = UserSelectorArg_validator +RemoveCustomQuotaResult._other_validator = bv.Void() +RemoveCustomQuotaResult._tagmap = { + 'success': RemoveCustomQuotaResult._success_validator, + 'invalid_user': RemoveCustomQuotaResult._invalid_user_validator, + 'other': RemoveCustomQuotaResult._other_validator, +} + +RemoveCustomQuotaResult.other = RemoveCustomQuotaResult('other') + +RemovedStatus._is_recoverable_validator = bv.Boolean() +RemovedStatus._is_disconnected_validator = bv.Boolean() +RemovedStatus._all_field_names_ = set([ + 'is_recoverable', + 'is_disconnected', +]) +RemovedStatus._all_fields_ = [ + ('is_recoverable', RemovedStatus._is_recoverable_validator), + ('is_disconnected', RemovedStatus._is_disconnected_validator), +] + +RevokeDesktopClientArg._delete_on_unlink_validator = bv.Boolean() +RevokeDesktopClientArg._all_field_names_ = DeviceSessionArg._all_field_names_.union(set(['delete_on_unlink'])) +RevokeDesktopClientArg._all_fields_ = DeviceSessionArg._all_fields_ + [('delete_on_unlink', RevokeDesktopClientArg._delete_on_unlink_validator)] + +RevokeDeviceSessionArg._web_session_validator = DeviceSessionArg_validator +RevokeDeviceSessionArg._desktop_client_validator = RevokeDesktopClientArg_validator +RevokeDeviceSessionArg._mobile_client_validator = DeviceSessionArg_validator +RevokeDeviceSessionArg._tagmap = { + 'web_session': RevokeDeviceSessionArg._web_session_validator, + 'desktop_client': RevokeDeviceSessionArg._desktop_client_validator, + 'mobile_client': RevokeDeviceSessionArg._mobile_client_validator, +} + +RevokeDeviceSessionBatchArg._revoke_devices_validator = bv.List(RevokeDeviceSessionArg_validator) +RevokeDeviceSessionBatchArg._all_field_names_ = set(['revoke_devices']) +RevokeDeviceSessionBatchArg._all_fields_ = [('revoke_devices', RevokeDeviceSessionBatchArg._revoke_devices_validator)] + +RevokeDeviceSessionBatchError._other_validator = bv.Void() +RevokeDeviceSessionBatchError._tagmap = { + 'other': RevokeDeviceSessionBatchError._other_validator, +} + +RevokeDeviceSessionBatchError.other = RevokeDeviceSessionBatchError('other') + +RevokeDeviceSessionBatchResult._revoke_devices_status_validator = bv.List(RevokeDeviceSessionStatus_validator) +RevokeDeviceSessionBatchResult._all_field_names_ = set(['revoke_devices_status']) +RevokeDeviceSessionBatchResult._all_fields_ = [('revoke_devices_status', RevokeDeviceSessionBatchResult._revoke_devices_status_validator)] + +RevokeDeviceSessionError._device_session_not_found_validator = bv.Void() +RevokeDeviceSessionError._member_not_found_validator = bv.Void() +RevokeDeviceSessionError._other_validator = bv.Void() +RevokeDeviceSessionError._tagmap = { + 'device_session_not_found': RevokeDeviceSessionError._device_session_not_found_validator, + 'member_not_found': RevokeDeviceSessionError._member_not_found_validator, + 'other': RevokeDeviceSessionError._other_validator, +} + +RevokeDeviceSessionError.device_session_not_found = RevokeDeviceSessionError('device_session_not_found') +RevokeDeviceSessionError.member_not_found = RevokeDeviceSessionError('member_not_found') +RevokeDeviceSessionError.other = RevokeDeviceSessionError('other') + +RevokeDeviceSessionStatus._success_validator = bv.Boolean() +RevokeDeviceSessionStatus._error_type_validator = bv.Nullable(RevokeDeviceSessionError_validator) +RevokeDeviceSessionStatus._all_field_names_ = set([ + 'success', + 'error_type', +]) +RevokeDeviceSessionStatus._all_fields_ = [ + ('success', RevokeDeviceSessionStatus._success_validator), + ('error_type', RevokeDeviceSessionStatus._error_type_validator), +] + +RevokeLinkedApiAppArg._app_id_validator = bv.String() +RevokeLinkedApiAppArg._team_member_id_validator = bv.String() +RevokeLinkedApiAppArg._keep_app_folder_validator = bv.Boolean() +RevokeLinkedApiAppArg._all_field_names_ = set([ + 'app_id', + 'team_member_id', + 'keep_app_folder', +]) +RevokeLinkedApiAppArg._all_fields_ = [ + ('app_id', RevokeLinkedApiAppArg._app_id_validator), + ('team_member_id', RevokeLinkedApiAppArg._team_member_id_validator), + ('keep_app_folder', RevokeLinkedApiAppArg._keep_app_folder_validator), +] + +RevokeLinkedApiAppBatchArg._revoke_linked_app_validator = bv.List(RevokeLinkedApiAppArg_validator) +RevokeLinkedApiAppBatchArg._all_field_names_ = set(['revoke_linked_app']) +RevokeLinkedApiAppBatchArg._all_fields_ = [('revoke_linked_app', RevokeLinkedApiAppBatchArg._revoke_linked_app_validator)] + +RevokeLinkedAppBatchError._other_validator = bv.Void() +RevokeLinkedAppBatchError._tagmap = { + 'other': RevokeLinkedAppBatchError._other_validator, +} + +RevokeLinkedAppBatchError.other = RevokeLinkedAppBatchError('other') + +RevokeLinkedAppBatchResult._revoke_linked_app_status_validator = bv.List(RevokeLinkedAppStatus_validator) +RevokeLinkedAppBatchResult._all_field_names_ = set(['revoke_linked_app_status']) +RevokeLinkedAppBatchResult._all_fields_ = [('revoke_linked_app_status', RevokeLinkedAppBatchResult._revoke_linked_app_status_validator)] + +RevokeLinkedAppError._app_not_found_validator = bv.Void() +RevokeLinkedAppError._member_not_found_validator = bv.Void() +RevokeLinkedAppError._other_validator = bv.Void() +RevokeLinkedAppError._tagmap = { + 'app_not_found': RevokeLinkedAppError._app_not_found_validator, + 'member_not_found': RevokeLinkedAppError._member_not_found_validator, + 'other': RevokeLinkedAppError._other_validator, +} + +RevokeLinkedAppError.app_not_found = RevokeLinkedAppError('app_not_found') +RevokeLinkedAppError.member_not_found = RevokeLinkedAppError('member_not_found') +RevokeLinkedAppError.other = RevokeLinkedAppError('other') + +RevokeLinkedAppStatus._success_validator = bv.Boolean() +RevokeLinkedAppStatus._error_type_validator = bv.Nullable(RevokeLinkedAppError_validator) +RevokeLinkedAppStatus._all_field_names_ = set([ + 'success', + 'error_type', +]) +RevokeLinkedAppStatus._all_fields_ = [ + ('success', RevokeLinkedAppStatus._success_validator), + ('error_type', RevokeLinkedAppStatus._error_type_validator), +] + +SetCustomQuotaArg._users_and_quotas_validator = bv.List(UserCustomQuotaArg_validator) +SetCustomQuotaArg._all_field_names_ = set(['users_and_quotas']) +SetCustomQuotaArg._all_fields_ = [('users_and_quotas', SetCustomQuotaArg._users_and_quotas_validator)] + +SetCustomQuotaError._some_users_are_excluded_validator = bv.Void() +SetCustomQuotaError._tagmap = { + 'some_users_are_excluded': SetCustomQuotaError._some_users_are_excluded_validator, +} +SetCustomQuotaError._tagmap.update(CustomQuotaError._tagmap) + +SetCustomQuotaError.some_users_are_excluded = SetCustomQuotaError('some_users_are_excluded') + +StorageBucket._bucket_validator = bv.String() +StorageBucket._users_validator = bv.UInt64() +StorageBucket._all_field_names_ = set([ + 'bucket', + 'users', +]) +StorageBucket._all_fields_ = [ + ('bucket', StorageBucket._bucket_validator), + ('users', StorageBucket._users_validator), +] + +TeamFolderAccessError._invalid_team_folder_id_validator = bv.Void() +TeamFolderAccessError._no_access_validator = bv.Void() +TeamFolderAccessError._other_validator = bv.Void() +TeamFolderAccessError._tagmap = { + 'invalid_team_folder_id': TeamFolderAccessError._invalid_team_folder_id_validator, + 'no_access': TeamFolderAccessError._no_access_validator, + 'other': TeamFolderAccessError._other_validator, +} + +TeamFolderAccessError.invalid_team_folder_id = TeamFolderAccessError('invalid_team_folder_id') +TeamFolderAccessError.no_access = TeamFolderAccessError('no_access') +TeamFolderAccessError.other = TeamFolderAccessError('other') + +TeamFolderActivateError._tagmap = { +} +TeamFolderActivateError._tagmap.update(BaseTeamFolderError._tagmap) + +TeamFolderIdArg._team_folder_id_validator = common.SharedFolderId_validator +TeamFolderIdArg._all_field_names_ = set(['team_folder_id']) +TeamFolderIdArg._all_fields_ = [('team_folder_id', TeamFolderIdArg._team_folder_id_validator)] + +TeamFolderArchiveArg._force_async_off_validator = bv.Boolean() +TeamFolderArchiveArg._all_field_names_ = TeamFolderIdArg._all_field_names_.union(set(['force_async_off'])) +TeamFolderArchiveArg._all_fields_ = TeamFolderIdArg._all_fields_ + [('force_async_off', TeamFolderArchiveArg._force_async_off_validator)] + +TeamFolderArchiveError._tagmap = { +} +TeamFolderArchiveError._tagmap.update(BaseTeamFolderError._tagmap) + +TeamFolderArchiveJobStatus._complete_validator = TeamFolderMetadata_validator +TeamFolderArchiveJobStatus._failed_validator = TeamFolderArchiveError_validator +TeamFolderArchiveJobStatus._tagmap = { + 'complete': TeamFolderArchiveJobStatus._complete_validator, + 'failed': TeamFolderArchiveJobStatus._failed_validator, +} +TeamFolderArchiveJobStatus._tagmap.update(async_.PollResultBase._tagmap) + +TeamFolderArchiveLaunch._complete_validator = TeamFolderMetadata_validator +TeamFolderArchiveLaunch._tagmap = { + 'complete': TeamFolderArchiveLaunch._complete_validator, +} +TeamFolderArchiveLaunch._tagmap.update(async_.LaunchResultBase._tagmap) + +TeamFolderCreateArg._name_validator = bv.String() +TeamFolderCreateArg._sync_setting_validator = bv.Nullable(files.SyncSettingArg_validator) +TeamFolderCreateArg._all_field_names_ = set([ + 'name', + 'sync_setting', +]) +TeamFolderCreateArg._all_fields_ = [ + ('name', TeamFolderCreateArg._name_validator), + ('sync_setting', TeamFolderCreateArg._sync_setting_validator), +] + +TeamFolderCreateError._invalid_folder_name_validator = bv.Void() +TeamFolderCreateError._folder_name_already_used_validator = bv.Void() +TeamFolderCreateError._folder_name_reserved_validator = bv.Void() +TeamFolderCreateError._sync_settings_error_validator = files.SyncSettingsError_validator +TeamFolderCreateError._other_validator = bv.Void() +TeamFolderCreateError._tagmap = { + 'invalid_folder_name': TeamFolderCreateError._invalid_folder_name_validator, + 'folder_name_already_used': TeamFolderCreateError._folder_name_already_used_validator, + 'folder_name_reserved': TeamFolderCreateError._folder_name_reserved_validator, + 'sync_settings_error': TeamFolderCreateError._sync_settings_error_validator, + 'other': TeamFolderCreateError._other_validator, +} + +TeamFolderCreateError.invalid_folder_name = TeamFolderCreateError('invalid_folder_name') +TeamFolderCreateError.folder_name_already_used = TeamFolderCreateError('folder_name_already_used') +TeamFolderCreateError.folder_name_reserved = TeamFolderCreateError('folder_name_reserved') +TeamFolderCreateError.other = TeamFolderCreateError('other') + +TeamFolderGetInfoItem._id_not_found_validator = bv.String() +TeamFolderGetInfoItem._team_folder_metadata_validator = TeamFolderMetadata_validator +TeamFolderGetInfoItem._tagmap = { + 'id_not_found': TeamFolderGetInfoItem._id_not_found_validator, + 'team_folder_metadata': TeamFolderGetInfoItem._team_folder_metadata_validator, +} + +TeamFolderIdListArg._team_folder_ids_validator = bv.List(common.SharedFolderId_validator, min_items=1) +TeamFolderIdListArg._all_field_names_ = set(['team_folder_ids']) +TeamFolderIdListArg._all_fields_ = [('team_folder_ids', TeamFolderIdListArg._team_folder_ids_validator)] + +TeamFolderInvalidStatusError._active_validator = bv.Void() +TeamFolderInvalidStatusError._archived_validator = bv.Void() +TeamFolderInvalidStatusError._archive_in_progress_validator = bv.Void() +TeamFolderInvalidStatusError._other_validator = bv.Void() +TeamFolderInvalidStatusError._tagmap = { + 'active': TeamFolderInvalidStatusError._active_validator, + 'archived': TeamFolderInvalidStatusError._archived_validator, + 'archive_in_progress': TeamFolderInvalidStatusError._archive_in_progress_validator, + 'other': TeamFolderInvalidStatusError._other_validator, +} + +TeamFolderInvalidStatusError.active = TeamFolderInvalidStatusError('active') +TeamFolderInvalidStatusError.archived = TeamFolderInvalidStatusError('archived') +TeamFolderInvalidStatusError.archive_in_progress = TeamFolderInvalidStatusError('archive_in_progress') +TeamFolderInvalidStatusError.other = TeamFolderInvalidStatusError('other') + +TeamFolderListArg._limit_validator = bv.UInt32(min_value=1, max_value=1000) +TeamFolderListArg._all_field_names_ = set(['limit']) +TeamFolderListArg._all_fields_ = [('limit', TeamFolderListArg._limit_validator)] + +TeamFolderListContinueArg._cursor_validator = bv.String() +TeamFolderListContinueArg._all_field_names_ = set(['cursor']) +TeamFolderListContinueArg._all_fields_ = [('cursor', TeamFolderListContinueArg._cursor_validator)] + +TeamFolderListContinueError._invalid_cursor_validator = bv.Void() +TeamFolderListContinueError._other_validator = bv.Void() +TeamFolderListContinueError._tagmap = { + 'invalid_cursor': TeamFolderListContinueError._invalid_cursor_validator, + 'other': TeamFolderListContinueError._other_validator, +} + +TeamFolderListContinueError.invalid_cursor = TeamFolderListContinueError('invalid_cursor') +TeamFolderListContinueError.other = TeamFolderListContinueError('other') + +TeamFolderListError._access_error_validator = TeamFolderAccessError_validator +TeamFolderListError._all_field_names_ = set(['access_error']) +TeamFolderListError._all_fields_ = [('access_error', TeamFolderListError._access_error_validator)] + +TeamFolderListResult._team_folders_validator = bv.List(TeamFolderMetadata_validator) +TeamFolderListResult._cursor_validator = bv.String() +TeamFolderListResult._has_more_validator = bv.Boolean() +TeamFolderListResult._all_field_names_ = set([ + 'team_folders', + 'cursor', + 'has_more', +]) +TeamFolderListResult._all_fields_ = [ + ('team_folders', TeamFolderListResult._team_folders_validator), + ('cursor', TeamFolderListResult._cursor_validator), + ('has_more', TeamFolderListResult._has_more_validator), +] + +TeamFolderMetadata._team_folder_id_validator = common.SharedFolderId_validator +TeamFolderMetadata._name_validator = bv.String() +TeamFolderMetadata._status_validator = TeamFolderStatus_validator +TeamFolderMetadata._is_team_shared_dropbox_validator = bv.Boolean() +TeamFolderMetadata._sync_setting_validator = files.SyncSetting_validator +TeamFolderMetadata._content_sync_settings_validator = bv.List(files.ContentSyncSetting_validator) +TeamFolderMetadata._all_field_names_ = set([ + 'team_folder_id', + 'name', + 'status', + 'is_team_shared_dropbox', + 'sync_setting', + 'content_sync_settings', +]) +TeamFolderMetadata._all_fields_ = [ + ('team_folder_id', TeamFolderMetadata._team_folder_id_validator), + ('name', TeamFolderMetadata._name_validator), + ('status', TeamFolderMetadata._status_validator), + ('is_team_shared_dropbox', TeamFolderMetadata._is_team_shared_dropbox_validator), + ('sync_setting', TeamFolderMetadata._sync_setting_validator), + ('content_sync_settings', TeamFolderMetadata._content_sync_settings_validator), +] + +TeamFolderPermanentlyDeleteError._tagmap = { +} +TeamFolderPermanentlyDeleteError._tagmap.update(BaseTeamFolderError._tagmap) + +TeamFolderRenameArg._name_validator = bv.String() +TeamFolderRenameArg._all_field_names_ = TeamFolderIdArg._all_field_names_.union(set(['name'])) +TeamFolderRenameArg._all_fields_ = TeamFolderIdArg._all_fields_ + [('name', TeamFolderRenameArg._name_validator)] + +TeamFolderRenameError._invalid_folder_name_validator = bv.Void() +TeamFolderRenameError._folder_name_already_used_validator = bv.Void() +TeamFolderRenameError._folder_name_reserved_validator = bv.Void() +TeamFolderRenameError._tagmap = { + 'invalid_folder_name': TeamFolderRenameError._invalid_folder_name_validator, + 'folder_name_already_used': TeamFolderRenameError._folder_name_already_used_validator, + 'folder_name_reserved': TeamFolderRenameError._folder_name_reserved_validator, +} +TeamFolderRenameError._tagmap.update(BaseTeamFolderError._tagmap) + +TeamFolderRenameError.invalid_folder_name = TeamFolderRenameError('invalid_folder_name') +TeamFolderRenameError.folder_name_already_used = TeamFolderRenameError('folder_name_already_used') +TeamFolderRenameError.folder_name_reserved = TeamFolderRenameError('folder_name_reserved') + +TeamFolderStatus._active_validator = bv.Void() +TeamFolderStatus._archived_validator = bv.Void() +TeamFolderStatus._archive_in_progress_validator = bv.Void() +TeamFolderStatus._other_validator = bv.Void() +TeamFolderStatus._tagmap = { + 'active': TeamFolderStatus._active_validator, + 'archived': TeamFolderStatus._archived_validator, + 'archive_in_progress': TeamFolderStatus._archive_in_progress_validator, + 'other': TeamFolderStatus._other_validator, +} + +TeamFolderStatus.active = TeamFolderStatus('active') +TeamFolderStatus.archived = TeamFolderStatus('archived') +TeamFolderStatus.archive_in_progress = TeamFolderStatus('archive_in_progress') +TeamFolderStatus.other = TeamFolderStatus('other') + +TeamFolderTeamSharedDropboxError._disallowed_validator = bv.Void() +TeamFolderTeamSharedDropboxError._other_validator = bv.Void() +TeamFolderTeamSharedDropboxError._tagmap = { + 'disallowed': TeamFolderTeamSharedDropboxError._disallowed_validator, + 'other': TeamFolderTeamSharedDropboxError._other_validator, +} + +TeamFolderTeamSharedDropboxError.disallowed = TeamFolderTeamSharedDropboxError('disallowed') +TeamFolderTeamSharedDropboxError.other = TeamFolderTeamSharedDropboxError('other') + +TeamFolderUpdateSyncSettingsArg._sync_setting_validator = bv.Nullable(files.SyncSettingArg_validator) +TeamFolderUpdateSyncSettingsArg._content_sync_settings_validator = bv.Nullable(bv.List(files.ContentSyncSettingArg_validator)) +TeamFolderUpdateSyncSettingsArg._all_field_names_ = TeamFolderIdArg._all_field_names_.union(set([ + 'sync_setting', + 'content_sync_settings', +])) +TeamFolderUpdateSyncSettingsArg._all_fields_ = TeamFolderIdArg._all_fields_ + [ + ('sync_setting', TeamFolderUpdateSyncSettingsArg._sync_setting_validator), + ('content_sync_settings', TeamFolderUpdateSyncSettingsArg._content_sync_settings_validator), +] + +TeamFolderUpdateSyncSettingsError._sync_settings_error_validator = files.SyncSettingsError_validator +TeamFolderUpdateSyncSettingsError._tagmap = { + 'sync_settings_error': TeamFolderUpdateSyncSettingsError._sync_settings_error_validator, +} +TeamFolderUpdateSyncSettingsError._tagmap.update(BaseTeamFolderError._tagmap) + +TeamGetInfoResult._name_validator = bv.String() +TeamGetInfoResult._team_id_validator = bv.String() +TeamGetInfoResult._num_licensed_users_validator = bv.UInt32() +TeamGetInfoResult._num_provisioned_users_validator = bv.UInt32() +TeamGetInfoResult._policies_validator = team_policies.TeamMemberPolicies_validator +TeamGetInfoResult._all_field_names_ = set([ + 'name', + 'team_id', + 'num_licensed_users', + 'num_provisioned_users', + 'policies', +]) +TeamGetInfoResult._all_fields_ = [ + ('name', TeamGetInfoResult._name_validator), + ('team_id', TeamGetInfoResult._team_id_validator), + ('num_licensed_users', TeamGetInfoResult._num_licensed_users_validator), + ('num_provisioned_users', TeamGetInfoResult._num_provisioned_users_validator), + ('policies', TeamGetInfoResult._policies_validator), +] + +TeamMemberInfo._profile_validator = TeamMemberProfile_validator +TeamMemberInfo._role_validator = AdminTier_validator +TeamMemberInfo._all_field_names_ = set([ + 'profile', + 'role', +]) +TeamMemberInfo._all_fields_ = [ + ('profile', TeamMemberInfo._profile_validator), + ('role', TeamMemberInfo._role_validator), +] + +TeamMemberProfile._groups_validator = bv.List(team_common.GroupId_validator) +TeamMemberProfile._member_folder_id_validator = common.NamespaceId_validator +TeamMemberProfile._all_field_names_ = MemberProfile._all_field_names_.union(set([ + 'groups', + 'member_folder_id', +])) +TeamMemberProfile._all_fields_ = MemberProfile._all_fields_ + [ + ('groups', TeamMemberProfile._groups_validator), + ('member_folder_id', TeamMemberProfile._member_folder_id_validator), +] + +TeamMemberStatus._active_validator = bv.Void() +TeamMemberStatus._invited_validator = bv.Void() +TeamMemberStatus._suspended_validator = bv.Void() +TeamMemberStatus._removed_validator = RemovedStatus_validator +TeamMemberStatus._tagmap = { + 'active': TeamMemberStatus._active_validator, + 'invited': TeamMemberStatus._invited_validator, + 'suspended': TeamMemberStatus._suspended_validator, + 'removed': TeamMemberStatus._removed_validator, +} + +TeamMemberStatus.active = TeamMemberStatus('active') +TeamMemberStatus.invited = TeamMemberStatus('invited') +TeamMemberStatus.suspended = TeamMemberStatus('suspended') + +TeamMembershipType._full_validator = bv.Void() +TeamMembershipType._limited_validator = bv.Void() +TeamMembershipType._tagmap = { + 'full': TeamMembershipType._full_validator, + 'limited': TeamMembershipType._limited_validator, +} + +TeamMembershipType.full = TeamMembershipType('full') +TeamMembershipType.limited = TeamMembershipType('limited') + +TeamNamespacesListArg._limit_validator = bv.UInt32(min_value=1, max_value=1000) +TeamNamespacesListArg._all_field_names_ = set(['limit']) +TeamNamespacesListArg._all_fields_ = [('limit', TeamNamespacesListArg._limit_validator)] + +TeamNamespacesListContinueArg._cursor_validator = bv.String() +TeamNamespacesListContinueArg._all_field_names_ = set(['cursor']) +TeamNamespacesListContinueArg._all_fields_ = [('cursor', TeamNamespacesListContinueArg._cursor_validator)] + +TeamNamespacesListError._invalid_arg_validator = bv.Void() +TeamNamespacesListError._other_validator = bv.Void() +TeamNamespacesListError._tagmap = { + 'invalid_arg': TeamNamespacesListError._invalid_arg_validator, + 'other': TeamNamespacesListError._other_validator, +} + +TeamNamespacesListError.invalid_arg = TeamNamespacesListError('invalid_arg') +TeamNamespacesListError.other = TeamNamespacesListError('other') + +TeamNamespacesListContinueError._invalid_cursor_validator = bv.Void() +TeamNamespacesListContinueError._tagmap = { + 'invalid_cursor': TeamNamespacesListContinueError._invalid_cursor_validator, +} +TeamNamespacesListContinueError._tagmap.update(TeamNamespacesListError._tagmap) + +TeamNamespacesListContinueError.invalid_cursor = TeamNamespacesListContinueError('invalid_cursor') + +TeamNamespacesListResult._namespaces_validator = bv.List(NamespaceMetadata_validator) +TeamNamespacesListResult._cursor_validator = bv.String() +TeamNamespacesListResult._has_more_validator = bv.Boolean() +TeamNamespacesListResult._all_field_names_ = set([ + 'namespaces', + 'cursor', + 'has_more', +]) +TeamNamespacesListResult._all_fields_ = [ + ('namespaces', TeamNamespacesListResult._namespaces_validator), + ('cursor', TeamNamespacesListResult._cursor_validator), + ('has_more', TeamNamespacesListResult._has_more_validator), +] + +TokenGetAuthenticatedAdminError._mapping_not_found_validator = bv.Void() +TokenGetAuthenticatedAdminError._admin_not_active_validator = bv.Void() +TokenGetAuthenticatedAdminError._other_validator = bv.Void() +TokenGetAuthenticatedAdminError._tagmap = { + 'mapping_not_found': TokenGetAuthenticatedAdminError._mapping_not_found_validator, + 'admin_not_active': TokenGetAuthenticatedAdminError._admin_not_active_validator, + 'other': TokenGetAuthenticatedAdminError._other_validator, +} + +TokenGetAuthenticatedAdminError.mapping_not_found = TokenGetAuthenticatedAdminError('mapping_not_found') +TokenGetAuthenticatedAdminError.admin_not_active = TokenGetAuthenticatedAdminError('admin_not_active') +TokenGetAuthenticatedAdminError.other = TokenGetAuthenticatedAdminError('other') + +TokenGetAuthenticatedAdminResult._admin_profile_validator = TeamMemberProfile_validator +TokenGetAuthenticatedAdminResult._all_field_names_ = set(['admin_profile']) +TokenGetAuthenticatedAdminResult._all_fields_ = [('admin_profile', TokenGetAuthenticatedAdminResult._admin_profile_validator)] + +UploadApiRateLimitValue._unlimited_validator = bv.Void() +UploadApiRateLimitValue._limit_validator = bv.UInt32() +UploadApiRateLimitValue._other_validator = bv.Void() +UploadApiRateLimitValue._tagmap = { + 'unlimited': UploadApiRateLimitValue._unlimited_validator, + 'limit': UploadApiRateLimitValue._limit_validator, + 'other': UploadApiRateLimitValue._other_validator, +} + +UploadApiRateLimitValue.unlimited = UploadApiRateLimitValue('unlimited') +UploadApiRateLimitValue.other = UploadApiRateLimitValue('other') + +UserCustomQuotaArg._user_validator = UserSelectorArg_validator +UserCustomQuotaArg._quota_gb_validator = UserQuota_validator +UserCustomQuotaArg._all_field_names_ = set([ + 'user', + 'quota_gb', +]) +UserCustomQuotaArg._all_fields_ = [ + ('user', UserCustomQuotaArg._user_validator), + ('quota_gb', UserCustomQuotaArg._quota_gb_validator), +] + +UserCustomQuotaResult._user_validator = UserSelectorArg_validator +UserCustomQuotaResult._quota_gb_validator = bv.Nullable(UserQuota_validator) +UserCustomQuotaResult._all_field_names_ = set([ + 'user', + 'quota_gb', +]) +UserCustomQuotaResult._all_fields_ = [ + ('user', UserCustomQuotaResult._user_validator), + ('quota_gb', UserCustomQuotaResult._quota_gb_validator), +] + +UserSelectorArg._team_member_id_validator = team_common.TeamMemberId_validator +UserSelectorArg._external_id_validator = team_common.MemberExternalId_validator +UserSelectorArg._email_validator = common.EmailAddress_validator +UserSelectorArg._tagmap = { + 'team_member_id': UserSelectorArg._team_member_id_validator, + 'external_id': UserSelectorArg._external_id_validator, + 'email': UserSelectorArg._email_validator, +} + +UsersSelectorArg._team_member_ids_validator = bv.List(team_common.TeamMemberId_validator) +UsersSelectorArg._external_ids_validator = bv.List(team_common.MemberExternalId_validator) +UsersSelectorArg._emails_validator = bv.List(common.EmailAddress_validator) +UsersSelectorArg._tagmap = { + 'team_member_ids': UsersSelectorArg._team_member_ids_validator, + 'external_ids': UsersSelectorArg._external_ids_validator, + 'emails': UsersSelectorArg._emails_validator, +} + +devices_list_member_devices = bb.Route( + 'devices/list_member_devices', + 1, + False, + ListMemberDevicesArg_validator, + ListMemberDevicesResult_validator, + ListMemberDevicesError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +devices_list_members_devices = bb.Route( + 'devices/list_members_devices', + 1, + False, + ListMembersDevicesArg_validator, + ListMembersDevicesResult_validator, + ListMembersDevicesError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +devices_list_team_devices = bb.Route( + 'devices/list_team_devices', + 1, + True, + ListTeamDevicesArg_validator, + ListTeamDevicesResult_validator, + ListTeamDevicesError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +devices_revoke_device_session = bb.Route( + 'devices/revoke_device_session', + 1, + False, + RevokeDeviceSessionArg_validator, + bv.Void(), + RevokeDeviceSessionError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +devices_revoke_device_session_batch = bb.Route( + 'devices/revoke_device_session_batch', + 1, + False, + RevokeDeviceSessionBatchArg_validator, + RevokeDeviceSessionBatchResult_validator, + RevokeDeviceSessionBatchError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +features_get_values = bb.Route( + 'features/get_values', + 1, + False, + FeaturesGetValuesBatchArg_validator, + FeaturesGetValuesBatchResult_validator, + FeaturesGetValuesBatchError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +get_info = bb.Route( + 'get_info', + 1, + False, + bv.Void(), + TeamGetInfoResult_validator, + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) +groups_create = bb.Route( + 'groups/create', + 1, + False, + GroupCreateArg_validator, + GroupFullInfo_validator, + GroupCreateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +groups_delete = bb.Route( + 'groups/delete', + 1, + False, + GroupSelector_validator, + async_.LaunchEmptyResult_validator, + GroupDeleteError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +groups_get_info = bb.Route( + 'groups/get_info', + 1, + False, + GroupsSelector_validator, + GroupsGetInfoResult_validator, + GroupsGetInfoError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +groups_job_status_get = bb.Route( + 'groups/job_status/get', + 1, + False, + async_.PollArg_validator, + async_.PollEmptyResult_validator, + GroupsPollError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +groups_list = bb.Route( + 'groups/list', + 1, + False, + GroupsListArg_validator, + GroupsListResult_validator, + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) +groups_list_continue = bb.Route( + 'groups/list/continue', + 1, + False, + GroupsListContinueArg_validator, + GroupsListResult_validator, + GroupsListContinueError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +groups_members_add = bb.Route( + 'groups/members/add', + 1, + False, + GroupMembersAddArg_validator, + GroupMembersChangeResult_validator, + GroupMembersAddError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +groups_members_list = bb.Route( + 'groups/members/list', + 1, + False, + GroupsMembersListArg_validator, + GroupsMembersListResult_validator, + GroupSelectorError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +groups_members_list_continue = bb.Route( + 'groups/members/list/continue', + 1, + False, + GroupsMembersListContinueArg_validator, + GroupsMembersListResult_validator, + GroupsMembersListContinueError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +groups_members_remove = bb.Route( + 'groups/members/remove', + 1, + False, + GroupMembersRemoveArg_validator, + GroupMembersChangeResult_validator, + GroupMembersRemoveError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +groups_members_set_access_type = bb.Route( + 'groups/members/set_access_type', + 1, + False, + GroupMembersSetAccessTypeArg_validator, + GroupsGetInfoResult_validator, + GroupMemberSetAccessTypeError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +groups_update = bb.Route( + 'groups/update', + 1, + False, + GroupUpdateArgs_validator, + GroupFullInfo_validator, + GroupUpdateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +linked_apps_list_member_linked_apps = bb.Route( + 'linked_apps/list_member_linked_apps', + 1, + False, + ListMemberAppsArg_validator, + ListMemberAppsResult_validator, + ListMemberAppsError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +linked_apps_list_members_linked_apps = bb.Route( + 'linked_apps/list_members_linked_apps', + 1, + False, + ListMembersAppsArg_validator, + ListMembersAppsResult_validator, + ListMembersAppsError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +linked_apps_list_team_linked_apps = bb.Route( + 'linked_apps/list_team_linked_apps', + 1, + True, + ListTeamAppsArg_validator, + ListTeamAppsResult_validator, + ListTeamAppsError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +linked_apps_revoke_linked_app = bb.Route( + 'linked_apps/revoke_linked_app', + 1, + False, + RevokeLinkedApiAppArg_validator, + bv.Void(), + RevokeLinkedAppError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +linked_apps_revoke_linked_app_batch = bb.Route( + 'linked_apps/revoke_linked_app_batch', + 1, + False, + RevokeLinkedApiAppBatchArg_validator, + RevokeLinkedAppBatchResult_validator, + RevokeLinkedAppBatchError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +member_space_limits_excluded_users_add = bb.Route( + 'member_space_limits/excluded_users/add', + 1, + False, + ExcludedUsersUpdateArg_validator, + ExcludedUsersUpdateResult_validator, + ExcludedUsersUpdateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +member_space_limits_excluded_users_list = bb.Route( + 'member_space_limits/excluded_users/list', + 1, + False, + ExcludedUsersListArg_validator, + ExcludedUsersListResult_validator, + ExcludedUsersListError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +member_space_limits_excluded_users_list_continue = bb.Route( + 'member_space_limits/excluded_users/list/continue', + 1, + False, + ExcludedUsersListContinueArg_validator, + ExcludedUsersListResult_validator, + ExcludedUsersListContinueError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +member_space_limits_excluded_users_remove = bb.Route( + 'member_space_limits/excluded_users/remove', + 1, + False, + ExcludedUsersUpdateArg_validator, + ExcludedUsersUpdateResult_validator, + ExcludedUsersUpdateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +member_space_limits_get_custom_quota = bb.Route( + 'member_space_limits/get_custom_quota', + 1, + False, + CustomQuotaUsersArg_validator, + bv.List(CustomQuotaResult_validator), + CustomQuotaError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +member_space_limits_remove_custom_quota = bb.Route( + 'member_space_limits/remove_custom_quota', + 1, + False, + CustomQuotaUsersArg_validator, + bv.List(RemoveCustomQuotaResult_validator), + CustomQuotaError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +member_space_limits_set_custom_quota = bb.Route( + 'member_space_limits/set_custom_quota', + 1, + False, + SetCustomQuotaArg_validator, + bv.List(CustomQuotaResult_validator), + SetCustomQuotaError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +members_add = bb.Route( + 'members/add', + 1, + False, + MembersAddArg_validator, + MembersAddLaunch_validator, + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) +members_add_job_status_get = bb.Route( + 'members/add/job_status/get', + 1, + False, + async_.PollArg_validator, + MembersAddJobStatus_validator, + async_.PollError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +members_get_info = bb.Route( + 'members/get_info', + 1, + False, + MembersGetInfoArgs_validator, + MembersGetInfoResult_validator, + MembersGetInfoError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +members_list = bb.Route( + 'members/list', + 1, + False, + MembersListArg_validator, + MembersListResult_validator, + MembersListError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +members_list_continue = bb.Route( + 'members/list/continue', + 1, + False, + MembersListContinueArg_validator, + MembersListResult_validator, + MembersListContinueError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +members_move_former_member_files = bb.Route( + 'members/move_former_member_files', + 1, + False, + MembersDataTransferArg_validator, + async_.LaunchEmptyResult_validator, + MembersTransferFormerMembersFilesError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +members_move_former_member_files_job_status_check = bb.Route( + 'members/move_former_member_files/job_status/check', + 1, + False, + async_.PollArg_validator, + async_.PollEmptyResult_validator, + async_.PollError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +members_recover = bb.Route( + 'members/recover', + 1, + False, + MembersRecoverArg_validator, + bv.Void(), + MembersRecoverError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +members_remove = bb.Route( + 'members/remove', + 1, + False, + MembersRemoveArg_validator, + async_.LaunchEmptyResult_validator, + MembersRemoveError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +members_remove_job_status_get = bb.Route( + 'members/remove/job_status/get', + 1, + False, + async_.PollArg_validator, + async_.PollEmptyResult_validator, + async_.PollError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +members_send_welcome_email = bb.Route( + 'members/send_welcome_email', + 1, + False, + UserSelectorArg_validator, + bv.Void(), + MembersSendWelcomeError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +members_set_admin_permissions = bb.Route( + 'members/set_admin_permissions', + 1, + False, + MembersSetPermissionsArg_validator, + MembersSetPermissionsResult_validator, + MembersSetPermissionsError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +members_set_profile = bb.Route( + 'members/set_profile', + 1, + False, + MembersSetProfileArg_validator, + TeamMemberInfo_validator, + MembersSetProfileError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +members_suspend = bb.Route( + 'members/suspend', + 1, + False, + MembersDeactivateArg_validator, + bv.Void(), + MembersSuspendError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +members_unsuspend = bb.Route( + 'members/unsuspend', + 1, + False, + MembersUnsuspendArg_validator, + bv.Void(), + MembersUnsuspendError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +namespaces_list = bb.Route( + 'namespaces/list', + 1, + False, + TeamNamespacesListArg_validator, + TeamNamespacesListResult_validator, + TeamNamespacesListError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +namespaces_list_continue = bb.Route( + 'namespaces/list/continue', + 1, + False, + TeamNamespacesListContinueArg_validator, + TeamNamespacesListResult_validator, + TeamNamespacesListContinueError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +properties_template_add = bb.Route( + 'properties/template/add', + 1, + True, + file_properties.AddTemplateArg_validator, + file_properties.AddTemplateResult_validator, + file_properties.ModifyTemplateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +properties_template_get = bb.Route( + 'properties/template/get', + 1, + True, + file_properties.GetTemplateArg_validator, + file_properties.GetTemplateResult_validator, + file_properties.TemplateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +properties_template_list = bb.Route( + 'properties/template/list', + 1, + True, + bv.Void(), + file_properties.ListTemplateResult_validator, + file_properties.TemplateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +properties_template_update = bb.Route( + 'properties/template/update', + 1, + True, + file_properties.UpdateTemplateArg_validator, + file_properties.UpdateTemplateResult_validator, + file_properties.ModifyTemplateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +reports_get_activity = bb.Route( + 'reports/get_activity', + 1, + False, + DateRange_validator, + GetActivityReport_validator, + DateRangeError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +reports_get_devices = bb.Route( + 'reports/get_devices', + 1, + False, + DateRange_validator, + GetDevicesReport_validator, + DateRangeError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +reports_get_membership = bb.Route( + 'reports/get_membership', + 1, + False, + DateRange_validator, + GetMembershipReport_validator, + DateRangeError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +reports_get_storage = bb.Route( + 'reports/get_storage', + 1, + False, + DateRange_validator, + GetStorageReport_validator, + DateRangeError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +team_folder_activate = bb.Route( + 'team_folder/activate', + 1, + False, + TeamFolderIdArg_validator, + TeamFolderMetadata_validator, + TeamFolderActivateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +team_folder_archive = bb.Route( + 'team_folder/archive', + 1, + False, + TeamFolderArchiveArg_validator, + TeamFolderArchiveLaunch_validator, + TeamFolderArchiveError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +team_folder_archive_check = bb.Route( + 'team_folder/archive/check', + 1, + False, + async_.PollArg_validator, + TeamFolderArchiveJobStatus_validator, + async_.PollError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +team_folder_create = bb.Route( + 'team_folder/create', + 1, + False, + TeamFolderCreateArg_validator, + TeamFolderMetadata_validator, + TeamFolderCreateError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +team_folder_get_info = bb.Route( + 'team_folder/get_info', + 1, + False, + TeamFolderIdListArg_validator, + bv.List(TeamFolderGetInfoItem_validator), + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) +team_folder_list = bb.Route( + 'team_folder/list', + 1, + False, + TeamFolderListArg_validator, + TeamFolderListResult_validator, + TeamFolderListError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +team_folder_list_continue = bb.Route( + 'team_folder/list/continue', + 1, + False, + TeamFolderListContinueArg_validator, + TeamFolderListResult_validator, + TeamFolderListContinueError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +team_folder_permanently_delete = bb.Route( + 'team_folder/permanently_delete', + 1, + False, + TeamFolderIdArg_validator, + bv.Void(), + TeamFolderPermanentlyDeleteError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +team_folder_rename = bb.Route( + 'team_folder/rename', + 1, + False, + TeamFolderRenameArg_validator, + TeamFolderMetadata_validator, + TeamFolderRenameError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +team_folder_update_sync_settings = bb.Route( + 'team_folder/update_sync_settings', + 1, + False, + TeamFolderUpdateSyncSettingsArg_validator, + TeamFolderMetadata_validator, + TeamFolderUpdateSyncSettingsError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +token_get_authenticated_admin = bb.Route( + 'token/get_authenticated_admin', + 1, + False, + bv.Void(), + TokenGetAuthenticatedAdminResult_validator, + TokenGetAuthenticatedAdminError_validator, + {'host': u'api', + 'style': u'rpc'}, +) + +ROUTES = { + 'devices/list_member_devices': devices_list_member_devices, + 'devices/list_members_devices': devices_list_members_devices, + 'devices/list_team_devices': devices_list_team_devices, + 'devices/revoke_device_session': devices_revoke_device_session, + 'devices/revoke_device_session_batch': devices_revoke_device_session_batch, + 'features/get_values': features_get_values, + 'get_info': get_info, + 'groups/create': groups_create, + 'groups/delete': groups_delete, + 'groups/get_info': groups_get_info, + 'groups/job_status/get': groups_job_status_get, + 'groups/list': groups_list, + 'groups/list/continue': groups_list_continue, + 'groups/members/add': groups_members_add, + 'groups/members/list': groups_members_list, + 'groups/members/list/continue': groups_members_list_continue, + 'groups/members/remove': groups_members_remove, + 'groups/members/set_access_type': groups_members_set_access_type, + 'groups/update': groups_update, + 'linked_apps/list_member_linked_apps': linked_apps_list_member_linked_apps, + 'linked_apps/list_members_linked_apps': linked_apps_list_members_linked_apps, + 'linked_apps/list_team_linked_apps': linked_apps_list_team_linked_apps, + 'linked_apps/revoke_linked_app': linked_apps_revoke_linked_app, + 'linked_apps/revoke_linked_app_batch': linked_apps_revoke_linked_app_batch, + 'member_space_limits/excluded_users/add': member_space_limits_excluded_users_add, + 'member_space_limits/excluded_users/list': member_space_limits_excluded_users_list, + 'member_space_limits/excluded_users/list/continue': member_space_limits_excluded_users_list_continue, + 'member_space_limits/excluded_users/remove': member_space_limits_excluded_users_remove, + 'member_space_limits/get_custom_quota': member_space_limits_get_custom_quota, + 'member_space_limits/remove_custom_quota': member_space_limits_remove_custom_quota, + 'member_space_limits/set_custom_quota': member_space_limits_set_custom_quota, + 'members/add': members_add, + 'members/add/job_status/get': members_add_job_status_get, + 'members/get_info': members_get_info, + 'members/list': members_list, + 'members/list/continue': members_list_continue, + 'members/move_former_member_files': members_move_former_member_files, + 'members/move_former_member_files/job_status/check': members_move_former_member_files_job_status_check, + 'members/recover': members_recover, + 'members/remove': members_remove, + 'members/remove/job_status/get': members_remove_job_status_get, + 'members/send_welcome_email': members_send_welcome_email, + 'members/set_admin_permissions': members_set_admin_permissions, + 'members/set_profile': members_set_profile, + 'members/suspend': members_suspend, + 'members/unsuspend': members_unsuspend, + 'namespaces/list': namespaces_list, + 'namespaces/list/continue': namespaces_list_continue, + 'properties/template/add': properties_template_add, + 'properties/template/get': properties_template_get, + 'properties/template/list': properties_template_list, + 'properties/template/update': properties_template_update, + 'reports/get_activity': reports_get_activity, + 'reports/get_devices': reports_get_devices, + 'reports/get_membership': reports_get_membership, + 'reports/get_storage': reports_get_storage, + 'team_folder/activate': team_folder_activate, + 'team_folder/archive': team_folder_archive, + 'team_folder/archive/check': team_folder_archive_check, + 'team_folder/create': team_folder_create, + 'team_folder/get_info': team_folder_get_info, + 'team_folder/list': team_folder_list, + 'team_folder/list/continue': team_folder_list_continue, + 'team_folder/permanently_delete': team_folder_permanently_delete, + 'team_folder/rename': team_folder_rename, + 'team_folder/update_sync_settings': team_folder_update_sync_settings, + 'token/get_authenticated_admin': token_get_authenticated_admin, +} + diff --git a/dropbox-script/dropbox/team_common.py b/dropbox-script/dropbox/team_common.py new file mode 100644 index 0000000..35a8cc3 --- /dev/null +++ b/dropbox-script/dropbox/team_common.py @@ -0,0 +1,562 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# @generated +# flake8: noqa +# pylint: skip-file +try: + from . import stone_validators as bv + from . import stone_base as bb +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bv + import stone_base as bb + +try: + from . import ( + common, + ) +except (ImportError, SystemError, ValueError): + import common + +class GroupManagementType(bb.Union): + """ + The group type determines how a group is managed. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar user_managed: A group which is managed by selected users. + :ivar company_managed: A group which is managed by team admins only. + :ivar system_managed: A group which is managed automatically by Dropbox. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + user_managed = None + # Attribute is overwritten below the class definition + company_managed = None + # Attribute is overwritten below the class definition + system_managed = None + # Attribute is overwritten below the class definition + other = None + + def is_user_managed(self): + """ + Check if the union tag is ``user_managed``. + + :rtype: bool + """ + return self._tag == 'user_managed' + + def is_company_managed(self): + """ + Check if the union tag is ``company_managed``. + + :rtype: bool + """ + return self._tag == 'company_managed' + + def is_system_managed(self): + """ + Check if the union tag is ``system_managed``. + + :rtype: bool + """ + return self._tag == 'system_managed' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupManagementType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupManagementType(%r, %r)' % (self._tag, self._value) + +GroupManagementType_validator = bv.Union(GroupManagementType) + +class GroupSummary(bb.Struct): + """ + Information about a group. + + :ivar group_external_id: External ID of group. This is an arbitrary ID that + an admin can attach to a group. + :ivar member_count: The number of members in the group. + :ivar group_management_type: Who is allowed to manage the group. + """ + + __slots__ = [ + '_group_name_value', + '_group_name_present', + '_group_id_value', + '_group_id_present', + '_group_external_id_value', + '_group_external_id_present', + '_member_count_value', + '_member_count_present', + '_group_management_type_value', + '_group_management_type_present', + ] + + _has_required_fields = True + + def __init__(self, + group_name=None, + group_id=None, + group_management_type=None, + group_external_id=None, + member_count=None): + self._group_name_value = None + self._group_name_present = False + self._group_id_value = None + self._group_id_present = False + self._group_external_id_value = None + self._group_external_id_present = False + self._member_count_value = None + self._member_count_present = False + self._group_management_type_value = None + self._group_management_type_present = False + if group_name is not None: + self.group_name = group_name + if group_id is not None: + self.group_id = group_id + if group_external_id is not None: + self.group_external_id = group_external_id + if member_count is not None: + self.member_count = member_count + if group_management_type is not None: + self.group_management_type = group_management_type + + @property + def group_name(self): + """ + :rtype: str + """ + if self._group_name_present: + return self._group_name_value + else: + raise AttributeError("missing required field 'group_name'") + + @group_name.setter + def group_name(self, val): + val = self._group_name_validator.validate(val) + self._group_name_value = val + self._group_name_present = True + + @group_name.deleter + def group_name(self): + self._group_name_value = None + self._group_name_present = False + + @property + def group_id(self): + """ + :rtype: str + """ + if self._group_id_present: + return self._group_id_value + else: + raise AttributeError("missing required field 'group_id'") + + @group_id.setter + def group_id(self, val): + val = self._group_id_validator.validate(val) + self._group_id_value = val + self._group_id_present = True + + @group_id.deleter + def group_id(self): + self._group_id_value = None + self._group_id_present = False + + @property + def group_external_id(self): + """ + External ID of group. This is an arbitrary ID that an admin can attach + to a group. + + :rtype: str + """ + if self._group_external_id_present: + return self._group_external_id_value + else: + return None + + @group_external_id.setter + def group_external_id(self, val): + if val is None: + del self.group_external_id + return + val = self._group_external_id_validator.validate(val) + self._group_external_id_value = val + self._group_external_id_present = True + + @group_external_id.deleter + def group_external_id(self): + self._group_external_id_value = None + self._group_external_id_present = False + + @property + def member_count(self): + """ + The number of members in the group. + + :rtype: int + """ + if self._member_count_present: + return self._member_count_value + else: + return None + + @member_count.setter + def member_count(self, val): + if val is None: + del self.member_count + return + val = self._member_count_validator.validate(val) + self._member_count_value = val + self._member_count_present = True + + @member_count.deleter + def member_count(self): + self._member_count_value = None + self._member_count_present = False + + @property + def group_management_type(self): + """ + Who is allowed to manage the group. + + :rtype: GroupManagementType + """ + if self._group_management_type_present: + return self._group_management_type_value + else: + raise AttributeError("missing required field 'group_management_type'") + + @group_management_type.setter + def group_management_type(self, val): + self._group_management_type_validator.validate_type_only(val) + self._group_management_type_value = val + self._group_management_type_present = True + + @group_management_type.deleter + def group_management_type(self): + self._group_management_type_value = None + self._group_management_type_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupSummary, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupSummary(group_name={!r}, group_id={!r}, group_management_type={!r}, group_external_id={!r}, member_count={!r})'.format( + self._group_name_value, + self._group_id_value, + self._group_management_type_value, + self._group_external_id_value, + self._member_count_value, + ) + +GroupSummary_validator = bv.Struct(GroupSummary) + +class GroupType(bb.Union): + """ + The group type determines how a group is created and managed. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar team: A group to which team members are automatically added. + Applicable to `team folders `_ only. + :ivar user_managed: A group is created and managed by a user. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + team = None + # Attribute is overwritten below the class definition + user_managed = None + # Attribute is overwritten below the class definition + other = None + + def is_team(self): + """ + Check if the union tag is ``team``. + + :rtype: bool + """ + return self._tag == 'team' + + def is_user_managed(self): + """ + Check if the union tag is ``user_managed``. + + :rtype: bool + """ + return self._tag == 'user_managed' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupType(%r, %r)' % (self._tag, self._value) + +GroupType_validator = bv.Union(GroupType) + +class MemberSpaceLimitType(bb.Union): + """ + The type of the space limit imposed on a team member. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar off: The team member does not have imposed space limit. + :ivar alert_only: The team member has soft imposed space limit - the limit + is used for display and for notifications. + :ivar stop_sync: The team member has hard imposed space limit - Dropbox file + sync will stop after the limit is reached. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + off = None + # Attribute is overwritten below the class definition + alert_only = None + # Attribute is overwritten below the class definition + stop_sync = None + # Attribute is overwritten below the class definition + other = None + + def is_off(self): + """ + Check if the union tag is ``off``. + + :rtype: bool + """ + return self._tag == 'off' + + def is_alert_only(self): + """ + Check if the union tag is ``alert_only``. + + :rtype: bool + """ + return self._tag == 'alert_only' + + def is_stop_sync(self): + """ + Check if the union tag is ``stop_sync``. + + :rtype: bool + """ + return self._tag == 'stop_sync' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSpaceLimitType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSpaceLimitType(%r, %r)' % (self._tag, self._value) + +MemberSpaceLimitType_validator = bv.Union(MemberSpaceLimitType) + +class TimeRange(bb.Struct): + """ + Time range. + + :ivar start_time: Optional starting time (inclusive). + :ivar end_time: Optional ending time (exclusive). + """ + + __slots__ = [ + '_start_time_value', + '_start_time_present', + '_end_time_value', + '_end_time_present', + ] + + _has_required_fields = False + + def __init__(self, + start_time=None, + end_time=None): + self._start_time_value = None + self._start_time_present = False + self._end_time_value = None + self._end_time_present = False + if start_time is not None: + self.start_time = start_time + if end_time is not None: + self.end_time = end_time + + @property + def start_time(self): + """ + Optional starting time (inclusive). + + :rtype: datetime.datetime + """ + if self._start_time_present: + return self._start_time_value + else: + return None + + @start_time.setter + def start_time(self, val): + if val is None: + del self.start_time + return + val = self._start_time_validator.validate(val) + self._start_time_value = val + self._start_time_present = True + + @start_time.deleter + def start_time(self): + self._start_time_value = None + self._start_time_present = False + + @property + def end_time(self): + """ + Optional ending time (exclusive). + + :rtype: datetime.datetime + """ + if self._end_time_present: + return self._end_time_value + else: + return None + + @end_time.setter + def end_time(self, val): + if val is None: + del self.end_time + return + val = self._end_time_validator.validate(val) + self._end_time_value = val + self._end_time_present = True + + @end_time.deleter + def end_time(self): + self._end_time_value = None + self._end_time_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TimeRange, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TimeRange(start_time={!r}, end_time={!r})'.format( + self._start_time_value, + self._end_time_value, + ) + +TimeRange_validator = bv.Struct(TimeRange) + +GroupExternalId_validator = bv.String() +GroupId_validator = bv.String() +MemberExternalId_validator = bv.String(max_length=64) +ResellerId_validator = bv.String() +TeamMemberId_validator = bv.String() +GroupManagementType._user_managed_validator = bv.Void() +GroupManagementType._company_managed_validator = bv.Void() +GroupManagementType._system_managed_validator = bv.Void() +GroupManagementType._other_validator = bv.Void() +GroupManagementType._tagmap = { + 'user_managed': GroupManagementType._user_managed_validator, + 'company_managed': GroupManagementType._company_managed_validator, + 'system_managed': GroupManagementType._system_managed_validator, + 'other': GroupManagementType._other_validator, +} + +GroupManagementType.user_managed = GroupManagementType('user_managed') +GroupManagementType.company_managed = GroupManagementType('company_managed') +GroupManagementType.system_managed = GroupManagementType('system_managed') +GroupManagementType.other = GroupManagementType('other') + +GroupSummary._group_name_validator = bv.String() +GroupSummary._group_id_validator = GroupId_validator +GroupSummary._group_external_id_validator = bv.Nullable(GroupExternalId_validator) +GroupSummary._member_count_validator = bv.Nullable(bv.UInt32()) +GroupSummary._group_management_type_validator = GroupManagementType_validator +GroupSummary._all_field_names_ = set([ + 'group_name', + 'group_id', + 'group_external_id', + 'member_count', + 'group_management_type', +]) +GroupSummary._all_fields_ = [ + ('group_name', GroupSummary._group_name_validator), + ('group_id', GroupSummary._group_id_validator), + ('group_external_id', GroupSummary._group_external_id_validator), + ('member_count', GroupSummary._member_count_validator), + ('group_management_type', GroupSummary._group_management_type_validator), +] + +GroupType._team_validator = bv.Void() +GroupType._user_managed_validator = bv.Void() +GroupType._other_validator = bv.Void() +GroupType._tagmap = { + 'team': GroupType._team_validator, + 'user_managed': GroupType._user_managed_validator, + 'other': GroupType._other_validator, +} + +GroupType.team = GroupType('team') +GroupType.user_managed = GroupType('user_managed') +GroupType.other = GroupType('other') + +MemberSpaceLimitType._off_validator = bv.Void() +MemberSpaceLimitType._alert_only_validator = bv.Void() +MemberSpaceLimitType._stop_sync_validator = bv.Void() +MemberSpaceLimitType._other_validator = bv.Void() +MemberSpaceLimitType._tagmap = { + 'off': MemberSpaceLimitType._off_validator, + 'alert_only': MemberSpaceLimitType._alert_only_validator, + 'stop_sync': MemberSpaceLimitType._stop_sync_validator, + 'other': MemberSpaceLimitType._other_validator, +} + +MemberSpaceLimitType.off = MemberSpaceLimitType('off') +MemberSpaceLimitType.alert_only = MemberSpaceLimitType('alert_only') +MemberSpaceLimitType.stop_sync = MemberSpaceLimitType('stop_sync') +MemberSpaceLimitType.other = MemberSpaceLimitType('other') + +TimeRange._start_time_validator = bv.Nullable(common.DropboxTimestamp_validator) +TimeRange._end_time_validator = bv.Nullable(common.DropboxTimestamp_validator) +TimeRange._all_field_names_ = set([ + 'start_time', + 'end_time', +]) +TimeRange._all_fields_ = [ + ('start_time', TimeRange._start_time_validator), + ('end_time', TimeRange._end_time_validator), +] + +ROUTES = { +} + diff --git a/dropbox-script/dropbox/team_log.py b/dropbox-script/dropbox/team_log.py new file mode 100644 index 0000000..016d049 --- /dev/null +++ b/dropbox-script/dropbox/team_log.py @@ -0,0 +1,69421 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# @generated +# flake8: noqa +# pylint: skip-file +try: + from . import stone_validators as bv + from . import stone_base as bb +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bv + import stone_base as bb + +try: + from . import ( + common, + file_requests, + files, + sharing, + team, + team_common, + team_policies, + users_common, + ) +except (ImportError, SystemError, ValueError): + import common + import file_requests + import files + import sharing + import team + import team_common + import team_policies + import users_common + +class AccessMethodLogInfo(bb.Union): + """ + Indicates the method in which the action was performed. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar SessionLogInfo end_user: End user session details. + :ivar WebSessionLogInfo sign_in_as: Sign in as session details. + :ivar WebSessionLogInfo content_manager: Content manager session details. + :ivar WebSessionLogInfo admin_console: Admin console session details. + :ivar ApiSessionLogInfo api: Api session details. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def end_user(cls, val): + """ + Create an instance of this class set to the ``end_user`` tag with value + ``val``. + + :param SessionLogInfo val: + :rtype: AccessMethodLogInfo + """ + return cls('end_user', val) + + @classmethod + def sign_in_as(cls, val): + """ + Create an instance of this class set to the ``sign_in_as`` tag with + value ``val``. + + :param WebSessionLogInfo val: + :rtype: AccessMethodLogInfo + """ + return cls('sign_in_as', val) + + @classmethod + def content_manager(cls, val): + """ + Create an instance of this class set to the ``content_manager`` tag with + value ``val``. + + :param WebSessionLogInfo val: + :rtype: AccessMethodLogInfo + """ + return cls('content_manager', val) + + @classmethod + def admin_console(cls, val): + """ + Create an instance of this class set to the ``admin_console`` tag with + value ``val``. + + :param WebSessionLogInfo val: + :rtype: AccessMethodLogInfo + """ + return cls('admin_console', val) + + @classmethod + def api(cls, val): + """ + Create an instance of this class set to the ``api`` tag with value + ``val``. + + :param ApiSessionLogInfo val: + :rtype: AccessMethodLogInfo + """ + return cls('api', val) + + def is_end_user(self): + """ + Check if the union tag is ``end_user``. + + :rtype: bool + """ + return self._tag == 'end_user' + + def is_sign_in_as(self): + """ + Check if the union tag is ``sign_in_as``. + + :rtype: bool + """ + return self._tag == 'sign_in_as' + + def is_content_manager(self): + """ + Check if the union tag is ``content_manager``. + + :rtype: bool + """ + return self._tag == 'content_manager' + + def is_admin_console(self): + """ + Check if the union tag is ``admin_console``. + + :rtype: bool + """ + return self._tag == 'admin_console' + + def is_api(self): + """ + Check if the union tag is ``api``. + + :rtype: bool + """ + return self._tag == 'api' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_end_user(self): + """ + End user session details. + + Only call this if :meth:`is_end_user` is true. + + :rtype: SessionLogInfo + """ + if not self.is_end_user(): + raise AttributeError("tag 'end_user' not set") + return self._value + + def get_sign_in_as(self): + """ + Sign in as session details. + + Only call this if :meth:`is_sign_in_as` is true. + + :rtype: WebSessionLogInfo + """ + if not self.is_sign_in_as(): + raise AttributeError("tag 'sign_in_as' not set") + return self._value + + def get_content_manager(self): + """ + Content manager session details. + + Only call this if :meth:`is_content_manager` is true. + + :rtype: WebSessionLogInfo + """ + if not self.is_content_manager(): + raise AttributeError("tag 'content_manager' not set") + return self._value + + def get_admin_console(self): + """ + Admin console session details. + + Only call this if :meth:`is_admin_console` is true. + + :rtype: WebSessionLogInfo + """ + if not self.is_admin_console(): + raise AttributeError("tag 'admin_console' not set") + return self._value + + def get_api(self): + """ + Api session details. + + Only call this if :meth:`is_api` is true. + + :rtype: ApiSessionLogInfo + """ + if not self.is_api(): + raise AttributeError("tag 'api' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(AccessMethodLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AccessMethodLogInfo(%r, %r)' % (self._tag, self._value) + +AccessMethodLogInfo_validator = bv.Union(AccessMethodLogInfo) + +class AccountCaptureAvailability(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + unavailable = None + # Attribute is overwritten below the class definition + available = None + # Attribute is overwritten below the class definition + other = None + + def is_unavailable(self): + """ + Check if the union tag is ``unavailable``. + + :rtype: bool + """ + return self._tag == 'unavailable' + + def is_available(self): + """ + Check if the union tag is ``available``. + + :rtype: bool + """ + return self._tag == 'available' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(AccountCaptureAvailability, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AccountCaptureAvailability(%r, %r)' % (self._tag, self._value) + +AccountCaptureAvailability_validator = bv.Union(AccountCaptureAvailability) + +class AccountCaptureChangeAvailabilityDetails(bb.Struct): + """ + Granted/revoked option to enable account capture on team domains. + + :ivar new_value: New account capture availabilty value. + :ivar previous_value: Previous account capture availabilty value. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New account capture availabilty value. + + :rtype: AccountCaptureAvailability + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous account capture availabilty value. Might be missing due to + historical data gap. + + :rtype: AccountCaptureAvailability + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AccountCaptureChangeAvailabilityDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AccountCaptureChangeAvailabilityDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +AccountCaptureChangeAvailabilityDetails_validator = bv.Struct(AccountCaptureChangeAvailabilityDetails) + +class AccountCaptureChangeAvailabilityType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AccountCaptureChangeAvailabilityType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AccountCaptureChangeAvailabilityType(description={!r})'.format( + self._description_value, + ) + +AccountCaptureChangeAvailabilityType_validator = bv.Struct(AccountCaptureChangeAvailabilityType) + +class AccountCaptureChangePolicyDetails(bb.Struct): + """ + Changed account capture setting on team domain. + + :ivar new_value: New account capture policy. + :ivar previous_value: Previous account capture policy. Might be missing due + to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New account capture policy. + + :rtype: AccountCapturePolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous account capture policy. Might be missing due to historical data + gap. + + :rtype: AccountCapturePolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AccountCaptureChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AccountCaptureChangePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +AccountCaptureChangePolicyDetails_validator = bv.Struct(AccountCaptureChangePolicyDetails) + +class AccountCaptureChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AccountCaptureChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AccountCaptureChangePolicyType(description={!r})'.format( + self._description_value, + ) + +AccountCaptureChangePolicyType_validator = bv.Struct(AccountCaptureChangePolicyType) + +class AccountCaptureMigrateAccountDetails(bb.Struct): + """ + Account-captured user migrated account to team. + + :ivar domain_name: Domain name. + """ + + __slots__ = [ + '_domain_name_value', + '_domain_name_present', + ] + + _has_required_fields = True + + def __init__(self, + domain_name=None): + self._domain_name_value = None + self._domain_name_present = False + if domain_name is not None: + self.domain_name = domain_name + + @property + def domain_name(self): + """ + Domain name. + + :rtype: str + """ + if self._domain_name_present: + return self._domain_name_value + else: + raise AttributeError("missing required field 'domain_name'") + + @domain_name.setter + def domain_name(self, val): + val = self._domain_name_validator.validate(val) + self._domain_name_value = val + self._domain_name_present = True + + @domain_name.deleter + def domain_name(self): + self._domain_name_value = None + self._domain_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AccountCaptureMigrateAccountDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AccountCaptureMigrateAccountDetails(domain_name={!r})'.format( + self._domain_name_value, + ) + +AccountCaptureMigrateAccountDetails_validator = bv.Struct(AccountCaptureMigrateAccountDetails) + +class AccountCaptureMigrateAccountType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AccountCaptureMigrateAccountType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AccountCaptureMigrateAccountType(description={!r})'.format( + self._description_value, + ) + +AccountCaptureMigrateAccountType_validator = bv.Struct(AccountCaptureMigrateAccountType) + +class AccountCaptureNotificationEmailsSentDetails(bb.Struct): + """ + Sent proactive account capture email to all unmanaged members. + + :ivar domain_name: Domain name. + """ + + __slots__ = [ + '_domain_name_value', + '_domain_name_present', + ] + + _has_required_fields = True + + def __init__(self, + domain_name=None): + self._domain_name_value = None + self._domain_name_present = False + if domain_name is not None: + self.domain_name = domain_name + + @property + def domain_name(self): + """ + Domain name. + + :rtype: str + """ + if self._domain_name_present: + return self._domain_name_value + else: + raise AttributeError("missing required field 'domain_name'") + + @domain_name.setter + def domain_name(self, val): + val = self._domain_name_validator.validate(val) + self._domain_name_value = val + self._domain_name_present = True + + @domain_name.deleter + def domain_name(self): + self._domain_name_value = None + self._domain_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AccountCaptureNotificationEmailsSentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AccountCaptureNotificationEmailsSentDetails(domain_name={!r})'.format( + self._domain_name_value, + ) + +AccountCaptureNotificationEmailsSentDetails_validator = bv.Struct(AccountCaptureNotificationEmailsSentDetails) + +class AccountCaptureNotificationEmailsSentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AccountCaptureNotificationEmailsSentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AccountCaptureNotificationEmailsSentType(description={!r})'.format( + self._description_value, + ) + +AccountCaptureNotificationEmailsSentType_validator = bv.Struct(AccountCaptureNotificationEmailsSentType) + +class AccountCapturePolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + invited_users = None + # Attribute is overwritten below the class definition + all_users = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_invited_users(self): + """ + Check if the union tag is ``invited_users``. + + :rtype: bool + """ + return self._tag == 'invited_users' + + def is_all_users(self): + """ + Check if the union tag is ``all_users``. + + :rtype: bool + """ + return self._tag == 'all_users' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(AccountCapturePolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AccountCapturePolicy(%r, %r)' % (self._tag, self._value) + +AccountCapturePolicy_validator = bv.Union(AccountCapturePolicy) + +class AccountCaptureRelinquishAccountDetails(bb.Struct): + """ + Account-captured user changed account email to personal email. + + :ivar domain_name: Domain name. + """ + + __slots__ = [ + '_domain_name_value', + '_domain_name_present', + ] + + _has_required_fields = True + + def __init__(self, + domain_name=None): + self._domain_name_value = None + self._domain_name_present = False + if domain_name is not None: + self.domain_name = domain_name + + @property + def domain_name(self): + """ + Domain name. + + :rtype: str + """ + if self._domain_name_present: + return self._domain_name_value + else: + raise AttributeError("missing required field 'domain_name'") + + @domain_name.setter + def domain_name(self, val): + val = self._domain_name_validator.validate(val) + self._domain_name_value = val + self._domain_name_present = True + + @domain_name.deleter + def domain_name(self): + self._domain_name_value = None + self._domain_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AccountCaptureRelinquishAccountDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AccountCaptureRelinquishAccountDetails(domain_name={!r})'.format( + self._domain_name_value, + ) + +AccountCaptureRelinquishAccountDetails_validator = bv.Struct(AccountCaptureRelinquishAccountDetails) + +class AccountCaptureRelinquishAccountType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AccountCaptureRelinquishAccountType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AccountCaptureRelinquishAccountType(description={!r})'.format( + self._description_value, + ) + +AccountCaptureRelinquishAccountType_validator = bv.Struct(AccountCaptureRelinquishAccountType) + +class ActionDetails(bb.Union): + """ + Additional information indicating the action taken that caused status + change. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar JoinTeamDetails team_join_details: Additional information relevant + when a new member joins the team. + :ivar MemberRemoveActionType remove_action: Define how the user was removed + from the team. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def team_join_details(cls, val): + """ + Create an instance of this class set to the ``team_join_details`` tag + with value ``val``. + + :param JoinTeamDetails val: + :rtype: ActionDetails + """ + return cls('team_join_details', val) + + @classmethod + def remove_action(cls, val): + """ + Create an instance of this class set to the ``remove_action`` tag with + value ``val``. + + :param MemberRemoveActionType val: + :rtype: ActionDetails + """ + return cls('remove_action', val) + + def is_team_join_details(self): + """ + Check if the union tag is ``team_join_details``. + + :rtype: bool + """ + return self._tag == 'team_join_details' + + def is_remove_action(self): + """ + Check if the union tag is ``remove_action``. + + :rtype: bool + """ + return self._tag == 'remove_action' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_team_join_details(self): + """ + Additional information relevant when a new member joins the team. + + Only call this if :meth:`is_team_join_details` is true. + + :rtype: JoinTeamDetails + """ + if not self.is_team_join_details(): + raise AttributeError("tag 'team_join_details' not set") + return self._value + + def get_remove_action(self): + """ + Define how the user was removed from the team. + + Only call this if :meth:`is_remove_action` is true. + + :rtype: MemberRemoveActionType + """ + if not self.is_remove_action(): + raise AttributeError("tag 'remove_action' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ActionDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ActionDetails(%r, %r)' % (self._tag, self._value) + +ActionDetails_validator = bv.Union(ActionDetails) + +class ActorLogInfo(bb.Union): + """ + The entity who performed the action. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar UserLogInfo user: The user who did the action. + :ivar UserLogInfo admin: The admin who did the action. + :ivar AppLogInfo app: The application who did the action. + :ivar ResellerLogInfo reseller: Action done by reseller. + :ivar dropbox: Action done by Dropbox. + :ivar anonymous: Anonymous actor. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + dropbox = None + # Attribute is overwritten below the class definition + anonymous = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def user(cls, val): + """ + Create an instance of this class set to the ``user`` tag with value + ``val``. + + :param UserLogInfo val: + :rtype: ActorLogInfo + """ + return cls('user', val) + + @classmethod + def admin(cls, val): + """ + Create an instance of this class set to the ``admin`` tag with value + ``val``. + + :param UserLogInfo val: + :rtype: ActorLogInfo + """ + return cls('admin', val) + + @classmethod + def app(cls, val): + """ + Create an instance of this class set to the ``app`` tag with value + ``val``. + + :param AppLogInfo val: + :rtype: ActorLogInfo + """ + return cls('app', val) + + @classmethod + def reseller(cls, val): + """ + Create an instance of this class set to the ``reseller`` tag with value + ``val``. + + :param ResellerLogInfo val: + :rtype: ActorLogInfo + """ + return cls('reseller', val) + + def is_user(self): + """ + Check if the union tag is ``user``. + + :rtype: bool + """ + return self._tag == 'user' + + def is_admin(self): + """ + Check if the union tag is ``admin``. + + :rtype: bool + """ + return self._tag == 'admin' + + def is_app(self): + """ + Check if the union tag is ``app``. + + :rtype: bool + """ + return self._tag == 'app' + + def is_reseller(self): + """ + Check if the union tag is ``reseller``. + + :rtype: bool + """ + return self._tag == 'reseller' + + def is_dropbox(self): + """ + Check if the union tag is ``dropbox``. + + :rtype: bool + """ + return self._tag == 'dropbox' + + def is_anonymous(self): + """ + Check if the union tag is ``anonymous``. + + :rtype: bool + """ + return self._tag == 'anonymous' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_user(self): + """ + The user who did the action. + + Only call this if :meth:`is_user` is true. + + :rtype: UserLogInfo + """ + if not self.is_user(): + raise AttributeError("tag 'user' not set") + return self._value + + def get_admin(self): + """ + The admin who did the action. + + Only call this if :meth:`is_admin` is true. + + :rtype: UserLogInfo + """ + if not self.is_admin(): + raise AttributeError("tag 'admin' not set") + return self._value + + def get_app(self): + """ + The application who did the action. + + Only call this if :meth:`is_app` is true. + + :rtype: AppLogInfo + """ + if not self.is_app(): + raise AttributeError("tag 'app' not set") + return self._value + + def get_reseller(self): + """ + Action done by reseller. + + Only call this if :meth:`is_reseller` is true. + + :rtype: ResellerLogInfo + """ + if not self.is_reseller(): + raise AttributeError("tag 'reseller' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ActorLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ActorLogInfo(%r, %r)' % (self._tag, self._value) + +ActorLogInfo_validator = bv.Union(ActorLogInfo) + +class AdminRole(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + team_admin = None + # Attribute is overwritten below the class definition + user_management_admin = None + # Attribute is overwritten below the class definition + support_admin = None + # Attribute is overwritten below the class definition + limited_admin = None + # Attribute is overwritten below the class definition + member_only = None + # Attribute is overwritten below the class definition + other = None + + def is_team_admin(self): + """ + Check if the union tag is ``team_admin``. + + :rtype: bool + """ + return self._tag == 'team_admin' + + def is_user_management_admin(self): + """ + Check if the union tag is ``user_management_admin``. + + :rtype: bool + """ + return self._tag == 'user_management_admin' + + def is_support_admin(self): + """ + Check if the union tag is ``support_admin``. + + :rtype: bool + """ + return self._tag == 'support_admin' + + def is_limited_admin(self): + """ + Check if the union tag is ``limited_admin``. + + :rtype: bool + """ + return self._tag == 'limited_admin' + + def is_member_only(self): + """ + Check if the union tag is ``member_only``. + + :rtype: bool + """ + return self._tag == 'member_only' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(AdminRole, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AdminRole(%r, %r)' % (self._tag, self._value) + +AdminRole_validator = bv.Union(AdminRole) + +class AllowDownloadDisabledDetails(bb.Struct): + """ + Disabled downloads. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(AllowDownloadDisabledDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AllowDownloadDisabledDetails()' + +AllowDownloadDisabledDetails_validator = bv.Struct(AllowDownloadDisabledDetails) + +class AllowDownloadDisabledType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AllowDownloadDisabledType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AllowDownloadDisabledType(description={!r})'.format( + self._description_value, + ) + +AllowDownloadDisabledType_validator = bv.Struct(AllowDownloadDisabledType) + +class AllowDownloadEnabledDetails(bb.Struct): + """ + Enabled downloads. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(AllowDownloadEnabledDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AllowDownloadEnabledDetails()' + +AllowDownloadEnabledDetails_validator = bv.Struct(AllowDownloadEnabledDetails) + +class AllowDownloadEnabledType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AllowDownloadEnabledType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AllowDownloadEnabledType(description={!r})'.format( + self._description_value, + ) + +AllowDownloadEnabledType_validator = bv.Struct(AllowDownloadEnabledType) + +class ApiSessionLogInfo(bb.Struct): + """ + Api session. + + :ivar request_id: Api request ID. + """ + + __slots__ = [ + '_request_id_value', + '_request_id_present', + ] + + _has_required_fields = True + + def __init__(self, + request_id=None): + self._request_id_value = None + self._request_id_present = False + if request_id is not None: + self.request_id = request_id + + @property + def request_id(self): + """ + Api request ID. + + :rtype: str + """ + if self._request_id_present: + return self._request_id_value + else: + raise AttributeError("missing required field 'request_id'") + + @request_id.setter + def request_id(self, val): + val = self._request_id_validator.validate(val) + self._request_id_value = val + self._request_id_present = True + + @request_id.deleter + def request_id(self): + self._request_id_value = None + self._request_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ApiSessionLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ApiSessionLogInfo(request_id={!r})'.format( + self._request_id_value, + ) + +ApiSessionLogInfo_validator = bv.Struct(ApiSessionLogInfo) + +class AppLinkTeamDetails(bb.Struct): + """ + Linked app for team. + + :ivar app_info: Relevant application details. + """ + + __slots__ = [ + '_app_info_value', + '_app_info_present', + ] + + _has_required_fields = True + + def __init__(self, + app_info=None): + self._app_info_value = None + self._app_info_present = False + if app_info is not None: + self.app_info = app_info + + @property + def app_info(self): + """ + Relevant application details. + + :rtype: AppLogInfo + """ + if self._app_info_present: + return self._app_info_value + else: + raise AttributeError("missing required field 'app_info'") + + @app_info.setter + def app_info(self, val): + self._app_info_validator.validate_type_only(val) + self._app_info_value = val + self._app_info_present = True + + @app_info.deleter + def app_info(self): + self._app_info_value = None + self._app_info_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AppLinkTeamDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AppLinkTeamDetails(app_info={!r})'.format( + self._app_info_value, + ) + +AppLinkTeamDetails_validator = bv.Struct(AppLinkTeamDetails) + +class AppLinkTeamType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AppLinkTeamType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AppLinkTeamType(description={!r})'.format( + self._description_value, + ) + +AppLinkTeamType_validator = bv.Struct(AppLinkTeamType) + +class AppLinkUserDetails(bb.Struct): + """ + Linked app for member. + + :ivar app_info: Relevant application details. + """ + + __slots__ = [ + '_app_info_value', + '_app_info_present', + ] + + _has_required_fields = True + + def __init__(self, + app_info=None): + self._app_info_value = None + self._app_info_present = False + if app_info is not None: + self.app_info = app_info + + @property + def app_info(self): + """ + Relevant application details. + + :rtype: AppLogInfo + """ + if self._app_info_present: + return self._app_info_value + else: + raise AttributeError("missing required field 'app_info'") + + @app_info.setter + def app_info(self, val): + self._app_info_validator.validate_type_only(val) + self._app_info_value = val + self._app_info_present = True + + @app_info.deleter + def app_info(self): + self._app_info_value = None + self._app_info_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AppLinkUserDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AppLinkUserDetails(app_info={!r})'.format( + self._app_info_value, + ) + +AppLinkUserDetails_validator = bv.Struct(AppLinkUserDetails) + +class AppLinkUserType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AppLinkUserType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AppLinkUserType(description={!r})'.format( + self._description_value, + ) + +AppLinkUserType_validator = bv.Struct(AppLinkUserType) + +class AppLogInfo(bb.Struct): + """ + App's logged information. + + :ivar app_id: App unique ID. Might be missing due to historical data gap. + :ivar display_name: App display name. Might be missing due to historical + data gap. + """ + + __slots__ = [ + '_app_id_value', + '_app_id_present', + '_display_name_value', + '_display_name_present', + ] + + _has_required_fields = False + + def __init__(self, + app_id=None, + display_name=None): + self._app_id_value = None + self._app_id_present = False + self._display_name_value = None + self._display_name_present = False + if app_id is not None: + self.app_id = app_id + if display_name is not None: + self.display_name = display_name + + @property + def app_id(self): + """ + App unique ID. Might be missing due to historical data gap. + + :rtype: str + """ + if self._app_id_present: + return self._app_id_value + else: + return None + + @app_id.setter + def app_id(self, val): + if val is None: + del self.app_id + return + val = self._app_id_validator.validate(val) + self._app_id_value = val + self._app_id_present = True + + @app_id.deleter + def app_id(self): + self._app_id_value = None + self._app_id_present = False + + @property + def display_name(self): + """ + App display name. Might be missing due to historical data gap. + + :rtype: str + """ + if self._display_name_present: + return self._display_name_value + else: + return None + + @display_name.setter + def display_name(self, val): + if val is None: + del self.display_name + return + val = self._display_name_validator.validate(val) + self._display_name_value = val + self._display_name_present = True + + @display_name.deleter + def display_name(self): + self._display_name_value = None + self._display_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AppLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AppLogInfo(app_id={!r}, display_name={!r})'.format( + self._app_id_value, + self._display_name_value, + ) + +AppLogInfo_validator = bv.StructTree(AppLogInfo) + +class AppUnlinkTeamDetails(bb.Struct): + """ + Unlinked app for team. + + :ivar app_info: Relevant application details. + """ + + __slots__ = [ + '_app_info_value', + '_app_info_present', + ] + + _has_required_fields = True + + def __init__(self, + app_info=None): + self._app_info_value = None + self._app_info_present = False + if app_info is not None: + self.app_info = app_info + + @property + def app_info(self): + """ + Relevant application details. + + :rtype: AppLogInfo + """ + if self._app_info_present: + return self._app_info_value + else: + raise AttributeError("missing required field 'app_info'") + + @app_info.setter + def app_info(self, val): + self._app_info_validator.validate_type_only(val) + self._app_info_value = val + self._app_info_present = True + + @app_info.deleter + def app_info(self): + self._app_info_value = None + self._app_info_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AppUnlinkTeamDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AppUnlinkTeamDetails(app_info={!r})'.format( + self._app_info_value, + ) + +AppUnlinkTeamDetails_validator = bv.Struct(AppUnlinkTeamDetails) + +class AppUnlinkTeamType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AppUnlinkTeamType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AppUnlinkTeamType(description={!r})'.format( + self._description_value, + ) + +AppUnlinkTeamType_validator = bv.Struct(AppUnlinkTeamType) + +class AppUnlinkUserDetails(bb.Struct): + """ + Unlinked app for member. + + :ivar app_info: Relevant application details. + """ + + __slots__ = [ + '_app_info_value', + '_app_info_present', + ] + + _has_required_fields = True + + def __init__(self, + app_info=None): + self._app_info_value = None + self._app_info_present = False + if app_info is not None: + self.app_info = app_info + + @property + def app_info(self): + """ + Relevant application details. + + :rtype: AppLogInfo + """ + if self._app_info_present: + return self._app_info_value + else: + raise AttributeError("missing required field 'app_info'") + + @app_info.setter + def app_info(self, val): + self._app_info_validator.validate_type_only(val) + self._app_info_value = val + self._app_info_present = True + + @app_info.deleter + def app_info(self): + self._app_info_value = None + self._app_info_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AppUnlinkUserDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AppUnlinkUserDetails(app_info={!r})'.format( + self._app_info_value, + ) + +AppUnlinkUserDetails_validator = bv.Struct(AppUnlinkUserDetails) + +class AppUnlinkUserType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(AppUnlinkUserType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AppUnlinkUserType(description={!r})'.format( + self._description_value, + ) + +AppUnlinkUserType_validator = bv.Struct(AppUnlinkUserType) + +class AssetLogInfo(bb.Union): + """ + Asset details. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar FileLogInfo file: File's details. + :ivar FolderLogInfo folder: Folder's details. + :ivar PaperDocumentLogInfo paper_document: Paper docuement's details. + :ivar PaperFolderLogInfo paper_folder: Paper folder's details. + :ivar ShowcaseDocumentLogInfo showcase_document: Showcase document's + details. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def file(cls, val): + """ + Create an instance of this class set to the ``file`` tag with value + ``val``. + + :param FileLogInfo val: + :rtype: AssetLogInfo + """ + return cls('file', val) + + @classmethod + def folder(cls, val): + """ + Create an instance of this class set to the ``folder`` tag with value + ``val``. + + :param FolderLogInfo val: + :rtype: AssetLogInfo + """ + return cls('folder', val) + + @classmethod + def paper_document(cls, val): + """ + Create an instance of this class set to the ``paper_document`` tag with + value ``val``. + + :param PaperDocumentLogInfo val: + :rtype: AssetLogInfo + """ + return cls('paper_document', val) + + @classmethod + def paper_folder(cls, val): + """ + Create an instance of this class set to the ``paper_folder`` tag with + value ``val``. + + :param PaperFolderLogInfo val: + :rtype: AssetLogInfo + """ + return cls('paper_folder', val) + + @classmethod + def showcase_document(cls, val): + """ + Create an instance of this class set to the ``showcase_document`` tag + with value ``val``. + + :param ShowcaseDocumentLogInfo val: + :rtype: AssetLogInfo + """ + return cls('showcase_document', val) + + def is_file(self): + """ + Check if the union tag is ``file``. + + :rtype: bool + """ + return self._tag == 'file' + + def is_folder(self): + """ + Check if the union tag is ``folder``. + + :rtype: bool + """ + return self._tag == 'folder' + + def is_paper_document(self): + """ + Check if the union tag is ``paper_document``. + + :rtype: bool + """ + return self._tag == 'paper_document' + + def is_paper_folder(self): + """ + Check if the union tag is ``paper_folder``. + + :rtype: bool + """ + return self._tag == 'paper_folder' + + def is_showcase_document(self): + """ + Check if the union tag is ``showcase_document``. + + :rtype: bool + """ + return self._tag == 'showcase_document' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_file(self): + """ + File's details. + + Only call this if :meth:`is_file` is true. + + :rtype: FileLogInfo + """ + if not self.is_file(): + raise AttributeError("tag 'file' not set") + return self._value + + def get_folder(self): + """ + Folder's details. + + Only call this if :meth:`is_folder` is true. + + :rtype: FolderLogInfo + """ + if not self.is_folder(): + raise AttributeError("tag 'folder' not set") + return self._value + + def get_paper_document(self): + """ + Paper docuement's details. + + Only call this if :meth:`is_paper_document` is true. + + :rtype: PaperDocumentLogInfo + """ + if not self.is_paper_document(): + raise AttributeError("tag 'paper_document' not set") + return self._value + + def get_paper_folder(self): + """ + Paper folder's details. + + Only call this if :meth:`is_paper_folder` is true. + + :rtype: PaperFolderLogInfo + """ + if not self.is_paper_folder(): + raise AttributeError("tag 'paper_folder' not set") + return self._value + + def get_showcase_document(self): + """ + Showcase document's details. + + Only call this if :meth:`is_showcase_document` is true. + + :rtype: ShowcaseDocumentLogInfo + """ + if not self.is_showcase_document(): + raise AttributeError("tag 'showcase_document' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(AssetLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AssetLogInfo(%r, %r)' % (self._tag, self._value) + +AssetLogInfo_validator = bv.Union(AssetLogInfo) + +class CameraUploadsPolicy(bb.Union): + """ + Policy for controlling if team members can activate camera uploads + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(CameraUploadsPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CameraUploadsPolicy(%r, %r)' % (self._tag, self._value) + +CameraUploadsPolicy_validator = bv.Union(CameraUploadsPolicy) + +class CameraUploadsPolicyChangedDetails(bb.Struct): + """ + Changed camera uploads setting for team. + + :ivar new_value: New camera uploads setting. + :ivar previous_value: Previous camera uploads setting. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New camera uploads setting. + + :rtype: CameraUploadsPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous camera uploads setting. + + :rtype: CameraUploadsPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(CameraUploadsPolicyChangedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CameraUploadsPolicyChangedDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +CameraUploadsPolicyChangedDetails_validator = bv.Struct(CameraUploadsPolicyChangedDetails) + +class CameraUploadsPolicyChangedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(CameraUploadsPolicyChangedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CameraUploadsPolicyChangedType(description={!r})'.format( + self._description_value, + ) + +CameraUploadsPolicyChangedType_validator = bv.Struct(CameraUploadsPolicyChangedType) + +class Certificate(bb.Struct): + """ + Certificate details. + + :ivar subject: Certificate subject. + :ivar issuer: Certificate issuer. + :ivar issue_date: Certificate issue date. + :ivar expiration_date: Certificate expiration date. + :ivar serial_number: Certificate serial number. + :ivar sha1_fingerprint: Certificate sha1 fingerprint. + :ivar common_name: Certificate common name. + """ + + __slots__ = [ + '_subject_value', + '_subject_present', + '_issuer_value', + '_issuer_present', + '_issue_date_value', + '_issue_date_present', + '_expiration_date_value', + '_expiration_date_present', + '_serial_number_value', + '_serial_number_present', + '_sha1_fingerprint_value', + '_sha1_fingerprint_present', + '_common_name_value', + '_common_name_present', + ] + + _has_required_fields = True + + def __init__(self, + subject=None, + issuer=None, + issue_date=None, + expiration_date=None, + serial_number=None, + sha1_fingerprint=None, + common_name=None): + self._subject_value = None + self._subject_present = False + self._issuer_value = None + self._issuer_present = False + self._issue_date_value = None + self._issue_date_present = False + self._expiration_date_value = None + self._expiration_date_present = False + self._serial_number_value = None + self._serial_number_present = False + self._sha1_fingerprint_value = None + self._sha1_fingerprint_present = False + self._common_name_value = None + self._common_name_present = False + if subject is not None: + self.subject = subject + if issuer is not None: + self.issuer = issuer + if issue_date is not None: + self.issue_date = issue_date + if expiration_date is not None: + self.expiration_date = expiration_date + if serial_number is not None: + self.serial_number = serial_number + if sha1_fingerprint is not None: + self.sha1_fingerprint = sha1_fingerprint + if common_name is not None: + self.common_name = common_name + + @property + def subject(self): + """ + Certificate subject. + + :rtype: str + """ + if self._subject_present: + return self._subject_value + else: + raise AttributeError("missing required field 'subject'") + + @subject.setter + def subject(self, val): + val = self._subject_validator.validate(val) + self._subject_value = val + self._subject_present = True + + @subject.deleter + def subject(self): + self._subject_value = None + self._subject_present = False + + @property + def issuer(self): + """ + Certificate issuer. + + :rtype: str + """ + if self._issuer_present: + return self._issuer_value + else: + raise AttributeError("missing required field 'issuer'") + + @issuer.setter + def issuer(self, val): + val = self._issuer_validator.validate(val) + self._issuer_value = val + self._issuer_present = True + + @issuer.deleter + def issuer(self): + self._issuer_value = None + self._issuer_present = False + + @property + def issue_date(self): + """ + Certificate issue date. + + :rtype: str + """ + if self._issue_date_present: + return self._issue_date_value + else: + raise AttributeError("missing required field 'issue_date'") + + @issue_date.setter + def issue_date(self, val): + val = self._issue_date_validator.validate(val) + self._issue_date_value = val + self._issue_date_present = True + + @issue_date.deleter + def issue_date(self): + self._issue_date_value = None + self._issue_date_present = False + + @property + def expiration_date(self): + """ + Certificate expiration date. + + :rtype: str + """ + if self._expiration_date_present: + return self._expiration_date_value + else: + raise AttributeError("missing required field 'expiration_date'") + + @expiration_date.setter + def expiration_date(self, val): + val = self._expiration_date_validator.validate(val) + self._expiration_date_value = val + self._expiration_date_present = True + + @expiration_date.deleter + def expiration_date(self): + self._expiration_date_value = None + self._expiration_date_present = False + + @property + def serial_number(self): + """ + Certificate serial number. + + :rtype: str + """ + if self._serial_number_present: + return self._serial_number_value + else: + raise AttributeError("missing required field 'serial_number'") + + @serial_number.setter + def serial_number(self, val): + val = self._serial_number_validator.validate(val) + self._serial_number_value = val + self._serial_number_present = True + + @serial_number.deleter + def serial_number(self): + self._serial_number_value = None + self._serial_number_present = False + + @property + def sha1_fingerprint(self): + """ + Certificate sha1 fingerprint. + + :rtype: str + """ + if self._sha1_fingerprint_present: + return self._sha1_fingerprint_value + else: + raise AttributeError("missing required field 'sha1_fingerprint'") + + @sha1_fingerprint.setter + def sha1_fingerprint(self, val): + val = self._sha1_fingerprint_validator.validate(val) + self._sha1_fingerprint_value = val + self._sha1_fingerprint_present = True + + @sha1_fingerprint.deleter + def sha1_fingerprint(self): + self._sha1_fingerprint_value = None + self._sha1_fingerprint_present = False + + @property + def common_name(self): + """ + Certificate common name. + + :rtype: str + """ + if self._common_name_present: + return self._common_name_value + else: + return None + + @common_name.setter + def common_name(self, val): + if val is None: + del self.common_name + return + val = self._common_name_validator.validate(val) + self._common_name_value = val + self._common_name_present = True + + @common_name.deleter + def common_name(self): + self._common_name_value = None + self._common_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(Certificate, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'Certificate(subject={!r}, issuer={!r}, issue_date={!r}, expiration_date={!r}, serial_number={!r}, sha1_fingerprint={!r}, common_name={!r})'.format( + self._subject_value, + self._issuer_value, + self._issue_date_value, + self._expiration_date_value, + self._serial_number_value, + self._sha1_fingerprint_value, + self._common_name_value, + ) + +Certificate_validator = bv.Struct(Certificate) + +class CollectionShareDetails(bb.Struct): + """ + Shared album. + + :ivar album_name: Album name. + """ + + __slots__ = [ + '_album_name_value', + '_album_name_present', + ] + + _has_required_fields = True + + def __init__(self, + album_name=None): + self._album_name_value = None + self._album_name_present = False + if album_name is not None: + self.album_name = album_name + + @property + def album_name(self): + """ + Album name. + + :rtype: str + """ + if self._album_name_present: + return self._album_name_value + else: + raise AttributeError("missing required field 'album_name'") + + @album_name.setter + def album_name(self, val): + val = self._album_name_validator.validate(val) + self._album_name_value = val + self._album_name_present = True + + @album_name.deleter + def album_name(self): + self._album_name_value = None + self._album_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(CollectionShareDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CollectionShareDetails(album_name={!r})'.format( + self._album_name_value, + ) + +CollectionShareDetails_validator = bv.Struct(CollectionShareDetails) + +class CollectionShareType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(CollectionShareType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CollectionShareType(description={!r})'.format( + self._description_value, + ) + +CollectionShareType_validator = bv.Struct(CollectionShareType) + +class ContentPermanentDeletePolicy(bb.Union): + """ + Policy for pemanent content deletion + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ContentPermanentDeletePolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ContentPermanentDeletePolicy(%r, %r)' % (self._tag, self._value) + +ContentPermanentDeletePolicy_validator = bv.Union(ContentPermanentDeletePolicy) + +class ContextLogInfo(bb.Union): + """ + The primary entity on which the action was done. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar TeamMemberLogInfo team_member: Action was done on behalf of a team + member. + :ivar NonTeamMemberLogInfo non_team_member: Action was done on behalf of a + non team member. + :ivar anonymous: Anonymous context. + :ivar team: Action was done on behalf of the team. + :ivar TrustedNonTeamMemberLogInfo trusted_non_team_member: Action was done + on behalf of a trusted non team member. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + anonymous = None + # Attribute is overwritten below the class definition + team = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def team_member(cls, val): + """ + Create an instance of this class set to the ``team_member`` tag with + value ``val``. + + :param TeamMemberLogInfo val: + :rtype: ContextLogInfo + """ + return cls('team_member', val) + + @classmethod + def non_team_member(cls, val): + """ + Create an instance of this class set to the ``non_team_member`` tag with + value ``val``. + + :param NonTeamMemberLogInfo val: + :rtype: ContextLogInfo + """ + return cls('non_team_member', val) + + @classmethod + def trusted_non_team_member(cls, val): + """ + Create an instance of this class set to the ``trusted_non_team_member`` + tag with value ``val``. + + :param TrustedNonTeamMemberLogInfo val: + :rtype: ContextLogInfo + """ + return cls('trusted_non_team_member', val) + + def is_team_member(self): + """ + Check if the union tag is ``team_member``. + + :rtype: bool + """ + return self._tag == 'team_member' + + def is_non_team_member(self): + """ + Check if the union tag is ``non_team_member``. + + :rtype: bool + """ + return self._tag == 'non_team_member' + + def is_anonymous(self): + """ + Check if the union tag is ``anonymous``. + + :rtype: bool + """ + return self._tag == 'anonymous' + + def is_team(self): + """ + Check if the union tag is ``team``. + + :rtype: bool + """ + return self._tag == 'team' + + def is_trusted_non_team_member(self): + """ + Check if the union tag is ``trusted_non_team_member``. + + :rtype: bool + """ + return self._tag == 'trusted_non_team_member' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_team_member(self): + """ + Action was done on behalf of a team member. + + Only call this if :meth:`is_team_member` is true. + + :rtype: TeamMemberLogInfo + """ + if not self.is_team_member(): + raise AttributeError("tag 'team_member' not set") + return self._value + + def get_non_team_member(self): + """ + Action was done on behalf of a non team member. + + Only call this if :meth:`is_non_team_member` is true. + + :rtype: NonTeamMemberLogInfo + """ + if not self.is_non_team_member(): + raise AttributeError("tag 'non_team_member' not set") + return self._value + + def get_trusted_non_team_member(self): + """ + Action was done on behalf of a trusted non team member. + + Only call this if :meth:`is_trusted_non_team_member` is true. + + :rtype: TrustedNonTeamMemberLogInfo + """ + if not self.is_trusted_non_team_member(): + raise AttributeError("tag 'trusted_non_team_member' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ContextLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ContextLogInfo(%r, %r)' % (self._tag, self._value) + +ContextLogInfo_validator = bv.Union(ContextLogInfo) + +class CreateFolderDetails(bb.Struct): + """ + Created folders. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateFolderDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateFolderDetails()' + +CreateFolderDetails_validator = bv.Struct(CreateFolderDetails) + +class CreateFolderType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(CreateFolderType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CreateFolderType(description={!r})'.format( + self._description_value, + ) + +CreateFolderType_validator = bv.Struct(CreateFolderType) + +class DataPlacementRestrictionChangePolicyDetails(bb.Struct): + """ + Set restrictions on data center locations where team data resides. + + :ivar previous_value: Previous placement restriction. + :ivar new_value: New placement restriction. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + previous_value=None, + new_value=None): + self._previous_value_value = None + self._previous_value_present = False + self._new_value_value = None + self._new_value_present = False + if previous_value is not None: + self.previous_value = previous_value + if new_value is not None: + self.new_value = new_value + + @property + def previous_value(self): + """ + Previous placement restriction. + + :rtype: PlacementRestriction + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + @property + def new_value(self): + """ + New placement restriction. + + :rtype: PlacementRestriction + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DataPlacementRestrictionChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DataPlacementRestrictionChangePolicyDetails(previous_value={!r}, new_value={!r})'.format( + self._previous_value_value, + self._new_value_value, + ) + +DataPlacementRestrictionChangePolicyDetails_validator = bv.Struct(DataPlacementRestrictionChangePolicyDetails) + +class DataPlacementRestrictionChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DataPlacementRestrictionChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DataPlacementRestrictionChangePolicyType(description={!r})'.format( + self._description_value, + ) + +DataPlacementRestrictionChangePolicyType_validator = bv.Struct(DataPlacementRestrictionChangePolicyType) + +class DataPlacementRestrictionSatisfyPolicyDetails(bb.Struct): + """ + Completed restrictions on data center locations where team data resides. + + :ivar placement_restriction: Placement restriction. + """ + + __slots__ = [ + '_placement_restriction_value', + '_placement_restriction_present', + ] + + _has_required_fields = True + + def __init__(self, + placement_restriction=None): + self._placement_restriction_value = None + self._placement_restriction_present = False + if placement_restriction is not None: + self.placement_restriction = placement_restriction + + @property + def placement_restriction(self): + """ + Placement restriction. + + :rtype: PlacementRestriction + """ + if self._placement_restriction_present: + return self._placement_restriction_value + else: + raise AttributeError("missing required field 'placement_restriction'") + + @placement_restriction.setter + def placement_restriction(self, val): + self._placement_restriction_validator.validate_type_only(val) + self._placement_restriction_value = val + self._placement_restriction_present = True + + @placement_restriction.deleter + def placement_restriction(self): + self._placement_restriction_value = None + self._placement_restriction_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DataPlacementRestrictionSatisfyPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DataPlacementRestrictionSatisfyPolicyDetails(placement_restriction={!r})'.format( + self._placement_restriction_value, + ) + +DataPlacementRestrictionSatisfyPolicyDetails_validator = bv.Struct(DataPlacementRestrictionSatisfyPolicyDetails) + +class DataPlacementRestrictionSatisfyPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DataPlacementRestrictionSatisfyPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DataPlacementRestrictionSatisfyPolicyType(description={!r})'.format( + self._description_value, + ) + +DataPlacementRestrictionSatisfyPolicyType_validator = bv.Struct(DataPlacementRestrictionSatisfyPolicyType) + +class DeviceSessionLogInfo(bb.Struct): + """ + Device's session logged information. + + :ivar ip_address: The IP address of the last activity from this session. + Might be missing due to historical data gap. + :ivar created: The time this session was created. Might be missing due to + historical data gap. + :ivar updated: The time of the last activity from this session. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_ip_address_value', + '_ip_address_present', + '_created_value', + '_created_present', + '_updated_value', + '_updated_present', + ] + + _has_required_fields = False + + def __init__(self, + ip_address=None, + created=None, + updated=None): + self._ip_address_value = None + self._ip_address_present = False + self._created_value = None + self._created_present = False + self._updated_value = None + self._updated_present = False + if ip_address is not None: + self.ip_address = ip_address + if created is not None: + self.created = created + if updated is not None: + self.updated = updated + + @property + def ip_address(self): + """ + The IP address of the last activity from this session. Might be missing + due to historical data gap. + + :rtype: str + """ + if self._ip_address_present: + return self._ip_address_value + else: + return None + + @ip_address.setter + def ip_address(self, val): + if val is None: + del self.ip_address + return + val = self._ip_address_validator.validate(val) + self._ip_address_value = val + self._ip_address_present = True + + @ip_address.deleter + def ip_address(self): + self._ip_address_value = None + self._ip_address_present = False + + @property + def created(self): + """ + The time this session was created. Might be missing due to historical + data gap. + + :rtype: datetime.datetime + """ + if self._created_present: + return self._created_value + else: + return None + + @created.setter + def created(self, val): + if val is None: + del self.created + return + val = self._created_validator.validate(val) + self._created_value = val + self._created_present = True + + @created.deleter + def created(self): + self._created_value = None + self._created_present = False + + @property + def updated(self): + """ + The time of the last activity from this session. Might be missing due to + historical data gap. + + :rtype: datetime.datetime + """ + if self._updated_present: + return self._updated_value + else: + return None + + @updated.setter + def updated(self, val): + if val is None: + del self.updated + return + val = self._updated_validator.validate(val) + self._updated_value = val + self._updated_present = True + + @updated.deleter + def updated(self): + self._updated_value = None + self._updated_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceSessionLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceSessionLogInfo(ip_address={!r}, created={!r}, updated={!r})'.format( + self._ip_address_value, + self._created_value, + self._updated_value, + ) + +DeviceSessionLogInfo_validator = bv.StructTree(DeviceSessionLogInfo) + +class DesktopDeviceSessionLogInfo(DeviceSessionLogInfo): + """ + Information about linked Dropbox desktop client sessions + + :ivar session_info: Desktop session unique id. Might be missing due to + historical data gap. + :ivar host_name: Name of the hosting desktop. + :ivar client_type: The Dropbox desktop client type. + :ivar client_version: The Dropbox client version. + :ivar platform: Information on the hosting platform. + :ivar is_delete_on_unlink_supported: Whether itu2019s possible to delete all + of the account files upon unlinking. + """ + + __slots__ = [ + '_session_info_value', + '_session_info_present', + '_host_name_value', + '_host_name_present', + '_client_type_value', + '_client_type_present', + '_client_version_value', + '_client_version_present', + '_platform_value', + '_platform_present', + '_is_delete_on_unlink_supported_value', + '_is_delete_on_unlink_supported_present', + ] + + _has_required_fields = True + + def __init__(self, + host_name=None, + client_type=None, + platform=None, + is_delete_on_unlink_supported=None, + ip_address=None, + created=None, + updated=None, + session_info=None, + client_version=None): + super(DesktopDeviceSessionLogInfo, self).__init__(ip_address, + created, + updated) + self._session_info_value = None + self._session_info_present = False + self._host_name_value = None + self._host_name_present = False + self._client_type_value = None + self._client_type_present = False + self._client_version_value = None + self._client_version_present = False + self._platform_value = None + self._platform_present = False + self._is_delete_on_unlink_supported_value = None + self._is_delete_on_unlink_supported_present = False + if session_info is not None: + self.session_info = session_info + if host_name is not None: + self.host_name = host_name + if client_type is not None: + self.client_type = client_type + if client_version is not None: + self.client_version = client_version + if platform is not None: + self.platform = platform + if is_delete_on_unlink_supported is not None: + self.is_delete_on_unlink_supported = is_delete_on_unlink_supported + + @property + def session_info(self): + """ + Desktop session unique id. Might be missing due to historical data gap. + + :rtype: DesktopSessionLogInfo + """ + if self._session_info_present: + return self._session_info_value + else: + return None + + @session_info.setter + def session_info(self, val): + if val is None: + del self.session_info + return + self._session_info_validator.validate_type_only(val) + self._session_info_value = val + self._session_info_present = True + + @session_info.deleter + def session_info(self): + self._session_info_value = None + self._session_info_present = False + + @property + def host_name(self): + """ + Name of the hosting desktop. + + :rtype: str + """ + if self._host_name_present: + return self._host_name_value + else: + raise AttributeError("missing required field 'host_name'") + + @host_name.setter + def host_name(self, val): + val = self._host_name_validator.validate(val) + self._host_name_value = val + self._host_name_present = True + + @host_name.deleter + def host_name(self): + self._host_name_value = None + self._host_name_present = False + + @property + def client_type(self): + """ + The Dropbox desktop client type. + + :rtype: team.DesktopPlatform + """ + if self._client_type_present: + return self._client_type_value + else: + raise AttributeError("missing required field 'client_type'") + + @client_type.setter + def client_type(self, val): + self._client_type_validator.validate_type_only(val) + self._client_type_value = val + self._client_type_present = True + + @client_type.deleter + def client_type(self): + self._client_type_value = None + self._client_type_present = False + + @property + def client_version(self): + """ + The Dropbox client version. + + :rtype: str + """ + if self._client_version_present: + return self._client_version_value + else: + return None + + @client_version.setter + def client_version(self, val): + if val is None: + del self.client_version + return + val = self._client_version_validator.validate(val) + self._client_version_value = val + self._client_version_present = True + + @client_version.deleter + def client_version(self): + self._client_version_value = None + self._client_version_present = False + + @property + def platform(self): + """ + Information on the hosting platform. + + :rtype: str + """ + if self._platform_present: + return self._platform_value + else: + raise AttributeError("missing required field 'platform'") + + @platform.setter + def platform(self, val): + val = self._platform_validator.validate(val) + self._platform_value = val + self._platform_present = True + + @platform.deleter + def platform(self): + self._platform_value = None + self._platform_present = False + + @property + def is_delete_on_unlink_supported(self): + """ + Whether itu2019s possible to delete all of the account files upon + unlinking. + + :rtype: bool + """ + if self._is_delete_on_unlink_supported_present: + return self._is_delete_on_unlink_supported_value + else: + raise AttributeError("missing required field 'is_delete_on_unlink_supported'") + + @is_delete_on_unlink_supported.setter + def is_delete_on_unlink_supported(self, val): + val = self._is_delete_on_unlink_supported_validator.validate(val) + self._is_delete_on_unlink_supported_value = val + self._is_delete_on_unlink_supported_present = True + + @is_delete_on_unlink_supported.deleter + def is_delete_on_unlink_supported(self): + self._is_delete_on_unlink_supported_value = None + self._is_delete_on_unlink_supported_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DesktopDeviceSessionLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DesktopDeviceSessionLogInfo(host_name={!r}, client_type={!r}, platform={!r}, is_delete_on_unlink_supported={!r}, ip_address={!r}, created={!r}, updated={!r}, session_info={!r}, client_version={!r})'.format( + self._host_name_value, + self._client_type_value, + self._platform_value, + self._is_delete_on_unlink_supported_value, + self._ip_address_value, + self._created_value, + self._updated_value, + self._session_info_value, + self._client_version_value, + ) + +DesktopDeviceSessionLogInfo_validator = bv.Struct(DesktopDeviceSessionLogInfo) + +class SessionLogInfo(bb.Struct): + """ + Session's logged information. + + :ivar session_id: Session ID. Might be missing due to historical data gap. + """ + + __slots__ = [ + '_session_id_value', + '_session_id_present', + ] + + _has_required_fields = False + + def __init__(self, + session_id=None): + self._session_id_value = None + self._session_id_present = False + if session_id is not None: + self.session_id = session_id + + @property + def session_id(self): + """ + Session ID. Might be missing due to historical data gap. + + :rtype: str + """ + if self._session_id_present: + return self._session_id_value + else: + return None + + @session_id.setter + def session_id(self, val): + if val is None: + del self.session_id + return + val = self._session_id_validator.validate(val) + self._session_id_value = val + self._session_id_present = True + + @session_id.deleter + def session_id(self): + self._session_id_value = None + self._session_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SessionLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SessionLogInfo(session_id={!r})'.format( + self._session_id_value, + ) + +SessionLogInfo_validator = bv.StructTree(SessionLogInfo) + +class DesktopSessionLogInfo(SessionLogInfo): + """ + Desktop session. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self, + session_id=None): + super(DesktopSessionLogInfo, self).__init__(session_id) + + def _process_custom_annotations(self, annotation_type, processor): + super(DesktopSessionLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DesktopSessionLogInfo(session_id={!r})'.format( + self._session_id_value, + ) + +DesktopSessionLogInfo_validator = bv.Struct(DesktopSessionLogInfo) + +class DeviceApprovalsChangeDesktopPolicyDetails(bb.Struct): + """ + Set/removed limit on number of computers member can link to team Dropbox + account. + + :ivar new_value: New desktop device approvals policy. Might be missing due + to historical data gap. + :ivar previous_value: Previous desktop device approvals policy. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = False + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New desktop device approvals policy. Might be missing due to historical + data gap. + + :rtype: DeviceApprovalsPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + return None + + @new_value.setter + def new_value(self, val): + if val is None: + del self.new_value + return + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous desktop device approvals policy. Might be missing due to + historical data gap. + + :rtype: DeviceApprovalsPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceApprovalsChangeDesktopPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceApprovalsChangeDesktopPolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +DeviceApprovalsChangeDesktopPolicyDetails_validator = bv.Struct(DeviceApprovalsChangeDesktopPolicyDetails) + +class DeviceApprovalsChangeDesktopPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceApprovalsChangeDesktopPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceApprovalsChangeDesktopPolicyType(description={!r})'.format( + self._description_value, + ) + +DeviceApprovalsChangeDesktopPolicyType_validator = bv.Struct(DeviceApprovalsChangeDesktopPolicyType) + +class DeviceApprovalsChangeMobilePolicyDetails(bb.Struct): + """ + Set/removed limit on number of mobile devices member can link to team + Dropbox account. + + :ivar new_value: New mobile device approvals policy. Might be missing due to + historical data gap. + :ivar previous_value: Previous mobile device approvals policy. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = False + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New mobile device approvals policy. Might be missing due to historical + data gap. + + :rtype: DeviceApprovalsPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + return None + + @new_value.setter + def new_value(self, val): + if val is None: + del self.new_value + return + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous mobile device approvals policy. Might be missing due to + historical data gap. + + :rtype: DeviceApprovalsPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceApprovalsChangeMobilePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceApprovalsChangeMobilePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +DeviceApprovalsChangeMobilePolicyDetails_validator = bv.Struct(DeviceApprovalsChangeMobilePolicyDetails) + +class DeviceApprovalsChangeMobilePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceApprovalsChangeMobilePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceApprovalsChangeMobilePolicyType(description={!r})'.format( + self._description_value, + ) + +DeviceApprovalsChangeMobilePolicyType_validator = bv.Struct(DeviceApprovalsChangeMobilePolicyType) + +class DeviceApprovalsChangeOverageActionDetails(bb.Struct): + """ + Changed device approvals setting when member is over limit. + + :ivar new_value: New over the limits policy. Might be missing due to + historical data gap. + :ivar previous_value: Previous over the limit policy. Might be missing due + to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = False + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New over the limits policy. Might be missing due to historical data gap. + + :rtype: team_policies.RolloutMethod + """ + if self._new_value_present: + return self._new_value_value + else: + return None + + @new_value.setter + def new_value(self, val): + if val is None: + del self.new_value + return + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous over the limit policy. Might be missing due to historical data + gap. + + :rtype: team_policies.RolloutMethod + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceApprovalsChangeOverageActionDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceApprovalsChangeOverageActionDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +DeviceApprovalsChangeOverageActionDetails_validator = bv.Struct(DeviceApprovalsChangeOverageActionDetails) + +class DeviceApprovalsChangeOverageActionType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceApprovalsChangeOverageActionType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceApprovalsChangeOverageActionType(description={!r})'.format( + self._description_value, + ) + +DeviceApprovalsChangeOverageActionType_validator = bv.Struct(DeviceApprovalsChangeOverageActionType) + +class DeviceApprovalsChangeUnlinkActionDetails(bb.Struct): + """ + Changed device approvals setting when member unlinks approved device. + + :ivar new_value: New device unlink policy. Might be missing due to + historical data gap. + :ivar previous_value: Previous device unlink policy. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = False + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New device unlink policy. Might be missing due to historical data gap. + + :rtype: DeviceUnlinkPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + return None + + @new_value.setter + def new_value(self, val): + if val is None: + del self.new_value + return + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous device unlink policy. Might be missing due to historical data + gap. + + :rtype: DeviceUnlinkPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceApprovalsChangeUnlinkActionDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceApprovalsChangeUnlinkActionDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +DeviceApprovalsChangeUnlinkActionDetails_validator = bv.Struct(DeviceApprovalsChangeUnlinkActionDetails) + +class DeviceApprovalsChangeUnlinkActionType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceApprovalsChangeUnlinkActionType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceApprovalsChangeUnlinkActionType(description={!r})'.format( + self._description_value, + ) + +DeviceApprovalsChangeUnlinkActionType_validator = bv.Struct(DeviceApprovalsChangeUnlinkActionType) + +class DeviceApprovalsPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + unlimited = None + # Attribute is overwritten below the class definition + limited = None + # Attribute is overwritten below the class definition + other = None + + def is_unlimited(self): + """ + Check if the union tag is ``unlimited``. + + :rtype: bool + """ + return self._tag == 'unlimited' + + def is_limited(self): + """ + Check if the union tag is ``limited``. + + :rtype: bool + """ + return self._tag == 'limited' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceApprovalsPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceApprovalsPolicy(%r, %r)' % (self._tag, self._value) + +DeviceApprovalsPolicy_validator = bv.Union(DeviceApprovalsPolicy) + +class DeviceChangeIpDesktopDetails(bb.Struct): + """ + Changed IP address associated with active desktop session. + + :ivar device_session_info: Device's session logged information. + """ + + __slots__ = [ + '_device_session_info_value', + '_device_session_info_present', + ] + + _has_required_fields = True + + def __init__(self, + device_session_info=None): + self._device_session_info_value = None + self._device_session_info_present = False + if device_session_info is not None: + self.device_session_info = device_session_info + + @property + def device_session_info(self): + """ + Device's session logged information. + + :rtype: DeviceSessionLogInfo + """ + if self._device_session_info_present: + return self._device_session_info_value + else: + raise AttributeError("missing required field 'device_session_info'") + + @device_session_info.setter + def device_session_info(self, val): + self._device_session_info_validator.validate_type_only(val) + self._device_session_info_value = val + self._device_session_info_present = True + + @device_session_info.deleter + def device_session_info(self): + self._device_session_info_value = None + self._device_session_info_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceChangeIpDesktopDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceChangeIpDesktopDetails(device_session_info={!r})'.format( + self._device_session_info_value, + ) + +DeviceChangeIpDesktopDetails_validator = bv.Struct(DeviceChangeIpDesktopDetails) + +class DeviceChangeIpDesktopType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceChangeIpDesktopType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceChangeIpDesktopType(description={!r})'.format( + self._description_value, + ) + +DeviceChangeIpDesktopType_validator = bv.Struct(DeviceChangeIpDesktopType) + +class DeviceChangeIpMobileDetails(bb.Struct): + """ + Changed IP address associated with active mobile session. + + :ivar device_session_info: Device's session logged information. + """ + + __slots__ = [ + '_device_session_info_value', + '_device_session_info_present', + ] + + _has_required_fields = False + + def __init__(self, + device_session_info=None): + self._device_session_info_value = None + self._device_session_info_present = False + if device_session_info is not None: + self.device_session_info = device_session_info + + @property + def device_session_info(self): + """ + Device's session logged information. + + :rtype: DeviceSessionLogInfo + """ + if self._device_session_info_present: + return self._device_session_info_value + else: + return None + + @device_session_info.setter + def device_session_info(self, val): + if val is None: + del self.device_session_info + return + self._device_session_info_validator.validate_type_only(val) + self._device_session_info_value = val + self._device_session_info_present = True + + @device_session_info.deleter + def device_session_info(self): + self._device_session_info_value = None + self._device_session_info_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceChangeIpMobileDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceChangeIpMobileDetails(device_session_info={!r})'.format( + self._device_session_info_value, + ) + +DeviceChangeIpMobileDetails_validator = bv.Struct(DeviceChangeIpMobileDetails) + +class DeviceChangeIpMobileType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceChangeIpMobileType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceChangeIpMobileType(description={!r})'.format( + self._description_value, + ) + +DeviceChangeIpMobileType_validator = bv.Struct(DeviceChangeIpMobileType) + +class DeviceChangeIpWebDetails(bb.Struct): + """ + Changed IP address associated with active web session. + + :ivar user_agent: Web browser name. + """ + + __slots__ = [ + '_user_agent_value', + '_user_agent_present', + ] + + _has_required_fields = True + + def __init__(self, + user_agent=None): + self._user_agent_value = None + self._user_agent_present = False + if user_agent is not None: + self.user_agent = user_agent + + @property + def user_agent(self): + """ + Web browser name. + + :rtype: str + """ + if self._user_agent_present: + return self._user_agent_value + else: + raise AttributeError("missing required field 'user_agent'") + + @user_agent.setter + def user_agent(self, val): + val = self._user_agent_validator.validate(val) + self._user_agent_value = val + self._user_agent_present = True + + @user_agent.deleter + def user_agent(self): + self._user_agent_value = None + self._user_agent_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceChangeIpWebDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceChangeIpWebDetails(user_agent={!r})'.format( + self._user_agent_value, + ) + +DeviceChangeIpWebDetails_validator = bv.Struct(DeviceChangeIpWebDetails) + +class DeviceChangeIpWebType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceChangeIpWebType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceChangeIpWebType(description={!r})'.format( + self._description_value, + ) + +DeviceChangeIpWebType_validator = bv.Struct(DeviceChangeIpWebType) + +class DeviceDeleteOnUnlinkFailDetails(bb.Struct): + """ + Failed to delete all files from unlinked device. + + :ivar session_info: Session unique id. Might be missing due to historical + data gap. + :ivar display_name: The device name. Might be missing due to historical data + gap. + :ivar num_failures: The number of times that remote file deletion failed. + """ + + __slots__ = [ + '_session_info_value', + '_session_info_present', + '_display_name_value', + '_display_name_present', + '_num_failures_value', + '_num_failures_present', + ] + + _has_required_fields = True + + def __init__(self, + num_failures=None, + session_info=None, + display_name=None): + self._session_info_value = None + self._session_info_present = False + self._display_name_value = None + self._display_name_present = False + self._num_failures_value = None + self._num_failures_present = False + if session_info is not None: + self.session_info = session_info + if display_name is not None: + self.display_name = display_name + if num_failures is not None: + self.num_failures = num_failures + + @property + def session_info(self): + """ + Session unique id. Might be missing due to historical data gap. + + :rtype: SessionLogInfo + """ + if self._session_info_present: + return self._session_info_value + else: + return None + + @session_info.setter + def session_info(self, val): + if val is None: + del self.session_info + return + self._session_info_validator.validate_type_only(val) + self._session_info_value = val + self._session_info_present = True + + @session_info.deleter + def session_info(self): + self._session_info_value = None + self._session_info_present = False + + @property + def display_name(self): + """ + The device name. Might be missing due to historical data gap. + + :rtype: str + """ + if self._display_name_present: + return self._display_name_value + else: + return None + + @display_name.setter + def display_name(self, val): + if val is None: + del self.display_name + return + val = self._display_name_validator.validate(val) + self._display_name_value = val + self._display_name_present = True + + @display_name.deleter + def display_name(self): + self._display_name_value = None + self._display_name_present = False + + @property + def num_failures(self): + """ + The number of times that remote file deletion failed. + + :rtype: int + """ + if self._num_failures_present: + return self._num_failures_value + else: + raise AttributeError("missing required field 'num_failures'") + + @num_failures.setter + def num_failures(self, val): + val = self._num_failures_validator.validate(val) + self._num_failures_value = val + self._num_failures_present = True + + @num_failures.deleter + def num_failures(self): + self._num_failures_value = None + self._num_failures_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceDeleteOnUnlinkFailDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceDeleteOnUnlinkFailDetails(num_failures={!r}, session_info={!r}, display_name={!r})'.format( + self._num_failures_value, + self._session_info_value, + self._display_name_value, + ) + +DeviceDeleteOnUnlinkFailDetails_validator = bv.Struct(DeviceDeleteOnUnlinkFailDetails) + +class DeviceDeleteOnUnlinkFailType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceDeleteOnUnlinkFailType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceDeleteOnUnlinkFailType(description={!r})'.format( + self._description_value, + ) + +DeviceDeleteOnUnlinkFailType_validator = bv.Struct(DeviceDeleteOnUnlinkFailType) + +class DeviceDeleteOnUnlinkSuccessDetails(bb.Struct): + """ + Deleted all files from unlinked device. + + :ivar session_info: Session unique id. Might be missing due to historical + data gap. + :ivar display_name: The device name. Might be missing due to historical data + gap. + """ + + __slots__ = [ + '_session_info_value', + '_session_info_present', + '_display_name_value', + '_display_name_present', + ] + + _has_required_fields = False + + def __init__(self, + session_info=None, + display_name=None): + self._session_info_value = None + self._session_info_present = False + self._display_name_value = None + self._display_name_present = False + if session_info is not None: + self.session_info = session_info + if display_name is not None: + self.display_name = display_name + + @property + def session_info(self): + """ + Session unique id. Might be missing due to historical data gap. + + :rtype: SessionLogInfo + """ + if self._session_info_present: + return self._session_info_value + else: + return None + + @session_info.setter + def session_info(self, val): + if val is None: + del self.session_info + return + self._session_info_validator.validate_type_only(val) + self._session_info_value = val + self._session_info_present = True + + @session_info.deleter + def session_info(self): + self._session_info_value = None + self._session_info_present = False + + @property + def display_name(self): + """ + The device name. Might be missing due to historical data gap. + + :rtype: str + """ + if self._display_name_present: + return self._display_name_value + else: + return None + + @display_name.setter + def display_name(self, val): + if val is None: + del self.display_name + return + val = self._display_name_validator.validate(val) + self._display_name_value = val + self._display_name_present = True + + @display_name.deleter + def display_name(self): + self._display_name_value = None + self._display_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceDeleteOnUnlinkSuccessDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceDeleteOnUnlinkSuccessDetails(session_info={!r}, display_name={!r})'.format( + self._session_info_value, + self._display_name_value, + ) + +DeviceDeleteOnUnlinkSuccessDetails_validator = bv.Struct(DeviceDeleteOnUnlinkSuccessDetails) + +class DeviceDeleteOnUnlinkSuccessType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceDeleteOnUnlinkSuccessType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceDeleteOnUnlinkSuccessType(description={!r})'.format( + self._description_value, + ) + +DeviceDeleteOnUnlinkSuccessType_validator = bv.Struct(DeviceDeleteOnUnlinkSuccessType) + +class DeviceLinkFailDetails(bb.Struct): + """ + Failed to link device. + + :ivar ip_address: IP address. Might be missing due to historical data gap. + :ivar device_type: A description of the device used while user approval + blocked. + """ + + __slots__ = [ + '_ip_address_value', + '_ip_address_present', + '_device_type_value', + '_device_type_present', + ] + + _has_required_fields = True + + def __init__(self, + device_type=None, + ip_address=None): + self._ip_address_value = None + self._ip_address_present = False + self._device_type_value = None + self._device_type_present = False + if ip_address is not None: + self.ip_address = ip_address + if device_type is not None: + self.device_type = device_type + + @property + def ip_address(self): + """ + IP address. Might be missing due to historical data gap. + + :rtype: str + """ + if self._ip_address_present: + return self._ip_address_value + else: + return None + + @ip_address.setter + def ip_address(self, val): + if val is None: + del self.ip_address + return + val = self._ip_address_validator.validate(val) + self._ip_address_value = val + self._ip_address_present = True + + @ip_address.deleter + def ip_address(self): + self._ip_address_value = None + self._ip_address_present = False + + @property + def device_type(self): + """ + A description of the device used while user approval blocked. + + :rtype: DeviceType + """ + if self._device_type_present: + return self._device_type_value + else: + raise AttributeError("missing required field 'device_type'") + + @device_type.setter + def device_type(self, val): + self._device_type_validator.validate_type_only(val) + self._device_type_value = val + self._device_type_present = True + + @device_type.deleter + def device_type(self): + self._device_type_value = None + self._device_type_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceLinkFailDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceLinkFailDetails(device_type={!r}, ip_address={!r})'.format( + self._device_type_value, + self._ip_address_value, + ) + +DeviceLinkFailDetails_validator = bv.Struct(DeviceLinkFailDetails) + +class DeviceLinkFailType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceLinkFailType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceLinkFailType(description={!r})'.format( + self._description_value, + ) + +DeviceLinkFailType_validator = bv.Struct(DeviceLinkFailType) + +class DeviceLinkSuccessDetails(bb.Struct): + """ + Linked device. + + :ivar device_session_info: Device's session logged information. + """ + + __slots__ = [ + '_device_session_info_value', + '_device_session_info_present', + ] + + _has_required_fields = False + + def __init__(self, + device_session_info=None): + self._device_session_info_value = None + self._device_session_info_present = False + if device_session_info is not None: + self.device_session_info = device_session_info + + @property + def device_session_info(self): + """ + Device's session logged information. + + :rtype: DeviceSessionLogInfo + """ + if self._device_session_info_present: + return self._device_session_info_value + else: + return None + + @device_session_info.setter + def device_session_info(self, val): + if val is None: + del self.device_session_info + return + self._device_session_info_validator.validate_type_only(val) + self._device_session_info_value = val + self._device_session_info_present = True + + @device_session_info.deleter + def device_session_info(self): + self._device_session_info_value = None + self._device_session_info_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceLinkSuccessDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceLinkSuccessDetails(device_session_info={!r})'.format( + self._device_session_info_value, + ) + +DeviceLinkSuccessDetails_validator = bv.Struct(DeviceLinkSuccessDetails) + +class DeviceLinkSuccessType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceLinkSuccessType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceLinkSuccessType(description={!r})'.format( + self._description_value, + ) + +DeviceLinkSuccessType_validator = bv.Struct(DeviceLinkSuccessType) + +class DeviceManagementDisabledDetails(bb.Struct): + """ + Disabled device management. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceManagementDisabledDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceManagementDisabledDetails()' + +DeviceManagementDisabledDetails_validator = bv.Struct(DeviceManagementDisabledDetails) + +class DeviceManagementDisabledType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceManagementDisabledType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceManagementDisabledType(description={!r})'.format( + self._description_value, + ) + +DeviceManagementDisabledType_validator = bv.Struct(DeviceManagementDisabledType) + +class DeviceManagementEnabledDetails(bb.Struct): + """ + Enabled device management. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceManagementEnabledDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceManagementEnabledDetails()' + +DeviceManagementEnabledDetails_validator = bv.Struct(DeviceManagementEnabledDetails) + +class DeviceManagementEnabledType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceManagementEnabledType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceManagementEnabledType(description={!r})'.format( + self._description_value, + ) + +DeviceManagementEnabledType_validator = bv.Struct(DeviceManagementEnabledType) + +class DeviceType(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + desktop = None + # Attribute is overwritten below the class definition + mobile = None + # Attribute is overwritten below the class definition + other = None + + def is_desktop(self): + """ + Check if the union tag is ``desktop``. + + :rtype: bool + """ + return self._tag == 'desktop' + + def is_mobile(self): + """ + Check if the union tag is ``mobile``. + + :rtype: bool + """ + return self._tag == 'mobile' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceType(%r, %r)' % (self._tag, self._value) + +DeviceType_validator = bv.Union(DeviceType) + +class DeviceUnlinkDetails(bb.Struct): + """ + Disconnected device. + + :ivar session_info: Session unique id. + :ivar display_name: The device name. Might be missing due to historical data + gap. + :ivar delete_data: True if the user requested to delete data after device + unlink, false otherwise. + """ + + __slots__ = [ + '_session_info_value', + '_session_info_present', + '_display_name_value', + '_display_name_present', + '_delete_data_value', + '_delete_data_present', + ] + + _has_required_fields = True + + def __init__(self, + delete_data=None, + session_info=None, + display_name=None): + self._session_info_value = None + self._session_info_present = False + self._display_name_value = None + self._display_name_present = False + self._delete_data_value = None + self._delete_data_present = False + if session_info is not None: + self.session_info = session_info + if display_name is not None: + self.display_name = display_name + if delete_data is not None: + self.delete_data = delete_data + + @property + def session_info(self): + """ + Session unique id. + + :rtype: SessionLogInfo + """ + if self._session_info_present: + return self._session_info_value + else: + return None + + @session_info.setter + def session_info(self, val): + if val is None: + del self.session_info + return + self._session_info_validator.validate_type_only(val) + self._session_info_value = val + self._session_info_present = True + + @session_info.deleter + def session_info(self): + self._session_info_value = None + self._session_info_present = False + + @property + def display_name(self): + """ + The device name. Might be missing due to historical data gap. + + :rtype: str + """ + if self._display_name_present: + return self._display_name_value + else: + return None + + @display_name.setter + def display_name(self, val): + if val is None: + del self.display_name + return + val = self._display_name_validator.validate(val) + self._display_name_value = val + self._display_name_present = True + + @display_name.deleter + def display_name(self): + self._display_name_value = None + self._display_name_present = False + + @property + def delete_data(self): + """ + True if the user requested to delete data after device unlink, false + otherwise. + + :rtype: bool + """ + if self._delete_data_present: + return self._delete_data_value + else: + raise AttributeError("missing required field 'delete_data'") + + @delete_data.setter + def delete_data(self, val): + val = self._delete_data_validator.validate(val) + self._delete_data_value = val + self._delete_data_present = True + + @delete_data.deleter + def delete_data(self): + self._delete_data_value = None + self._delete_data_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceUnlinkDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceUnlinkDetails(delete_data={!r}, session_info={!r}, display_name={!r})'.format( + self._delete_data_value, + self._session_info_value, + self._display_name_value, + ) + +DeviceUnlinkDetails_validator = bv.Struct(DeviceUnlinkDetails) + +class DeviceUnlinkPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + remove = None + # Attribute is overwritten below the class definition + keep = None + # Attribute is overwritten below the class definition + other = None + + def is_remove(self): + """ + Check if the union tag is ``remove``. + + :rtype: bool + """ + return self._tag == 'remove' + + def is_keep(self): + """ + Check if the union tag is ``keep``. + + :rtype: bool + """ + return self._tag == 'keep' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceUnlinkPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceUnlinkPolicy(%r, %r)' % (self._tag, self._value) + +DeviceUnlinkPolicy_validator = bv.Union(DeviceUnlinkPolicy) + +class DeviceUnlinkType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DeviceUnlinkType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DeviceUnlinkType(description={!r})'.format( + self._description_value, + ) + +DeviceUnlinkType_validator = bv.Struct(DeviceUnlinkType) + +class DirectoryRestrictionsAddMembersDetails(bb.Struct): + """ + Added members to directory restrictions list. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(DirectoryRestrictionsAddMembersDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DirectoryRestrictionsAddMembersDetails()' + +DirectoryRestrictionsAddMembersDetails_validator = bv.Struct(DirectoryRestrictionsAddMembersDetails) + +class DirectoryRestrictionsAddMembersType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DirectoryRestrictionsAddMembersType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DirectoryRestrictionsAddMembersType(description={!r})'.format( + self._description_value, + ) + +DirectoryRestrictionsAddMembersType_validator = bv.Struct(DirectoryRestrictionsAddMembersType) + +class DirectoryRestrictionsRemoveMembersDetails(bb.Struct): + """ + Removed members from directory restrictions list. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(DirectoryRestrictionsRemoveMembersDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DirectoryRestrictionsRemoveMembersDetails()' + +DirectoryRestrictionsRemoveMembersDetails_validator = bv.Struct(DirectoryRestrictionsRemoveMembersDetails) + +class DirectoryRestrictionsRemoveMembersType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DirectoryRestrictionsRemoveMembersType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DirectoryRestrictionsRemoveMembersType(description={!r})'.format( + self._description_value, + ) + +DirectoryRestrictionsRemoveMembersType_validator = bv.Struct(DirectoryRestrictionsRemoveMembersType) + +class DisabledDomainInvitesDetails(bb.Struct): + """ + Disabled domain invites. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(DisabledDomainInvitesDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DisabledDomainInvitesDetails()' + +DisabledDomainInvitesDetails_validator = bv.Struct(DisabledDomainInvitesDetails) + +class DisabledDomainInvitesType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DisabledDomainInvitesType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DisabledDomainInvitesType(description={!r})'.format( + self._description_value, + ) + +DisabledDomainInvitesType_validator = bv.Struct(DisabledDomainInvitesType) + +class DomainInvitesApproveRequestToJoinTeamDetails(bb.Struct): + """ + Approved user's request to join team. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainInvitesApproveRequestToJoinTeamDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainInvitesApproveRequestToJoinTeamDetails()' + +DomainInvitesApproveRequestToJoinTeamDetails_validator = bv.Struct(DomainInvitesApproveRequestToJoinTeamDetails) + +class DomainInvitesApproveRequestToJoinTeamType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainInvitesApproveRequestToJoinTeamType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainInvitesApproveRequestToJoinTeamType(description={!r})'.format( + self._description_value, + ) + +DomainInvitesApproveRequestToJoinTeamType_validator = bv.Struct(DomainInvitesApproveRequestToJoinTeamType) + +class DomainInvitesDeclineRequestToJoinTeamDetails(bb.Struct): + """ + Declined user's request to join team. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainInvitesDeclineRequestToJoinTeamDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainInvitesDeclineRequestToJoinTeamDetails()' + +DomainInvitesDeclineRequestToJoinTeamDetails_validator = bv.Struct(DomainInvitesDeclineRequestToJoinTeamDetails) + +class DomainInvitesDeclineRequestToJoinTeamType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainInvitesDeclineRequestToJoinTeamType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainInvitesDeclineRequestToJoinTeamType(description={!r})'.format( + self._description_value, + ) + +DomainInvitesDeclineRequestToJoinTeamType_validator = bv.Struct(DomainInvitesDeclineRequestToJoinTeamType) + +class DomainInvitesEmailExistingUsersDetails(bb.Struct): + """ + Sent domain invites to existing domain accounts. + + :ivar domain_name: Domain names. + :ivar num_recipients: Number of recipients. + """ + + __slots__ = [ + '_domain_name_value', + '_domain_name_present', + '_num_recipients_value', + '_num_recipients_present', + ] + + _has_required_fields = True + + def __init__(self, + domain_name=None, + num_recipients=None): + self._domain_name_value = None + self._domain_name_present = False + self._num_recipients_value = None + self._num_recipients_present = False + if domain_name is not None: + self.domain_name = domain_name + if num_recipients is not None: + self.num_recipients = num_recipients + + @property + def domain_name(self): + """ + Domain names. + + :rtype: str + """ + if self._domain_name_present: + return self._domain_name_value + else: + raise AttributeError("missing required field 'domain_name'") + + @domain_name.setter + def domain_name(self, val): + val = self._domain_name_validator.validate(val) + self._domain_name_value = val + self._domain_name_present = True + + @domain_name.deleter + def domain_name(self): + self._domain_name_value = None + self._domain_name_present = False + + @property + def num_recipients(self): + """ + Number of recipients. + + :rtype: int + """ + if self._num_recipients_present: + return self._num_recipients_value + else: + raise AttributeError("missing required field 'num_recipients'") + + @num_recipients.setter + def num_recipients(self, val): + val = self._num_recipients_validator.validate(val) + self._num_recipients_value = val + self._num_recipients_present = True + + @num_recipients.deleter + def num_recipients(self): + self._num_recipients_value = None + self._num_recipients_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainInvitesEmailExistingUsersDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainInvitesEmailExistingUsersDetails(domain_name={!r}, num_recipients={!r})'.format( + self._domain_name_value, + self._num_recipients_value, + ) + +DomainInvitesEmailExistingUsersDetails_validator = bv.Struct(DomainInvitesEmailExistingUsersDetails) + +class DomainInvitesEmailExistingUsersType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainInvitesEmailExistingUsersType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainInvitesEmailExistingUsersType(description={!r})'.format( + self._description_value, + ) + +DomainInvitesEmailExistingUsersType_validator = bv.Struct(DomainInvitesEmailExistingUsersType) + +class DomainInvitesRequestToJoinTeamDetails(bb.Struct): + """ + Requested to join team. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainInvitesRequestToJoinTeamDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainInvitesRequestToJoinTeamDetails()' + +DomainInvitesRequestToJoinTeamDetails_validator = bv.Struct(DomainInvitesRequestToJoinTeamDetails) + +class DomainInvitesRequestToJoinTeamType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainInvitesRequestToJoinTeamType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainInvitesRequestToJoinTeamType(description={!r})'.format( + self._description_value, + ) + +DomainInvitesRequestToJoinTeamType_validator = bv.Struct(DomainInvitesRequestToJoinTeamType) + +class DomainInvitesSetInviteNewUserPrefToNoDetails(bb.Struct): + """ + Disabled "Automatically invite new users". + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainInvitesSetInviteNewUserPrefToNoDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainInvitesSetInviteNewUserPrefToNoDetails()' + +DomainInvitesSetInviteNewUserPrefToNoDetails_validator = bv.Struct(DomainInvitesSetInviteNewUserPrefToNoDetails) + +class DomainInvitesSetInviteNewUserPrefToNoType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainInvitesSetInviteNewUserPrefToNoType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainInvitesSetInviteNewUserPrefToNoType(description={!r})'.format( + self._description_value, + ) + +DomainInvitesSetInviteNewUserPrefToNoType_validator = bv.Struct(DomainInvitesSetInviteNewUserPrefToNoType) + +class DomainInvitesSetInviteNewUserPrefToYesDetails(bb.Struct): + """ + Enabled "Automatically invite new users". + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainInvitesSetInviteNewUserPrefToYesDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainInvitesSetInviteNewUserPrefToYesDetails()' + +DomainInvitesSetInviteNewUserPrefToYesDetails_validator = bv.Struct(DomainInvitesSetInviteNewUserPrefToYesDetails) + +class DomainInvitesSetInviteNewUserPrefToYesType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainInvitesSetInviteNewUserPrefToYesType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainInvitesSetInviteNewUserPrefToYesType(description={!r})'.format( + self._description_value, + ) + +DomainInvitesSetInviteNewUserPrefToYesType_validator = bv.Struct(DomainInvitesSetInviteNewUserPrefToYesType) + +class DomainVerificationAddDomainFailDetails(bb.Struct): + """ + Failed to verify team domain. + + :ivar domain_name: Domain name. + :ivar verification_method: Domain name verification method. Might be missing + due to historical data gap. + """ + + __slots__ = [ + '_domain_name_value', + '_domain_name_present', + '_verification_method_value', + '_verification_method_present', + ] + + _has_required_fields = True + + def __init__(self, + domain_name=None, + verification_method=None): + self._domain_name_value = None + self._domain_name_present = False + self._verification_method_value = None + self._verification_method_present = False + if domain_name is not None: + self.domain_name = domain_name + if verification_method is not None: + self.verification_method = verification_method + + @property + def domain_name(self): + """ + Domain name. + + :rtype: str + """ + if self._domain_name_present: + return self._domain_name_value + else: + raise AttributeError("missing required field 'domain_name'") + + @domain_name.setter + def domain_name(self, val): + val = self._domain_name_validator.validate(val) + self._domain_name_value = val + self._domain_name_present = True + + @domain_name.deleter + def domain_name(self): + self._domain_name_value = None + self._domain_name_present = False + + @property + def verification_method(self): + """ + Domain name verification method. Might be missing due to historical data + gap. + + :rtype: str + """ + if self._verification_method_present: + return self._verification_method_value + else: + return None + + @verification_method.setter + def verification_method(self, val): + if val is None: + del self.verification_method + return + val = self._verification_method_validator.validate(val) + self._verification_method_value = val + self._verification_method_present = True + + @verification_method.deleter + def verification_method(self): + self._verification_method_value = None + self._verification_method_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainVerificationAddDomainFailDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainVerificationAddDomainFailDetails(domain_name={!r}, verification_method={!r})'.format( + self._domain_name_value, + self._verification_method_value, + ) + +DomainVerificationAddDomainFailDetails_validator = bv.Struct(DomainVerificationAddDomainFailDetails) + +class DomainVerificationAddDomainFailType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainVerificationAddDomainFailType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainVerificationAddDomainFailType(description={!r})'.format( + self._description_value, + ) + +DomainVerificationAddDomainFailType_validator = bv.Struct(DomainVerificationAddDomainFailType) + +class DomainVerificationAddDomainSuccessDetails(bb.Struct): + """ + Verified team domain. + + :ivar domain_names: Domain names. + :ivar verification_method: Domain name verification method. Might be missing + due to historical data gap. + """ + + __slots__ = [ + '_domain_names_value', + '_domain_names_present', + '_verification_method_value', + '_verification_method_present', + ] + + _has_required_fields = True + + def __init__(self, + domain_names=None, + verification_method=None): + self._domain_names_value = None + self._domain_names_present = False + self._verification_method_value = None + self._verification_method_present = False + if domain_names is not None: + self.domain_names = domain_names + if verification_method is not None: + self.verification_method = verification_method + + @property + def domain_names(self): + """ + Domain names. + + :rtype: list of [str] + """ + if self._domain_names_present: + return self._domain_names_value + else: + raise AttributeError("missing required field 'domain_names'") + + @domain_names.setter + def domain_names(self, val): + val = self._domain_names_validator.validate(val) + self._domain_names_value = val + self._domain_names_present = True + + @domain_names.deleter + def domain_names(self): + self._domain_names_value = None + self._domain_names_present = False + + @property + def verification_method(self): + """ + Domain name verification method. Might be missing due to historical data + gap. + + :rtype: str + """ + if self._verification_method_present: + return self._verification_method_value + else: + return None + + @verification_method.setter + def verification_method(self, val): + if val is None: + del self.verification_method + return + val = self._verification_method_validator.validate(val) + self._verification_method_value = val + self._verification_method_present = True + + @verification_method.deleter + def verification_method(self): + self._verification_method_value = None + self._verification_method_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainVerificationAddDomainSuccessDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainVerificationAddDomainSuccessDetails(domain_names={!r}, verification_method={!r})'.format( + self._domain_names_value, + self._verification_method_value, + ) + +DomainVerificationAddDomainSuccessDetails_validator = bv.Struct(DomainVerificationAddDomainSuccessDetails) + +class DomainVerificationAddDomainSuccessType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainVerificationAddDomainSuccessType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainVerificationAddDomainSuccessType(description={!r})'.format( + self._description_value, + ) + +DomainVerificationAddDomainSuccessType_validator = bv.Struct(DomainVerificationAddDomainSuccessType) + +class DomainVerificationRemoveDomainDetails(bb.Struct): + """ + Removed domain from list of verified team domains. + + :ivar domain_names: Domain names. + """ + + __slots__ = [ + '_domain_names_value', + '_domain_names_present', + ] + + _has_required_fields = True + + def __init__(self, + domain_names=None): + self._domain_names_value = None + self._domain_names_present = False + if domain_names is not None: + self.domain_names = domain_names + + @property + def domain_names(self): + """ + Domain names. + + :rtype: list of [str] + """ + if self._domain_names_present: + return self._domain_names_value + else: + raise AttributeError("missing required field 'domain_names'") + + @domain_names.setter + def domain_names(self, val): + val = self._domain_names_validator.validate(val) + self._domain_names_value = val + self._domain_names_present = True + + @domain_names.deleter + def domain_names(self): + self._domain_names_value = None + self._domain_names_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainVerificationRemoveDomainDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainVerificationRemoveDomainDetails(domain_names={!r})'.format( + self._domain_names_value, + ) + +DomainVerificationRemoveDomainDetails_validator = bv.Struct(DomainVerificationRemoveDomainDetails) + +class DomainVerificationRemoveDomainType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DomainVerificationRemoveDomainType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DomainVerificationRemoveDomainType(description={!r})'.format( + self._description_value, + ) + +DomainVerificationRemoveDomainType_validator = bv.Struct(DomainVerificationRemoveDomainType) + +class DownloadPolicyType(bb.Union): + """ + Shared content downloads policy + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + allow = None + # Attribute is overwritten below the class definition + disallow = None + # Attribute is overwritten below the class definition + other = None + + def is_allow(self): + """ + Check if the union tag is ``allow``. + + :rtype: bool + """ + return self._tag == 'allow' + + def is_disallow(self): + """ + Check if the union tag is ``disallow``. + + :rtype: bool + """ + return self._tag == 'disallow' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(DownloadPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DownloadPolicyType(%r, %r)' % (self._tag, self._value) + +DownloadPolicyType_validator = bv.Union(DownloadPolicyType) + +class DurationLogInfo(bb.Struct): + """ + Represents a time duration: unit and amount + + :ivar unit: Time unit. + :ivar amount: Amount of time. + """ + + __slots__ = [ + '_unit_value', + '_unit_present', + '_amount_value', + '_amount_present', + ] + + _has_required_fields = True + + def __init__(self, + unit=None, + amount=None): + self._unit_value = None + self._unit_present = False + self._amount_value = None + self._amount_present = False + if unit is not None: + self.unit = unit + if amount is not None: + self.amount = amount + + @property + def unit(self): + """ + Time unit. + + :rtype: TimeUnit + """ + if self._unit_present: + return self._unit_value + else: + raise AttributeError("missing required field 'unit'") + + @unit.setter + def unit(self, val): + self._unit_validator.validate_type_only(val) + self._unit_value = val + self._unit_present = True + + @unit.deleter + def unit(self): + self._unit_value = None + self._unit_present = False + + @property + def amount(self): + """ + Amount of time. + + :rtype: int + """ + if self._amount_present: + return self._amount_value + else: + raise AttributeError("missing required field 'amount'") + + @amount.setter + def amount(self, val): + val = self._amount_validator.validate(val) + self._amount_value = val + self._amount_present = True + + @amount.deleter + def amount(self): + self._amount_value = None + self._amount_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(DurationLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'DurationLogInfo(unit={!r}, amount={!r})'.format( + self._unit_value, + self._amount_value, + ) + +DurationLogInfo_validator = bv.Struct(DurationLogInfo) + +class EmmAddExceptionDetails(bb.Struct): + """ + Added members to EMM exception list. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(EmmAddExceptionDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EmmAddExceptionDetails()' + +EmmAddExceptionDetails_validator = bv.Struct(EmmAddExceptionDetails) + +class EmmAddExceptionType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(EmmAddExceptionType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EmmAddExceptionType(description={!r})'.format( + self._description_value, + ) + +EmmAddExceptionType_validator = bv.Struct(EmmAddExceptionType) + +class EmmChangePolicyDetails(bb.Struct): + """ + Enabled/disabled enterprise mobility management for members. + + :ivar new_value: New enterprise mobility management policy. + :ivar previous_value: Previous enterprise mobility management policy. Might + be missing due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New enterprise mobility management policy. + + :rtype: team_policies.EmmState + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous enterprise mobility management policy. Might be missing due to + historical data gap. + + :rtype: team_policies.EmmState + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(EmmChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EmmChangePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +EmmChangePolicyDetails_validator = bv.Struct(EmmChangePolicyDetails) + +class EmmChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(EmmChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EmmChangePolicyType(description={!r})'.format( + self._description_value, + ) + +EmmChangePolicyType_validator = bv.Struct(EmmChangePolicyType) + +class EmmCreateExceptionsReportDetails(bb.Struct): + """ + Created EMM-excluded users report. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(EmmCreateExceptionsReportDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EmmCreateExceptionsReportDetails()' + +EmmCreateExceptionsReportDetails_validator = bv.Struct(EmmCreateExceptionsReportDetails) + +class EmmCreateExceptionsReportType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(EmmCreateExceptionsReportType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EmmCreateExceptionsReportType(description={!r})'.format( + self._description_value, + ) + +EmmCreateExceptionsReportType_validator = bv.Struct(EmmCreateExceptionsReportType) + +class EmmCreateUsageReportDetails(bb.Struct): + """ + Created EMM mobile app usage report. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(EmmCreateUsageReportDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EmmCreateUsageReportDetails()' + +EmmCreateUsageReportDetails_validator = bv.Struct(EmmCreateUsageReportDetails) + +class EmmCreateUsageReportType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(EmmCreateUsageReportType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EmmCreateUsageReportType(description={!r})'.format( + self._description_value, + ) + +EmmCreateUsageReportType_validator = bv.Struct(EmmCreateUsageReportType) + +class EmmErrorDetails(bb.Struct): + """ + Failed to sign in via EMM. + + :ivar error_details: Error details. + """ + + __slots__ = [ + '_error_details_value', + '_error_details_present', + ] + + _has_required_fields = True + + def __init__(self, + error_details=None): + self._error_details_value = None + self._error_details_present = False + if error_details is not None: + self.error_details = error_details + + @property + def error_details(self): + """ + Error details. + + :rtype: FailureDetailsLogInfo + """ + if self._error_details_present: + return self._error_details_value + else: + raise AttributeError("missing required field 'error_details'") + + @error_details.setter + def error_details(self, val): + self._error_details_validator.validate_type_only(val) + self._error_details_value = val + self._error_details_present = True + + @error_details.deleter + def error_details(self): + self._error_details_value = None + self._error_details_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(EmmErrorDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EmmErrorDetails(error_details={!r})'.format( + self._error_details_value, + ) + +EmmErrorDetails_validator = bv.Struct(EmmErrorDetails) + +class EmmErrorType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(EmmErrorType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EmmErrorType(description={!r})'.format( + self._description_value, + ) + +EmmErrorType_validator = bv.Struct(EmmErrorType) + +class EmmRefreshAuthTokenDetails(bb.Struct): + """ + Refreshed auth token used for setting up enterprise mobility management. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(EmmRefreshAuthTokenDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EmmRefreshAuthTokenDetails()' + +EmmRefreshAuthTokenDetails_validator = bv.Struct(EmmRefreshAuthTokenDetails) + +class EmmRefreshAuthTokenType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(EmmRefreshAuthTokenType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EmmRefreshAuthTokenType(description={!r})'.format( + self._description_value, + ) + +EmmRefreshAuthTokenType_validator = bv.Struct(EmmRefreshAuthTokenType) + +class EmmRemoveExceptionDetails(bb.Struct): + """ + Removed members from EMM exception list. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(EmmRemoveExceptionDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EmmRemoveExceptionDetails()' + +EmmRemoveExceptionDetails_validator = bv.Struct(EmmRemoveExceptionDetails) + +class EmmRemoveExceptionType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(EmmRemoveExceptionType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EmmRemoveExceptionType(description={!r})'.format( + self._description_value, + ) + +EmmRemoveExceptionType_validator = bv.Struct(EmmRemoveExceptionType) + +class EnabledDomainInvitesDetails(bb.Struct): + """ + Enabled domain invites. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(EnabledDomainInvitesDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EnabledDomainInvitesDetails()' + +EnabledDomainInvitesDetails_validator = bv.Struct(EnabledDomainInvitesDetails) + +class EnabledDomainInvitesType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(EnabledDomainInvitesType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EnabledDomainInvitesType(description={!r})'.format( + self._description_value, + ) + +EnabledDomainInvitesType_validator = bv.Struct(EnabledDomainInvitesType) + +class EventCategory(bb.Union): + """ + Category of events in event audit log. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar apps: Events that apply to management of linked apps. + :ivar comments: Events that have to do with comments on files and Paper + documents. + :ivar devices: Events that apply to linked devices on mobile, desktop and + Web platforms. + :ivar domains: Events that involve domain management feature: domain + verification, invite enforcement and account capture. + :ivar file_operations: Events that have to do with filesystem operations on + files and folders: copy, move, delete, etc. + :ivar file_requests: Events that apply to the file requests feature. + :ivar groups: Events that involve group management. + :ivar logins: Events that involve users signing in to or out of Dropbox. + :ivar members: Events that involve team member management. + :ivar paper: Events that apply to Dropbox Paper. + :ivar passwords: Events that involve using, changing or resetting passwords. + :ivar reports: Events that concern generation of admin reports, including + team activity and device usage. + :ivar sharing: Events that apply to all types of sharing and collaboration. + :ivar showcase: Events that apply to Dropbox Showcase. + :ivar sso: Events that involve using or configuring single sign-on as well + as administrative policies concerning single sign-on. + :ivar team_folders: Events that involve team folder management. + :ivar team_policies: Events that involve a change in team-wide policies. + :ivar team_profile: Events that involve a change in the team profile. + :ivar tfa: Events that involve using or configuring two factor + authentication as well as administrative policies concerning two factor + authentication. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + apps = None + # Attribute is overwritten below the class definition + comments = None + # Attribute is overwritten below the class definition + devices = None + # Attribute is overwritten below the class definition + domains = None + # Attribute is overwritten below the class definition + file_operations = None + # Attribute is overwritten below the class definition + file_requests = None + # Attribute is overwritten below the class definition + groups = None + # Attribute is overwritten below the class definition + logins = None + # Attribute is overwritten below the class definition + members = None + # Attribute is overwritten below the class definition + paper = None + # Attribute is overwritten below the class definition + passwords = None + # Attribute is overwritten below the class definition + reports = None + # Attribute is overwritten below the class definition + sharing = None + # Attribute is overwritten below the class definition + showcase = None + # Attribute is overwritten below the class definition + sso = None + # Attribute is overwritten below the class definition + team_folders = None + # Attribute is overwritten below the class definition + team_policies = None + # Attribute is overwritten below the class definition + team_profile = None + # Attribute is overwritten below the class definition + tfa = None + # Attribute is overwritten below the class definition + other = None + + def is_apps(self): + """ + Check if the union tag is ``apps``. + + :rtype: bool + """ + return self._tag == 'apps' + + def is_comments(self): + """ + Check if the union tag is ``comments``. + + :rtype: bool + """ + return self._tag == 'comments' + + def is_devices(self): + """ + Check if the union tag is ``devices``. + + :rtype: bool + """ + return self._tag == 'devices' + + def is_domains(self): + """ + Check if the union tag is ``domains``. + + :rtype: bool + """ + return self._tag == 'domains' + + def is_file_operations(self): + """ + Check if the union tag is ``file_operations``. + + :rtype: bool + """ + return self._tag == 'file_operations' + + def is_file_requests(self): + """ + Check if the union tag is ``file_requests``. + + :rtype: bool + """ + return self._tag == 'file_requests' + + def is_groups(self): + """ + Check if the union tag is ``groups``. + + :rtype: bool + """ + return self._tag == 'groups' + + def is_logins(self): + """ + Check if the union tag is ``logins``. + + :rtype: bool + """ + return self._tag == 'logins' + + def is_members(self): + """ + Check if the union tag is ``members``. + + :rtype: bool + """ + return self._tag == 'members' + + def is_paper(self): + """ + Check if the union tag is ``paper``. + + :rtype: bool + """ + return self._tag == 'paper' + + def is_passwords(self): + """ + Check if the union tag is ``passwords``. + + :rtype: bool + """ + return self._tag == 'passwords' + + def is_reports(self): + """ + Check if the union tag is ``reports``. + + :rtype: bool + """ + return self._tag == 'reports' + + def is_sharing(self): + """ + Check if the union tag is ``sharing``. + + :rtype: bool + """ + return self._tag == 'sharing' + + def is_showcase(self): + """ + Check if the union tag is ``showcase``. + + :rtype: bool + """ + return self._tag == 'showcase' + + def is_sso(self): + """ + Check if the union tag is ``sso``. + + :rtype: bool + """ + return self._tag == 'sso' + + def is_team_folders(self): + """ + Check if the union tag is ``team_folders``. + + :rtype: bool + """ + return self._tag == 'team_folders' + + def is_team_policies(self): + """ + Check if the union tag is ``team_policies``. + + :rtype: bool + """ + return self._tag == 'team_policies' + + def is_team_profile(self): + """ + Check if the union tag is ``team_profile``. + + :rtype: bool + """ + return self._tag == 'team_profile' + + def is_tfa(self): + """ + Check if the union tag is ``tfa``. + + :rtype: bool + """ + return self._tag == 'tfa' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(EventCategory, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EventCategory(%r, %r)' % (self._tag, self._value) + +EventCategory_validator = bv.Union(EventCategory) + +class EventDetails(bb.Union): + """ + Additional fields depending on the event type. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar MissingDetails missing_details: Hints that this event was returned + with missing details due to an internal error. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def app_link_team_details(cls, val): + """ + Create an instance of this class set to the ``app_link_team_details`` + tag with value ``val``. + + :param AppLinkTeamDetails val: + :rtype: EventDetails + """ + return cls('app_link_team_details', val) + + @classmethod + def app_link_user_details(cls, val): + """ + Create an instance of this class set to the ``app_link_user_details`` + tag with value ``val``. + + :param AppLinkUserDetails val: + :rtype: EventDetails + """ + return cls('app_link_user_details', val) + + @classmethod + def app_unlink_team_details(cls, val): + """ + Create an instance of this class set to the ``app_unlink_team_details`` + tag with value ``val``. + + :param AppUnlinkTeamDetails val: + :rtype: EventDetails + """ + return cls('app_unlink_team_details', val) + + @classmethod + def app_unlink_user_details(cls, val): + """ + Create an instance of this class set to the ``app_unlink_user_details`` + tag with value ``val``. + + :param AppUnlinkUserDetails val: + :rtype: EventDetails + """ + return cls('app_unlink_user_details', val) + + @classmethod + def file_add_comment_details(cls, val): + """ + Create an instance of this class set to the ``file_add_comment_details`` + tag with value ``val``. + + :param FileAddCommentDetails val: + :rtype: EventDetails + """ + return cls('file_add_comment_details', val) + + @classmethod + def file_change_comment_subscription_details(cls, val): + """ + Create an instance of this class set to the + ``file_change_comment_subscription_details`` tag with value ``val``. + + :param FileChangeCommentSubscriptionDetails val: + :rtype: EventDetails + """ + return cls('file_change_comment_subscription_details', val) + + @classmethod + def file_delete_comment_details(cls, val): + """ + Create an instance of this class set to the + ``file_delete_comment_details`` tag with value ``val``. + + :param FileDeleteCommentDetails val: + :rtype: EventDetails + """ + return cls('file_delete_comment_details', val) + + @classmethod + def file_edit_comment_details(cls, val): + """ + Create an instance of this class set to the + ``file_edit_comment_details`` tag with value ``val``. + + :param FileEditCommentDetails val: + :rtype: EventDetails + """ + return cls('file_edit_comment_details', val) + + @classmethod + def file_like_comment_details(cls, val): + """ + Create an instance of this class set to the + ``file_like_comment_details`` tag with value ``val``. + + :param FileLikeCommentDetails val: + :rtype: EventDetails + """ + return cls('file_like_comment_details', val) + + @classmethod + def file_resolve_comment_details(cls, val): + """ + Create an instance of this class set to the + ``file_resolve_comment_details`` tag with value ``val``. + + :param FileResolveCommentDetails val: + :rtype: EventDetails + """ + return cls('file_resolve_comment_details', val) + + @classmethod + def file_unlike_comment_details(cls, val): + """ + Create an instance of this class set to the + ``file_unlike_comment_details`` tag with value ``val``. + + :param FileUnlikeCommentDetails val: + :rtype: EventDetails + """ + return cls('file_unlike_comment_details', val) + + @classmethod + def file_unresolve_comment_details(cls, val): + """ + Create an instance of this class set to the + ``file_unresolve_comment_details`` tag with value ``val``. + + :param FileUnresolveCommentDetails val: + :rtype: EventDetails + """ + return cls('file_unresolve_comment_details', val) + + @classmethod + def device_change_ip_desktop_details(cls, val): + """ + Create an instance of this class set to the + ``device_change_ip_desktop_details`` tag with value ``val``. + + :param DeviceChangeIpDesktopDetails val: + :rtype: EventDetails + """ + return cls('device_change_ip_desktop_details', val) + + @classmethod + def device_change_ip_mobile_details(cls, val): + """ + Create an instance of this class set to the + ``device_change_ip_mobile_details`` tag with value ``val``. + + :param DeviceChangeIpMobileDetails val: + :rtype: EventDetails + """ + return cls('device_change_ip_mobile_details', val) + + @classmethod + def device_change_ip_web_details(cls, val): + """ + Create an instance of this class set to the + ``device_change_ip_web_details`` tag with value ``val``. + + :param DeviceChangeIpWebDetails val: + :rtype: EventDetails + """ + return cls('device_change_ip_web_details', val) + + @classmethod + def device_delete_on_unlink_fail_details(cls, val): + """ + Create an instance of this class set to the + ``device_delete_on_unlink_fail_details`` tag with value ``val``. + + :param DeviceDeleteOnUnlinkFailDetails val: + :rtype: EventDetails + """ + return cls('device_delete_on_unlink_fail_details', val) + + @classmethod + def device_delete_on_unlink_success_details(cls, val): + """ + Create an instance of this class set to the + ``device_delete_on_unlink_success_details`` tag with value ``val``. + + :param DeviceDeleteOnUnlinkSuccessDetails val: + :rtype: EventDetails + """ + return cls('device_delete_on_unlink_success_details', val) + + @classmethod + def device_link_fail_details(cls, val): + """ + Create an instance of this class set to the ``device_link_fail_details`` + tag with value ``val``. + + :param DeviceLinkFailDetails val: + :rtype: EventDetails + """ + return cls('device_link_fail_details', val) + + @classmethod + def device_link_success_details(cls, val): + """ + Create an instance of this class set to the + ``device_link_success_details`` tag with value ``val``. + + :param DeviceLinkSuccessDetails val: + :rtype: EventDetails + """ + return cls('device_link_success_details', val) + + @classmethod + def device_management_disabled_details(cls, val): + """ + Create an instance of this class set to the + ``device_management_disabled_details`` tag with value ``val``. + + :param DeviceManagementDisabledDetails val: + :rtype: EventDetails + """ + return cls('device_management_disabled_details', val) + + @classmethod + def device_management_enabled_details(cls, val): + """ + Create an instance of this class set to the + ``device_management_enabled_details`` tag with value ``val``. + + :param DeviceManagementEnabledDetails val: + :rtype: EventDetails + """ + return cls('device_management_enabled_details', val) + + @classmethod + def device_unlink_details(cls, val): + """ + Create an instance of this class set to the ``device_unlink_details`` + tag with value ``val``. + + :param DeviceUnlinkDetails val: + :rtype: EventDetails + """ + return cls('device_unlink_details', val) + + @classmethod + def emm_refresh_auth_token_details(cls, val): + """ + Create an instance of this class set to the + ``emm_refresh_auth_token_details`` tag with value ``val``. + + :param EmmRefreshAuthTokenDetails val: + :rtype: EventDetails + """ + return cls('emm_refresh_auth_token_details', val) + + @classmethod + def account_capture_change_availability_details(cls, val): + """ + Create an instance of this class set to the + ``account_capture_change_availability_details`` tag with value ``val``. + + :param AccountCaptureChangeAvailabilityDetails val: + :rtype: EventDetails + """ + return cls('account_capture_change_availability_details', val) + + @classmethod + def account_capture_migrate_account_details(cls, val): + """ + Create an instance of this class set to the + ``account_capture_migrate_account_details`` tag with value ``val``. + + :param AccountCaptureMigrateAccountDetails val: + :rtype: EventDetails + """ + return cls('account_capture_migrate_account_details', val) + + @classmethod + def account_capture_notification_emails_sent_details(cls, val): + """ + Create an instance of this class set to the + ``account_capture_notification_emails_sent_details`` tag with value + ``val``. + + :param AccountCaptureNotificationEmailsSentDetails val: + :rtype: EventDetails + """ + return cls('account_capture_notification_emails_sent_details', val) + + @classmethod + def account_capture_relinquish_account_details(cls, val): + """ + Create an instance of this class set to the + ``account_capture_relinquish_account_details`` tag with value ``val``. + + :param AccountCaptureRelinquishAccountDetails val: + :rtype: EventDetails + """ + return cls('account_capture_relinquish_account_details', val) + + @classmethod + def disabled_domain_invites_details(cls, val): + """ + Create an instance of this class set to the + ``disabled_domain_invites_details`` tag with value ``val``. + + :param DisabledDomainInvitesDetails val: + :rtype: EventDetails + """ + return cls('disabled_domain_invites_details', val) + + @classmethod + def domain_invites_approve_request_to_join_team_details(cls, val): + """ + Create an instance of this class set to the + ``domain_invites_approve_request_to_join_team_details`` tag with value + ``val``. + + :param DomainInvitesApproveRequestToJoinTeamDetails val: + :rtype: EventDetails + """ + return cls('domain_invites_approve_request_to_join_team_details', val) + + @classmethod + def domain_invites_decline_request_to_join_team_details(cls, val): + """ + Create an instance of this class set to the + ``domain_invites_decline_request_to_join_team_details`` tag with value + ``val``. + + :param DomainInvitesDeclineRequestToJoinTeamDetails val: + :rtype: EventDetails + """ + return cls('domain_invites_decline_request_to_join_team_details', val) + + @classmethod + def domain_invites_email_existing_users_details(cls, val): + """ + Create an instance of this class set to the + ``domain_invites_email_existing_users_details`` tag with value ``val``. + + :param DomainInvitesEmailExistingUsersDetails val: + :rtype: EventDetails + """ + return cls('domain_invites_email_existing_users_details', val) + + @classmethod + def domain_invites_request_to_join_team_details(cls, val): + """ + Create an instance of this class set to the + ``domain_invites_request_to_join_team_details`` tag with value ``val``. + + :param DomainInvitesRequestToJoinTeamDetails val: + :rtype: EventDetails + """ + return cls('domain_invites_request_to_join_team_details', val) + + @classmethod + def domain_invites_set_invite_new_user_pref_to_no_details(cls, val): + """ + Create an instance of this class set to the + ``domain_invites_set_invite_new_user_pref_to_no_details`` tag with value + ``val``. + + :param DomainInvitesSetInviteNewUserPrefToNoDetails val: + :rtype: EventDetails + """ + return cls('domain_invites_set_invite_new_user_pref_to_no_details', val) + + @classmethod + def domain_invites_set_invite_new_user_pref_to_yes_details(cls, val): + """ + Create an instance of this class set to the + ``domain_invites_set_invite_new_user_pref_to_yes_details`` tag with + value ``val``. + + :param DomainInvitesSetInviteNewUserPrefToYesDetails val: + :rtype: EventDetails + """ + return cls('domain_invites_set_invite_new_user_pref_to_yes_details', val) + + @classmethod + def domain_verification_add_domain_fail_details(cls, val): + """ + Create an instance of this class set to the + ``domain_verification_add_domain_fail_details`` tag with value ``val``. + + :param DomainVerificationAddDomainFailDetails val: + :rtype: EventDetails + """ + return cls('domain_verification_add_domain_fail_details', val) + + @classmethod + def domain_verification_add_domain_success_details(cls, val): + """ + Create an instance of this class set to the + ``domain_verification_add_domain_success_details`` tag with value + ``val``. + + :param DomainVerificationAddDomainSuccessDetails val: + :rtype: EventDetails + """ + return cls('domain_verification_add_domain_success_details', val) + + @classmethod + def domain_verification_remove_domain_details(cls, val): + """ + Create an instance of this class set to the + ``domain_verification_remove_domain_details`` tag with value ``val``. + + :param DomainVerificationRemoveDomainDetails val: + :rtype: EventDetails + """ + return cls('domain_verification_remove_domain_details', val) + + @classmethod + def enabled_domain_invites_details(cls, val): + """ + Create an instance of this class set to the + ``enabled_domain_invites_details`` tag with value ``val``. + + :param EnabledDomainInvitesDetails val: + :rtype: EventDetails + """ + return cls('enabled_domain_invites_details', val) + + @classmethod + def create_folder_details(cls, val): + """ + Create an instance of this class set to the ``create_folder_details`` + tag with value ``val``. + + :param CreateFolderDetails val: + :rtype: EventDetails + """ + return cls('create_folder_details', val) + + @classmethod + def file_add_details(cls, val): + """ + Create an instance of this class set to the ``file_add_details`` tag + with value ``val``. + + :param FileAddDetails val: + :rtype: EventDetails + """ + return cls('file_add_details', val) + + @classmethod + def file_copy_details(cls, val): + """ + Create an instance of this class set to the ``file_copy_details`` tag + with value ``val``. + + :param FileCopyDetails val: + :rtype: EventDetails + """ + return cls('file_copy_details', val) + + @classmethod + def file_delete_details(cls, val): + """ + Create an instance of this class set to the ``file_delete_details`` tag + with value ``val``. + + :param FileDeleteDetails val: + :rtype: EventDetails + """ + return cls('file_delete_details', val) + + @classmethod + def file_download_details(cls, val): + """ + Create an instance of this class set to the ``file_download_details`` + tag with value ``val``. + + :param FileDownloadDetails val: + :rtype: EventDetails + """ + return cls('file_download_details', val) + + @classmethod + def file_edit_details(cls, val): + """ + Create an instance of this class set to the ``file_edit_details`` tag + with value ``val``. + + :param FileEditDetails val: + :rtype: EventDetails + """ + return cls('file_edit_details', val) + + @classmethod + def file_get_copy_reference_details(cls, val): + """ + Create an instance of this class set to the + ``file_get_copy_reference_details`` tag with value ``val``. + + :param FileGetCopyReferenceDetails val: + :rtype: EventDetails + """ + return cls('file_get_copy_reference_details', val) + + @classmethod + def file_move_details(cls, val): + """ + Create an instance of this class set to the ``file_move_details`` tag + with value ``val``. + + :param FileMoveDetails val: + :rtype: EventDetails + """ + return cls('file_move_details', val) + + @classmethod + def file_permanently_delete_details(cls, val): + """ + Create an instance of this class set to the + ``file_permanently_delete_details`` tag with value ``val``. + + :param FilePermanentlyDeleteDetails val: + :rtype: EventDetails + """ + return cls('file_permanently_delete_details', val) + + @classmethod + def file_preview_details(cls, val): + """ + Create an instance of this class set to the ``file_preview_details`` tag + with value ``val``. + + :param FilePreviewDetails val: + :rtype: EventDetails + """ + return cls('file_preview_details', val) + + @classmethod + def file_rename_details(cls, val): + """ + Create an instance of this class set to the ``file_rename_details`` tag + with value ``val``. + + :param FileRenameDetails val: + :rtype: EventDetails + """ + return cls('file_rename_details', val) + + @classmethod + def file_restore_details(cls, val): + """ + Create an instance of this class set to the ``file_restore_details`` tag + with value ``val``. + + :param FileRestoreDetails val: + :rtype: EventDetails + """ + return cls('file_restore_details', val) + + @classmethod + def file_revert_details(cls, val): + """ + Create an instance of this class set to the ``file_revert_details`` tag + with value ``val``. + + :param FileRevertDetails val: + :rtype: EventDetails + """ + return cls('file_revert_details', val) + + @classmethod + def file_rollback_changes_details(cls, val): + """ + Create an instance of this class set to the + ``file_rollback_changes_details`` tag with value ``val``. + + :param FileRollbackChangesDetails val: + :rtype: EventDetails + """ + return cls('file_rollback_changes_details', val) + + @classmethod + def file_save_copy_reference_details(cls, val): + """ + Create an instance of this class set to the + ``file_save_copy_reference_details`` tag with value ``val``. + + :param FileSaveCopyReferenceDetails val: + :rtype: EventDetails + """ + return cls('file_save_copy_reference_details', val) + + @classmethod + def file_request_change_details(cls, val): + """ + Create an instance of this class set to the + ``file_request_change_details`` tag with value ``val``. + + :param FileRequestChangeDetails val: + :rtype: EventDetails + """ + return cls('file_request_change_details', val) + + @classmethod + def file_request_close_details(cls, val): + """ + Create an instance of this class set to the + ``file_request_close_details`` tag with value ``val``. + + :param FileRequestCloseDetails val: + :rtype: EventDetails + """ + return cls('file_request_close_details', val) + + @classmethod + def file_request_create_details(cls, val): + """ + Create an instance of this class set to the + ``file_request_create_details`` tag with value ``val``. + + :param FileRequestCreateDetails val: + :rtype: EventDetails + """ + return cls('file_request_create_details', val) + + @classmethod + def file_request_receive_file_details(cls, val): + """ + Create an instance of this class set to the + ``file_request_receive_file_details`` tag with value ``val``. + + :param FileRequestReceiveFileDetails val: + :rtype: EventDetails + """ + return cls('file_request_receive_file_details', val) + + @classmethod + def group_add_external_id_details(cls, val): + """ + Create an instance of this class set to the + ``group_add_external_id_details`` tag with value ``val``. + + :param GroupAddExternalIdDetails val: + :rtype: EventDetails + """ + return cls('group_add_external_id_details', val) + + @classmethod + def group_add_member_details(cls, val): + """ + Create an instance of this class set to the ``group_add_member_details`` + tag with value ``val``. + + :param GroupAddMemberDetails val: + :rtype: EventDetails + """ + return cls('group_add_member_details', val) + + @classmethod + def group_change_external_id_details(cls, val): + """ + Create an instance of this class set to the + ``group_change_external_id_details`` tag with value ``val``. + + :param GroupChangeExternalIdDetails val: + :rtype: EventDetails + """ + return cls('group_change_external_id_details', val) + + @classmethod + def group_change_management_type_details(cls, val): + """ + Create an instance of this class set to the + ``group_change_management_type_details`` tag with value ``val``. + + :param GroupChangeManagementTypeDetails val: + :rtype: EventDetails + """ + return cls('group_change_management_type_details', val) + + @classmethod + def group_change_member_role_details(cls, val): + """ + Create an instance of this class set to the + ``group_change_member_role_details`` tag with value ``val``. + + :param GroupChangeMemberRoleDetails val: + :rtype: EventDetails + """ + return cls('group_change_member_role_details', val) + + @classmethod + def group_create_details(cls, val): + """ + Create an instance of this class set to the ``group_create_details`` tag + with value ``val``. + + :param GroupCreateDetails val: + :rtype: EventDetails + """ + return cls('group_create_details', val) + + @classmethod + def group_delete_details(cls, val): + """ + Create an instance of this class set to the ``group_delete_details`` tag + with value ``val``. + + :param GroupDeleteDetails val: + :rtype: EventDetails + """ + return cls('group_delete_details', val) + + @classmethod + def group_description_updated_details(cls, val): + """ + Create an instance of this class set to the + ``group_description_updated_details`` tag with value ``val``. + + :param GroupDescriptionUpdatedDetails val: + :rtype: EventDetails + """ + return cls('group_description_updated_details', val) + + @classmethod + def group_join_policy_updated_details(cls, val): + """ + Create an instance of this class set to the + ``group_join_policy_updated_details`` tag with value ``val``. + + :param GroupJoinPolicyUpdatedDetails val: + :rtype: EventDetails + """ + return cls('group_join_policy_updated_details', val) + + @classmethod + def group_moved_details(cls, val): + """ + Create an instance of this class set to the ``group_moved_details`` tag + with value ``val``. + + :param GroupMovedDetails val: + :rtype: EventDetails + """ + return cls('group_moved_details', val) + + @classmethod + def group_remove_external_id_details(cls, val): + """ + Create an instance of this class set to the + ``group_remove_external_id_details`` tag with value ``val``. + + :param GroupRemoveExternalIdDetails val: + :rtype: EventDetails + """ + return cls('group_remove_external_id_details', val) + + @classmethod + def group_remove_member_details(cls, val): + """ + Create an instance of this class set to the + ``group_remove_member_details`` tag with value ``val``. + + :param GroupRemoveMemberDetails val: + :rtype: EventDetails + """ + return cls('group_remove_member_details', val) + + @classmethod + def group_rename_details(cls, val): + """ + Create an instance of this class set to the ``group_rename_details`` tag + with value ``val``. + + :param GroupRenameDetails val: + :rtype: EventDetails + """ + return cls('group_rename_details', val) + + @classmethod + def emm_error_details(cls, val): + """ + Create an instance of this class set to the ``emm_error_details`` tag + with value ``val``. + + :param EmmErrorDetails val: + :rtype: EventDetails + """ + return cls('emm_error_details', val) + + @classmethod + def login_fail_details(cls, val): + """ + Create an instance of this class set to the ``login_fail_details`` tag + with value ``val``. + + :param LoginFailDetails val: + :rtype: EventDetails + """ + return cls('login_fail_details', val) + + @classmethod + def login_success_details(cls, val): + """ + Create an instance of this class set to the ``login_success_details`` + tag with value ``val``. + + :param LoginSuccessDetails val: + :rtype: EventDetails + """ + return cls('login_success_details', val) + + @classmethod + def logout_details(cls, val): + """ + Create an instance of this class set to the ``logout_details`` tag with + value ``val``. + + :param LogoutDetails val: + :rtype: EventDetails + """ + return cls('logout_details', val) + + @classmethod + def reseller_support_session_end_details(cls, val): + """ + Create an instance of this class set to the + ``reseller_support_session_end_details`` tag with value ``val``. + + :param ResellerSupportSessionEndDetails val: + :rtype: EventDetails + """ + return cls('reseller_support_session_end_details', val) + + @classmethod + def reseller_support_session_start_details(cls, val): + """ + Create an instance of this class set to the + ``reseller_support_session_start_details`` tag with value ``val``. + + :param ResellerSupportSessionStartDetails val: + :rtype: EventDetails + """ + return cls('reseller_support_session_start_details', val) + + @classmethod + def sign_in_as_session_end_details(cls, val): + """ + Create an instance of this class set to the + ``sign_in_as_session_end_details`` tag with value ``val``. + + :param SignInAsSessionEndDetails val: + :rtype: EventDetails + """ + return cls('sign_in_as_session_end_details', val) + + @classmethod + def sign_in_as_session_start_details(cls, val): + """ + Create an instance of this class set to the + ``sign_in_as_session_start_details`` tag with value ``val``. + + :param SignInAsSessionStartDetails val: + :rtype: EventDetails + """ + return cls('sign_in_as_session_start_details', val) + + @classmethod + def sso_error_details(cls, val): + """ + Create an instance of this class set to the ``sso_error_details`` tag + with value ``val``. + + :param SsoErrorDetails val: + :rtype: EventDetails + """ + return cls('sso_error_details', val) + + @classmethod + def member_add_name_details(cls, val): + """ + Create an instance of this class set to the ``member_add_name_details`` + tag with value ``val``. + + :param MemberAddNameDetails val: + :rtype: EventDetails + """ + return cls('member_add_name_details', val) + + @classmethod + def member_change_admin_role_details(cls, val): + """ + Create an instance of this class set to the + ``member_change_admin_role_details`` tag with value ``val``. + + :param MemberChangeAdminRoleDetails val: + :rtype: EventDetails + """ + return cls('member_change_admin_role_details', val) + + @classmethod + def member_change_email_details(cls, val): + """ + Create an instance of this class set to the + ``member_change_email_details`` tag with value ``val``. + + :param MemberChangeEmailDetails val: + :rtype: EventDetails + """ + return cls('member_change_email_details', val) + + @classmethod + def member_change_membership_type_details(cls, val): + """ + Create an instance of this class set to the + ``member_change_membership_type_details`` tag with value ``val``. + + :param MemberChangeMembershipTypeDetails val: + :rtype: EventDetails + """ + return cls('member_change_membership_type_details', val) + + @classmethod + def member_change_name_details(cls, val): + """ + Create an instance of this class set to the + ``member_change_name_details`` tag with value ``val``. + + :param MemberChangeNameDetails val: + :rtype: EventDetails + """ + return cls('member_change_name_details', val) + + @classmethod + def member_change_status_details(cls, val): + """ + Create an instance of this class set to the + ``member_change_status_details`` tag with value ``val``. + + :param MemberChangeStatusDetails val: + :rtype: EventDetails + """ + return cls('member_change_status_details', val) + + @classmethod + def member_delete_manual_contacts_details(cls, val): + """ + Create an instance of this class set to the + ``member_delete_manual_contacts_details`` tag with value ``val``. + + :param MemberDeleteManualContactsDetails val: + :rtype: EventDetails + """ + return cls('member_delete_manual_contacts_details', val) + + @classmethod + def member_permanently_delete_account_contents_details(cls, val): + """ + Create an instance of this class set to the + ``member_permanently_delete_account_contents_details`` tag with value + ``val``. + + :param MemberPermanentlyDeleteAccountContentsDetails val: + :rtype: EventDetails + """ + return cls('member_permanently_delete_account_contents_details', val) + + @classmethod + def member_space_limits_add_custom_quota_details(cls, val): + """ + Create an instance of this class set to the + ``member_space_limits_add_custom_quota_details`` tag with value ``val``. + + :param MemberSpaceLimitsAddCustomQuotaDetails val: + :rtype: EventDetails + """ + return cls('member_space_limits_add_custom_quota_details', val) + + @classmethod + def member_space_limits_change_custom_quota_details(cls, val): + """ + Create an instance of this class set to the + ``member_space_limits_change_custom_quota_details`` tag with value + ``val``. + + :param MemberSpaceLimitsChangeCustomQuotaDetails val: + :rtype: EventDetails + """ + return cls('member_space_limits_change_custom_quota_details', val) + + @classmethod + def member_space_limits_change_status_details(cls, val): + """ + Create an instance of this class set to the + ``member_space_limits_change_status_details`` tag with value ``val``. + + :param MemberSpaceLimitsChangeStatusDetails val: + :rtype: EventDetails + """ + return cls('member_space_limits_change_status_details', val) + + @classmethod + def member_space_limits_remove_custom_quota_details(cls, val): + """ + Create an instance of this class set to the + ``member_space_limits_remove_custom_quota_details`` tag with value + ``val``. + + :param MemberSpaceLimitsRemoveCustomQuotaDetails val: + :rtype: EventDetails + """ + return cls('member_space_limits_remove_custom_quota_details', val) + + @classmethod + def member_suggest_details(cls, val): + """ + Create an instance of this class set to the ``member_suggest_details`` + tag with value ``val``. + + :param MemberSuggestDetails val: + :rtype: EventDetails + """ + return cls('member_suggest_details', val) + + @classmethod + def member_transfer_account_contents_details(cls, val): + """ + Create an instance of this class set to the + ``member_transfer_account_contents_details`` tag with value ``val``. + + :param MemberTransferAccountContentsDetails val: + :rtype: EventDetails + """ + return cls('member_transfer_account_contents_details', val) + + @classmethod + def secondary_mails_policy_changed_details(cls, val): + """ + Create an instance of this class set to the + ``secondary_mails_policy_changed_details`` tag with value ``val``. + + :param SecondaryMailsPolicyChangedDetails val: + :rtype: EventDetails + """ + return cls('secondary_mails_policy_changed_details', val) + + @classmethod + def paper_content_add_member_details(cls, val): + """ + Create an instance of this class set to the + ``paper_content_add_member_details`` tag with value ``val``. + + :param PaperContentAddMemberDetails val: + :rtype: EventDetails + """ + return cls('paper_content_add_member_details', val) + + @classmethod + def paper_content_add_to_folder_details(cls, val): + """ + Create an instance of this class set to the + ``paper_content_add_to_folder_details`` tag with value ``val``. + + :param PaperContentAddToFolderDetails val: + :rtype: EventDetails + """ + return cls('paper_content_add_to_folder_details', val) + + @classmethod + def paper_content_archive_details(cls, val): + """ + Create an instance of this class set to the + ``paper_content_archive_details`` tag with value ``val``. + + :param PaperContentArchiveDetails val: + :rtype: EventDetails + """ + return cls('paper_content_archive_details', val) + + @classmethod + def paper_content_create_details(cls, val): + """ + Create an instance of this class set to the + ``paper_content_create_details`` tag with value ``val``. + + :param PaperContentCreateDetails val: + :rtype: EventDetails + """ + return cls('paper_content_create_details', val) + + @classmethod + def paper_content_permanently_delete_details(cls, val): + """ + Create an instance of this class set to the + ``paper_content_permanently_delete_details`` tag with value ``val``. + + :param PaperContentPermanentlyDeleteDetails val: + :rtype: EventDetails + """ + return cls('paper_content_permanently_delete_details', val) + + @classmethod + def paper_content_remove_from_folder_details(cls, val): + """ + Create an instance of this class set to the + ``paper_content_remove_from_folder_details`` tag with value ``val``. + + :param PaperContentRemoveFromFolderDetails val: + :rtype: EventDetails + """ + return cls('paper_content_remove_from_folder_details', val) + + @classmethod + def paper_content_remove_member_details(cls, val): + """ + Create an instance of this class set to the + ``paper_content_remove_member_details`` tag with value ``val``. + + :param PaperContentRemoveMemberDetails val: + :rtype: EventDetails + """ + return cls('paper_content_remove_member_details', val) + + @classmethod + def paper_content_rename_details(cls, val): + """ + Create an instance of this class set to the + ``paper_content_rename_details`` tag with value ``val``. + + :param PaperContentRenameDetails val: + :rtype: EventDetails + """ + return cls('paper_content_rename_details', val) + + @classmethod + def paper_content_restore_details(cls, val): + """ + Create an instance of this class set to the + ``paper_content_restore_details`` tag with value ``val``. + + :param PaperContentRestoreDetails val: + :rtype: EventDetails + """ + return cls('paper_content_restore_details', val) + + @classmethod + def paper_doc_add_comment_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_add_comment_details`` tag with value ``val``. + + :param PaperDocAddCommentDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_add_comment_details', val) + + @classmethod + def paper_doc_change_member_role_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_change_member_role_details`` tag with value ``val``. + + :param PaperDocChangeMemberRoleDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_change_member_role_details', val) + + @classmethod + def paper_doc_change_sharing_policy_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_change_sharing_policy_details`` tag with value ``val``. + + :param PaperDocChangeSharingPolicyDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_change_sharing_policy_details', val) + + @classmethod + def paper_doc_change_subscription_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_change_subscription_details`` tag with value ``val``. + + :param PaperDocChangeSubscriptionDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_change_subscription_details', val) + + @classmethod + def paper_doc_deleted_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_deleted_details`` tag with value ``val``. + + :param PaperDocDeletedDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_deleted_details', val) + + @classmethod + def paper_doc_delete_comment_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_delete_comment_details`` tag with value ``val``. + + :param PaperDocDeleteCommentDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_delete_comment_details', val) + + @classmethod + def paper_doc_download_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_download_details`` tag with value ``val``. + + :param PaperDocDownloadDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_download_details', val) + + @classmethod + def paper_doc_edit_details(cls, val): + """ + Create an instance of this class set to the ``paper_doc_edit_details`` + tag with value ``val``. + + :param PaperDocEditDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_edit_details', val) + + @classmethod + def paper_doc_edit_comment_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_edit_comment_details`` tag with value ``val``. + + :param PaperDocEditCommentDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_edit_comment_details', val) + + @classmethod + def paper_doc_followed_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_followed_details`` tag with value ``val``. + + :param PaperDocFollowedDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_followed_details', val) + + @classmethod + def paper_doc_mention_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_mention_details`` tag with value ``val``. + + :param PaperDocMentionDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_mention_details', val) + + @classmethod + def paper_doc_ownership_changed_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_ownership_changed_details`` tag with value ``val``. + + :param PaperDocOwnershipChangedDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_ownership_changed_details', val) + + @classmethod + def paper_doc_request_access_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_request_access_details`` tag with value ``val``. + + :param PaperDocRequestAccessDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_request_access_details', val) + + @classmethod + def paper_doc_resolve_comment_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_resolve_comment_details`` tag with value ``val``. + + :param PaperDocResolveCommentDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_resolve_comment_details', val) + + @classmethod + def paper_doc_revert_details(cls, val): + """ + Create an instance of this class set to the ``paper_doc_revert_details`` + tag with value ``val``. + + :param PaperDocRevertDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_revert_details', val) + + @classmethod + def paper_doc_slack_share_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_slack_share_details`` tag with value ``val``. + + :param PaperDocSlackShareDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_slack_share_details', val) + + @classmethod + def paper_doc_team_invite_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_team_invite_details`` tag with value ``val``. + + :param PaperDocTeamInviteDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_team_invite_details', val) + + @classmethod + def paper_doc_trashed_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_trashed_details`` tag with value ``val``. + + :param PaperDocTrashedDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_trashed_details', val) + + @classmethod + def paper_doc_unresolve_comment_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_unresolve_comment_details`` tag with value ``val``. + + :param PaperDocUnresolveCommentDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_unresolve_comment_details', val) + + @classmethod + def paper_doc_untrashed_details(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_untrashed_details`` tag with value ``val``. + + :param PaperDocUntrashedDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_untrashed_details', val) + + @classmethod + def paper_doc_view_details(cls, val): + """ + Create an instance of this class set to the ``paper_doc_view_details`` + tag with value ``val``. + + :param PaperDocViewDetails val: + :rtype: EventDetails + """ + return cls('paper_doc_view_details', val) + + @classmethod + def paper_external_view_allow_details(cls, val): + """ + Create an instance of this class set to the + ``paper_external_view_allow_details`` tag with value ``val``. + + :param PaperExternalViewAllowDetails val: + :rtype: EventDetails + """ + return cls('paper_external_view_allow_details', val) + + @classmethod + def paper_external_view_default_team_details(cls, val): + """ + Create an instance of this class set to the + ``paper_external_view_default_team_details`` tag with value ``val``. + + :param PaperExternalViewDefaultTeamDetails val: + :rtype: EventDetails + """ + return cls('paper_external_view_default_team_details', val) + + @classmethod + def paper_external_view_forbid_details(cls, val): + """ + Create an instance of this class set to the + ``paper_external_view_forbid_details`` tag with value ``val``. + + :param PaperExternalViewForbidDetails val: + :rtype: EventDetails + """ + return cls('paper_external_view_forbid_details', val) + + @classmethod + def paper_folder_change_subscription_details(cls, val): + """ + Create an instance of this class set to the + ``paper_folder_change_subscription_details`` tag with value ``val``. + + :param PaperFolderChangeSubscriptionDetails val: + :rtype: EventDetails + """ + return cls('paper_folder_change_subscription_details', val) + + @classmethod + def paper_folder_deleted_details(cls, val): + """ + Create an instance of this class set to the + ``paper_folder_deleted_details`` tag with value ``val``. + + :param PaperFolderDeletedDetails val: + :rtype: EventDetails + """ + return cls('paper_folder_deleted_details', val) + + @classmethod + def paper_folder_followed_details(cls, val): + """ + Create an instance of this class set to the + ``paper_folder_followed_details`` tag with value ``val``. + + :param PaperFolderFollowedDetails val: + :rtype: EventDetails + """ + return cls('paper_folder_followed_details', val) + + @classmethod + def paper_folder_team_invite_details(cls, val): + """ + Create an instance of this class set to the + ``paper_folder_team_invite_details`` tag with value ``val``. + + :param PaperFolderTeamInviteDetails val: + :rtype: EventDetails + """ + return cls('paper_folder_team_invite_details', val) + + @classmethod + def password_change_details(cls, val): + """ + Create an instance of this class set to the ``password_change_details`` + tag with value ``val``. + + :param PasswordChangeDetails val: + :rtype: EventDetails + """ + return cls('password_change_details', val) + + @classmethod + def password_reset_details(cls, val): + """ + Create an instance of this class set to the ``password_reset_details`` + tag with value ``val``. + + :param PasswordResetDetails val: + :rtype: EventDetails + """ + return cls('password_reset_details', val) + + @classmethod + def password_reset_all_details(cls, val): + """ + Create an instance of this class set to the + ``password_reset_all_details`` tag with value ``val``. + + :param PasswordResetAllDetails val: + :rtype: EventDetails + """ + return cls('password_reset_all_details', val) + + @classmethod + def emm_create_exceptions_report_details(cls, val): + """ + Create an instance of this class set to the + ``emm_create_exceptions_report_details`` tag with value ``val``. + + :param EmmCreateExceptionsReportDetails val: + :rtype: EventDetails + """ + return cls('emm_create_exceptions_report_details', val) + + @classmethod + def emm_create_usage_report_details(cls, val): + """ + Create an instance of this class set to the + ``emm_create_usage_report_details`` tag with value ``val``. + + :param EmmCreateUsageReportDetails val: + :rtype: EventDetails + """ + return cls('emm_create_usage_report_details', val) + + @classmethod + def export_members_report_details(cls, val): + """ + Create an instance of this class set to the + ``export_members_report_details`` tag with value ``val``. + + :param ExportMembersReportDetails val: + :rtype: EventDetails + """ + return cls('export_members_report_details', val) + + @classmethod + def paper_admin_export_start_details(cls, val): + """ + Create an instance of this class set to the + ``paper_admin_export_start_details`` tag with value ``val``. + + :param PaperAdminExportStartDetails val: + :rtype: EventDetails + """ + return cls('paper_admin_export_start_details', val) + + @classmethod + def smart_sync_create_admin_privilege_report_details(cls, val): + """ + Create an instance of this class set to the + ``smart_sync_create_admin_privilege_report_details`` tag with value + ``val``. + + :param SmartSyncCreateAdminPrivilegeReportDetails val: + :rtype: EventDetails + """ + return cls('smart_sync_create_admin_privilege_report_details', val) + + @classmethod + def team_activity_create_report_details(cls, val): + """ + Create an instance of this class set to the + ``team_activity_create_report_details`` tag with value ``val``. + + :param TeamActivityCreateReportDetails val: + :rtype: EventDetails + """ + return cls('team_activity_create_report_details', val) + + @classmethod + def collection_share_details(cls, val): + """ + Create an instance of this class set to the ``collection_share_details`` + tag with value ``val``. + + :param CollectionShareDetails val: + :rtype: EventDetails + """ + return cls('collection_share_details', val) + + @classmethod + def note_acl_invite_only_details(cls, val): + """ + Create an instance of this class set to the + ``note_acl_invite_only_details`` tag with value ``val``. + + :param NoteAclInviteOnlyDetails val: + :rtype: EventDetails + """ + return cls('note_acl_invite_only_details', val) + + @classmethod + def note_acl_link_details(cls, val): + """ + Create an instance of this class set to the ``note_acl_link_details`` + tag with value ``val``. + + :param NoteAclLinkDetails val: + :rtype: EventDetails + """ + return cls('note_acl_link_details', val) + + @classmethod + def note_acl_team_link_details(cls, val): + """ + Create an instance of this class set to the + ``note_acl_team_link_details`` tag with value ``val``. + + :param NoteAclTeamLinkDetails val: + :rtype: EventDetails + """ + return cls('note_acl_team_link_details', val) + + @classmethod + def note_shared_details(cls, val): + """ + Create an instance of this class set to the ``note_shared_details`` tag + with value ``val``. + + :param NoteSharedDetails val: + :rtype: EventDetails + """ + return cls('note_shared_details', val) + + @classmethod + def note_share_receive_details(cls, val): + """ + Create an instance of this class set to the + ``note_share_receive_details`` tag with value ``val``. + + :param NoteShareReceiveDetails val: + :rtype: EventDetails + """ + return cls('note_share_receive_details', val) + + @classmethod + def open_note_shared_details(cls, val): + """ + Create an instance of this class set to the ``open_note_shared_details`` + tag with value ``val``. + + :param OpenNoteSharedDetails val: + :rtype: EventDetails + """ + return cls('open_note_shared_details', val) + + @classmethod + def sf_add_group_details(cls, val): + """ + Create an instance of this class set to the ``sf_add_group_details`` tag + with value ``val``. + + :param SfAddGroupDetails val: + :rtype: EventDetails + """ + return cls('sf_add_group_details', val) + + @classmethod + def sf_allow_non_members_to_view_shared_links_details(cls, val): + """ + Create an instance of this class set to the + ``sf_allow_non_members_to_view_shared_links_details`` tag with value + ``val``. + + :param SfAllowNonMembersToViewSharedLinksDetails val: + :rtype: EventDetails + """ + return cls('sf_allow_non_members_to_view_shared_links_details', val) + + @classmethod + def sf_external_invite_warn_details(cls, val): + """ + Create an instance of this class set to the + ``sf_external_invite_warn_details`` tag with value ``val``. + + :param SfExternalInviteWarnDetails val: + :rtype: EventDetails + """ + return cls('sf_external_invite_warn_details', val) + + @classmethod + def sf_fb_invite_details(cls, val): + """ + Create an instance of this class set to the ``sf_fb_invite_details`` tag + with value ``val``. + + :param SfFbInviteDetails val: + :rtype: EventDetails + """ + return cls('sf_fb_invite_details', val) + + @classmethod + def sf_fb_invite_change_role_details(cls, val): + """ + Create an instance of this class set to the + ``sf_fb_invite_change_role_details`` tag with value ``val``. + + :param SfFbInviteChangeRoleDetails val: + :rtype: EventDetails + """ + return cls('sf_fb_invite_change_role_details', val) + + @classmethod + def sf_fb_uninvite_details(cls, val): + """ + Create an instance of this class set to the ``sf_fb_uninvite_details`` + tag with value ``val``. + + :param SfFbUninviteDetails val: + :rtype: EventDetails + """ + return cls('sf_fb_uninvite_details', val) + + @classmethod + def sf_invite_group_details(cls, val): + """ + Create an instance of this class set to the ``sf_invite_group_details`` + tag with value ``val``. + + :param SfInviteGroupDetails val: + :rtype: EventDetails + """ + return cls('sf_invite_group_details', val) + + @classmethod + def sf_team_grant_access_details(cls, val): + """ + Create an instance of this class set to the + ``sf_team_grant_access_details`` tag with value ``val``. + + :param SfTeamGrantAccessDetails val: + :rtype: EventDetails + """ + return cls('sf_team_grant_access_details', val) + + @classmethod + def sf_team_invite_details(cls, val): + """ + Create an instance of this class set to the ``sf_team_invite_details`` + tag with value ``val``. + + :param SfTeamInviteDetails val: + :rtype: EventDetails + """ + return cls('sf_team_invite_details', val) + + @classmethod + def sf_team_invite_change_role_details(cls, val): + """ + Create an instance of this class set to the + ``sf_team_invite_change_role_details`` tag with value ``val``. + + :param SfTeamInviteChangeRoleDetails val: + :rtype: EventDetails + """ + return cls('sf_team_invite_change_role_details', val) + + @classmethod + def sf_team_join_details(cls, val): + """ + Create an instance of this class set to the ``sf_team_join_details`` tag + with value ``val``. + + :param SfTeamJoinDetails val: + :rtype: EventDetails + """ + return cls('sf_team_join_details', val) + + @classmethod + def sf_team_join_from_oob_link_details(cls, val): + """ + Create an instance of this class set to the + ``sf_team_join_from_oob_link_details`` tag with value ``val``. + + :param SfTeamJoinFromOobLinkDetails val: + :rtype: EventDetails + """ + return cls('sf_team_join_from_oob_link_details', val) + + @classmethod + def sf_team_uninvite_details(cls, val): + """ + Create an instance of this class set to the ``sf_team_uninvite_details`` + tag with value ``val``. + + :param SfTeamUninviteDetails val: + :rtype: EventDetails + """ + return cls('sf_team_uninvite_details', val) + + @classmethod + def shared_content_add_invitees_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_add_invitees_details`` tag with value ``val``. + + :param SharedContentAddInviteesDetails val: + :rtype: EventDetails + """ + return cls('shared_content_add_invitees_details', val) + + @classmethod + def shared_content_add_link_expiry_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_add_link_expiry_details`` tag with value ``val``. + + :param SharedContentAddLinkExpiryDetails val: + :rtype: EventDetails + """ + return cls('shared_content_add_link_expiry_details', val) + + @classmethod + def shared_content_add_link_password_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_add_link_password_details`` tag with value ``val``. + + :param SharedContentAddLinkPasswordDetails val: + :rtype: EventDetails + """ + return cls('shared_content_add_link_password_details', val) + + @classmethod + def shared_content_add_member_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_add_member_details`` tag with value ``val``. + + :param SharedContentAddMemberDetails val: + :rtype: EventDetails + """ + return cls('shared_content_add_member_details', val) + + @classmethod + def shared_content_change_downloads_policy_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_change_downloads_policy_details`` tag with value + ``val``. + + :param SharedContentChangeDownloadsPolicyDetails val: + :rtype: EventDetails + """ + return cls('shared_content_change_downloads_policy_details', val) + + @classmethod + def shared_content_change_invitee_role_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_change_invitee_role_details`` tag with value ``val``. + + :param SharedContentChangeInviteeRoleDetails val: + :rtype: EventDetails + """ + return cls('shared_content_change_invitee_role_details', val) + + @classmethod + def shared_content_change_link_audience_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_change_link_audience_details`` tag with value ``val``. + + :param SharedContentChangeLinkAudienceDetails val: + :rtype: EventDetails + """ + return cls('shared_content_change_link_audience_details', val) + + @classmethod + def shared_content_change_link_expiry_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_change_link_expiry_details`` tag with value ``val``. + + :param SharedContentChangeLinkExpiryDetails val: + :rtype: EventDetails + """ + return cls('shared_content_change_link_expiry_details', val) + + @classmethod + def shared_content_change_link_password_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_change_link_password_details`` tag with value ``val``. + + :param SharedContentChangeLinkPasswordDetails val: + :rtype: EventDetails + """ + return cls('shared_content_change_link_password_details', val) + + @classmethod + def shared_content_change_member_role_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_change_member_role_details`` tag with value ``val``. + + :param SharedContentChangeMemberRoleDetails val: + :rtype: EventDetails + """ + return cls('shared_content_change_member_role_details', val) + + @classmethod + def shared_content_change_viewer_info_policy_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_change_viewer_info_policy_details`` tag with value + ``val``. + + :param SharedContentChangeViewerInfoPolicyDetails val: + :rtype: EventDetails + """ + return cls('shared_content_change_viewer_info_policy_details', val) + + @classmethod + def shared_content_claim_invitation_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_claim_invitation_details`` tag with value ``val``. + + :param SharedContentClaimInvitationDetails val: + :rtype: EventDetails + """ + return cls('shared_content_claim_invitation_details', val) + + @classmethod + def shared_content_copy_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_copy_details`` tag with value ``val``. + + :param SharedContentCopyDetails val: + :rtype: EventDetails + """ + return cls('shared_content_copy_details', val) + + @classmethod + def shared_content_download_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_download_details`` tag with value ``val``. + + :param SharedContentDownloadDetails val: + :rtype: EventDetails + """ + return cls('shared_content_download_details', val) + + @classmethod + def shared_content_relinquish_membership_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_relinquish_membership_details`` tag with value ``val``. + + :param SharedContentRelinquishMembershipDetails val: + :rtype: EventDetails + """ + return cls('shared_content_relinquish_membership_details', val) + + @classmethod + def shared_content_remove_invitees_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_remove_invitees_details`` tag with value ``val``. + + :param SharedContentRemoveInviteesDetails val: + :rtype: EventDetails + """ + return cls('shared_content_remove_invitees_details', val) + + @classmethod + def shared_content_remove_link_expiry_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_remove_link_expiry_details`` tag with value ``val``. + + :param SharedContentRemoveLinkExpiryDetails val: + :rtype: EventDetails + """ + return cls('shared_content_remove_link_expiry_details', val) + + @classmethod + def shared_content_remove_link_password_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_remove_link_password_details`` tag with value ``val``. + + :param SharedContentRemoveLinkPasswordDetails val: + :rtype: EventDetails + """ + return cls('shared_content_remove_link_password_details', val) + + @classmethod + def shared_content_remove_member_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_remove_member_details`` tag with value ``val``. + + :param SharedContentRemoveMemberDetails val: + :rtype: EventDetails + """ + return cls('shared_content_remove_member_details', val) + + @classmethod + def shared_content_request_access_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_request_access_details`` tag with value ``val``. + + :param SharedContentRequestAccessDetails val: + :rtype: EventDetails + """ + return cls('shared_content_request_access_details', val) + + @classmethod + def shared_content_unshare_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_unshare_details`` tag with value ``val``. + + :param SharedContentUnshareDetails val: + :rtype: EventDetails + """ + return cls('shared_content_unshare_details', val) + + @classmethod + def shared_content_view_details(cls, val): + """ + Create an instance of this class set to the + ``shared_content_view_details`` tag with value ``val``. + + :param SharedContentViewDetails val: + :rtype: EventDetails + """ + return cls('shared_content_view_details', val) + + @classmethod + def shared_folder_change_link_policy_details(cls, val): + """ + Create an instance of this class set to the + ``shared_folder_change_link_policy_details`` tag with value ``val``. + + :param SharedFolderChangeLinkPolicyDetails val: + :rtype: EventDetails + """ + return cls('shared_folder_change_link_policy_details', val) + + @classmethod + def shared_folder_change_members_inheritance_policy_details(cls, val): + """ + Create an instance of this class set to the + ``shared_folder_change_members_inheritance_policy_details`` tag with + value ``val``. + + :param SharedFolderChangeMembersInheritancePolicyDetails val: + :rtype: EventDetails + """ + return cls('shared_folder_change_members_inheritance_policy_details', val) + + @classmethod + def shared_folder_change_members_management_policy_details(cls, val): + """ + Create an instance of this class set to the + ``shared_folder_change_members_management_policy_details`` tag with + value ``val``. + + :param SharedFolderChangeMembersManagementPolicyDetails val: + :rtype: EventDetails + """ + return cls('shared_folder_change_members_management_policy_details', val) + + @classmethod + def shared_folder_change_members_policy_details(cls, val): + """ + Create an instance of this class set to the + ``shared_folder_change_members_policy_details`` tag with value ``val``. + + :param SharedFolderChangeMembersPolicyDetails val: + :rtype: EventDetails + """ + return cls('shared_folder_change_members_policy_details', val) + + @classmethod + def shared_folder_create_details(cls, val): + """ + Create an instance of this class set to the + ``shared_folder_create_details`` tag with value ``val``. + + :param SharedFolderCreateDetails val: + :rtype: EventDetails + """ + return cls('shared_folder_create_details', val) + + @classmethod + def shared_folder_decline_invitation_details(cls, val): + """ + Create an instance of this class set to the + ``shared_folder_decline_invitation_details`` tag with value ``val``. + + :param SharedFolderDeclineInvitationDetails val: + :rtype: EventDetails + """ + return cls('shared_folder_decline_invitation_details', val) + + @classmethod + def shared_folder_mount_details(cls, val): + """ + Create an instance of this class set to the + ``shared_folder_mount_details`` tag with value ``val``. + + :param SharedFolderMountDetails val: + :rtype: EventDetails + """ + return cls('shared_folder_mount_details', val) + + @classmethod + def shared_folder_nest_details(cls, val): + """ + Create an instance of this class set to the + ``shared_folder_nest_details`` tag with value ``val``. + + :param SharedFolderNestDetails val: + :rtype: EventDetails + """ + return cls('shared_folder_nest_details', val) + + @classmethod + def shared_folder_transfer_ownership_details(cls, val): + """ + Create an instance of this class set to the + ``shared_folder_transfer_ownership_details`` tag with value ``val``. + + :param SharedFolderTransferOwnershipDetails val: + :rtype: EventDetails + """ + return cls('shared_folder_transfer_ownership_details', val) + + @classmethod + def shared_folder_unmount_details(cls, val): + """ + Create an instance of this class set to the + ``shared_folder_unmount_details`` tag with value ``val``. + + :param SharedFolderUnmountDetails val: + :rtype: EventDetails + """ + return cls('shared_folder_unmount_details', val) + + @classmethod + def shared_link_add_expiry_details(cls, val): + """ + Create an instance of this class set to the + ``shared_link_add_expiry_details`` tag with value ``val``. + + :param SharedLinkAddExpiryDetails val: + :rtype: EventDetails + """ + return cls('shared_link_add_expiry_details', val) + + @classmethod + def shared_link_change_expiry_details(cls, val): + """ + Create an instance of this class set to the + ``shared_link_change_expiry_details`` tag with value ``val``. + + :param SharedLinkChangeExpiryDetails val: + :rtype: EventDetails + """ + return cls('shared_link_change_expiry_details', val) + + @classmethod + def shared_link_change_visibility_details(cls, val): + """ + Create an instance of this class set to the + ``shared_link_change_visibility_details`` tag with value ``val``. + + :param SharedLinkChangeVisibilityDetails val: + :rtype: EventDetails + """ + return cls('shared_link_change_visibility_details', val) + + @classmethod + def shared_link_copy_details(cls, val): + """ + Create an instance of this class set to the ``shared_link_copy_details`` + tag with value ``val``. + + :param SharedLinkCopyDetails val: + :rtype: EventDetails + """ + return cls('shared_link_copy_details', val) + + @classmethod + def shared_link_create_details(cls, val): + """ + Create an instance of this class set to the + ``shared_link_create_details`` tag with value ``val``. + + :param SharedLinkCreateDetails val: + :rtype: EventDetails + """ + return cls('shared_link_create_details', val) + + @classmethod + def shared_link_disable_details(cls, val): + """ + Create an instance of this class set to the + ``shared_link_disable_details`` tag with value ``val``. + + :param SharedLinkDisableDetails val: + :rtype: EventDetails + """ + return cls('shared_link_disable_details', val) + + @classmethod + def shared_link_download_details(cls, val): + """ + Create an instance of this class set to the + ``shared_link_download_details`` tag with value ``val``. + + :param SharedLinkDownloadDetails val: + :rtype: EventDetails + """ + return cls('shared_link_download_details', val) + + @classmethod + def shared_link_remove_expiry_details(cls, val): + """ + Create an instance of this class set to the + ``shared_link_remove_expiry_details`` tag with value ``val``. + + :param SharedLinkRemoveExpiryDetails val: + :rtype: EventDetails + """ + return cls('shared_link_remove_expiry_details', val) + + @classmethod + def shared_link_share_details(cls, val): + """ + Create an instance of this class set to the + ``shared_link_share_details`` tag with value ``val``. + + :param SharedLinkShareDetails val: + :rtype: EventDetails + """ + return cls('shared_link_share_details', val) + + @classmethod + def shared_link_view_details(cls, val): + """ + Create an instance of this class set to the ``shared_link_view_details`` + tag with value ``val``. + + :param SharedLinkViewDetails val: + :rtype: EventDetails + """ + return cls('shared_link_view_details', val) + + @classmethod + def shared_note_opened_details(cls, val): + """ + Create an instance of this class set to the + ``shared_note_opened_details`` tag with value ``val``. + + :param SharedNoteOpenedDetails val: + :rtype: EventDetails + """ + return cls('shared_note_opened_details', val) + + @classmethod + def shmodel_group_share_details(cls, val): + """ + Create an instance of this class set to the + ``shmodel_group_share_details`` tag with value ``val``. + + :param ShmodelGroupShareDetails val: + :rtype: EventDetails + """ + return cls('shmodel_group_share_details', val) + + @classmethod + def showcase_access_granted_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_access_granted_details`` tag with value ``val``. + + :param ShowcaseAccessGrantedDetails val: + :rtype: EventDetails + """ + return cls('showcase_access_granted_details', val) + + @classmethod + def showcase_add_member_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_add_member_details`` tag with value ``val``. + + :param ShowcaseAddMemberDetails val: + :rtype: EventDetails + """ + return cls('showcase_add_member_details', val) + + @classmethod + def showcase_archived_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_archived_details`` tag with value ``val``. + + :param ShowcaseArchivedDetails val: + :rtype: EventDetails + """ + return cls('showcase_archived_details', val) + + @classmethod + def showcase_created_details(cls, val): + """ + Create an instance of this class set to the ``showcase_created_details`` + tag with value ``val``. + + :param ShowcaseCreatedDetails val: + :rtype: EventDetails + """ + return cls('showcase_created_details', val) + + @classmethod + def showcase_delete_comment_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_delete_comment_details`` tag with value ``val``. + + :param ShowcaseDeleteCommentDetails val: + :rtype: EventDetails + """ + return cls('showcase_delete_comment_details', val) + + @classmethod + def showcase_edited_details(cls, val): + """ + Create an instance of this class set to the ``showcase_edited_details`` + tag with value ``val``. + + :param ShowcaseEditedDetails val: + :rtype: EventDetails + """ + return cls('showcase_edited_details', val) + + @classmethod + def showcase_edit_comment_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_edit_comment_details`` tag with value ``val``. + + :param ShowcaseEditCommentDetails val: + :rtype: EventDetails + """ + return cls('showcase_edit_comment_details', val) + + @classmethod + def showcase_file_added_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_file_added_details`` tag with value ``val``. + + :param ShowcaseFileAddedDetails val: + :rtype: EventDetails + """ + return cls('showcase_file_added_details', val) + + @classmethod + def showcase_file_download_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_file_download_details`` tag with value ``val``. + + :param ShowcaseFileDownloadDetails val: + :rtype: EventDetails + """ + return cls('showcase_file_download_details', val) + + @classmethod + def showcase_file_removed_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_file_removed_details`` tag with value ``val``. + + :param ShowcaseFileRemovedDetails val: + :rtype: EventDetails + """ + return cls('showcase_file_removed_details', val) + + @classmethod + def showcase_file_view_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_file_view_details`` tag with value ``val``. + + :param ShowcaseFileViewDetails val: + :rtype: EventDetails + """ + return cls('showcase_file_view_details', val) + + @classmethod + def showcase_permanently_deleted_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_permanently_deleted_details`` tag with value ``val``. + + :param ShowcasePermanentlyDeletedDetails val: + :rtype: EventDetails + """ + return cls('showcase_permanently_deleted_details', val) + + @classmethod + def showcase_post_comment_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_post_comment_details`` tag with value ``val``. + + :param ShowcasePostCommentDetails val: + :rtype: EventDetails + """ + return cls('showcase_post_comment_details', val) + + @classmethod + def showcase_remove_member_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_remove_member_details`` tag with value ``val``. + + :param ShowcaseRemoveMemberDetails val: + :rtype: EventDetails + """ + return cls('showcase_remove_member_details', val) + + @classmethod + def showcase_renamed_details(cls, val): + """ + Create an instance of this class set to the ``showcase_renamed_details`` + tag with value ``val``. + + :param ShowcaseRenamedDetails val: + :rtype: EventDetails + """ + return cls('showcase_renamed_details', val) + + @classmethod + def showcase_request_access_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_request_access_details`` tag with value ``val``. + + :param ShowcaseRequestAccessDetails val: + :rtype: EventDetails + """ + return cls('showcase_request_access_details', val) + + @classmethod + def showcase_resolve_comment_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_resolve_comment_details`` tag with value ``val``. + + :param ShowcaseResolveCommentDetails val: + :rtype: EventDetails + """ + return cls('showcase_resolve_comment_details', val) + + @classmethod + def showcase_restored_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_restored_details`` tag with value ``val``. + + :param ShowcaseRestoredDetails val: + :rtype: EventDetails + """ + return cls('showcase_restored_details', val) + + @classmethod + def showcase_trashed_details(cls, val): + """ + Create an instance of this class set to the ``showcase_trashed_details`` + tag with value ``val``. + + :param ShowcaseTrashedDetails val: + :rtype: EventDetails + """ + return cls('showcase_trashed_details', val) + + @classmethod + def showcase_trashed_deprecated_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_trashed_deprecated_details`` tag with value ``val``. + + :param ShowcaseTrashedDeprecatedDetails val: + :rtype: EventDetails + """ + return cls('showcase_trashed_deprecated_details', val) + + @classmethod + def showcase_unresolve_comment_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_unresolve_comment_details`` tag with value ``val``. + + :param ShowcaseUnresolveCommentDetails val: + :rtype: EventDetails + """ + return cls('showcase_unresolve_comment_details', val) + + @classmethod + def showcase_untrashed_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_untrashed_details`` tag with value ``val``. + + :param ShowcaseUntrashedDetails val: + :rtype: EventDetails + """ + return cls('showcase_untrashed_details', val) + + @classmethod + def showcase_untrashed_deprecated_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_untrashed_deprecated_details`` tag with value ``val``. + + :param ShowcaseUntrashedDeprecatedDetails val: + :rtype: EventDetails + """ + return cls('showcase_untrashed_deprecated_details', val) + + @classmethod + def showcase_view_details(cls, val): + """ + Create an instance of this class set to the ``showcase_view_details`` + tag with value ``val``. + + :param ShowcaseViewDetails val: + :rtype: EventDetails + """ + return cls('showcase_view_details', val) + + @classmethod + def sso_add_cert_details(cls, val): + """ + Create an instance of this class set to the ``sso_add_cert_details`` tag + with value ``val``. + + :param SsoAddCertDetails val: + :rtype: EventDetails + """ + return cls('sso_add_cert_details', val) + + @classmethod + def sso_add_login_url_details(cls, val): + """ + Create an instance of this class set to the + ``sso_add_login_url_details`` tag with value ``val``. + + :param SsoAddLoginUrlDetails val: + :rtype: EventDetails + """ + return cls('sso_add_login_url_details', val) + + @classmethod + def sso_add_logout_url_details(cls, val): + """ + Create an instance of this class set to the + ``sso_add_logout_url_details`` tag with value ``val``. + + :param SsoAddLogoutUrlDetails val: + :rtype: EventDetails + """ + return cls('sso_add_logout_url_details', val) + + @classmethod + def sso_change_cert_details(cls, val): + """ + Create an instance of this class set to the ``sso_change_cert_details`` + tag with value ``val``. + + :param SsoChangeCertDetails val: + :rtype: EventDetails + """ + return cls('sso_change_cert_details', val) + + @classmethod + def sso_change_login_url_details(cls, val): + """ + Create an instance of this class set to the + ``sso_change_login_url_details`` tag with value ``val``. + + :param SsoChangeLoginUrlDetails val: + :rtype: EventDetails + """ + return cls('sso_change_login_url_details', val) + + @classmethod + def sso_change_logout_url_details(cls, val): + """ + Create an instance of this class set to the + ``sso_change_logout_url_details`` tag with value ``val``. + + :param SsoChangeLogoutUrlDetails val: + :rtype: EventDetails + """ + return cls('sso_change_logout_url_details', val) + + @classmethod + def sso_change_saml_identity_mode_details(cls, val): + """ + Create an instance of this class set to the + ``sso_change_saml_identity_mode_details`` tag with value ``val``. + + :param SsoChangeSamlIdentityModeDetails val: + :rtype: EventDetails + """ + return cls('sso_change_saml_identity_mode_details', val) + + @classmethod + def sso_remove_cert_details(cls, val): + """ + Create an instance of this class set to the ``sso_remove_cert_details`` + tag with value ``val``. + + :param SsoRemoveCertDetails val: + :rtype: EventDetails + """ + return cls('sso_remove_cert_details', val) + + @classmethod + def sso_remove_login_url_details(cls, val): + """ + Create an instance of this class set to the + ``sso_remove_login_url_details`` tag with value ``val``. + + :param SsoRemoveLoginUrlDetails val: + :rtype: EventDetails + """ + return cls('sso_remove_login_url_details', val) + + @classmethod + def sso_remove_logout_url_details(cls, val): + """ + Create an instance of this class set to the + ``sso_remove_logout_url_details`` tag with value ``val``. + + :param SsoRemoveLogoutUrlDetails val: + :rtype: EventDetails + """ + return cls('sso_remove_logout_url_details', val) + + @classmethod + def team_folder_change_status_details(cls, val): + """ + Create an instance of this class set to the + ``team_folder_change_status_details`` tag with value ``val``. + + :param TeamFolderChangeStatusDetails val: + :rtype: EventDetails + """ + return cls('team_folder_change_status_details', val) + + @classmethod + def team_folder_create_details(cls, val): + """ + Create an instance of this class set to the + ``team_folder_create_details`` tag with value ``val``. + + :param TeamFolderCreateDetails val: + :rtype: EventDetails + """ + return cls('team_folder_create_details', val) + + @classmethod + def team_folder_downgrade_details(cls, val): + """ + Create an instance of this class set to the + ``team_folder_downgrade_details`` tag with value ``val``. + + :param TeamFolderDowngradeDetails val: + :rtype: EventDetails + """ + return cls('team_folder_downgrade_details', val) + + @classmethod + def team_folder_permanently_delete_details(cls, val): + """ + Create an instance of this class set to the + ``team_folder_permanently_delete_details`` tag with value ``val``. + + :param TeamFolderPermanentlyDeleteDetails val: + :rtype: EventDetails + """ + return cls('team_folder_permanently_delete_details', val) + + @classmethod + def team_folder_rename_details(cls, val): + """ + Create an instance of this class set to the + ``team_folder_rename_details`` tag with value ``val``. + + :param TeamFolderRenameDetails val: + :rtype: EventDetails + """ + return cls('team_folder_rename_details', val) + + @classmethod + def team_selective_sync_settings_changed_details(cls, val): + """ + Create an instance of this class set to the + ``team_selective_sync_settings_changed_details`` tag with value ``val``. + + :param TeamSelectiveSyncSettingsChangedDetails val: + :rtype: EventDetails + """ + return cls('team_selective_sync_settings_changed_details', val) + + @classmethod + def account_capture_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``account_capture_change_policy_details`` tag with value ``val``. + + :param AccountCaptureChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('account_capture_change_policy_details', val) + + @classmethod + def allow_download_disabled_details(cls, val): + """ + Create an instance of this class set to the + ``allow_download_disabled_details`` tag with value ``val``. + + :param AllowDownloadDisabledDetails val: + :rtype: EventDetails + """ + return cls('allow_download_disabled_details', val) + + @classmethod + def allow_download_enabled_details(cls, val): + """ + Create an instance of this class set to the + ``allow_download_enabled_details`` tag with value ``val``. + + :param AllowDownloadEnabledDetails val: + :rtype: EventDetails + """ + return cls('allow_download_enabled_details', val) + + @classmethod + def camera_uploads_policy_changed_details(cls, val): + """ + Create an instance of this class set to the + ``camera_uploads_policy_changed_details`` tag with value ``val``. + + :param CameraUploadsPolicyChangedDetails val: + :rtype: EventDetails + """ + return cls('camera_uploads_policy_changed_details', val) + + @classmethod + def data_placement_restriction_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``data_placement_restriction_change_policy_details`` tag with value + ``val``. + + :param DataPlacementRestrictionChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('data_placement_restriction_change_policy_details', val) + + @classmethod + def data_placement_restriction_satisfy_policy_details(cls, val): + """ + Create an instance of this class set to the + ``data_placement_restriction_satisfy_policy_details`` tag with value + ``val``. + + :param DataPlacementRestrictionSatisfyPolicyDetails val: + :rtype: EventDetails + """ + return cls('data_placement_restriction_satisfy_policy_details', val) + + @classmethod + def device_approvals_change_desktop_policy_details(cls, val): + """ + Create an instance of this class set to the + ``device_approvals_change_desktop_policy_details`` tag with value + ``val``. + + :param DeviceApprovalsChangeDesktopPolicyDetails val: + :rtype: EventDetails + """ + return cls('device_approvals_change_desktop_policy_details', val) + + @classmethod + def device_approvals_change_mobile_policy_details(cls, val): + """ + Create an instance of this class set to the + ``device_approvals_change_mobile_policy_details`` tag with value + ``val``. + + :param DeviceApprovalsChangeMobilePolicyDetails val: + :rtype: EventDetails + """ + return cls('device_approvals_change_mobile_policy_details', val) + + @classmethod + def device_approvals_change_overage_action_details(cls, val): + """ + Create an instance of this class set to the + ``device_approvals_change_overage_action_details`` tag with value + ``val``. + + :param DeviceApprovalsChangeOverageActionDetails val: + :rtype: EventDetails + """ + return cls('device_approvals_change_overage_action_details', val) + + @classmethod + def device_approvals_change_unlink_action_details(cls, val): + """ + Create an instance of this class set to the + ``device_approvals_change_unlink_action_details`` tag with value + ``val``. + + :param DeviceApprovalsChangeUnlinkActionDetails val: + :rtype: EventDetails + """ + return cls('device_approvals_change_unlink_action_details', val) + + @classmethod + def directory_restrictions_add_members_details(cls, val): + """ + Create an instance of this class set to the + ``directory_restrictions_add_members_details`` tag with value ``val``. + + :param DirectoryRestrictionsAddMembersDetails val: + :rtype: EventDetails + """ + return cls('directory_restrictions_add_members_details', val) + + @classmethod + def directory_restrictions_remove_members_details(cls, val): + """ + Create an instance of this class set to the + ``directory_restrictions_remove_members_details`` tag with value + ``val``. + + :param DirectoryRestrictionsRemoveMembersDetails val: + :rtype: EventDetails + """ + return cls('directory_restrictions_remove_members_details', val) + + @classmethod + def emm_add_exception_details(cls, val): + """ + Create an instance of this class set to the + ``emm_add_exception_details`` tag with value ``val``. + + :param EmmAddExceptionDetails val: + :rtype: EventDetails + """ + return cls('emm_add_exception_details', val) + + @classmethod + def emm_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``emm_change_policy_details`` tag with value ``val``. + + :param EmmChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('emm_change_policy_details', val) + + @classmethod + def emm_remove_exception_details(cls, val): + """ + Create an instance of this class set to the + ``emm_remove_exception_details`` tag with value ``val``. + + :param EmmRemoveExceptionDetails val: + :rtype: EventDetails + """ + return cls('emm_remove_exception_details', val) + + @classmethod + def extended_version_history_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``extended_version_history_change_policy_details`` tag with value + ``val``. + + :param ExtendedVersionHistoryChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('extended_version_history_change_policy_details', val) + + @classmethod + def file_comments_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``file_comments_change_policy_details`` tag with value ``val``. + + :param FileCommentsChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('file_comments_change_policy_details', val) + + @classmethod + def file_requests_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``file_requests_change_policy_details`` tag with value ``val``. + + :param FileRequestsChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('file_requests_change_policy_details', val) + + @classmethod + def file_requests_emails_enabled_details(cls, val): + """ + Create an instance of this class set to the + ``file_requests_emails_enabled_details`` tag with value ``val``. + + :param FileRequestsEmailsEnabledDetails val: + :rtype: EventDetails + """ + return cls('file_requests_emails_enabled_details', val) + + @classmethod + def file_requests_emails_restricted_to_team_only_details(cls, val): + """ + Create an instance of this class set to the + ``file_requests_emails_restricted_to_team_only_details`` tag with value + ``val``. + + :param FileRequestsEmailsRestrictedToTeamOnlyDetails val: + :rtype: EventDetails + """ + return cls('file_requests_emails_restricted_to_team_only_details', val) + + @classmethod + def google_sso_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``google_sso_change_policy_details`` tag with value ``val``. + + :param GoogleSsoChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('google_sso_change_policy_details', val) + + @classmethod + def group_user_management_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``group_user_management_change_policy_details`` tag with value ``val``. + + :param GroupUserManagementChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('group_user_management_change_policy_details', val) + + @classmethod + def member_requests_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``member_requests_change_policy_details`` tag with value ``val``. + + :param MemberRequestsChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('member_requests_change_policy_details', val) + + @classmethod + def member_space_limits_add_exception_details(cls, val): + """ + Create an instance of this class set to the + ``member_space_limits_add_exception_details`` tag with value ``val``. + + :param MemberSpaceLimitsAddExceptionDetails val: + :rtype: EventDetails + """ + return cls('member_space_limits_add_exception_details', val) + + @classmethod + def member_space_limits_change_caps_type_policy_details(cls, val): + """ + Create an instance of this class set to the + ``member_space_limits_change_caps_type_policy_details`` tag with value + ``val``. + + :param MemberSpaceLimitsChangeCapsTypePolicyDetails val: + :rtype: EventDetails + """ + return cls('member_space_limits_change_caps_type_policy_details', val) + + @classmethod + def member_space_limits_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``member_space_limits_change_policy_details`` tag with value ``val``. + + :param MemberSpaceLimitsChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('member_space_limits_change_policy_details', val) + + @classmethod + def member_space_limits_remove_exception_details(cls, val): + """ + Create an instance of this class set to the + ``member_space_limits_remove_exception_details`` tag with value ``val``. + + :param MemberSpaceLimitsRemoveExceptionDetails val: + :rtype: EventDetails + """ + return cls('member_space_limits_remove_exception_details', val) + + @classmethod + def member_suggestions_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``member_suggestions_change_policy_details`` tag with value ``val``. + + :param MemberSuggestionsChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('member_suggestions_change_policy_details', val) + + @classmethod + def microsoft_office_addin_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``microsoft_office_addin_change_policy_details`` tag with value ``val``. + + :param MicrosoftOfficeAddinChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('microsoft_office_addin_change_policy_details', val) + + @classmethod + def network_control_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``network_control_change_policy_details`` tag with value ``val``. + + :param NetworkControlChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('network_control_change_policy_details', val) + + @classmethod + def paper_change_deployment_policy_details(cls, val): + """ + Create an instance of this class set to the + ``paper_change_deployment_policy_details`` tag with value ``val``. + + :param PaperChangeDeploymentPolicyDetails val: + :rtype: EventDetails + """ + return cls('paper_change_deployment_policy_details', val) + + @classmethod + def paper_change_member_link_policy_details(cls, val): + """ + Create an instance of this class set to the + ``paper_change_member_link_policy_details`` tag with value ``val``. + + :param PaperChangeMemberLinkPolicyDetails val: + :rtype: EventDetails + """ + return cls('paper_change_member_link_policy_details', val) + + @classmethod + def paper_change_member_policy_details(cls, val): + """ + Create an instance of this class set to the + ``paper_change_member_policy_details`` tag with value ``val``. + + :param PaperChangeMemberPolicyDetails val: + :rtype: EventDetails + """ + return cls('paper_change_member_policy_details', val) + + @classmethod + def paper_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``paper_change_policy_details`` tag with value ``val``. + + :param PaperChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('paper_change_policy_details', val) + + @classmethod + def paper_enabled_users_group_addition_details(cls, val): + """ + Create an instance of this class set to the + ``paper_enabled_users_group_addition_details`` tag with value ``val``. + + :param PaperEnabledUsersGroupAdditionDetails val: + :rtype: EventDetails + """ + return cls('paper_enabled_users_group_addition_details', val) + + @classmethod + def paper_enabled_users_group_removal_details(cls, val): + """ + Create an instance of this class set to the + ``paper_enabled_users_group_removal_details`` tag with value ``val``. + + :param PaperEnabledUsersGroupRemovalDetails val: + :rtype: EventDetails + """ + return cls('paper_enabled_users_group_removal_details', val) + + @classmethod + def permanent_delete_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``permanent_delete_change_policy_details`` tag with value ``val``. + + :param PermanentDeleteChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('permanent_delete_change_policy_details', val) + + @classmethod + def sharing_change_folder_join_policy_details(cls, val): + """ + Create an instance of this class set to the + ``sharing_change_folder_join_policy_details`` tag with value ``val``. + + :param SharingChangeFolderJoinPolicyDetails val: + :rtype: EventDetails + """ + return cls('sharing_change_folder_join_policy_details', val) + + @classmethod + def sharing_change_link_policy_details(cls, val): + """ + Create an instance of this class set to the + ``sharing_change_link_policy_details`` tag with value ``val``. + + :param SharingChangeLinkPolicyDetails val: + :rtype: EventDetails + """ + return cls('sharing_change_link_policy_details', val) + + @classmethod + def sharing_change_member_policy_details(cls, val): + """ + Create an instance of this class set to the + ``sharing_change_member_policy_details`` tag with value ``val``. + + :param SharingChangeMemberPolicyDetails val: + :rtype: EventDetails + """ + return cls('sharing_change_member_policy_details', val) + + @classmethod + def showcase_change_download_policy_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_change_download_policy_details`` tag with value ``val``. + + :param ShowcaseChangeDownloadPolicyDetails val: + :rtype: EventDetails + """ + return cls('showcase_change_download_policy_details', val) + + @classmethod + def showcase_change_enabled_policy_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_change_enabled_policy_details`` tag with value ``val``. + + :param ShowcaseChangeEnabledPolicyDetails val: + :rtype: EventDetails + """ + return cls('showcase_change_enabled_policy_details', val) + + @classmethod + def showcase_change_external_sharing_policy_details(cls, val): + """ + Create an instance of this class set to the + ``showcase_change_external_sharing_policy_details`` tag with value + ``val``. + + :param ShowcaseChangeExternalSharingPolicyDetails val: + :rtype: EventDetails + """ + return cls('showcase_change_external_sharing_policy_details', val) + + @classmethod + def smart_sync_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``smart_sync_change_policy_details`` tag with value ``val``. + + :param SmartSyncChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('smart_sync_change_policy_details', val) + + @classmethod + def smart_sync_not_opt_out_details(cls, val): + """ + Create an instance of this class set to the + ``smart_sync_not_opt_out_details`` tag with value ``val``. + + :param SmartSyncNotOptOutDetails val: + :rtype: EventDetails + """ + return cls('smart_sync_not_opt_out_details', val) + + @classmethod + def smart_sync_opt_out_details(cls, val): + """ + Create an instance of this class set to the + ``smart_sync_opt_out_details`` tag with value ``val``. + + :param SmartSyncOptOutDetails val: + :rtype: EventDetails + """ + return cls('smart_sync_opt_out_details', val) + + @classmethod + def sso_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``sso_change_policy_details`` tag with value ``val``. + + :param SsoChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('sso_change_policy_details', val) + + @classmethod + def team_selective_sync_policy_changed_details(cls, val): + """ + Create an instance of this class set to the + ``team_selective_sync_policy_changed_details`` tag with value ``val``. + + :param TeamSelectiveSyncPolicyChangedDetails val: + :rtype: EventDetails + """ + return cls('team_selective_sync_policy_changed_details', val) + + @classmethod + def tfa_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``tfa_change_policy_details`` tag with value ``val``. + + :param TfaChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('tfa_change_policy_details', val) + + @classmethod + def two_account_change_policy_details(cls, val): + """ + Create an instance of this class set to the + ``two_account_change_policy_details`` tag with value ``val``. + + :param TwoAccountChangePolicyDetails val: + :rtype: EventDetails + """ + return cls('two_account_change_policy_details', val) + + @classmethod + def viewer_info_policy_changed_details(cls, val): + """ + Create an instance of this class set to the + ``viewer_info_policy_changed_details`` tag with value ``val``. + + :param ViewerInfoPolicyChangedDetails val: + :rtype: EventDetails + """ + return cls('viewer_info_policy_changed_details', val) + + @classmethod + def web_sessions_change_fixed_length_policy_details(cls, val): + """ + Create an instance of this class set to the + ``web_sessions_change_fixed_length_policy_details`` tag with value + ``val``. + + :param WebSessionsChangeFixedLengthPolicyDetails val: + :rtype: EventDetails + """ + return cls('web_sessions_change_fixed_length_policy_details', val) + + @classmethod + def web_sessions_change_idle_length_policy_details(cls, val): + """ + Create an instance of this class set to the + ``web_sessions_change_idle_length_policy_details`` tag with value + ``val``. + + :param WebSessionsChangeIdleLengthPolicyDetails val: + :rtype: EventDetails + """ + return cls('web_sessions_change_idle_length_policy_details', val) + + @classmethod + def team_merge_from_details(cls, val): + """ + Create an instance of this class set to the ``team_merge_from_details`` + tag with value ``val``. + + :param TeamMergeFromDetails val: + :rtype: EventDetails + """ + return cls('team_merge_from_details', val) + + @classmethod + def team_merge_to_details(cls, val): + """ + Create an instance of this class set to the ``team_merge_to_details`` + tag with value ``val``. + + :param TeamMergeToDetails val: + :rtype: EventDetails + """ + return cls('team_merge_to_details', val) + + @classmethod + def team_profile_add_logo_details(cls, val): + """ + Create an instance of this class set to the + ``team_profile_add_logo_details`` tag with value ``val``. + + :param TeamProfileAddLogoDetails val: + :rtype: EventDetails + """ + return cls('team_profile_add_logo_details', val) + + @classmethod + def team_profile_change_default_language_details(cls, val): + """ + Create an instance of this class set to the + ``team_profile_change_default_language_details`` tag with value ``val``. + + :param TeamProfileChangeDefaultLanguageDetails val: + :rtype: EventDetails + """ + return cls('team_profile_change_default_language_details', val) + + @classmethod + def team_profile_change_logo_details(cls, val): + """ + Create an instance of this class set to the + ``team_profile_change_logo_details`` tag with value ``val``. + + :param TeamProfileChangeLogoDetails val: + :rtype: EventDetails + """ + return cls('team_profile_change_logo_details', val) + + @classmethod + def team_profile_change_name_details(cls, val): + """ + Create an instance of this class set to the + ``team_profile_change_name_details`` tag with value ``val``. + + :param TeamProfileChangeNameDetails val: + :rtype: EventDetails + """ + return cls('team_profile_change_name_details', val) + + @classmethod + def team_profile_remove_logo_details(cls, val): + """ + Create an instance of this class set to the + ``team_profile_remove_logo_details`` tag with value ``val``. + + :param TeamProfileRemoveLogoDetails val: + :rtype: EventDetails + """ + return cls('team_profile_remove_logo_details', val) + + @classmethod + def tfa_add_backup_phone_details(cls, val): + """ + Create an instance of this class set to the + ``tfa_add_backup_phone_details`` tag with value ``val``. + + :param TfaAddBackupPhoneDetails val: + :rtype: EventDetails + """ + return cls('tfa_add_backup_phone_details', val) + + @classmethod + def tfa_add_security_key_details(cls, val): + """ + Create an instance of this class set to the + ``tfa_add_security_key_details`` tag with value ``val``. + + :param TfaAddSecurityKeyDetails val: + :rtype: EventDetails + """ + return cls('tfa_add_security_key_details', val) + + @classmethod + def tfa_change_backup_phone_details(cls, val): + """ + Create an instance of this class set to the + ``tfa_change_backup_phone_details`` tag with value ``val``. + + :param TfaChangeBackupPhoneDetails val: + :rtype: EventDetails + """ + return cls('tfa_change_backup_phone_details', val) + + @classmethod + def tfa_change_status_details(cls, val): + """ + Create an instance of this class set to the + ``tfa_change_status_details`` tag with value ``val``. + + :param TfaChangeStatusDetails val: + :rtype: EventDetails + """ + return cls('tfa_change_status_details', val) + + @classmethod + def tfa_remove_backup_phone_details(cls, val): + """ + Create an instance of this class set to the + ``tfa_remove_backup_phone_details`` tag with value ``val``. + + :param TfaRemoveBackupPhoneDetails val: + :rtype: EventDetails + """ + return cls('tfa_remove_backup_phone_details', val) + + @classmethod + def tfa_remove_security_key_details(cls, val): + """ + Create an instance of this class set to the + ``tfa_remove_security_key_details`` tag with value ``val``. + + :param TfaRemoveSecurityKeyDetails val: + :rtype: EventDetails + """ + return cls('tfa_remove_security_key_details', val) + + @classmethod + def tfa_reset_details(cls, val): + """ + Create an instance of this class set to the ``tfa_reset_details`` tag + with value ``val``. + + :param TfaResetDetails val: + :rtype: EventDetails + """ + return cls('tfa_reset_details', val) + + @classmethod + def missing_details(cls, val): + """ + Create an instance of this class set to the ``missing_details`` tag with + value ``val``. + + :param MissingDetails val: + :rtype: EventDetails + """ + return cls('missing_details', val) + + def is_app_link_team_details(self): + """ + Check if the union tag is ``app_link_team_details``. + + :rtype: bool + """ + return self._tag == 'app_link_team_details' + + def is_app_link_user_details(self): + """ + Check if the union tag is ``app_link_user_details``. + + :rtype: bool + """ + return self._tag == 'app_link_user_details' + + def is_app_unlink_team_details(self): + """ + Check if the union tag is ``app_unlink_team_details``. + + :rtype: bool + """ + return self._tag == 'app_unlink_team_details' + + def is_app_unlink_user_details(self): + """ + Check if the union tag is ``app_unlink_user_details``. + + :rtype: bool + """ + return self._tag == 'app_unlink_user_details' + + def is_file_add_comment_details(self): + """ + Check if the union tag is ``file_add_comment_details``. + + :rtype: bool + """ + return self._tag == 'file_add_comment_details' + + def is_file_change_comment_subscription_details(self): + """ + Check if the union tag is ``file_change_comment_subscription_details``. + + :rtype: bool + """ + return self._tag == 'file_change_comment_subscription_details' + + def is_file_delete_comment_details(self): + """ + Check if the union tag is ``file_delete_comment_details``. + + :rtype: bool + """ + return self._tag == 'file_delete_comment_details' + + def is_file_edit_comment_details(self): + """ + Check if the union tag is ``file_edit_comment_details``. + + :rtype: bool + """ + return self._tag == 'file_edit_comment_details' + + def is_file_like_comment_details(self): + """ + Check if the union tag is ``file_like_comment_details``. + + :rtype: bool + """ + return self._tag == 'file_like_comment_details' + + def is_file_resolve_comment_details(self): + """ + Check if the union tag is ``file_resolve_comment_details``. + + :rtype: bool + """ + return self._tag == 'file_resolve_comment_details' + + def is_file_unlike_comment_details(self): + """ + Check if the union tag is ``file_unlike_comment_details``. + + :rtype: bool + """ + return self._tag == 'file_unlike_comment_details' + + def is_file_unresolve_comment_details(self): + """ + Check if the union tag is ``file_unresolve_comment_details``. + + :rtype: bool + """ + return self._tag == 'file_unresolve_comment_details' + + def is_device_change_ip_desktop_details(self): + """ + Check if the union tag is ``device_change_ip_desktop_details``. + + :rtype: bool + """ + return self._tag == 'device_change_ip_desktop_details' + + def is_device_change_ip_mobile_details(self): + """ + Check if the union tag is ``device_change_ip_mobile_details``. + + :rtype: bool + """ + return self._tag == 'device_change_ip_mobile_details' + + def is_device_change_ip_web_details(self): + """ + Check if the union tag is ``device_change_ip_web_details``. + + :rtype: bool + """ + return self._tag == 'device_change_ip_web_details' + + def is_device_delete_on_unlink_fail_details(self): + """ + Check if the union tag is ``device_delete_on_unlink_fail_details``. + + :rtype: bool + """ + return self._tag == 'device_delete_on_unlink_fail_details' + + def is_device_delete_on_unlink_success_details(self): + """ + Check if the union tag is ``device_delete_on_unlink_success_details``. + + :rtype: bool + """ + return self._tag == 'device_delete_on_unlink_success_details' + + def is_device_link_fail_details(self): + """ + Check if the union tag is ``device_link_fail_details``. + + :rtype: bool + """ + return self._tag == 'device_link_fail_details' + + def is_device_link_success_details(self): + """ + Check if the union tag is ``device_link_success_details``. + + :rtype: bool + """ + return self._tag == 'device_link_success_details' + + def is_device_management_disabled_details(self): + """ + Check if the union tag is ``device_management_disabled_details``. + + :rtype: bool + """ + return self._tag == 'device_management_disabled_details' + + def is_device_management_enabled_details(self): + """ + Check if the union tag is ``device_management_enabled_details``. + + :rtype: bool + """ + return self._tag == 'device_management_enabled_details' + + def is_device_unlink_details(self): + """ + Check if the union tag is ``device_unlink_details``. + + :rtype: bool + """ + return self._tag == 'device_unlink_details' + + def is_emm_refresh_auth_token_details(self): + """ + Check if the union tag is ``emm_refresh_auth_token_details``. + + :rtype: bool + """ + return self._tag == 'emm_refresh_auth_token_details' + + def is_account_capture_change_availability_details(self): + """ + Check if the union tag is ``account_capture_change_availability_details``. + + :rtype: bool + """ + return self._tag == 'account_capture_change_availability_details' + + def is_account_capture_migrate_account_details(self): + """ + Check if the union tag is ``account_capture_migrate_account_details``. + + :rtype: bool + """ + return self._tag == 'account_capture_migrate_account_details' + + def is_account_capture_notification_emails_sent_details(self): + """ + Check if the union tag is ``account_capture_notification_emails_sent_details``. + + :rtype: bool + """ + return self._tag == 'account_capture_notification_emails_sent_details' + + def is_account_capture_relinquish_account_details(self): + """ + Check if the union tag is ``account_capture_relinquish_account_details``. + + :rtype: bool + """ + return self._tag == 'account_capture_relinquish_account_details' + + def is_disabled_domain_invites_details(self): + """ + Check if the union tag is ``disabled_domain_invites_details``. + + :rtype: bool + """ + return self._tag == 'disabled_domain_invites_details' + + def is_domain_invites_approve_request_to_join_team_details(self): + """ + Check if the union tag is ``domain_invites_approve_request_to_join_team_details``. + + :rtype: bool + """ + return self._tag == 'domain_invites_approve_request_to_join_team_details' + + def is_domain_invites_decline_request_to_join_team_details(self): + """ + Check if the union tag is ``domain_invites_decline_request_to_join_team_details``. + + :rtype: bool + """ + return self._tag == 'domain_invites_decline_request_to_join_team_details' + + def is_domain_invites_email_existing_users_details(self): + """ + Check if the union tag is ``domain_invites_email_existing_users_details``. + + :rtype: bool + """ + return self._tag == 'domain_invites_email_existing_users_details' + + def is_domain_invites_request_to_join_team_details(self): + """ + Check if the union tag is ``domain_invites_request_to_join_team_details``. + + :rtype: bool + """ + return self._tag == 'domain_invites_request_to_join_team_details' + + def is_domain_invites_set_invite_new_user_pref_to_no_details(self): + """ + Check if the union tag is ``domain_invites_set_invite_new_user_pref_to_no_details``. + + :rtype: bool + """ + return self._tag == 'domain_invites_set_invite_new_user_pref_to_no_details' + + def is_domain_invites_set_invite_new_user_pref_to_yes_details(self): + """ + Check if the union tag is ``domain_invites_set_invite_new_user_pref_to_yes_details``. + + :rtype: bool + """ + return self._tag == 'domain_invites_set_invite_new_user_pref_to_yes_details' + + def is_domain_verification_add_domain_fail_details(self): + """ + Check if the union tag is ``domain_verification_add_domain_fail_details``. + + :rtype: bool + """ + return self._tag == 'domain_verification_add_domain_fail_details' + + def is_domain_verification_add_domain_success_details(self): + """ + Check if the union tag is ``domain_verification_add_domain_success_details``. + + :rtype: bool + """ + return self._tag == 'domain_verification_add_domain_success_details' + + def is_domain_verification_remove_domain_details(self): + """ + Check if the union tag is ``domain_verification_remove_domain_details``. + + :rtype: bool + """ + return self._tag == 'domain_verification_remove_domain_details' + + def is_enabled_domain_invites_details(self): + """ + Check if the union tag is ``enabled_domain_invites_details``. + + :rtype: bool + """ + return self._tag == 'enabled_domain_invites_details' + + def is_create_folder_details(self): + """ + Check if the union tag is ``create_folder_details``. + + :rtype: bool + """ + return self._tag == 'create_folder_details' + + def is_file_add_details(self): + """ + Check if the union tag is ``file_add_details``. + + :rtype: bool + """ + return self._tag == 'file_add_details' + + def is_file_copy_details(self): + """ + Check if the union tag is ``file_copy_details``. + + :rtype: bool + """ + return self._tag == 'file_copy_details' + + def is_file_delete_details(self): + """ + Check if the union tag is ``file_delete_details``. + + :rtype: bool + """ + return self._tag == 'file_delete_details' + + def is_file_download_details(self): + """ + Check if the union tag is ``file_download_details``. + + :rtype: bool + """ + return self._tag == 'file_download_details' + + def is_file_edit_details(self): + """ + Check if the union tag is ``file_edit_details``. + + :rtype: bool + """ + return self._tag == 'file_edit_details' + + def is_file_get_copy_reference_details(self): + """ + Check if the union tag is ``file_get_copy_reference_details``. + + :rtype: bool + """ + return self._tag == 'file_get_copy_reference_details' + + def is_file_move_details(self): + """ + Check if the union tag is ``file_move_details``. + + :rtype: bool + """ + return self._tag == 'file_move_details' + + def is_file_permanently_delete_details(self): + """ + Check if the union tag is ``file_permanently_delete_details``. + + :rtype: bool + """ + return self._tag == 'file_permanently_delete_details' + + def is_file_preview_details(self): + """ + Check if the union tag is ``file_preview_details``. + + :rtype: bool + """ + return self._tag == 'file_preview_details' + + def is_file_rename_details(self): + """ + Check if the union tag is ``file_rename_details``. + + :rtype: bool + """ + return self._tag == 'file_rename_details' + + def is_file_restore_details(self): + """ + Check if the union tag is ``file_restore_details``. + + :rtype: bool + """ + return self._tag == 'file_restore_details' + + def is_file_revert_details(self): + """ + Check if the union tag is ``file_revert_details``. + + :rtype: bool + """ + return self._tag == 'file_revert_details' + + def is_file_rollback_changes_details(self): + """ + Check if the union tag is ``file_rollback_changes_details``. + + :rtype: bool + """ + return self._tag == 'file_rollback_changes_details' + + def is_file_save_copy_reference_details(self): + """ + Check if the union tag is ``file_save_copy_reference_details``. + + :rtype: bool + """ + return self._tag == 'file_save_copy_reference_details' + + def is_file_request_change_details(self): + """ + Check if the union tag is ``file_request_change_details``. + + :rtype: bool + """ + return self._tag == 'file_request_change_details' + + def is_file_request_close_details(self): + """ + Check if the union tag is ``file_request_close_details``. + + :rtype: bool + """ + return self._tag == 'file_request_close_details' + + def is_file_request_create_details(self): + """ + Check if the union tag is ``file_request_create_details``. + + :rtype: bool + """ + return self._tag == 'file_request_create_details' + + def is_file_request_receive_file_details(self): + """ + Check if the union tag is ``file_request_receive_file_details``. + + :rtype: bool + """ + return self._tag == 'file_request_receive_file_details' + + def is_group_add_external_id_details(self): + """ + Check if the union tag is ``group_add_external_id_details``. + + :rtype: bool + """ + return self._tag == 'group_add_external_id_details' + + def is_group_add_member_details(self): + """ + Check if the union tag is ``group_add_member_details``. + + :rtype: bool + """ + return self._tag == 'group_add_member_details' + + def is_group_change_external_id_details(self): + """ + Check if the union tag is ``group_change_external_id_details``. + + :rtype: bool + """ + return self._tag == 'group_change_external_id_details' + + def is_group_change_management_type_details(self): + """ + Check if the union tag is ``group_change_management_type_details``. + + :rtype: bool + """ + return self._tag == 'group_change_management_type_details' + + def is_group_change_member_role_details(self): + """ + Check if the union tag is ``group_change_member_role_details``. + + :rtype: bool + """ + return self._tag == 'group_change_member_role_details' + + def is_group_create_details(self): + """ + Check if the union tag is ``group_create_details``. + + :rtype: bool + """ + return self._tag == 'group_create_details' + + def is_group_delete_details(self): + """ + Check if the union tag is ``group_delete_details``. + + :rtype: bool + """ + return self._tag == 'group_delete_details' + + def is_group_description_updated_details(self): + """ + Check if the union tag is ``group_description_updated_details``. + + :rtype: bool + """ + return self._tag == 'group_description_updated_details' + + def is_group_join_policy_updated_details(self): + """ + Check if the union tag is ``group_join_policy_updated_details``. + + :rtype: bool + """ + return self._tag == 'group_join_policy_updated_details' + + def is_group_moved_details(self): + """ + Check if the union tag is ``group_moved_details``. + + :rtype: bool + """ + return self._tag == 'group_moved_details' + + def is_group_remove_external_id_details(self): + """ + Check if the union tag is ``group_remove_external_id_details``. + + :rtype: bool + """ + return self._tag == 'group_remove_external_id_details' + + def is_group_remove_member_details(self): + """ + Check if the union tag is ``group_remove_member_details``. + + :rtype: bool + """ + return self._tag == 'group_remove_member_details' + + def is_group_rename_details(self): + """ + Check if the union tag is ``group_rename_details``. + + :rtype: bool + """ + return self._tag == 'group_rename_details' + + def is_emm_error_details(self): + """ + Check if the union tag is ``emm_error_details``. + + :rtype: bool + """ + return self._tag == 'emm_error_details' + + def is_login_fail_details(self): + """ + Check if the union tag is ``login_fail_details``. + + :rtype: bool + """ + return self._tag == 'login_fail_details' + + def is_login_success_details(self): + """ + Check if the union tag is ``login_success_details``. + + :rtype: bool + """ + return self._tag == 'login_success_details' + + def is_logout_details(self): + """ + Check if the union tag is ``logout_details``. + + :rtype: bool + """ + return self._tag == 'logout_details' + + def is_reseller_support_session_end_details(self): + """ + Check if the union tag is ``reseller_support_session_end_details``. + + :rtype: bool + """ + return self._tag == 'reseller_support_session_end_details' + + def is_reseller_support_session_start_details(self): + """ + Check if the union tag is ``reseller_support_session_start_details``. + + :rtype: bool + """ + return self._tag == 'reseller_support_session_start_details' + + def is_sign_in_as_session_end_details(self): + """ + Check if the union tag is ``sign_in_as_session_end_details``. + + :rtype: bool + """ + return self._tag == 'sign_in_as_session_end_details' + + def is_sign_in_as_session_start_details(self): + """ + Check if the union tag is ``sign_in_as_session_start_details``. + + :rtype: bool + """ + return self._tag == 'sign_in_as_session_start_details' + + def is_sso_error_details(self): + """ + Check if the union tag is ``sso_error_details``. + + :rtype: bool + """ + return self._tag == 'sso_error_details' + + def is_member_add_name_details(self): + """ + Check if the union tag is ``member_add_name_details``. + + :rtype: bool + """ + return self._tag == 'member_add_name_details' + + def is_member_change_admin_role_details(self): + """ + Check if the union tag is ``member_change_admin_role_details``. + + :rtype: bool + """ + return self._tag == 'member_change_admin_role_details' + + def is_member_change_email_details(self): + """ + Check if the union tag is ``member_change_email_details``. + + :rtype: bool + """ + return self._tag == 'member_change_email_details' + + def is_member_change_membership_type_details(self): + """ + Check if the union tag is ``member_change_membership_type_details``. + + :rtype: bool + """ + return self._tag == 'member_change_membership_type_details' + + def is_member_change_name_details(self): + """ + Check if the union tag is ``member_change_name_details``. + + :rtype: bool + """ + return self._tag == 'member_change_name_details' + + def is_member_change_status_details(self): + """ + Check if the union tag is ``member_change_status_details``. + + :rtype: bool + """ + return self._tag == 'member_change_status_details' + + def is_member_delete_manual_contacts_details(self): + """ + Check if the union tag is ``member_delete_manual_contacts_details``. + + :rtype: bool + """ + return self._tag == 'member_delete_manual_contacts_details' + + def is_member_permanently_delete_account_contents_details(self): + """ + Check if the union tag is ``member_permanently_delete_account_contents_details``. + + :rtype: bool + """ + return self._tag == 'member_permanently_delete_account_contents_details' + + def is_member_space_limits_add_custom_quota_details(self): + """ + Check if the union tag is ``member_space_limits_add_custom_quota_details``. + + :rtype: bool + """ + return self._tag == 'member_space_limits_add_custom_quota_details' + + def is_member_space_limits_change_custom_quota_details(self): + """ + Check if the union tag is ``member_space_limits_change_custom_quota_details``. + + :rtype: bool + """ + return self._tag == 'member_space_limits_change_custom_quota_details' + + def is_member_space_limits_change_status_details(self): + """ + Check if the union tag is ``member_space_limits_change_status_details``. + + :rtype: bool + """ + return self._tag == 'member_space_limits_change_status_details' + + def is_member_space_limits_remove_custom_quota_details(self): + """ + Check if the union tag is ``member_space_limits_remove_custom_quota_details``. + + :rtype: bool + """ + return self._tag == 'member_space_limits_remove_custom_quota_details' + + def is_member_suggest_details(self): + """ + Check if the union tag is ``member_suggest_details``. + + :rtype: bool + """ + return self._tag == 'member_suggest_details' + + def is_member_transfer_account_contents_details(self): + """ + Check if the union tag is ``member_transfer_account_contents_details``. + + :rtype: bool + """ + return self._tag == 'member_transfer_account_contents_details' + + def is_secondary_mails_policy_changed_details(self): + """ + Check if the union tag is ``secondary_mails_policy_changed_details``. + + :rtype: bool + """ + return self._tag == 'secondary_mails_policy_changed_details' + + def is_paper_content_add_member_details(self): + """ + Check if the union tag is ``paper_content_add_member_details``. + + :rtype: bool + """ + return self._tag == 'paper_content_add_member_details' + + def is_paper_content_add_to_folder_details(self): + """ + Check if the union tag is ``paper_content_add_to_folder_details``. + + :rtype: bool + """ + return self._tag == 'paper_content_add_to_folder_details' + + def is_paper_content_archive_details(self): + """ + Check if the union tag is ``paper_content_archive_details``. + + :rtype: bool + """ + return self._tag == 'paper_content_archive_details' + + def is_paper_content_create_details(self): + """ + Check if the union tag is ``paper_content_create_details``. + + :rtype: bool + """ + return self._tag == 'paper_content_create_details' + + def is_paper_content_permanently_delete_details(self): + """ + Check if the union tag is ``paper_content_permanently_delete_details``. + + :rtype: bool + """ + return self._tag == 'paper_content_permanently_delete_details' + + def is_paper_content_remove_from_folder_details(self): + """ + Check if the union tag is ``paper_content_remove_from_folder_details``. + + :rtype: bool + """ + return self._tag == 'paper_content_remove_from_folder_details' + + def is_paper_content_remove_member_details(self): + """ + Check if the union tag is ``paper_content_remove_member_details``. + + :rtype: bool + """ + return self._tag == 'paper_content_remove_member_details' + + def is_paper_content_rename_details(self): + """ + Check if the union tag is ``paper_content_rename_details``. + + :rtype: bool + """ + return self._tag == 'paper_content_rename_details' + + def is_paper_content_restore_details(self): + """ + Check if the union tag is ``paper_content_restore_details``. + + :rtype: bool + """ + return self._tag == 'paper_content_restore_details' + + def is_paper_doc_add_comment_details(self): + """ + Check if the union tag is ``paper_doc_add_comment_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_add_comment_details' + + def is_paper_doc_change_member_role_details(self): + """ + Check if the union tag is ``paper_doc_change_member_role_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_change_member_role_details' + + def is_paper_doc_change_sharing_policy_details(self): + """ + Check if the union tag is ``paper_doc_change_sharing_policy_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_change_sharing_policy_details' + + def is_paper_doc_change_subscription_details(self): + """ + Check if the union tag is ``paper_doc_change_subscription_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_change_subscription_details' + + def is_paper_doc_deleted_details(self): + """ + Check if the union tag is ``paper_doc_deleted_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_deleted_details' + + def is_paper_doc_delete_comment_details(self): + """ + Check if the union tag is ``paper_doc_delete_comment_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_delete_comment_details' + + def is_paper_doc_download_details(self): + """ + Check if the union tag is ``paper_doc_download_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_download_details' + + def is_paper_doc_edit_details(self): + """ + Check if the union tag is ``paper_doc_edit_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_edit_details' + + def is_paper_doc_edit_comment_details(self): + """ + Check if the union tag is ``paper_doc_edit_comment_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_edit_comment_details' + + def is_paper_doc_followed_details(self): + """ + Check if the union tag is ``paper_doc_followed_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_followed_details' + + def is_paper_doc_mention_details(self): + """ + Check if the union tag is ``paper_doc_mention_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_mention_details' + + def is_paper_doc_ownership_changed_details(self): + """ + Check if the union tag is ``paper_doc_ownership_changed_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_ownership_changed_details' + + def is_paper_doc_request_access_details(self): + """ + Check if the union tag is ``paper_doc_request_access_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_request_access_details' + + def is_paper_doc_resolve_comment_details(self): + """ + Check if the union tag is ``paper_doc_resolve_comment_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_resolve_comment_details' + + def is_paper_doc_revert_details(self): + """ + Check if the union tag is ``paper_doc_revert_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_revert_details' + + def is_paper_doc_slack_share_details(self): + """ + Check if the union tag is ``paper_doc_slack_share_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_slack_share_details' + + def is_paper_doc_team_invite_details(self): + """ + Check if the union tag is ``paper_doc_team_invite_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_team_invite_details' + + def is_paper_doc_trashed_details(self): + """ + Check if the union tag is ``paper_doc_trashed_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_trashed_details' + + def is_paper_doc_unresolve_comment_details(self): + """ + Check if the union tag is ``paper_doc_unresolve_comment_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_unresolve_comment_details' + + def is_paper_doc_untrashed_details(self): + """ + Check if the union tag is ``paper_doc_untrashed_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_untrashed_details' + + def is_paper_doc_view_details(self): + """ + Check if the union tag is ``paper_doc_view_details``. + + :rtype: bool + """ + return self._tag == 'paper_doc_view_details' + + def is_paper_external_view_allow_details(self): + """ + Check if the union tag is ``paper_external_view_allow_details``. + + :rtype: bool + """ + return self._tag == 'paper_external_view_allow_details' + + def is_paper_external_view_default_team_details(self): + """ + Check if the union tag is ``paper_external_view_default_team_details``. + + :rtype: bool + """ + return self._tag == 'paper_external_view_default_team_details' + + def is_paper_external_view_forbid_details(self): + """ + Check if the union tag is ``paper_external_view_forbid_details``. + + :rtype: bool + """ + return self._tag == 'paper_external_view_forbid_details' + + def is_paper_folder_change_subscription_details(self): + """ + Check if the union tag is ``paper_folder_change_subscription_details``. + + :rtype: bool + """ + return self._tag == 'paper_folder_change_subscription_details' + + def is_paper_folder_deleted_details(self): + """ + Check if the union tag is ``paper_folder_deleted_details``. + + :rtype: bool + """ + return self._tag == 'paper_folder_deleted_details' + + def is_paper_folder_followed_details(self): + """ + Check if the union tag is ``paper_folder_followed_details``. + + :rtype: bool + """ + return self._tag == 'paper_folder_followed_details' + + def is_paper_folder_team_invite_details(self): + """ + Check if the union tag is ``paper_folder_team_invite_details``. + + :rtype: bool + """ + return self._tag == 'paper_folder_team_invite_details' + + def is_password_change_details(self): + """ + Check if the union tag is ``password_change_details``. + + :rtype: bool + """ + return self._tag == 'password_change_details' + + def is_password_reset_details(self): + """ + Check if the union tag is ``password_reset_details``. + + :rtype: bool + """ + return self._tag == 'password_reset_details' + + def is_password_reset_all_details(self): + """ + Check if the union tag is ``password_reset_all_details``. + + :rtype: bool + """ + return self._tag == 'password_reset_all_details' + + def is_emm_create_exceptions_report_details(self): + """ + Check if the union tag is ``emm_create_exceptions_report_details``. + + :rtype: bool + """ + return self._tag == 'emm_create_exceptions_report_details' + + def is_emm_create_usage_report_details(self): + """ + Check if the union tag is ``emm_create_usage_report_details``. + + :rtype: bool + """ + return self._tag == 'emm_create_usage_report_details' + + def is_export_members_report_details(self): + """ + Check if the union tag is ``export_members_report_details``. + + :rtype: bool + """ + return self._tag == 'export_members_report_details' + + def is_paper_admin_export_start_details(self): + """ + Check if the union tag is ``paper_admin_export_start_details``. + + :rtype: bool + """ + return self._tag == 'paper_admin_export_start_details' + + def is_smart_sync_create_admin_privilege_report_details(self): + """ + Check if the union tag is ``smart_sync_create_admin_privilege_report_details``. + + :rtype: bool + """ + return self._tag == 'smart_sync_create_admin_privilege_report_details' + + def is_team_activity_create_report_details(self): + """ + Check if the union tag is ``team_activity_create_report_details``. + + :rtype: bool + """ + return self._tag == 'team_activity_create_report_details' + + def is_collection_share_details(self): + """ + Check if the union tag is ``collection_share_details``. + + :rtype: bool + """ + return self._tag == 'collection_share_details' + + def is_note_acl_invite_only_details(self): + """ + Check if the union tag is ``note_acl_invite_only_details``. + + :rtype: bool + """ + return self._tag == 'note_acl_invite_only_details' + + def is_note_acl_link_details(self): + """ + Check if the union tag is ``note_acl_link_details``. + + :rtype: bool + """ + return self._tag == 'note_acl_link_details' + + def is_note_acl_team_link_details(self): + """ + Check if the union tag is ``note_acl_team_link_details``. + + :rtype: bool + """ + return self._tag == 'note_acl_team_link_details' + + def is_note_shared_details(self): + """ + Check if the union tag is ``note_shared_details``. + + :rtype: bool + """ + return self._tag == 'note_shared_details' + + def is_note_share_receive_details(self): + """ + Check if the union tag is ``note_share_receive_details``. + + :rtype: bool + """ + return self._tag == 'note_share_receive_details' + + def is_open_note_shared_details(self): + """ + Check if the union tag is ``open_note_shared_details``. + + :rtype: bool + """ + return self._tag == 'open_note_shared_details' + + def is_sf_add_group_details(self): + """ + Check if the union tag is ``sf_add_group_details``. + + :rtype: bool + """ + return self._tag == 'sf_add_group_details' + + def is_sf_allow_non_members_to_view_shared_links_details(self): + """ + Check if the union tag is ``sf_allow_non_members_to_view_shared_links_details``. + + :rtype: bool + """ + return self._tag == 'sf_allow_non_members_to_view_shared_links_details' + + def is_sf_external_invite_warn_details(self): + """ + Check if the union tag is ``sf_external_invite_warn_details``. + + :rtype: bool + """ + return self._tag == 'sf_external_invite_warn_details' + + def is_sf_fb_invite_details(self): + """ + Check if the union tag is ``sf_fb_invite_details``. + + :rtype: bool + """ + return self._tag == 'sf_fb_invite_details' + + def is_sf_fb_invite_change_role_details(self): + """ + Check if the union tag is ``sf_fb_invite_change_role_details``. + + :rtype: bool + """ + return self._tag == 'sf_fb_invite_change_role_details' + + def is_sf_fb_uninvite_details(self): + """ + Check if the union tag is ``sf_fb_uninvite_details``. + + :rtype: bool + """ + return self._tag == 'sf_fb_uninvite_details' + + def is_sf_invite_group_details(self): + """ + Check if the union tag is ``sf_invite_group_details``. + + :rtype: bool + """ + return self._tag == 'sf_invite_group_details' + + def is_sf_team_grant_access_details(self): + """ + Check if the union tag is ``sf_team_grant_access_details``. + + :rtype: bool + """ + return self._tag == 'sf_team_grant_access_details' + + def is_sf_team_invite_details(self): + """ + Check if the union tag is ``sf_team_invite_details``. + + :rtype: bool + """ + return self._tag == 'sf_team_invite_details' + + def is_sf_team_invite_change_role_details(self): + """ + Check if the union tag is ``sf_team_invite_change_role_details``. + + :rtype: bool + """ + return self._tag == 'sf_team_invite_change_role_details' + + def is_sf_team_join_details(self): + """ + Check if the union tag is ``sf_team_join_details``. + + :rtype: bool + """ + return self._tag == 'sf_team_join_details' + + def is_sf_team_join_from_oob_link_details(self): + """ + Check if the union tag is ``sf_team_join_from_oob_link_details``. + + :rtype: bool + """ + return self._tag == 'sf_team_join_from_oob_link_details' + + def is_sf_team_uninvite_details(self): + """ + Check if the union tag is ``sf_team_uninvite_details``. + + :rtype: bool + """ + return self._tag == 'sf_team_uninvite_details' + + def is_shared_content_add_invitees_details(self): + """ + Check if the union tag is ``shared_content_add_invitees_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_add_invitees_details' + + def is_shared_content_add_link_expiry_details(self): + """ + Check if the union tag is ``shared_content_add_link_expiry_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_add_link_expiry_details' + + def is_shared_content_add_link_password_details(self): + """ + Check if the union tag is ``shared_content_add_link_password_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_add_link_password_details' + + def is_shared_content_add_member_details(self): + """ + Check if the union tag is ``shared_content_add_member_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_add_member_details' + + def is_shared_content_change_downloads_policy_details(self): + """ + Check if the union tag is ``shared_content_change_downloads_policy_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_change_downloads_policy_details' + + def is_shared_content_change_invitee_role_details(self): + """ + Check if the union tag is ``shared_content_change_invitee_role_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_change_invitee_role_details' + + def is_shared_content_change_link_audience_details(self): + """ + Check if the union tag is ``shared_content_change_link_audience_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_change_link_audience_details' + + def is_shared_content_change_link_expiry_details(self): + """ + Check if the union tag is ``shared_content_change_link_expiry_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_change_link_expiry_details' + + def is_shared_content_change_link_password_details(self): + """ + Check if the union tag is ``shared_content_change_link_password_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_change_link_password_details' + + def is_shared_content_change_member_role_details(self): + """ + Check if the union tag is ``shared_content_change_member_role_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_change_member_role_details' + + def is_shared_content_change_viewer_info_policy_details(self): + """ + Check if the union tag is ``shared_content_change_viewer_info_policy_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_change_viewer_info_policy_details' + + def is_shared_content_claim_invitation_details(self): + """ + Check if the union tag is ``shared_content_claim_invitation_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_claim_invitation_details' + + def is_shared_content_copy_details(self): + """ + Check if the union tag is ``shared_content_copy_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_copy_details' + + def is_shared_content_download_details(self): + """ + Check if the union tag is ``shared_content_download_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_download_details' + + def is_shared_content_relinquish_membership_details(self): + """ + Check if the union tag is ``shared_content_relinquish_membership_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_relinquish_membership_details' + + def is_shared_content_remove_invitees_details(self): + """ + Check if the union tag is ``shared_content_remove_invitees_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_remove_invitees_details' + + def is_shared_content_remove_link_expiry_details(self): + """ + Check if the union tag is ``shared_content_remove_link_expiry_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_remove_link_expiry_details' + + def is_shared_content_remove_link_password_details(self): + """ + Check if the union tag is ``shared_content_remove_link_password_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_remove_link_password_details' + + def is_shared_content_remove_member_details(self): + """ + Check if the union tag is ``shared_content_remove_member_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_remove_member_details' + + def is_shared_content_request_access_details(self): + """ + Check if the union tag is ``shared_content_request_access_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_request_access_details' + + def is_shared_content_unshare_details(self): + """ + Check if the union tag is ``shared_content_unshare_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_unshare_details' + + def is_shared_content_view_details(self): + """ + Check if the union tag is ``shared_content_view_details``. + + :rtype: bool + """ + return self._tag == 'shared_content_view_details' + + def is_shared_folder_change_link_policy_details(self): + """ + Check if the union tag is ``shared_folder_change_link_policy_details``. + + :rtype: bool + """ + return self._tag == 'shared_folder_change_link_policy_details' + + def is_shared_folder_change_members_inheritance_policy_details(self): + """ + Check if the union tag is ``shared_folder_change_members_inheritance_policy_details``. + + :rtype: bool + """ + return self._tag == 'shared_folder_change_members_inheritance_policy_details' + + def is_shared_folder_change_members_management_policy_details(self): + """ + Check if the union tag is ``shared_folder_change_members_management_policy_details``. + + :rtype: bool + """ + return self._tag == 'shared_folder_change_members_management_policy_details' + + def is_shared_folder_change_members_policy_details(self): + """ + Check if the union tag is ``shared_folder_change_members_policy_details``. + + :rtype: bool + """ + return self._tag == 'shared_folder_change_members_policy_details' + + def is_shared_folder_create_details(self): + """ + Check if the union tag is ``shared_folder_create_details``. + + :rtype: bool + """ + return self._tag == 'shared_folder_create_details' + + def is_shared_folder_decline_invitation_details(self): + """ + Check if the union tag is ``shared_folder_decline_invitation_details``. + + :rtype: bool + """ + return self._tag == 'shared_folder_decline_invitation_details' + + def is_shared_folder_mount_details(self): + """ + Check if the union tag is ``shared_folder_mount_details``. + + :rtype: bool + """ + return self._tag == 'shared_folder_mount_details' + + def is_shared_folder_nest_details(self): + """ + Check if the union tag is ``shared_folder_nest_details``. + + :rtype: bool + """ + return self._tag == 'shared_folder_nest_details' + + def is_shared_folder_transfer_ownership_details(self): + """ + Check if the union tag is ``shared_folder_transfer_ownership_details``. + + :rtype: bool + """ + return self._tag == 'shared_folder_transfer_ownership_details' + + def is_shared_folder_unmount_details(self): + """ + Check if the union tag is ``shared_folder_unmount_details``. + + :rtype: bool + """ + return self._tag == 'shared_folder_unmount_details' + + def is_shared_link_add_expiry_details(self): + """ + Check if the union tag is ``shared_link_add_expiry_details``. + + :rtype: bool + """ + return self._tag == 'shared_link_add_expiry_details' + + def is_shared_link_change_expiry_details(self): + """ + Check if the union tag is ``shared_link_change_expiry_details``. + + :rtype: bool + """ + return self._tag == 'shared_link_change_expiry_details' + + def is_shared_link_change_visibility_details(self): + """ + Check if the union tag is ``shared_link_change_visibility_details``. + + :rtype: bool + """ + return self._tag == 'shared_link_change_visibility_details' + + def is_shared_link_copy_details(self): + """ + Check if the union tag is ``shared_link_copy_details``. + + :rtype: bool + """ + return self._tag == 'shared_link_copy_details' + + def is_shared_link_create_details(self): + """ + Check if the union tag is ``shared_link_create_details``. + + :rtype: bool + """ + return self._tag == 'shared_link_create_details' + + def is_shared_link_disable_details(self): + """ + Check if the union tag is ``shared_link_disable_details``. + + :rtype: bool + """ + return self._tag == 'shared_link_disable_details' + + def is_shared_link_download_details(self): + """ + Check if the union tag is ``shared_link_download_details``. + + :rtype: bool + """ + return self._tag == 'shared_link_download_details' + + def is_shared_link_remove_expiry_details(self): + """ + Check if the union tag is ``shared_link_remove_expiry_details``. + + :rtype: bool + """ + return self._tag == 'shared_link_remove_expiry_details' + + def is_shared_link_share_details(self): + """ + Check if the union tag is ``shared_link_share_details``. + + :rtype: bool + """ + return self._tag == 'shared_link_share_details' + + def is_shared_link_view_details(self): + """ + Check if the union tag is ``shared_link_view_details``. + + :rtype: bool + """ + return self._tag == 'shared_link_view_details' + + def is_shared_note_opened_details(self): + """ + Check if the union tag is ``shared_note_opened_details``. + + :rtype: bool + """ + return self._tag == 'shared_note_opened_details' + + def is_shmodel_group_share_details(self): + """ + Check if the union tag is ``shmodel_group_share_details``. + + :rtype: bool + """ + return self._tag == 'shmodel_group_share_details' + + def is_showcase_access_granted_details(self): + """ + Check if the union tag is ``showcase_access_granted_details``. + + :rtype: bool + """ + return self._tag == 'showcase_access_granted_details' + + def is_showcase_add_member_details(self): + """ + Check if the union tag is ``showcase_add_member_details``. + + :rtype: bool + """ + return self._tag == 'showcase_add_member_details' + + def is_showcase_archived_details(self): + """ + Check if the union tag is ``showcase_archived_details``. + + :rtype: bool + """ + return self._tag == 'showcase_archived_details' + + def is_showcase_created_details(self): + """ + Check if the union tag is ``showcase_created_details``. + + :rtype: bool + """ + return self._tag == 'showcase_created_details' + + def is_showcase_delete_comment_details(self): + """ + Check if the union tag is ``showcase_delete_comment_details``. + + :rtype: bool + """ + return self._tag == 'showcase_delete_comment_details' + + def is_showcase_edited_details(self): + """ + Check if the union tag is ``showcase_edited_details``. + + :rtype: bool + """ + return self._tag == 'showcase_edited_details' + + def is_showcase_edit_comment_details(self): + """ + Check if the union tag is ``showcase_edit_comment_details``. + + :rtype: bool + """ + return self._tag == 'showcase_edit_comment_details' + + def is_showcase_file_added_details(self): + """ + Check if the union tag is ``showcase_file_added_details``. + + :rtype: bool + """ + return self._tag == 'showcase_file_added_details' + + def is_showcase_file_download_details(self): + """ + Check if the union tag is ``showcase_file_download_details``. + + :rtype: bool + """ + return self._tag == 'showcase_file_download_details' + + def is_showcase_file_removed_details(self): + """ + Check if the union tag is ``showcase_file_removed_details``. + + :rtype: bool + """ + return self._tag == 'showcase_file_removed_details' + + def is_showcase_file_view_details(self): + """ + Check if the union tag is ``showcase_file_view_details``. + + :rtype: bool + """ + return self._tag == 'showcase_file_view_details' + + def is_showcase_permanently_deleted_details(self): + """ + Check if the union tag is ``showcase_permanently_deleted_details``. + + :rtype: bool + """ + return self._tag == 'showcase_permanently_deleted_details' + + def is_showcase_post_comment_details(self): + """ + Check if the union tag is ``showcase_post_comment_details``. + + :rtype: bool + """ + return self._tag == 'showcase_post_comment_details' + + def is_showcase_remove_member_details(self): + """ + Check if the union tag is ``showcase_remove_member_details``. + + :rtype: bool + """ + return self._tag == 'showcase_remove_member_details' + + def is_showcase_renamed_details(self): + """ + Check if the union tag is ``showcase_renamed_details``. + + :rtype: bool + """ + return self._tag == 'showcase_renamed_details' + + def is_showcase_request_access_details(self): + """ + Check if the union tag is ``showcase_request_access_details``. + + :rtype: bool + """ + return self._tag == 'showcase_request_access_details' + + def is_showcase_resolve_comment_details(self): + """ + Check if the union tag is ``showcase_resolve_comment_details``. + + :rtype: bool + """ + return self._tag == 'showcase_resolve_comment_details' + + def is_showcase_restored_details(self): + """ + Check if the union tag is ``showcase_restored_details``. + + :rtype: bool + """ + return self._tag == 'showcase_restored_details' + + def is_showcase_trashed_details(self): + """ + Check if the union tag is ``showcase_trashed_details``. + + :rtype: bool + """ + return self._tag == 'showcase_trashed_details' + + def is_showcase_trashed_deprecated_details(self): + """ + Check if the union tag is ``showcase_trashed_deprecated_details``. + + :rtype: bool + """ + return self._tag == 'showcase_trashed_deprecated_details' + + def is_showcase_unresolve_comment_details(self): + """ + Check if the union tag is ``showcase_unresolve_comment_details``. + + :rtype: bool + """ + return self._tag == 'showcase_unresolve_comment_details' + + def is_showcase_untrashed_details(self): + """ + Check if the union tag is ``showcase_untrashed_details``. + + :rtype: bool + """ + return self._tag == 'showcase_untrashed_details' + + def is_showcase_untrashed_deprecated_details(self): + """ + Check if the union tag is ``showcase_untrashed_deprecated_details``. + + :rtype: bool + """ + return self._tag == 'showcase_untrashed_deprecated_details' + + def is_showcase_view_details(self): + """ + Check if the union tag is ``showcase_view_details``. + + :rtype: bool + """ + return self._tag == 'showcase_view_details' + + def is_sso_add_cert_details(self): + """ + Check if the union tag is ``sso_add_cert_details``. + + :rtype: bool + """ + return self._tag == 'sso_add_cert_details' + + def is_sso_add_login_url_details(self): + """ + Check if the union tag is ``sso_add_login_url_details``. + + :rtype: bool + """ + return self._tag == 'sso_add_login_url_details' + + def is_sso_add_logout_url_details(self): + """ + Check if the union tag is ``sso_add_logout_url_details``. + + :rtype: bool + """ + return self._tag == 'sso_add_logout_url_details' + + def is_sso_change_cert_details(self): + """ + Check if the union tag is ``sso_change_cert_details``. + + :rtype: bool + """ + return self._tag == 'sso_change_cert_details' + + def is_sso_change_login_url_details(self): + """ + Check if the union tag is ``sso_change_login_url_details``. + + :rtype: bool + """ + return self._tag == 'sso_change_login_url_details' + + def is_sso_change_logout_url_details(self): + """ + Check if the union tag is ``sso_change_logout_url_details``. + + :rtype: bool + """ + return self._tag == 'sso_change_logout_url_details' + + def is_sso_change_saml_identity_mode_details(self): + """ + Check if the union tag is ``sso_change_saml_identity_mode_details``. + + :rtype: bool + """ + return self._tag == 'sso_change_saml_identity_mode_details' + + def is_sso_remove_cert_details(self): + """ + Check if the union tag is ``sso_remove_cert_details``. + + :rtype: bool + """ + return self._tag == 'sso_remove_cert_details' + + def is_sso_remove_login_url_details(self): + """ + Check if the union tag is ``sso_remove_login_url_details``. + + :rtype: bool + """ + return self._tag == 'sso_remove_login_url_details' + + def is_sso_remove_logout_url_details(self): + """ + Check if the union tag is ``sso_remove_logout_url_details``. + + :rtype: bool + """ + return self._tag == 'sso_remove_logout_url_details' + + def is_team_folder_change_status_details(self): + """ + Check if the union tag is ``team_folder_change_status_details``. + + :rtype: bool + """ + return self._tag == 'team_folder_change_status_details' + + def is_team_folder_create_details(self): + """ + Check if the union tag is ``team_folder_create_details``. + + :rtype: bool + """ + return self._tag == 'team_folder_create_details' + + def is_team_folder_downgrade_details(self): + """ + Check if the union tag is ``team_folder_downgrade_details``. + + :rtype: bool + """ + return self._tag == 'team_folder_downgrade_details' + + def is_team_folder_permanently_delete_details(self): + """ + Check if the union tag is ``team_folder_permanently_delete_details``. + + :rtype: bool + """ + return self._tag == 'team_folder_permanently_delete_details' + + def is_team_folder_rename_details(self): + """ + Check if the union tag is ``team_folder_rename_details``. + + :rtype: bool + """ + return self._tag == 'team_folder_rename_details' + + def is_team_selective_sync_settings_changed_details(self): + """ + Check if the union tag is ``team_selective_sync_settings_changed_details``. + + :rtype: bool + """ + return self._tag == 'team_selective_sync_settings_changed_details' + + def is_account_capture_change_policy_details(self): + """ + Check if the union tag is ``account_capture_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'account_capture_change_policy_details' + + def is_allow_download_disabled_details(self): + """ + Check if the union tag is ``allow_download_disabled_details``. + + :rtype: bool + """ + return self._tag == 'allow_download_disabled_details' + + def is_allow_download_enabled_details(self): + """ + Check if the union tag is ``allow_download_enabled_details``. + + :rtype: bool + """ + return self._tag == 'allow_download_enabled_details' + + def is_camera_uploads_policy_changed_details(self): + """ + Check if the union tag is ``camera_uploads_policy_changed_details``. + + :rtype: bool + """ + return self._tag == 'camera_uploads_policy_changed_details' + + def is_data_placement_restriction_change_policy_details(self): + """ + Check if the union tag is ``data_placement_restriction_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'data_placement_restriction_change_policy_details' + + def is_data_placement_restriction_satisfy_policy_details(self): + """ + Check if the union tag is ``data_placement_restriction_satisfy_policy_details``. + + :rtype: bool + """ + return self._tag == 'data_placement_restriction_satisfy_policy_details' + + def is_device_approvals_change_desktop_policy_details(self): + """ + Check if the union tag is ``device_approvals_change_desktop_policy_details``. + + :rtype: bool + """ + return self._tag == 'device_approvals_change_desktop_policy_details' + + def is_device_approvals_change_mobile_policy_details(self): + """ + Check if the union tag is ``device_approvals_change_mobile_policy_details``. + + :rtype: bool + """ + return self._tag == 'device_approvals_change_mobile_policy_details' + + def is_device_approvals_change_overage_action_details(self): + """ + Check if the union tag is ``device_approvals_change_overage_action_details``. + + :rtype: bool + """ + return self._tag == 'device_approvals_change_overage_action_details' + + def is_device_approvals_change_unlink_action_details(self): + """ + Check if the union tag is ``device_approvals_change_unlink_action_details``. + + :rtype: bool + """ + return self._tag == 'device_approvals_change_unlink_action_details' + + def is_directory_restrictions_add_members_details(self): + """ + Check if the union tag is ``directory_restrictions_add_members_details``. + + :rtype: bool + """ + return self._tag == 'directory_restrictions_add_members_details' + + def is_directory_restrictions_remove_members_details(self): + """ + Check if the union tag is ``directory_restrictions_remove_members_details``. + + :rtype: bool + """ + return self._tag == 'directory_restrictions_remove_members_details' + + def is_emm_add_exception_details(self): + """ + Check if the union tag is ``emm_add_exception_details``. + + :rtype: bool + """ + return self._tag == 'emm_add_exception_details' + + def is_emm_change_policy_details(self): + """ + Check if the union tag is ``emm_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'emm_change_policy_details' + + def is_emm_remove_exception_details(self): + """ + Check if the union tag is ``emm_remove_exception_details``. + + :rtype: bool + """ + return self._tag == 'emm_remove_exception_details' + + def is_extended_version_history_change_policy_details(self): + """ + Check if the union tag is ``extended_version_history_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'extended_version_history_change_policy_details' + + def is_file_comments_change_policy_details(self): + """ + Check if the union tag is ``file_comments_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'file_comments_change_policy_details' + + def is_file_requests_change_policy_details(self): + """ + Check if the union tag is ``file_requests_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'file_requests_change_policy_details' + + def is_file_requests_emails_enabled_details(self): + """ + Check if the union tag is ``file_requests_emails_enabled_details``. + + :rtype: bool + """ + return self._tag == 'file_requests_emails_enabled_details' + + def is_file_requests_emails_restricted_to_team_only_details(self): + """ + Check if the union tag is ``file_requests_emails_restricted_to_team_only_details``. + + :rtype: bool + """ + return self._tag == 'file_requests_emails_restricted_to_team_only_details' + + def is_google_sso_change_policy_details(self): + """ + Check if the union tag is ``google_sso_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'google_sso_change_policy_details' + + def is_group_user_management_change_policy_details(self): + """ + Check if the union tag is ``group_user_management_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'group_user_management_change_policy_details' + + def is_member_requests_change_policy_details(self): + """ + Check if the union tag is ``member_requests_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'member_requests_change_policy_details' + + def is_member_space_limits_add_exception_details(self): + """ + Check if the union tag is ``member_space_limits_add_exception_details``. + + :rtype: bool + """ + return self._tag == 'member_space_limits_add_exception_details' + + def is_member_space_limits_change_caps_type_policy_details(self): + """ + Check if the union tag is ``member_space_limits_change_caps_type_policy_details``. + + :rtype: bool + """ + return self._tag == 'member_space_limits_change_caps_type_policy_details' + + def is_member_space_limits_change_policy_details(self): + """ + Check if the union tag is ``member_space_limits_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'member_space_limits_change_policy_details' + + def is_member_space_limits_remove_exception_details(self): + """ + Check if the union tag is ``member_space_limits_remove_exception_details``. + + :rtype: bool + """ + return self._tag == 'member_space_limits_remove_exception_details' + + def is_member_suggestions_change_policy_details(self): + """ + Check if the union tag is ``member_suggestions_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'member_suggestions_change_policy_details' + + def is_microsoft_office_addin_change_policy_details(self): + """ + Check if the union tag is ``microsoft_office_addin_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'microsoft_office_addin_change_policy_details' + + def is_network_control_change_policy_details(self): + """ + Check if the union tag is ``network_control_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'network_control_change_policy_details' + + def is_paper_change_deployment_policy_details(self): + """ + Check if the union tag is ``paper_change_deployment_policy_details``. + + :rtype: bool + """ + return self._tag == 'paper_change_deployment_policy_details' + + def is_paper_change_member_link_policy_details(self): + """ + Check if the union tag is ``paper_change_member_link_policy_details``. + + :rtype: bool + """ + return self._tag == 'paper_change_member_link_policy_details' + + def is_paper_change_member_policy_details(self): + """ + Check if the union tag is ``paper_change_member_policy_details``. + + :rtype: bool + """ + return self._tag == 'paper_change_member_policy_details' + + def is_paper_change_policy_details(self): + """ + Check if the union tag is ``paper_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'paper_change_policy_details' + + def is_paper_enabled_users_group_addition_details(self): + """ + Check if the union tag is ``paper_enabled_users_group_addition_details``. + + :rtype: bool + """ + return self._tag == 'paper_enabled_users_group_addition_details' + + def is_paper_enabled_users_group_removal_details(self): + """ + Check if the union tag is ``paper_enabled_users_group_removal_details``. + + :rtype: bool + """ + return self._tag == 'paper_enabled_users_group_removal_details' + + def is_permanent_delete_change_policy_details(self): + """ + Check if the union tag is ``permanent_delete_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'permanent_delete_change_policy_details' + + def is_sharing_change_folder_join_policy_details(self): + """ + Check if the union tag is ``sharing_change_folder_join_policy_details``. + + :rtype: bool + """ + return self._tag == 'sharing_change_folder_join_policy_details' + + def is_sharing_change_link_policy_details(self): + """ + Check if the union tag is ``sharing_change_link_policy_details``. + + :rtype: bool + """ + return self._tag == 'sharing_change_link_policy_details' + + def is_sharing_change_member_policy_details(self): + """ + Check if the union tag is ``sharing_change_member_policy_details``. + + :rtype: bool + """ + return self._tag == 'sharing_change_member_policy_details' + + def is_showcase_change_download_policy_details(self): + """ + Check if the union tag is ``showcase_change_download_policy_details``. + + :rtype: bool + """ + return self._tag == 'showcase_change_download_policy_details' + + def is_showcase_change_enabled_policy_details(self): + """ + Check if the union tag is ``showcase_change_enabled_policy_details``. + + :rtype: bool + """ + return self._tag == 'showcase_change_enabled_policy_details' + + def is_showcase_change_external_sharing_policy_details(self): + """ + Check if the union tag is ``showcase_change_external_sharing_policy_details``. + + :rtype: bool + """ + return self._tag == 'showcase_change_external_sharing_policy_details' + + def is_smart_sync_change_policy_details(self): + """ + Check if the union tag is ``smart_sync_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'smart_sync_change_policy_details' + + def is_smart_sync_not_opt_out_details(self): + """ + Check if the union tag is ``smart_sync_not_opt_out_details``. + + :rtype: bool + """ + return self._tag == 'smart_sync_not_opt_out_details' + + def is_smart_sync_opt_out_details(self): + """ + Check if the union tag is ``smart_sync_opt_out_details``. + + :rtype: bool + """ + return self._tag == 'smart_sync_opt_out_details' + + def is_sso_change_policy_details(self): + """ + Check if the union tag is ``sso_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'sso_change_policy_details' + + def is_team_selective_sync_policy_changed_details(self): + """ + Check if the union tag is ``team_selective_sync_policy_changed_details``. + + :rtype: bool + """ + return self._tag == 'team_selective_sync_policy_changed_details' + + def is_tfa_change_policy_details(self): + """ + Check if the union tag is ``tfa_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'tfa_change_policy_details' + + def is_two_account_change_policy_details(self): + """ + Check if the union tag is ``two_account_change_policy_details``. + + :rtype: bool + """ + return self._tag == 'two_account_change_policy_details' + + def is_viewer_info_policy_changed_details(self): + """ + Check if the union tag is ``viewer_info_policy_changed_details``. + + :rtype: bool + """ + return self._tag == 'viewer_info_policy_changed_details' + + def is_web_sessions_change_fixed_length_policy_details(self): + """ + Check if the union tag is ``web_sessions_change_fixed_length_policy_details``. + + :rtype: bool + """ + return self._tag == 'web_sessions_change_fixed_length_policy_details' + + def is_web_sessions_change_idle_length_policy_details(self): + """ + Check if the union tag is ``web_sessions_change_idle_length_policy_details``. + + :rtype: bool + """ + return self._tag == 'web_sessions_change_idle_length_policy_details' + + def is_team_merge_from_details(self): + """ + Check if the union tag is ``team_merge_from_details``. + + :rtype: bool + """ + return self._tag == 'team_merge_from_details' + + def is_team_merge_to_details(self): + """ + Check if the union tag is ``team_merge_to_details``. + + :rtype: bool + """ + return self._tag == 'team_merge_to_details' + + def is_team_profile_add_logo_details(self): + """ + Check if the union tag is ``team_profile_add_logo_details``. + + :rtype: bool + """ + return self._tag == 'team_profile_add_logo_details' + + def is_team_profile_change_default_language_details(self): + """ + Check if the union tag is ``team_profile_change_default_language_details``. + + :rtype: bool + """ + return self._tag == 'team_profile_change_default_language_details' + + def is_team_profile_change_logo_details(self): + """ + Check if the union tag is ``team_profile_change_logo_details``. + + :rtype: bool + """ + return self._tag == 'team_profile_change_logo_details' + + def is_team_profile_change_name_details(self): + """ + Check if the union tag is ``team_profile_change_name_details``. + + :rtype: bool + """ + return self._tag == 'team_profile_change_name_details' + + def is_team_profile_remove_logo_details(self): + """ + Check if the union tag is ``team_profile_remove_logo_details``. + + :rtype: bool + """ + return self._tag == 'team_profile_remove_logo_details' + + def is_tfa_add_backup_phone_details(self): + """ + Check if the union tag is ``tfa_add_backup_phone_details``. + + :rtype: bool + """ + return self._tag == 'tfa_add_backup_phone_details' + + def is_tfa_add_security_key_details(self): + """ + Check if the union tag is ``tfa_add_security_key_details``. + + :rtype: bool + """ + return self._tag == 'tfa_add_security_key_details' + + def is_tfa_change_backup_phone_details(self): + """ + Check if the union tag is ``tfa_change_backup_phone_details``. + + :rtype: bool + """ + return self._tag == 'tfa_change_backup_phone_details' + + def is_tfa_change_status_details(self): + """ + Check if the union tag is ``tfa_change_status_details``. + + :rtype: bool + """ + return self._tag == 'tfa_change_status_details' + + def is_tfa_remove_backup_phone_details(self): + """ + Check if the union tag is ``tfa_remove_backup_phone_details``. + + :rtype: bool + """ + return self._tag == 'tfa_remove_backup_phone_details' + + def is_tfa_remove_security_key_details(self): + """ + Check if the union tag is ``tfa_remove_security_key_details``. + + :rtype: bool + """ + return self._tag == 'tfa_remove_security_key_details' + + def is_tfa_reset_details(self): + """ + Check if the union tag is ``tfa_reset_details``. + + :rtype: bool + """ + return self._tag == 'tfa_reset_details' + + def is_missing_details(self): + """ + Check if the union tag is ``missing_details``. + + :rtype: bool + """ + return self._tag == 'missing_details' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_app_link_team_details(self): + """ + Only call this if :meth:`is_app_link_team_details` is true. + + :rtype: AppLinkTeamDetails + """ + if not self.is_app_link_team_details(): + raise AttributeError("tag 'app_link_team_details' not set") + return self._value + + def get_app_link_user_details(self): + """ + Only call this if :meth:`is_app_link_user_details` is true. + + :rtype: AppLinkUserDetails + """ + if not self.is_app_link_user_details(): + raise AttributeError("tag 'app_link_user_details' not set") + return self._value + + def get_app_unlink_team_details(self): + """ + Only call this if :meth:`is_app_unlink_team_details` is true. + + :rtype: AppUnlinkTeamDetails + """ + if not self.is_app_unlink_team_details(): + raise AttributeError("tag 'app_unlink_team_details' not set") + return self._value + + def get_app_unlink_user_details(self): + """ + Only call this if :meth:`is_app_unlink_user_details` is true. + + :rtype: AppUnlinkUserDetails + """ + if not self.is_app_unlink_user_details(): + raise AttributeError("tag 'app_unlink_user_details' not set") + return self._value + + def get_file_add_comment_details(self): + """ + Only call this if :meth:`is_file_add_comment_details` is true. + + :rtype: FileAddCommentDetails + """ + if not self.is_file_add_comment_details(): + raise AttributeError("tag 'file_add_comment_details' not set") + return self._value + + def get_file_change_comment_subscription_details(self): + """ + Only call this if :meth:`is_file_change_comment_subscription_details` is true. + + :rtype: FileChangeCommentSubscriptionDetails + """ + if not self.is_file_change_comment_subscription_details(): + raise AttributeError("tag 'file_change_comment_subscription_details' not set") + return self._value + + def get_file_delete_comment_details(self): + """ + Only call this if :meth:`is_file_delete_comment_details` is true. + + :rtype: FileDeleteCommentDetails + """ + if not self.is_file_delete_comment_details(): + raise AttributeError("tag 'file_delete_comment_details' not set") + return self._value + + def get_file_edit_comment_details(self): + """ + Only call this if :meth:`is_file_edit_comment_details` is true. + + :rtype: FileEditCommentDetails + """ + if not self.is_file_edit_comment_details(): + raise AttributeError("tag 'file_edit_comment_details' not set") + return self._value + + def get_file_like_comment_details(self): + """ + Only call this if :meth:`is_file_like_comment_details` is true. + + :rtype: FileLikeCommentDetails + """ + if not self.is_file_like_comment_details(): + raise AttributeError("tag 'file_like_comment_details' not set") + return self._value + + def get_file_resolve_comment_details(self): + """ + Only call this if :meth:`is_file_resolve_comment_details` is true. + + :rtype: FileResolveCommentDetails + """ + if not self.is_file_resolve_comment_details(): + raise AttributeError("tag 'file_resolve_comment_details' not set") + return self._value + + def get_file_unlike_comment_details(self): + """ + Only call this if :meth:`is_file_unlike_comment_details` is true. + + :rtype: FileUnlikeCommentDetails + """ + if not self.is_file_unlike_comment_details(): + raise AttributeError("tag 'file_unlike_comment_details' not set") + return self._value + + def get_file_unresolve_comment_details(self): + """ + Only call this if :meth:`is_file_unresolve_comment_details` is true. + + :rtype: FileUnresolveCommentDetails + """ + if not self.is_file_unresolve_comment_details(): + raise AttributeError("tag 'file_unresolve_comment_details' not set") + return self._value + + def get_device_change_ip_desktop_details(self): + """ + Only call this if :meth:`is_device_change_ip_desktop_details` is true. + + :rtype: DeviceChangeIpDesktopDetails + """ + if not self.is_device_change_ip_desktop_details(): + raise AttributeError("tag 'device_change_ip_desktop_details' not set") + return self._value + + def get_device_change_ip_mobile_details(self): + """ + Only call this if :meth:`is_device_change_ip_mobile_details` is true. + + :rtype: DeviceChangeIpMobileDetails + """ + if not self.is_device_change_ip_mobile_details(): + raise AttributeError("tag 'device_change_ip_mobile_details' not set") + return self._value + + def get_device_change_ip_web_details(self): + """ + Only call this if :meth:`is_device_change_ip_web_details` is true. + + :rtype: DeviceChangeIpWebDetails + """ + if not self.is_device_change_ip_web_details(): + raise AttributeError("tag 'device_change_ip_web_details' not set") + return self._value + + def get_device_delete_on_unlink_fail_details(self): + """ + Only call this if :meth:`is_device_delete_on_unlink_fail_details` is true. + + :rtype: DeviceDeleteOnUnlinkFailDetails + """ + if not self.is_device_delete_on_unlink_fail_details(): + raise AttributeError("tag 'device_delete_on_unlink_fail_details' not set") + return self._value + + def get_device_delete_on_unlink_success_details(self): + """ + Only call this if :meth:`is_device_delete_on_unlink_success_details` is true. + + :rtype: DeviceDeleteOnUnlinkSuccessDetails + """ + if not self.is_device_delete_on_unlink_success_details(): + raise AttributeError("tag 'device_delete_on_unlink_success_details' not set") + return self._value + + def get_device_link_fail_details(self): + """ + Only call this if :meth:`is_device_link_fail_details` is true. + + :rtype: DeviceLinkFailDetails + """ + if not self.is_device_link_fail_details(): + raise AttributeError("tag 'device_link_fail_details' not set") + return self._value + + def get_device_link_success_details(self): + """ + Only call this if :meth:`is_device_link_success_details` is true. + + :rtype: DeviceLinkSuccessDetails + """ + if not self.is_device_link_success_details(): + raise AttributeError("tag 'device_link_success_details' not set") + return self._value + + def get_device_management_disabled_details(self): + """ + Only call this if :meth:`is_device_management_disabled_details` is true. + + :rtype: DeviceManagementDisabledDetails + """ + if not self.is_device_management_disabled_details(): + raise AttributeError("tag 'device_management_disabled_details' not set") + return self._value + + def get_device_management_enabled_details(self): + """ + Only call this if :meth:`is_device_management_enabled_details` is true. + + :rtype: DeviceManagementEnabledDetails + """ + if not self.is_device_management_enabled_details(): + raise AttributeError("tag 'device_management_enabled_details' not set") + return self._value + + def get_device_unlink_details(self): + """ + Only call this if :meth:`is_device_unlink_details` is true. + + :rtype: DeviceUnlinkDetails + """ + if not self.is_device_unlink_details(): + raise AttributeError("tag 'device_unlink_details' not set") + return self._value + + def get_emm_refresh_auth_token_details(self): + """ + Only call this if :meth:`is_emm_refresh_auth_token_details` is true. + + :rtype: EmmRefreshAuthTokenDetails + """ + if not self.is_emm_refresh_auth_token_details(): + raise AttributeError("tag 'emm_refresh_auth_token_details' not set") + return self._value + + def get_account_capture_change_availability_details(self): + """ + Only call this if :meth:`is_account_capture_change_availability_details` is true. + + :rtype: AccountCaptureChangeAvailabilityDetails + """ + if not self.is_account_capture_change_availability_details(): + raise AttributeError("tag 'account_capture_change_availability_details' not set") + return self._value + + def get_account_capture_migrate_account_details(self): + """ + Only call this if :meth:`is_account_capture_migrate_account_details` is true. + + :rtype: AccountCaptureMigrateAccountDetails + """ + if not self.is_account_capture_migrate_account_details(): + raise AttributeError("tag 'account_capture_migrate_account_details' not set") + return self._value + + def get_account_capture_notification_emails_sent_details(self): + """ + Only call this if :meth:`is_account_capture_notification_emails_sent_details` is true. + + :rtype: AccountCaptureNotificationEmailsSentDetails + """ + if not self.is_account_capture_notification_emails_sent_details(): + raise AttributeError("tag 'account_capture_notification_emails_sent_details' not set") + return self._value + + def get_account_capture_relinquish_account_details(self): + """ + Only call this if :meth:`is_account_capture_relinquish_account_details` is true. + + :rtype: AccountCaptureRelinquishAccountDetails + """ + if not self.is_account_capture_relinquish_account_details(): + raise AttributeError("tag 'account_capture_relinquish_account_details' not set") + return self._value + + def get_disabled_domain_invites_details(self): + """ + Only call this if :meth:`is_disabled_domain_invites_details` is true. + + :rtype: DisabledDomainInvitesDetails + """ + if not self.is_disabled_domain_invites_details(): + raise AttributeError("tag 'disabled_domain_invites_details' not set") + return self._value + + def get_domain_invites_approve_request_to_join_team_details(self): + """ + Only call this if :meth:`is_domain_invites_approve_request_to_join_team_details` is true. + + :rtype: DomainInvitesApproveRequestToJoinTeamDetails + """ + if not self.is_domain_invites_approve_request_to_join_team_details(): + raise AttributeError("tag 'domain_invites_approve_request_to_join_team_details' not set") + return self._value + + def get_domain_invites_decline_request_to_join_team_details(self): + """ + Only call this if :meth:`is_domain_invites_decline_request_to_join_team_details` is true. + + :rtype: DomainInvitesDeclineRequestToJoinTeamDetails + """ + if not self.is_domain_invites_decline_request_to_join_team_details(): + raise AttributeError("tag 'domain_invites_decline_request_to_join_team_details' not set") + return self._value + + def get_domain_invites_email_existing_users_details(self): + """ + Only call this if :meth:`is_domain_invites_email_existing_users_details` is true. + + :rtype: DomainInvitesEmailExistingUsersDetails + """ + if not self.is_domain_invites_email_existing_users_details(): + raise AttributeError("tag 'domain_invites_email_existing_users_details' not set") + return self._value + + def get_domain_invites_request_to_join_team_details(self): + """ + Only call this if :meth:`is_domain_invites_request_to_join_team_details` is true. + + :rtype: DomainInvitesRequestToJoinTeamDetails + """ + if not self.is_domain_invites_request_to_join_team_details(): + raise AttributeError("tag 'domain_invites_request_to_join_team_details' not set") + return self._value + + def get_domain_invites_set_invite_new_user_pref_to_no_details(self): + """ + Only call this if :meth:`is_domain_invites_set_invite_new_user_pref_to_no_details` is true. + + :rtype: DomainInvitesSetInviteNewUserPrefToNoDetails + """ + if not self.is_domain_invites_set_invite_new_user_pref_to_no_details(): + raise AttributeError("tag 'domain_invites_set_invite_new_user_pref_to_no_details' not set") + return self._value + + def get_domain_invites_set_invite_new_user_pref_to_yes_details(self): + """ + Only call this if :meth:`is_domain_invites_set_invite_new_user_pref_to_yes_details` is true. + + :rtype: DomainInvitesSetInviteNewUserPrefToYesDetails + """ + if not self.is_domain_invites_set_invite_new_user_pref_to_yes_details(): + raise AttributeError("tag 'domain_invites_set_invite_new_user_pref_to_yes_details' not set") + return self._value + + def get_domain_verification_add_domain_fail_details(self): + """ + Only call this if :meth:`is_domain_verification_add_domain_fail_details` is true. + + :rtype: DomainVerificationAddDomainFailDetails + """ + if not self.is_domain_verification_add_domain_fail_details(): + raise AttributeError("tag 'domain_verification_add_domain_fail_details' not set") + return self._value + + def get_domain_verification_add_domain_success_details(self): + """ + Only call this if :meth:`is_domain_verification_add_domain_success_details` is true. + + :rtype: DomainVerificationAddDomainSuccessDetails + """ + if not self.is_domain_verification_add_domain_success_details(): + raise AttributeError("tag 'domain_verification_add_domain_success_details' not set") + return self._value + + def get_domain_verification_remove_domain_details(self): + """ + Only call this if :meth:`is_domain_verification_remove_domain_details` is true. + + :rtype: DomainVerificationRemoveDomainDetails + """ + if not self.is_domain_verification_remove_domain_details(): + raise AttributeError("tag 'domain_verification_remove_domain_details' not set") + return self._value + + def get_enabled_domain_invites_details(self): + """ + Only call this if :meth:`is_enabled_domain_invites_details` is true. + + :rtype: EnabledDomainInvitesDetails + """ + if not self.is_enabled_domain_invites_details(): + raise AttributeError("tag 'enabled_domain_invites_details' not set") + return self._value + + def get_create_folder_details(self): + """ + Only call this if :meth:`is_create_folder_details` is true. + + :rtype: CreateFolderDetails + """ + if not self.is_create_folder_details(): + raise AttributeError("tag 'create_folder_details' not set") + return self._value + + def get_file_add_details(self): + """ + Only call this if :meth:`is_file_add_details` is true. + + :rtype: FileAddDetails + """ + if not self.is_file_add_details(): + raise AttributeError("tag 'file_add_details' not set") + return self._value + + def get_file_copy_details(self): + """ + Only call this if :meth:`is_file_copy_details` is true. + + :rtype: FileCopyDetails + """ + if not self.is_file_copy_details(): + raise AttributeError("tag 'file_copy_details' not set") + return self._value + + def get_file_delete_details(self): + """ + Only call this if :meth:`is_file_delete_details` is true. + + :rtype: FileDeleteDetails + """ + if not self.is_file_delete_details(): + raise AttributeError("tag 'file_delete_details' not set") + return self._value + + def get_file_download_details(self): + """ + Only call this if :meth:`is_file_download_details` is true. + + :rtype: FileDownloadDetails + """ + if not self.is_file_download_details(): + raise AttributeError("tag 'file_download_details' not set") + return self._value + + def get_file_edit_details(self): + """ + Only call this if :meth:`is_file_edit_details` is true. + + :rtype: FileEditDetails + """ + if not self.is_file_edit_details(): + raise AttributeError("tag 'file_edit_details' not set") + return self._value + + def get_file_get_copy_reference_details(self): + """ + Only call this if :meth:`is_file_get_copy_reference_details` is true. + + :rtype: FileGetCopyReferenceDetails + """ + if not self.is_file_get_copy_reference_details(): + raise AttributeError("tag 'file_get_copy_reference_details' not set") + return self._value + + def get_file_move_details(self): + """ + Only call this if :meth:`is_file_move_details` is true. + + :rtype: FileMoveDetails + """ + if not self.is_file_move_details(): + raise AttributeError("tag 'file_move_details' not set") + return self._value + + def get_file_permanently_delete_details(self): + """ + Only call this if :meth:`is_file_permanently_delete_details` is true. + + :rtype: FilePermanentlyDeleteDetails + """ + if not self.is_file_permanently_delete_details(): + raise AttributeError("tag 'file_permanently_delete_details' not set") + return self._value + + def get_file_preview_details(self): + """ + Only call this if :meth:`is_file_preview_details` is true. + + :rtype: FilePreviewDetails + """ + if not self.is_file_preview_details(): + raise AttributeError("tag 'file_preview_details' not set") + return self._value + + def get_file_rename_details(self): + """ + Only call this if :meth:`is_file_rename_details` is true. + + :rtype: FileRenameDetails + """ + if not self.is_file_rename_details(): + raise AttributeError("tag 'file_rename_details' not set") + return self._value + + def get_file_restore_details(self): + """ + Only call this if :meth:`is_file_restore_details` is true. + + :rtype: FileRestoreDetails + """ + if not self.is_file_restore_details(): + raise AttributeError("tag 'file_restore_details' not set") + return self._value + + def get_file_revert_details(self): + """ + Only call this if :meth:`is_file_revert_details` is true. + + :rtype: FileRevertDetails + """ + if not self.is_file_revert_details(): + raise AttributeError("tag 'file_revert_details' not set") + return self._value + + def get_file_rollback_changes_details(self): + """ + Only call this if :meth:`is_file_rollback_changes_details` is true. + + :rtype: FileRollbackChangesDetails + """ + if not self.is_file_rollback_changes_details(): + raise AttributeError("tag 'file_rollback_changes_details' not set") + return self._value + + def get_file_save_copy_reference_details(self): + """ + Only call this if :meth:`is_file_save_copy_reference_details` is true. + + :rtype: FileSaveCopyReferenceDetails + """ + if not self.is_file_save_copy_reference_details(): + raise AttributeError("tag 'file_save_copy_reference_details' not set") + return self._value + + def get_file_request_change_details(self): + """ + Only call this if :meth:`is_file_request_change_details` is true. + + :rtype: FileRequestChangeDetails + """ + if not self.is_file_request_change_details(): + raise AttributeError("tag 'file_request_change_details' not set") + return self._value + + def get_file_request_close_details(self): + """ + Only call this if :meth:`is_file_request_close_details` is true. + + :rtype: FileRequestCloseDetails + """ + if not self.is_file_request_close_details(): + raise AttributeError("tag 'file_request_close_details' not set") + return self._value + + def get_file_request_create_details(self): + """ + Only call this if :meth:`is_file_request_create_details` is true. + + :rtype: FileRequestCreateDetails + """ + if not self.is_file_request_create_details(): + raise AttributeError("tag 'file_request_create_details' not set") + return self._value + + def get_file_request_receive_file_details(self): + """ + Only call this if :meth:`is_file_request_receive_file_details` is true. + + :rtype: FileRequestReceiveFileDetails + """ + if not self.is_file_request_receive_file_details(): + raise AttributeError("tag 'file_request_receive_file_details' not set") + return self._value + + def get_group_add_external_id_details(self): + """ + Only call this if :meth:`is_group_add_external_id_details` is true. + + :rtype: GroupAddExternalIdDetails + """ + if not self.is_group_add_external_id_details(): + raise AttributeError("tag 'group_add_external_id_details' not set") + return self._value + + def get_group_add_member_details(self): + """ + Only call this if :meth:`is_group_add_member_details` is true. + + :rtype: GroupAddMemberDetails + """ + if not self.is_group_add_member_details(): + raise AttributeError("tag 'group_add_member_details' not set") + return self._value + + def get_group_change_external_id_details(self): + """ + Only call this if :meth:`is_group_change_external_id_details` is true. + + :rtype: GroupChangeExternalIdDetails + """ + if not self.is_group_change_external_id_details(): + raise AttributeError("tag 'group_change_external_id_details' not set") + return self._value + + def get_group_change_management_type_details(self): + """ + Only call this if :meth:`is_group_change_management_type_details` is true. + + :rtype: GroupChangeManagementTypeDetails + """ + if not self.is_group_change_management_type_details(): + raise AttributeError("tag 'group_change_management_type_details' not set") + return self._value + + def get_group_change_member_role_details(self): + """ + Only call this if :meth:`is_group_change_member_role_details` is true. + + :rtype: GroupChangeMemberRoleDetails + """ + if not self.is_group_change_member_role_details(): + raise AttributeError("tag 'group_change_member_role_details' not set") + return self._value + + def get_group_create_details(self): + """ + Only call this if :meth:`is_group_create_details` is true. + + :rtype: GroupCreateDetails + """ + if not self.is_group_create_details(): + raise AttributeError("tag 'group_create_details' not set") + return self._value + + def get_group_delete_details(self): + """ + Only call this if :meth:`is_group_delete_details` is true. + + :rtype: GroupDeleteDetails + """ + if not self.is_group_delete_details(): + raise AttributeError("tag 'group_delete_details' not set") + return self._value + + def get_group_description_updated_details(self): + """ + Only call this if :meth:`is_group_description_updated_details` is true. + + :rtype: GroupDescriptionUpdatedDetails + """ + if not self.is_group_description_updated_details(): + raise AttributeError("tag 'group_description_updated_details' not set") + return self._value + + def get_group_join_policy_updated_details(self): + """ + Only call this if :meth:`is_group_join_policy_updated_details` is true. + + :rtype: GroupJoinPolicyUpdatedDetails + """ + if not self.is_group_join_policy_updated_details(): + raise AttributeError("tag 'group_join_policy_updated_details' not set") + return self._value + + def get_group_moved_details(self): + """ + Only call this if :meth:`is_group_moved_details` is true. + + :rtype: GroupMovedDetails + """ + if not self.is_group_moved_details(): + raise AttributeError("tag 'group_moved_details' not set") + return self._value + + def get_group_remove_external_id_details(self): + """ + Only call this if :meth:`is_group_remove_external_id_details` is true. + + :rtype: GroupRemoveExternalIdDetails + """ + if not self.is_group_remove_external_id_details(): + raise AttributeError("tag 'group_remove_external_id_details' not set") + return self._value + + def get_group_remove_member_details(self): + """ + Only call this if :meth:`is_group_remove_member_details` is true. + + :rtype: GroupRemoveMemberDetails + """ + if not self.is_group_remove_member_details(): + raise AttributeError("tag 'group_remove_member_details' not set") + return self._value + + def get_group_rename_details(self): + """ + Only call this if :meth:`is_group_rename_details` is true. + + :rtype: GroupRenameDetails + """ + if not self.is_group_rename_details(): + raise AttributeError("tag 'group_rename_details' not set") + return self._value + + def get_emm_error_details(self): + """ + Only call this if :meth:`is_emm_error_details` is true. + + :rtype: EmmErrorDetails + """ + if not self.is_emm_error_details(): + raise AttributeError("tag 'emm_error_details' not set") + return self._value + + def get_login_fail_details(self): + """ + Only call this if :meth:`is_login_fail_details` is true. + + :rtype: LoginFailDetails + """ + if not self.is_login_fail_details(): + raise AttributeError("tag 'login_fail_details' not set") + return self._value + + def get_login_success_details(self): + """ + Only call this if :meth:`is_login_success_details` is true. + + :rtype: LoginSuccessDetails + """ + if not self.is_login_success_details(): + raise AttributeError("tag 'login_success_details' not set") + return self._value + + def get_logout_details(self): + """ + Only call this if :meth:`is_logout_details` is true. + + :rtype: LogoutDetails + """ + if not self.is_logout_details(): + raise AttributeError("tag 'logout_details' not set") + return self._value + + def get_reseller_support_session_end_details(self): + """ + Only call this if :meth:`is_reseller_support_session_end_details` is true. + + :rtype: ResellerSupportSessionEndDetails + """ + if not self.is_reseller_support_session_end_details(): + raise AttributeError("tag 'reseller_support_session_end_details' not set") + return self._value + + def get_reseller_support_session_start_details(self): + """ + Only call this if :meth:`is_reseller_support_session_start_details` is true. + + :rtype: ResellerSupportSessionStartDetails + """ + if not self.is_reseller_support_session_start_details(): + raise AttributeError("tag 'reseller_support_session_start_details' not set") + return self._value + + def get_sign_in_as_session_end_details(self): + """ + Only call this if :meth:`is_sign_in_as_session_end_details` is true. + + :rtype: SignInAsSessionEndDetails + """ + if not self.is_sign_in_as_session_end_details(): + raise AttributeError("tag 'sign_in_as_session_end_details' not set") + return self._value + + def get_sign_in_as_session_start_details(self): + """ + Only call this if :meth:`is_sign_in_as_session_start_details` is true. + + :rtype: SignInAsSessionStartDetails + """ + if not self.is_sign_in_as_session_start_details(): + raise AttributeError("tag 'sign_in_as_session_start_details' not set") + return self._value + + def get_sso_error_details(self): + """ + Only call this if :meth:`is_sso_error_details` is true. + + :rtype: SsoErrorDetails + """ + if not self.is_sso_error_details(): + raise AttributeError("tag 'sso_error_details' not set") + return self._value + + def get_member_add_name_details(self): + """ + Only call this if :meth:`is_member_add_name_details` is true. + + :rtype: MemberAddNameDetails + """ + if not self.is_member_add_name_details(): + raise AttributeError("tag 'member_add_name_details' not set") + return self._value + + def get_member_change_admin_role_details(self): + """ + Only call this if :meth:`is_member_change_admin_role_details` is true. + + :rtype: MemberChangeAdminRoleDetails + """ + if not self.is_member_change_admin_role_details(): + raise AttributeError("tag 'member_change_admin_role_details' not set") + return self._value + + def get_member_change_email_details(self): + """ + Only call this if :meth:`is_member_change_email_details` is true. + + :rtype: MemberChangeEmailDetails + """ + if not self.is_member_change_email_details(): + raise AttributeError("tag 'member_change_email_details' not set") + return self._value + + def get_member_change_membership_type_details(self): + """ + Only call this if :meth:`is_member_change_membership_type_details` is true. + + :rtype: MemberChangeMembershipTypeDetails + """ + if not self.is_member_change_membership_type_details(): + raise AttributeError("tag 'member_change_membership_type_details' not set") + return self._value + + def get_member_change_name_details(self): + """ + Only call this if :meth:`is_member_change_name_details` is true. + + :rtype: MemberChangeNameDetails + """ + if not self.is_member_change_name_details(): + raise AttributeError("tag 'member_change_name_details' not set") + return self._value + + def get_member_change_status_details(self): + """ + Only call this if :meth:`is_member_change_status_details` is true. + + :rtype: MemberChangeStatusDetails + """ + if not self.is_member_change_status_details(): + raise AttributeError("tag 'member_change_status_details' not set") + return self._value + + def get_member_delete_manual_contacts_details(self): + """ + Only call this if :meth:`is_member_delete_manual_contacts_details` is true. + + :rtype: MemberDeleteManualContactsDetails + """ + if not self.is_member_delete_manual_contacts_details(): + raise AttributeError("tag 'member_delete_manual_contacts_details' not set") + return self._value + + def get_member_permanently_delete_account_contents_details(self): + """ + Only call this if :meth:`is_member_permanently_delete_account_contents_details` is true. + + :rtype: MemberPermanentlyDeleteAccountContentsDetails + """ + if not self.is_member_permanently_delete_account_contents_details(): + raise AttributeError("tag 'member_permanently_delete_account_contents_details' not set") + return self._value + + def get_member_space_limits_add_custom_quota_details(self): + """ + Only call this if :meth:`is_member_space_limits_add_custom_quota_details` is true. + + :rtype: MemberSpaceLimitsAddCustomQuotaDetails + """ + if not self.is_member_space_limits_add_custom_quota_details(): + raise AttributeError("tag 'member_space_limits_add_custom_quota_details' not set") + return self._value + + def get_member_space_limits_change_custom_quota_details(self): + """ + Only call this if :meth:`is_member_space_limits_change_custom_quota_details` is true. + + :rtype: MemberSpaceLimitsChangeCustomQuotaDetails + """ + if not self.is_member_space_limits_change_custom_quota_details(): + raise AttributeError("tag 'member_space_limits_change_custom_quota_details' not set") + return self._value + + def get_member_space_limits_change_status_details(self): + """ + Only call this if :meth:`is_member_space_limits_change_status_details` is true. + + :rtype: MemberSpaceLimitsChangeStatusDetails + """ + if not self.is_member_space_limits_change_status_details(): + raise AttributeError("tag 'member_space_limits_change_status_details' not set") + return self._value + + def get_member_space_limits_remove_custom_quota_details(self): + """ + Only call this if :meth:`is_member_space_limits_remove_custom_quota_details` is true. + + :rtype: MemberSpaceLimitsRemoveCustomQuotaDetails + """ + if not self.is_member_space_limits_remove_custom_quota_details(): + raise AttributeError("tag 'member_space_limits_remove_custom_quota_details' not set") + return self._value + + def get_member_suggest_details(self): + """ + Only call this if :meth:`is_member_suggest_details` is true. + + :rtype: MemberSuggestDetails + """ + if not self.is_member_suggest_details(): + raise AttributeError("tag 'member_suggest_details' not set") + return self._value + + def get_member_transfer_account_contents_details(self): + """ + Only call this if :meth:`is_member_transfer_account_contents_details` is true. + + :rtype: MemberTransferAccountContentsDetails + """ + if not self.is_member_transfer_account_contents_details(): + raise AttributeError("tag 'member_transfer_account_contents_details' not set") + return self._value + + def get_secondary_mails_policy_changed_details(self): + """ + Only call this if :meth:`is_secondary_mails_policy_changed_details` is true. + + :rtype: SecondaryMailsPolicyChangedDetails + """ + if not self.is_secondary_mails_policy_changed_details(): + raise AttributeError("tag 'secondary_mails_policy_changed_details' not set") + return self._value + + def get_paper_content_add_member_details(self): + """ + Only call this if :meth:`is_paper_content_add_member_details` is true. + + :rtype: PaperContentAddMemberDetails + """ + if not self.is_paper_content_add_member_details(): + raise AttributeError("tag 'paper_content_add_member_details' not set") + return self._value + + def get_paper_content_add_to_folder_details(self): + """ + Only call this if :meth:`is_paper_content_add_to_folder_details` is true. + + :rtype: PaperContentAddToFolderDetails + """ + if not self.is_paper_content_add_to_folder_details(): + raise AttributeError("tag 'paper_content_add_to_folder_details' not set") + return self._value + + def get_paper_content_archive_details(self): + """ + Only call this if :meth:`is_paper_content_archive_details` is true. + + :rtype: PaperContentArchiveDetails + """ + if not self.is_paper_content_archive_details(): + raise AttributeError("tag 'paper_content_archive_details' not set") + return self._value + + def get_paper_content_create_details(self): + """ + Only call this if :meth:`is_paper_content_create_details` is true. + + :rtype: PaperContentCreateDetails + """ + if not self.is_paper_content_create_details(): + raise AttributeError("tag 'paper_content_create_details' not set") + return self._value + + def get_paper_content_permanently_delete_details(self): + """ + Only call this if :meth:`is_paper_content_permanently_delete_details` is true. + + :rtype: PaperContentPermanentlyDeleteDetails + """ + if not self.is_paper_content_permanently_delete_details(): + raise AttributeError("tag 'paper_content_permanently_delete_details' not set") + return self._value + + def get_paper_content_remove_from_folder_details(self): + """ + Only call this if :meth:`is_paper_content_remove_from_folder_details` is true. + + :rtype: PaperContentRemoveFromFolderDetails + """ + if not self.is_paper_content_remove_from_folder_details(): + raise AttributeError("tag 'paper_content_remove_from_folder_details' not set") + return self._value + + def get_paper_content_remove_member_details(self): + """ + Only call this if :meth:`is_paper_content_remove_member_details` is true. + + :rtype: PaperContentRemoveMemberDetails + """ + if not self.is_paper_content_remove_member_details(): + raise AttributeError("tag 'paper_content_remove_member_details' not set") + return self._value + + def get_paper_content_rename_details(self): + """ + Only call this if :meth:`is_paper_content_rename_details` is true. + + :rtype: PaperContentRenameDetails + """ + if not self.is_paper_content_rename_details(): + raise AttributeError("tag 'paper_content_rename_details' not set") + return self._value + + def get_paper_content_restore_details(self): + """ + Only call this if :meth:`is_paper_content_restore_details` is true. + + :rtype: PaperContentRestoreDetails + """ + if not self.is_paper_content_restore_details(): + raise AttributeError("tag 'paper_content_restore_details' not set") + return self._value + + def get_paper_doc_add_comment_details(self): + """ + Only call this if :meth:`is_paper_doc_add_comment_details` is true. + + :rtype: PaperDocAddCommentDetails + """ + if not self.is_paper_doc_add_comment_details(): + raise AttributeError("tag 'paper_doc_add_comment_details' not set") + return self._value + + def get_paper_doc_change_member_role_details(self): + """ + Only call this if :meth:`is_paper_doc_change_member_role_details` is true. + + :rtype: PaperDocChangeMemberRoleDetails + """ + if not self.is_paper_doc_change_member_role_details(): + raise AttributeError("tag 'paper_doc_change_member_role_details' not set") + return self._value + + def get_paper_doc_change_sharing_policy_details(self): + """ + Only call this if :meth:`is_paper_doc_change_sharing_policy_details` is true. + + :rtype: PaperDocChangeSharingPolicyDetails + """ + if not self.is_paper_doc_change_sharing_policy_details(): + raise AttributeError("tag 'paper_doc_change_sharing_policy_details' not set") + return self._value + + def get_paper_doc_change_subscription_details(self): + """ + Only call this if :meth:`is_paper_doc_change_subscription_details` is true. + + :rtype: PaperDocChangeSubscriptionDetails + """ + if not self.is_paper_doc_change_subscription_details(): + raise AttributeError("tag 'paper_doc_change_subscription_details' not set") + return self._value + + def get_paper_doc_deleted_details(self): + """ + Only call this if :meth:`is_paper_doc_deleted_details` is true. + + :rtype: PaperDocDeletedDetails + """ + if not self.is_paper_doc_deleted_details(): + raise AttributeError("tag 'paper_doc_deleted_details' not set") + return self._value + + def get_paper_doc_delete_comment_details(self): + """ + Only call this if :meth:`is_paper_doc_delete_comment_details` is true. + + :rtype: PaperDocDeleteCommentDetails + """ + if not self.is_paper_doc_delete_comment_details(): + raise AttributeError("tag 'paper_doc_delete_comment_details' not set") + return self._value + + def get_paper_doc_download_details(self): + """ + Only call this if :meth:`is_paper_doc_download_details` is true. + + :rtype: PaperDocDownloadDetails + """ + if not self.is_paper_doc_download_details(): + raise AttributeError("tag 'paper_doc_download_details' not set") + return self._value + + def get_paper_doc_edit_details(self): + """ + Only call this if :meth:`is_paper_doc_edit_details` is true. + + :rtype: PaperDocEditDetails + """ + if not self.is_paper_doc_edit_details(): + raise AttributeError("tag 'paper_doc_edit_details' not set") + return self._value + + def get_paper_doc_edit_comment_details(self): + """ + Only call this if :meth:`is_paper_doc_edit_comment_details` is true. + + :rtype: PaperDocEditCommentDetails + """ + if not self.is_paper_doc_edit_comment_details(): + raise AttributeError("tag 'paper_doc_edit_comment_details' not set") + return self._value + + def get_paper_doc_followed_details(self): + """ + Only call this if :meth:`is_paper_doc_followed_details` is true. + + :rtype: PaperDocFollowedDetails + """ + if not self.is_paper_doc_followed_details(): + raise AttributeError("tag 'paper_doc_followed_details' not set") + return self._value + + def get_paper_doc_mention_details(self): + """ + Only call this if :meth:`is_paper_doc_mention_details` is true. + + :rtype: PaperDocMentionDetails + """ + if not self.is_paper_doc_mention_details(): + raise AttributeError("tag 'paper_doc_mention_details' not set") + return self._value + + def get_paper_doc_ownership_changed_details(self): + """ + Only call this if :meth:`is_paper_doc_ownership_changed_details` is true. + + :rtype: PaperDocOwnershipChangedDetails + """ + if not self.is_paper_doc_ownership_changed_details(): + raise AttributeError("tag 'paper_doc_ownership_changed_details' not set") + return self._value + + def get_paper_doc_request_access_details(self): + """ + Only call this if :meth:`is_paper_doc_request_access_details` is true. + + :rtype: PaperDocRequestAccessDetails + """ + if not self.is_paper_doc_request_access_details(): + raise AttributeError("tag 'paper_doc_request_access_details' not set") + return self._value + + def get_paper_doc_resolve_comment_details(self): + """ + Only call this if :meth:`is_paper_doc_resolve_comment_details` is true. + + :rtype: PaperDocResolveCommentDetails + """ + if not self.is_paper_doc_resolve_comment_details(): + raise AttributeError("tag 'paper_doc_resolve_comment_details' not set") + return self._value + + def get_paper_doc_revert_details(self): + """ + Only call this if :meth:`is_paper_doc_revert_details` is true. + + :rtype: PaperDocRevertDetails + """ + if not self.is_paper_doc_revert_details(): + raise AttributeError("tag 'paper_doc_revert_details' not set") + return self._value + + def get_paper_doc_slack_share_details(self): + """ + Only call this if :meth:`is_paper_doc_slack_share_details` is true. + + :rtype: PaperDocSlackShareDetails + """ + if not self.is_paper_doc_slack_share_details(): + raise AttributeError("tag 'paper_doc_slack_share_details' not set") + return self._value + + def get_paper_doc_team_invite_details(self): + """ + Only call this if :meth:`is_paper_doc_team_invite_details` is true. + + :rtype: PaperDocTeamInviteDetails + """ + if not self.is_paper_doc_team_invite_details(): + raise AttributeError("tag 'paper_doc_team_invite_details' not set") + return self._value + + def get_paper_doc_trashed_details(self): + """ + Only call this if :meth:`is_paper_doc_trashed_details` is true. + + :rtype: PaperDocTrashedDetails + """ + if not self.is_paper_doc_trashed_details(): + raise AttributeError("tag 'paper_doc_trashed_details' not set") + return self._value + + def get_paper_doc_unresolve_comment_details(self): + """ + Only call this if :meth:`is_paper_doc_unresolve_comment_details` is true. + + :rtype: PaperDocUnresolveCommentDetails + """ + if not self.is_paper_doc_unresolve_comment_details(): + raise AttributeError("tag 'paper_doc_unresolve_comment_details' not set") + return self._value + + def get_paper_doc_untrashed_details(self): + """ + Only call this if :meth:`is_paper_doc_untrashed_details` is true. + + :rtype: PaperDocUntrashedDetails + """ + if not self.is_paper_doc_untrashed_details(): + raise AttributeError("tag 'paper_doc_untrashed_details' not set") + return self._value + + def get_paper_doc_view_details(self): + """ + Only call this if :meth:`is_paper_doc_view_details` is true. + + :rtype: PaperDocViewDetails + """ + if not self.is_paper_doc_view_details(): + raise AttributeError("tag 'paper_doc_view_details' not set") + return self._value + + def get_paper_external_view_allow_details(self): + """ + Only call this if :meth:`is_paper_external_view_allow_details` is true. + + :rtype: PaperExternalViewAllowDetails + """ + if not self.is_paper_external_view_allow_details(): + raise AttributeError("tag 'paper_external_view_allow_details' not set") + return self._value + + def get_paper_external_view_default_team_details(self): + """ + Only call this if :meth:`is_paper_external_view_default_team_details` is true. + + :rtype: PaperExternalViewDefaultTeamDetails + """ + if not self.is_paper_external_view_default_team_details(): + raise AttributeError("tag 'paper_external_view_default_team_details' not set") + return self._value + + def get_paper_external_view_forbid_details(self): + """ + Only call this if :meth:`is_paper_external_view_forbid_details` is true. + + :rtype: PaperExternalViewForbidDetails + """ + if not self.is_paper_external_view_forbid_details(): + raise AttributeError("tag 'paper_external_view_forbid_details' not set") + return self._value + + def get_paper_folder_change_subscription_details(self): + """ + Only call this if :meth:`is_paper_folder_change_subscription_details` is true. + + :rtype: PaperFolderChangeSubscriptionDetails + """ + if not self.is_paper_folder_change_subscription_details(): + raise AttributeError("tag 'paper_folder_change_subscription_details' not set") + return self._value + + def get_paper_folder_deleted_details(self): + """ + Only call this if :meth:`is_paper_folder_deleted_details` is true. + + :rtype: PaperFolderDeletedDetails + """ + if not self.is_paper_folder_deleted_details(): + raise AttributeError("tag 'paper_folder_deleted_details' not set") + return self._value + + def get_paper_folder_followed_details(self): + """ + Only call this if :meth:`is_paper_folder_followed_details` is true. + + :rtype: PaperFolderFollowedDetails + """ + if not self.is_paper_folder_followed_details(): + raise AttributeError("tag 'paper_folder_followed_details' not set") + return self._value + + def get_paper_folder_team_invite_details(self): + """ + Only call this if :meth:`is_paper_folder_team_invite_details` is true. + + :rtype: PaperFolderTeamInviteDetails + """ + if not self.is_paper_folder_team_invite_details(): + raise AttributeError("tag 'paper_folder_team_invite_details' not set") + return self._value + + def get_password_change_details(self): + """ + Only call this if :meth:`is_password_change_details` is true. + + :rtype: PasswordChangeDetails + """ + if not self.is_password_change_details(): + raise AttributeError("tag 'password_change_details' not set") + return self._value + + def get_password_reset_details(self): + """ + Only call this if :meth:`is_password_reset_details` is true. + + :rtype: PasswordResetDetails + """ + if not self.is_password_reset_details(): + raise AttributeError("tag 'password_reset_details' not set") + return self._value + + def get_password_reset_all_details(self): + """ + Only call this if :meth:`is_password_reset_all_details` is true. + + :rtype: PasswordResetAllDetails + """ + if not self.is_password_reset_all_details(): + raise AttributeError("tag 'password_reset_all_details' not set") + return self._value + + def get_emm_create_exceptions_report_details(self): + """ + Only call this if :meth:`is_emm_create_exceptions_report_details` is true. + + :rtype: EmmCreateExceptionsReportDetails + """ + if not self.is_emm_create_exceptions_report_details(): + raise AttributeError("tag 'emm_create_exceptions_report_details' not set") + return self._value + + def get_emm_create_usage_report_details(self): + """ + Only call this if :meth:`is_emm_create_usage_report_details` is true. + + :rtype: EmmCreateUsageReportDetails + """ + if not self.is_emm_create_usage_report_details(): + raise AttributeError("tag 'emm_create_usage_report_details' not set") + return self._value + + def get_export_members_report_details(self): + """ + Only call this if :meth:`is_export_members_report_details` is true. + + :rtype: ExportMembersReportDetails + """ + if not self.is_export_members_report_details(): + raise AttributeError("tag 'export_members_report_details' not set") + return self._value + + def get_paper_admin_export_start_details(self): + """ + Only call this if :meth:`is_paper_admin_export_start_details` is true. + + :rtype: PaperAdminExportStartDetails + """ + if not self.is_paper_admin_export_start_details(): + raise AttributeError("tag 'paper_admin_export_start_details' not set") + return self._value + + def get_smart_sync_create_admin_privilege_report_details(self): + """ + Only call this if :meth:`is_smart_sync_create_admin_privilege_report_details` is true. + + :rtype: SmartSyncCreateAdminPrivilegeReportDetails + """ + if not self.is_smart_sync_create_admin_privilege_report_details(): + raise AttributeError("tag 'smart_sync_create_admin_privilege_report_details' not set") + return self._value + + def get_team_activity_create_report_details(self): + """ + Only call this if :meth:`is_team_activity_create_report_details` is true. + + :rtype: TeamActivityCreateReportDetails + """ + if not self.is_team_activity_create_report_details(): + raise AttributeError("tag 'team_activity_create_report_details' not set") + return self._value + + def get_collection_share_details(self): + """ + Only call this if :meth:`is_collection_share_details` is true. + + :rtype: CollectionShareDetails + """ + if not self.is_collection_share_details(): + raise AttributeError("tag 'collection_share_details' not set") + return self._value + + def get_note_acl_invite_only_details(self): + """ + Only call this if :meth:`is_note_acl_invite_only_details` is true. + + :rtype: NoteAclInviteOnlyDetails + """ + if not self.is_note_acl_invite_only_details(): + raise AttributeError("tag 'note_acl_invite_only_details' not set") + return self._value + + def get_note_acl_link_details(self): + """ + Only call this if :meth:`is_note_acl_link_details` is true. + + :rtype: NoteAclLinkDetails + """ + if not self.is_note_acl_link_details(): + raise AttributeError("tag 'note_acl_link_details' not set") + return self._value + + def get_note_acl_team_link_details(self): + """ + Only call this if :meth:`is_note_acl_team_link_details` is true. + + :rtype: NoteAclTeamLinkDetails + """ + if not self.is_note_acl_team_link_details(): + raise AttributeError("tag 'note_acl_team_link_details' not set") + return self._value + + def get_note_shared_details(self): + """ + Only call this if :meth:`is_note_shared_details` is true. + + :rtype: NoteSharedDetails + """ + if not self.is_note_shared_details(): + raise AttributeError("tag 'note_shared_details' not set") + return self._value + + def get_note_share_receive_details(self): + """ + Only call this if :meth:`is_note_share_receive_details` is true. + + :rtype: NoteShareReceiveDetails + """ + if not self.is_note_share_receive_details(): + raise AttributeError("tag 'note_share_receive_details' not set") + return self._value + + def get_open_note_shared_details(self): + """ + Only call this if :meth:`is_open_note_shared_details` is true. + + :rtype: OpenNoteSharedDetails + """ + if not self.is_open_note_shared_details(): + raise AttributeError("tag 'open_note_shared_details' not set") + return self._value + + def get_sf_add_group_details(self): + """ + Only call this if :meth:`is_sf_add_group_details` is true. + + :rtype: SfAddGroupDetails + """ + if not self.is_sf_add_group_details(): + raise AttributeError("tag 'sf_add_group_details' not set") + return self._value + + def get_sf_allow_non_members_to_view_shared_links_details(self): + """ + Only call this if :meth:`is_sf_allow_non_members_to_view_shared_links_details` is true. + + :rtype: SfAllowNonMembersToViewSharedLinksDetails + """ + if not self.is_sf_allow_non_members_to_view_shared_links_details(): + raise AttributeError("tag 'sf_allow_non_members_to_view_shared_links_details' not set") + return self._value + + def get_sf_external_invite_warn_details(self): + """ + Only call this if :meth:`is_sf_external_invite_warn_details` is true. + + :rtype: SfExternalInviteWarnDetails + """ + if not self.is_sf_external_invite_warn_details(): + raise AttributeError("tag 'sf_external_invite_warn_details' not set") + return self._value + + def get_sf_fb_invite_details(self): + """ + Only call this if :meth:`is_sf_fb_invite_details` is true. + + :rtype: SfFbInviteDetails + """ + if not self.is_sf_fb_invite_details(): + raise AttributeError("tag 'sf_fb_invite_details' not set") + return self._value + + def get_sf_fb_invite_change_role_details(self): + """ + Only call this if :meth:`is_sf_fb_invite_change_role_details` is true. + + :rtype: SfFbInviteChangeRoleDetails + """ + if not self.is_sf_fb_invite_change_role_details(): + raise AttributeError("tag 'sf_fb_invite_change_role_details' not set") + return self._value + + def get_sf_fb_uninvite_details(self): + """ + Only call this if :meth:`is_sf_fb_uninvite_details` is true. + + :rtype: SfFbUninviteDetails + """ + if not self.is_sf_fb_uninvite_details(): + raise AttributeError("tag 'sf_fb_uninvite_details' not set") + return self._value + + def get_sf_invite_group_details(self): + """ + Only call this if :meth:`is_sf_invite_group_details` is true. + + :rtype: SfInviteGroupDetails + """ + if not self.is_sf_invite_group_details(): + raise AttributeError("tag 'sf_invite_group_details' not set") + return self._value + + def get_sf_team_grant_access_details(self): + """ + Only call this if :meth:`is_sf_team_grant_access_details` is true. + + :rtype: SfTeamGrantAccessDetails + """ + if not self.is_sf_team_grant_access_details(): + raise AttributeError("tag 'sf_team_grant_access_details' not set") + return self._value + + def get_sf_team_invite_details(self): + """ + Only call this if :meth:`is_sf_team_invite_details` is true. + + :rtype: SfTeamInviteDetails + """ + if not self.is_sf_team_invite_details(): + raise AttributeError("tag 'sf_team_invite_details' not set") + return self._value + + def get_sf_team_invite_change_role_details(self): + """ + Only call this if :meth:`is_sf_team_invite_change_role_details` is true. + + :rtype: SfTeamInviteChangeRoleDetails + """ + if not self.is_sf_team_invite_change_role_details(): + raise AttributeError("tag 'sf_team_invite_change_role_details' not set") + return self._value + + def get_sf_team_join_details(self): + """ + Only call this if :meth:`is_sf_team_join_details` is true. + + :rtype: SfTeamJoinDetails + """ + if not self.is_sf_team_join_details(): + raise AttributeError("tag 'sf_team_join_details' not set") + return self._value + + def get_sf_team_join_from_oob_link_details(self): + """ + Only call this if :meth:`is_sf_team_join_from_oob_link_details` is true. + + :rtype: SfTeamJoinFromOobLinkDetails + """ + if not self.is_sf_team_join_from_oob_link_details(): + raise AttributeError("tag 'sf_team_join_from_oob_link_details' not set") + return self._value + + def get_sf_team_uninvite_details(self): + """ + Only call this if :meth:`is_sf_team_uninvite_details` is true. + + :rtype: SfTeamUninviteDetails + """ + if not self.is_sf_team_uninvite_details(): + raise AttributeError("tag 'sf_team_uninvite_details' not set") + return self._value + + def get_shared_content_add_invitees_details(self): + """ + Only call this if :meth:`is_shared_content_add_invitees_details` is true. + + :rtype: SharedContentAddInviteesDetails + """ + if not self.is_shared_content_add_invitees_details(): + raise AttributeError("tag 'shared_content_add_invitees_details' not set") + return self._value + + def get_shared_content_add_link_expiry_details(self): + """ + Only call this if :meth:`is_shared_content_add_link_expiry_details` is true. + + :rtype: SharedContentAddLinkExpiryDetails + """ + if not self.is_shared_content_add_link_expiry_details(): + raise AttributeError("tag 'shared_content_add_link_expiry_details' not set") + return self._value + + def get_shared_content_add_link_password_details(self): + """ + Only call this if :meth:`is_shared_content_add_link_password_details` is true. + + :rtype: SharedContentAddLinkPasswordDetails + """ + if not self.is_shared_content_add_link_password_details(): + raise AttributeError("tag 'shared_content_add_link_password_details' not set") + return self._value + + def get_shared_content_add_member_details(self): + """ + Only call this if :meth:`is_shared_content_add_member_details` is true. + + :rtype: SharedContentAddMemberDetails + """ + if not self.is_shared_content_add_member_details(): + raise AttributeError("tag 'shared_content_add_member_details' not set") + return self._value + + def get_shared_content_change_downloads_policy_details(self): + """ + Only call this if :meth:`is_shared_content_change_downloads_policy_details` is true. + + :rtype: SharedContentChangeDownloadsPolicyDetails + """ + if not self.is_shared_content_change_downloads_policy_details(): + raise AttributeError("tag 'shared_content_change_downloads_policy_details' not set") + return self._value + + def get_shared_content_change_invitee_role_details(self): + """ + Only call this if :meth:`is_shared_content_change_invitee_role_details` is true. + + :rtype: SharedContentChangeInviteeRoleDetails + """ + if not self.is_shared_content_change_invitee_role_details(): + raise AttributeError("tag 'shared_content_change_invitee_role_details' not set") + return self._value + + def get_shared_content_change_link_audience_details(self): + """ + Only call this if :meth:`is_shared_content_change_link_audience_details` is true. + + :rtype: SharedContentChangeLinkAudienceDetails + """ + if not self.is_shared_content_change_link_audience_details(): + raise AttributeError("tag 'shared_content_change_link_audience_details' not set") + return self._value + + def get_shared_content_change_link_expiry_details(self): + """ + Only call this if :meth:`is_shared_content_change_link_expiry_details` is true. + + :rtype: SharedContentChangeLinkExpiryDetails + """ + if not self.is_shared_content_change_link_expiry_details(): + raise AttributeError("tag 'shared_content_change_link_expiry_details' not set") + return self._value + + def get_shared_content_change_link_password_details(self): + """ + Only call this if :meth:`is_shared_content_change_link_password_details` is true. + + :rtype: SharedContentChangeLinkPasswordDetails + """ + if not self.is_shared_content_change_link_password_details(): + raise AttributeError("tag 'shared_content_change_link_password_details' not set") + return self._value + + def get_shared_content_change_member_role_details(self): + """ + Only call this if :meth:`is_shared_content_change_member_role_details` is true. + + :rtype: SharedContentChangeMemberRoleDetails + """ + if not self.is_shared_content_change_member_role_details(): + raise AttributeError("tag 'shared_content_change_member_role_details' not set") + return self._value + + def get_shared_content_change_viewer_info_policy_details(self): + """ + Only call this if :meth:`is_shared_content_change_viewer_info_policy_details` is true. + + :rtype: SharedContentChangeViewerInfoPolicyDetails + """ + if not self.is_shared_content_change_viewer_info_policy_details(): + raise AttributeError("tag 'shared_content_change_viewer_info_policy_details' not set") + return self._value + + def get_shared_content_claim_invitation_details(self): + """ + Only call this if :meth:`is_shared_content_claim_invitation_details` is true. + + :rtype: SharedContentClaimInvitationDetails + """ + if not self.is_shared_content_claim_invitation_details(): + raise AttributeError("tag 'shared_content_claim_invitation_details' not set") + return self._value + + def get_shared_content_copy_details(self): + """ + Only call this if :meth:`is_shared_content_copy_details` is true. + + :rtype: SharedContentCopyDetails + """ + if not self.is_shared_content_copy_details(): + raise AttributeError("tag 'shared_content_copy_details' not set") + return self._value + + def get_shared_content_download_details(self): + """ + Only call this if :meth:`is_shared_content_download_details` is true. + + :rtype: SharedContentDownloadDetails + """ + if not self.is_shared_content_download_details(): + raise AttributeError("tag 'shared_content_download_details' not set") + return self._value + + def get_shared_content_relinquish_membership_details(self): + """ + Only call this if :meth:`is_shared_content_relinquish_membership_details` is true. + + :rtype: SharedContentRelinquishMembershipDetails + """ + if not self.is_shared_content_relinquish_membership_details(): + raise AttributeError("tag 'shared_content_relinquish_membership_details' not set") + return self._value + + def get_shared_content_remove_invitees_details(self): + """ + Only call this if :meth:`is_shared_content_remove_invitees_details` is true. + + :rtype: SharedContentRemoveInviteesDetails + """ + if not self.is_shared_content_remove_invitees_details(): + raise AttributeError("tag 'shared_content_remove_invitees_details' not set") + return self._value + + def get_shared_content_remove_link_expiry_details(self): + """ + Only call this if :meth:`is_shared_content_remove_link_expiry_details` is true. + + :rtype: SharedContentRemoveLinkExpiryDetails + """ + if not self.is_shared_content_remove_link_expiry_details(): + raise AttributeError("tag 'shared_content_remove_link_expiry_details' not set") + return self._value + + def get_shared_content_remove_link_password_details(self): + """ + Only call this if :meth:`is_shared_content_remove_link_password_details` is true. + + :rtype: SharedContentRemoveLinkPasswordDetails + """ + if not self.is_shared_content_remove_link_password_details(): + raise AttributeError("tag 'shared_content_remove_link_password_details' not set") + return self._value + + def get_shared_content_remove_member_details(self): + """ + Only call this if :meth:`is_shared_content_remove_member_details` is true. + + :rtype: SharedContentRemoveMemberDetails + """ + if not self.is_shared_content_remove_member_details(): + raise AttributeError("tag 'shared_content_remove_member_details' not set") + return self._value + + def get_shared_content_request_access_details(self): + """ + Only call this if :meth:`is_shared_content_request_access_details` is true. + + :rtype: SharedContentRequestAccessDetails + """ + if not self.is_shared_content_request_access_details(): + raise AttributeError("tag 'shared_content_request_access_details' not set") + return self._value + + def get_shared_content_unshare_details(self): + """ + Only call this if :meth:`is_shared_content_unshare_details` is true. + + :rtype: SharedContentUnshareDetails + """ + if not self.is_shared_content_unshare_details(): + raise AttributeError("tag 'shared_content_unshare_details' not set") + return self._value + + def get_shared_content_view_details(self): + """ + Only call this if :meth:`is_shared_content_view_details` is true. + + :rtype: SharedContentViewDetails + """ + if not self.is_shared_content_view_details(): + raise AttributeError("tag 'shared_content_view_details' not set") + return self._value + + def get_shared_folder_change_link_policy_details(self): + """ + Only call this if :meth:`is_shared_folder_change_link_policy_details` is true. + + :rtype: SharedFolderChangeLinkPolicyDetails + """ + if not self.is_shared_folder_change_link_policy_details(): + raise AttributeError("tag 'shared_folder_change_link_policy_details' not set") + return self._value + + def get_shared_folder_change_members_inheritance_policy_details(self): + """ + Only call this if :meth:`is_shared_folder_change_members_inheritance_policy_details` is true. + + :rtype: SharedFolderChangeMembersInheritancePolicyDetails + """ + if not self.is_shared_folder_change_members_inheritance_policy_details(): + raise AttributeError("tag 'shared_folder_change_members_inheritance_policy_details' not set") + return self._value + + def get_shared_folder_change_members_management_policy_details(self): + """ + Only call this if :meth:`is_shared_folder_change_members_management_policy_details` is true. + + :rtype: SharedFolderChangeMembersManagementPolicyDetails + """ + if not self.is_shared_folder_change_members_management_policy_details(): + raise AttributeError("tag 'shared_folder_change_members_management_policy_details' not set") + return self._value + + def get_shared_folder_change_members_policy_details(self): + """ + Only call this if :meth:`is_shared_folder_change_members_policy_details` is true. + + :rtype: SharedFolderChangeMembersPolicyDetails + """ + if not self.is_shared_folder_change_members_policy_details(): + raise AttributeError("tag 'shared_folder_change_members_policy_details' not set") + return self._value + + def get_shared_folder_create_details(self): + """ + Only call this if :meth:`is_shared_folder_create_details` is true. + + :rtype: SharedFolderCreateDetails + """ + if not self.is_shared_folder_create_details(): + raise AttributeError("tag 'shared_folder_create_details' not set") + return self._value + + def get_shared_folder_decline_invitation_details(self): + """ + Only call this if :meth:`is_shared_folder_decline_invitation_details` is true. + + :rtype: SharedFolderDeclineInvitationDetails + """ + if not self.is_shared_folder_decline_invitation_details(): + raise AttributeError("tag 'shared_folder_decline_invitation_details' not set") + return self._value + + def get_shared_folder_mount_details(self): + """ + Only call this if :meth:`is_shared_folder_mount_details` is true. + + :rtype: SharedFolderMountDetails + """ + if not self.is_shared_folder_mount_details(): + raise AttributeError("tag 'shared_folder_mount_details' not set") + return self._value + + def get_shared_folder_nest_details(self): + """ + Only call this if :meth:`is_shared_folder_nest_details` is true. + + :rtype: SharedFolderNestDetails + """ + if not self.is_shared_folder_nest_details(): + raise AttributeError("tag 'shared_folder_nest_details' not set") + return self._value + + def get_shared_folder_transfer_ownership_details(self): + """ + Only call this if :meth:`is_shared_folder_transfer_ownership_details` is true. + + :rtype: SharedFolderTransferOwnershipDetails + """ + if not self.is_shared_folder_transfer_ownership_details(): + raise AttributeError("tag 'shared_folder_transfer_ownership_details' not set") + return self._value + + def get_shared_folder_unmount_details(self): + """ + Only call this if :meth:`is_shared_folder_unmount_details` is true. + + :rtype: SharedFolderUnmountDetails + """ + if not self.is_shared_folder_unmount_details(): + raise AttributeError("tag 'shared_folder_unmount_details' not set") + return self._value + + def get_shared_link_add_expiry_details(self): + """ + Only call this if :meth:`is_shared_link_add_expiry_details` is true. + + :rtype: SharedLinkAddExpiryDetails + """ + if not self.is_shared_link_add_expiry_details(): + raise AttributeError("tag 'shared_link_add_expiry_details' not set") + return self._value + + def get_shared_link_change_expiry_details(self): + """ + Only call this if :meth:`is_shared_link_change_expiry_details` is true. + + :rtype: SharedLinkChangeExpiryDetails + """ + if not self.is_shared_link_change_expiry_details(): + raise AttributeError("tag 'shared_link_change_expiry_details' not set") + return self._value + + def get_shared_link_change_visibility_details(self): + """ + Only call this if :meth:`is_shared_link_change_visibility_details` is true. + + :rtype: SharedLinkChangeVisibilityDetails + """ + if not self.is_shared_link_change_visibility_details(): + raise AttributeError("tag 'shared_link_change_visibility_details' not set") + return self._value + + def get_shared_link_copy_details(self): + """ + Only call this if :meth:`is_shared_link_copy_details` is true. + + :rtype: SharedLinkCopyDetails + """ + if not self.is_shared_link_copy_details(): + raise AttributeError("tag 'shared_link_copy_details' not set") + return self._value + + def get_shared_link_create_details(self): + """ + Only call this if :meth:`is_shared_link_create_details` is true. + + :rtype: SharedLinkCreateDetails + """ + if not self.is_shared_link_create_details(): + raise AttributeError("tag 'shared_link_create_details' not set") + return self._value + + def get_shared_link_disable_details(self): + """ + Only call this if :meth:`is_shared_link_disable_details` is true. + + :rtype: SharedLinkDisableDetails + """ + if not self.is_shared_link_disable_details(): + raise AttributeError("tag 'shared_link_disable_details' not set") + return self._value + + def get_shared_link_download_details(self): + """ + Only call this if :meth:`is_shared_link_download_details` is true. + + :rtype: SharedLinkDownloadDetails + """ + if not self.is_shared_link_download_details(): + raise AttributeError("tag 'shared_link_download_details' not set") + return self._value + + def get_shared_link_remove_expiry_details(self): + """ + Only call this if :meth:`is_shared_link_remove_expiry_details` is true. + + :rtype: SharedLinkRemoveExpiryDetails + """ + if not self.is_shared_link_remove_expiry_details(): + raise AttributeError("tag 'shared_link_remove_expiry_details' not set") + return self._value + + def get_shared_link_share_details(self): + """ + Only call this if :meth:`is_shared_link_share_details` is true. + + :rtype: SharedLinkShareDetails + """ + if not self.is_shared_link_share_details(): + raise AttributeError("tag 'shared_link_share_details' not set") + return self._value + + def get_shared_link_view_details(self): + """ + Only call this if :meth:`is_shared_link_view_details` is true. + + :rtype: SharedLinkViewDetails + """ + if not self.is_shared_link_view_details(): + raise AttributeError("tag 'shared_link_view_details' not set") + return self._value + + def get_shared_note_opened_details(self): + """ + Only call this if :meth:`is_shared_note_opened_details` is true. + + :rtype: SharedNoteOpenedDetails + """ + if not self.is_shared_note_opened_details(): + raise AttributeError("tag 'shared_note_opened_details' not set") + return self._value + + def get_shmodel_group_share_details(self): + """ + Only call this if :meth:`is_shmodel_group_share_details` is true. + + :rtype: ShmodelGroupShareDetails + """ + if not self.is_shmodel_group_share_details(): + raise AttributeError("tag 'shmodel_group_share_details' not set") + return self._value + + def get_showcase_access_granted_details(self): + """ + Only call this if :meth:`is_showcase_access_granted_details` is true. + + :rtype: ShowcaseAccessGrantedDetails + """ + if not self.is_showcase_access_granted_details(): + raise AttributeError("tag 'showcase_access_granted_details' not set") + return self._value + + def get_showcase_add_member_details(self): + """ + Only call this if :meth:`is_showcase_add_member_details` is true. + + :rtype: ShowcaseAddMemberDetails + """ + if not self.is_showcase_add_member_details(): + raise AttributeError("tag 'showcase_add_member_details' not set") + return self._value + + def get_showcase_archived_details(self): + """ + Only call this if :meth:`is_showcase_archived_details` is true. + + :rtype: ShowcaseArchivedDetails + """ + if not self.is_showcase_archived_details(): + raise AttributeError("tag 'showcase_archived_details' not set") + return self._value + + def get_showcase_created_details(self): + """ + Only call this if :meth:`is_showcase_created_details` is true. + + :rtype: ShowcaseCreatedDetails + """ + if not self.is_showcase_created_details(): + raise AttributeError("tag 'showcase_created_details' not set") + return self._value + + def get_showcase_delete_comment_details(self): + """ + Only call this if :meth:`is_showcase_delete_comment_details` is true. + + :rtype: ShowcaseDeleteCommentDetails + """ + if not self.is_showcase_delete_comment_details(): + raise AttributeError("tag 'showcase_delete_comment_details' not set") + return self._value + + def get_showcase_edited_details(self): + """ + Only call this if :meth:`is_showcase_edited_details` is true. + + :rtype: ShowcaseEditedDetails + """ + if not self.is_showcase_edited_details(): + raise AttributeError("tag 'showcase_edited_details' not set") + return self._value + + def get_showcase_edit_comment_details(self): + """ + Only call this if :meth:`is_showcase_edit_comment_details` is true. + + :rtype: ShowcaseEditCommentDetails + """ + if not self.is_showcase_edit_comment_details(): + raise AttributeError("tag 'showcase_edit_comment_details' not set") + return self._value + + def get_showcase_file_added_details(self): + """ + Only call this if :meth:`is_showcase_file_added_details` is true. + + :rtype: ShowcaseFileAddedDetails + """ + if not self.is_showcase_file_added_details(): + raise AttributeError("tag 'showcase_file_added_details' not set") + return self._value + + def get_showcase_file_download_details(self): + """ + Only call this if :meth:`is_showcase_file_download_details` is true. + + :rtype: ShowcaseFileDownloadDetails + """ + if not self.is_showcase_file_download_details(): + raise AttributeError("tag 'showcase_file_download_details' not set") + return self._value + + def get_showcase_file_removed_details(self): + """ + Only call this if :meth:`is_showcase_file_removed_details` is true. + + :rtype: ShowcaseFileRemovedDetails + """ + if not self.is_showcase_file_removed_details(): + raise AttributeError("tag 'showcase_file_removed_details' not set") + return self._value + + def get_showcase_file_view_details(self): + """ + Only call this if :meth:`is_showcase_file_view_details` is true. + + :rtype: ShowcaseFileViewDetails + """ + if not self.is_showcase_file_view_details(): + raise AttributeError("tag 'showcase_file_view_details' not set") + return self._value + + def get_showcase_permanently_deleted_details(self): + """ + Only call this if :meth:`is_showcase_permanently_deleted_details` is true. + + :rtype: ShowcasePermanentlyDeletedDetails + """ + if not self.is_showcase_permanently_deleted_details(): + raise AttributeError("tag 'showcase_permanently_deleted_details' not set") + return self._value + + def get_showcase_post_comment_details(self): + """ + Only call this if :meth:`is_showcase_post_comment_details` is true. + + :rtype: ShowcasePostCommentDetails + """ + if not self.is_showcase_post_comment_details(): + raise AttributeError("tag 'showcase_post_comment_details' not set") + return self._value + + def get_showcase_remove_member_details(self): + """ + Only call this if :meth:`is_showcase_remove_member_details` is true. + + :rtype: ShowcaseRemoveMemberDetails + """ + if not self.is_showcase_remove_member_details(): + raise AttributeError("tag 'showcase_remove_member_details' not set") + return self._value + + def get_showcase_renamed_details(self): + """ + Only call this if :meth:`is_showcase_renamed_details` is true. + + :rtype: ShowcaseRenamedDetails + """ + if not self.is_showcase_renamed_details(): + raise AttributeError("tag 'showcase_renamed_details' not set") + return self._value + + def get_showcase_request_access_details(self): + """ + Only call this if :meth:`is_showcase_request_access_details` is true. + + :rtype: ShowcaseRequestAccessDetails + """ + if not self.is_showcase_request_access_details(): + raise AttributeError("tag 'showcase_request_access_details' not set") + return self._value + + def get_showcase_resolve_comment_details(self): + """ + Only call this if :meth:`is_showcase_resolve_comment_details` is true. + + :rtype: ShowcaseResolveCommentDetails + """ + if not self.is_showcase_resolve_comment_details(): + raise AttributeError("tag 'showcase_resolve_comment_details' not set") + return self._value + + def get_showcase_restored_details(self): + """ + Only call this if :meth:`is_showcase_restored_details` is true. + + :rtype: ShowcaseRestoredDetails + """ + if not self.is_showcase_restored_details(): + raise AttributeError("tag 'showcase_restored_details' not set") + return self._value + + def get_showcase_trashed_details(self): + """ + Only call this if :meth:`is_showcase_trashed_details` is true. + + :rtype: ShowcaseTrashedDetails + """ + if not self.is_showcase_trashed_details(): + raise AttributeError("tag 'showcase_trashed_details' not set") + return self._value + + def get_showcase_trashed_deprecated_details(self): + """ + Only call this if :meth:`is_showcase_trashed_deprecated_details` is true. + + :rtype: ShowcaseTrashedDeprecatedDetails + """ + if not self.is_showcase_trashed_deprecated_details(): + raise AttributeError("tag 'showcase_trashed_deprecated_details' not set") + return self._value + + def get_showcase_unresolve_comment_details(self): + """ + Only call this if :meth:`is_showcase_unresolve_comment_details` is true. + + :rtype: ShowcaseUnresolveCommentDetails + """ + if not self.is_showcase_unresolve_comment_details(): + raise AttributeError("tag 'showcase_unresolve_comment_details' not set") + return self._value + + def get_showcase_untrashed_details(self): + """ + Only call this if :meth:`is_showcase_untrashed_details` is true. + + :rtype: ShowcaseUntrashedDetails + """ + if not self.is_showcase_untrashed_details(): + raise AttributeError("tag 'showcase_untrashed_details' not set") + return self._value + + def get_showcase_untrashed_deprecated_details(self): + """ + Only call this if :meth:`is_showcase_untrashed_deprecated_details` is true. + + :rtype: ShowcaseUntrashedDeprecatedDetails + """ + if not self.is_showcase_untrashed_deprecated_details(): + raise AttributeError("tag 'showcase_untrashed_deprecated_details' not set") + return self._value + + def get_showcase_view_details(self): + """ + Only call this if :meth:`is_showcase_view_details` is true. + + :rtype: ShowcaseViewDetails + """ + if not self.is_showcase_view_details(): + raise AttributeError("tag 'showcase_view_details' not set") + return self._value + + def get_sso_add_cert_details(self): + """ + Only call this if :meth:`is_sso_add_cert_details` is true. + + :rtype: SsoAddCertDetails + """ + if not self.is_sso_add_cert_details(): + raise AttributeError("tag 'sso_add_cert_details' not set") + return self._value + + def get_sso_add_login_url_details(self): + """ + Only call this if :meth:`is_sso_add_login_url_details` is true. + + :rtype: SsoAddLoginUrlDetails + """ + if not self.is_sso_add_login_url_details(): + raise AttributeError("tag 'sso_add_login_url_details' not set") + return self._value + + def get_sso_add_logout_url_details(self): + """ + Only call this if :meth:`is_sso_add_logout_url_details` is true. + + :rtype: SsoAddLogoutUrlDetails + """ + if not self.is_sso_add_logout_url_details(): + raise AttributeError("tag 'sso_add_logout_url_details' not set") + return self._value + + def get_sso_change_cert_details(self): + """ + Only call this if :meth:`is_sso_change_cert_details` is true. + + :rtype: SsoChangeCertDetails + """ + if not self.is_sso_change_cert_details(): + raise AttributeError("tag 'sso_change_cert_details' not set") + return self._value + + def get_sso_change_login_url_details(self): + """ + Only call this if :meth:`is_sso_change_login_url_details` is true. + + :rtype: SsoChangeLoginUrlDetails + """ + if not self.is_sso_change_login_url_details(): + raise AttributeError("tag 'sso_change_login_url_details' not set") + return self._value + + def get_sso_change_logout_url_details(self): + """ + Only call this if :meth:`is_sso_change_logout_url_details` is true. + + :rtype: SsoChangeLogoutUrlDetails + """ + if not self.is_sso_change_logout_url_details(): + raise AttributeError("tag 'sso_change_logout_url_details' not set") + return self._value + + def get_sso_change_saml_identity_mode_details(self): + """ + Only call this if :meth:`is_sso_change_saml_identity_mode_details` is true. + + :rtype: SsoChangeSamlIdentityModeDetails + """ + if not self.is_sso_change_saml_identity_mode_details(): + raise AttributeError("tag 'sso_change_saml_identity_mode_details' not set") + return self._value + + def get_sso_remove_cert_details(self): + """ + Only call this if :meth:`is_sso_remove_cert_details` is true. + + :rtype: SsoRemoveCertDetails + """ + if not self.is_sso_remove_cert_details(): + raise AttributeError("tag 'sso_remove_cert_details' not set") + return self._value + + def get_sso_remove_login_url_details(self): + """ + Only call this if :meth:`is_sso_remove_login_url_details` is true. + + :rtype: SsoRemoveLoginUrlDetails + """ + if not self.is_sso_remove_login_url_details(): + raise AttributeError("tag 'sso_remove_login_url_details' not set") + return self._value + + def get_sso_remove_logout_url_details(self): + """ + Only call this if :meth:`is_sso_remove_logout_url_details` is true. + + :rtype: SsoRemoveLogoutUrlDetails + """ + if not self.is_sso_remove_logout_url_details(): + raise AttributeError("tag 'sso_remove_logout_url_details' not set") + return self._value + + def get_team_folder_change_status_details(self): + """ + Only call this if :meth:`is_team_folder_change_status_details` is true. + + :rtype: TeamFolderChangeStatusDetails + """ + if not self.is_team_folder_change_status_details(): + raise AttributeError("tag 'team_folder_change_status_details' not set") + return self._value + + def get_team_folder_create_details(self): + """ + Only call this if :meth:`is_team_folder_create_details` is true. + + :rtype: TeamFolderCreateDetails + """ + if not self.is_team_folder_create_details(): + raise AttributeError("tag 'team_folder_create_details' not set") + return self._value + + def get_team_folder_downgrade_details(self): + """ + Only call this if :meth:`is_team_folder_downgrade_details` is true. + + :rtype: TeamFolderDowngradeDetails + """ + if not self.is_team_folder_downgrade_details(): + raise AttributeError("tag 'team_folder_downgrade_details' not set") + return self._value + + def get_team_folder_permanently_delete_details(self): + """ + Only call this if :meth:`is_team_folder_permanently_delete_details` is true. + + :rtype: TeamFolderPermanentlyDeleteDetails + """ + if not self.is_team_folder_permanently_delete_details(): + raise AttributeError("tag 'team_folder_permanently_delete_details' not set") + return self._value + + def get_team_folder_rename_details(self): + """ + Only call this if :meth:`is_team_folder_rename_details` is true. + + :rtype: TeamFolderRenameDetails + """ + if not self.is_team_folder_rename_details(): + raise AttributeError("tag 'team_folder_rename_details' not set") + return self._value + + def get_team_selective_sync_settings_changed_details(self): + """ + Only call this if :meth:`is_team_selective_sync_settings_changed_details` is true. + + :rtype: TeamSelectiveSyncSettingsChangedDetails + """ + if not self.is_team_selective_sync_settings_changed_details(): + raise AttributeError("tag 'team_selective_sync_settings_changed_details' not set") + return self._value + + def get_account_capture_change_policy_details(self): + """ + Only call this if :meth:`is_account_capture_change_policy_details` is true. + + :rtype: AccountCaptureChangePolicyDetails + """ + if not self.is_account_capture_change_policy_details(): + raise AttributeError("tag 'account_capture_change_policy_details' not set") + return self._value + + def get_allow_download_disabled_details(self): + """ + Only call this if :meth:`is_allow_download_disabled_details` is true. + + :rtype: AllowDownloadDisabledDetails + """ + if not self.is_allow_download_disabled_details(): + raise AttributeError("tag 'allow_download_disabled_details' not set") + return self._value + + def get_allow_download_enabled_details(self): + """ + Only call this if :meth:`is_allow_download_enabled_details` is true. + + :rtype: AllowDownloadEnabledDetails + """ + if not self.is_allow_download_enabled_details(): + raise AttributeError("tag 'allow_download_enabled_details' not set") + return self._value + + def get_camera_uploads_policy_changed_details(self): + """ + Only call this if :meth:`is_camera_uploads_policy_changed_details` is true. + + :rtype: CameraUploadsPolicyChangedDetails + """ + if not self.is_camera_uploads_policy_changed_details(): + raise AttributeError("tag 'camera_uploads_policy_changed_details' not set") + return self._value + + def get_data_placement_restriction_change_policy_details(self): + """ + Only call this if :meth:`is_data_placement_restriction_change_policy_details` is true. + + :rtype: DataPlacementRestrictionChangePolicyDetails + """ + if not self.is_data_placement_restriction_change_policy_details(): + raise AttributeError("tag 'data_placement_restriction_change_policy_details' not set") + return self._value + + def get_data_placement_restriction_satisfy_policy_details(self): + """ + Only call this if :meth:`is_data_placement_restriction_satisfy_policy_details` is true. + + :rtype: DataPlacementRestrictionSatisfyPolicyDetails + """ + if not self.is_data_placement_restriction_satisfy_policy_details(): + raise AttributeError("tag 'data_placement_restriction_satisfy_policy_details' not set") + return self._value + + def get_device_approvals_change_desktop_policy_details(self): + """ + Only call this if :meth:`is_device_approvals_change_desktop_policy_details` is true. + + :rtype: DeviceApprovalsChangeDesktopPolicyDetails + """ + if not self.is_device_approvals_change_desktop_policy_details(): + raise AttributeError("tag 'device_approvals_change_desktop_policy_details' not set") + return self._value + + def get_device_approvals_change_mobile_policy_details(self): + """ + Only call this if :meth:`is_device_approvals_change_mobile_policy_details` is true. + + :rtype: DeviceApprovalsChangeMobilePolicyDetails + """ + if not self.is_device_approvals_change_mobile_policy_details(): + raise AttributeError("tag 'device_approvals_change_mobile_policy_details' not set") + return self._value + + def get_device_approvals_change_overage_action_details(self): + """ + Only call this if :meth:`is_device_approvals_change_overage_action_details` is true. + + :rtype: DeviceApprovalsChangeOverageActionDetails + """ + if not self.is_device_approvals_change_overage_action_details(): + raise AttributeError("tag 'device_approvals_change_overage_action_details' not set") + return self._value + + def get_device_approvals_change_unlink_action_details(self): + """ + Only call this if :meth:`is_device_approvals_change_unlink_action_details` is true. + + :rtype: DeviceApprovalsChangeUnlinkActionDetails + """ + if not self.is_device_approvals_change_unlink_action_details(): + raise AttributeError("tag 'device_approvals_change_unlink_action_details' not set") + return self._value + + def get_directory_restrictions_add_members_details(self): + """ + Only call this if :meth:`is_directory_restrictions_add_members_details` is true. + + :rtype: DirectoryRestrictionsAddMembersDetails + """ + if not self.is_directory_restrictions_add_members_details(): + raise AttributeError("tag 'directory_restrictions_add_members_details' not set") + return self._value + + def get_directory_restrictions_remove_members_details(self): + """ + Only call this if :meth:`is_directory_restrictions_remove_members_details` is true. + + :rtype: DirectoryRestrictionsRemoveMembersDetails + """ + if not self.is_directory_restrictions_remove_members_details(): + raise AttributeError("tag 'directory_restrictions_remove_members_details' not set") + return self._value + + def get_emm_add_exception_details(self): + """ + Only call this if :meth:`is_emm_add_exception_details` is true. + + :rtype: EmmAddExceptionDetails + """ + if not self.is_emm_add_exception_details(): + raise AttributeError("tag 'emm_add_exception_details' not set") + return self._value + + def get_emm_change_policy_details(self): + """ + Only call this if :meth:`is_emm_change_policy_details` is true. + + :rtype: EmmChangePolicyDetails + """ + if not self.is_emm_change_policy_details(): + raise AttributeError("tag 'emm_change_policy_details' not set") + return self._value + + def get_emm_remove_exception_details(self): + """ + Only call this if :meth:`is_emm_remove_exception_details` is true. + + :rtype: EmmRemoveExceptionDetails + """ + if not self.is_emm_remove_exception_details(): + raise AttributeError("tag 'emm_remove_exception_details' not set") + return self._value + + def get_extended_version_history_change_policy_details(self): + """ + Only call this if :meth:`is_extended_version_history_change_policy_details` is true. + + :rtype: ExtendedVersionHistoryChangePolicyDetails + """ + if not self.is_extended_version_history_change_policy_details(): + raise AttributeError("tag 'extended_version_history_change_policy_details' not set") + return self._value + + def get_file_comments_change_policy_details(self): + """ + Only call this if :meth:`is_file_comments_change_policy_details` is true. + + :rtype: FileCommentsChangePolicyDetails + """ + if not self.is_file_comments_change_policy_details(): + raise AttributeError("tag 'file_comments_change_policy_details' not set") + return self._value + + def get_file_requests_change_policy_details(self): + """ + Only call this if :meth:`is_file_requests_change_policy_details` is true. + + :rtype: FileRequestsChangePolicyDetails + """ + if not self.is_file_requests_change_policy_details(): + raise AttributeError("tag 'file_requests_change_policy_details' not set") + return self._value + + def get_file_requests_emails_enabled_details(self): + """ + Only call this if :meth:`is_file_requests_emails_enabled_details` is true. + + :rtype: FileRequestsEmailsEnabledDetails + """ + if not self.is_file_requests_emails_enabled_details(): + raise AttributeError("tag 'file_requests_emails_enabled_details' not set") + return self._value + + def get_file_requests_emails_restricted_to_team_only_details(self): + """ + Only call this if :meth:`is_file_requests_emails_restricted_to_team_only_details` is true. + + :rtype: FileRequestsEmailsRestrictedToTeamOnlyDetails + """ + if not self.is_file_requests_emails_restricted_to_team_only_details(): + raise AttributeError("tag 'file_requests_emails_restricted_to_team_only_details' not set") + return self._value + + def get_google_sso_change_policy_details(self): + """ + Only call this if :meth:`is_google_sso_change_policy_details` is true. + + :rtype: GoogleSsoChangePolicyDetails + """ + if not self.is_google_sso_change_policy_details(): + raise AttributeError("tag 'google_sso_change_policy_details' not set") + return self._value + + def get_group_user_management_change_policy_details(self): + """ + Only call this if :meth:`is_group_user_management_change_policy_details` is true. + + :rtype: GroupUserManagementChangePolicyDetails + """ + if not self.is_group_user_management_change_policy_details(): + raise AttributeError("tag 'group_user_management_change_policy_details' not set") + return self._value + + def get_member_requests_change_policy_details(self): + """ + Only call this if :meth:`is_member_requests_change_policy_details` is true. + + :rtype: MemberRequestsChangePolicyDetails + """ + if not self.is_member_requests_change_policy_details(): + raise AttributeError("tag 'member_requests_change_policy_details' not set") + return self._value + + def get_member_space_limits_add_exception_details(self): + """ + Only call this if :meth:`is_member_space_limits_add_exception_details` is true. + + :rtype: MemberSpaceLimitsAddExceptionDetails + """ + if not self.is_member_space_limits_add_exception_details(): + raise AttributeError("tag 'member_space_limits_add_exception_details' not set") + return self._value + + def get_member_space_limits_change_caps_type_policy_details(self): + """ + Only call this if :meth:`is_member_space_limits_change_caps_type_policy_details` is true. + + :rtype: MemberSpaceLimitsChangeCapsTypePolicyDetails + """ + if not self.is_member_space_limits_change_caps_type_policy_details(): + raise AttributeError("tag 'member_space_limits_change_caps_type_policy_details' not set") + return self._value + + def get_member_space_limits_change_policy_details(self): + """ + Only call this if :meth:`is_member_space_limits_change_policy_details` is true. + + :rtype: MemberSpaceLimitsChangePolicyDetails + """ + if not self.is_member_space_limits_change_policy_details(): + raise AttributeError("tag 'member_space_limits_change_policy_details' not set") + return self._value + + def get_member_space_limits_remove_exception_details(self): + """ + Only call this if :meth:`is_member_space_limits_remove_exception_details` is true. + + :rtype: MemberSpaceLimitsRemoveExceptionDetails + """ + if not self.is_member_space_limits_remove_exception_details(): + raise AttributeError("tag 'member_space_limits_remove_exception_details' not set") + return self._value + + def get_member_suggestions_change_policy_details(self): + """ + Only call this if :meth:`is_member_suggestions_change_policy_details` is true. + + :rtype: MemberSuggestionsChangePolicyDetails + """ + if not self.is_member_suggestions_change_policy_details(): + raise AttributeError("tag 'member_suggestions_change_policy_details' not set") + return self._value + + def get_microsoft_office_addin_change_policy_details(self): + """ + Only call this if :meth:`is_microsoft_office_addin_change_policy_details` is true. + + :rtype: MicrosoftOfficeAddinChangePolicyDetails + """ + if not self.is_microsoft_office_addin_change_policy_details(): + raise AttributeError("tag 'microsoft_office_addin_change_policy_details' not set") + return self._value + + def get_network_control_change_policy_details(self): + """ + Only call this if :meth:`is_network_control_change_policy_details` is true. + + :rtype: NetworkControlChangePolicyDetails + """ + if not self.is_network_control_change_policy_details(): + raise AttributeError("tag 'network_control_change_policy_details' not set") + return self._value + + def get_paper_change_deployment_policy_details(self): + """ + Only call this if :meth:`is_paper_change_deployment_policy_details` is true. + + :rtype: PaperChangeDeploymentPolicyDetails + """ + if not self.is_paper_change_deployment_policy_details(): + raise AttributeError("tag 'paper_change_deployment_policy_details' not set") + return self._value + + def get_paper_change_member_link_policy_details(self): + """ + Only call this if :meth:`is_paper_change_member_link_policy_details` is true. + + :rtype: PaperChangeMemberLinkPolicyDetails + """ + if not self.is_paper_change_member_link_policy_details(): + raise AttributeError("tag 'paper_change_member_link_policy_details' not set") + return self._value + + def get_paper_change_member_policy_details(self): + """ + Only call this if :meth:`is_paper_change_member_policy_details` is true. + + :rtype: PaperChangeMemberPolicyDetails + """ + if not self.is_paper_change_member_policy_details(): + raise AttributeError("tag 'paper_change_member_policy_details' not set") + return self._value + + def get_paper_change_policy_details(self): + """ + Only call this if :meth:`is_paper_change_policy_details` is true. + + :rtype: PaperChangePolicyDetails + """ + if not self.is_paper_change_policy_details(): + raise AttributeError("tag 'paper_change_policy_details' not set") + return self._value + + def get_paper_enabled_users_group_addition_details(self): + """ + Only call this if :meth:`is_paper_enabled_users_group_addition_details` is true. + + :rtype: PaperEnabledUsersGroupAdditionDetails + """ + if not self.is_paper_enabled_users_group_addition_details(): + raise AttributeError("tag 'paper_enabled_users_group_addition_details' not set") + return self._value + + def get_paper_enabled_users_group_removal_details(self): + """ + Only call this if :meth:`is_paper_enabled_users_group_removal_details` is true. + + :rtype: PaperEnabledUsersGroupRemovalDetails + """ + if not self.is_paper_enabled_users_group_removal_details(): + raise AttributeError("tag 'paper_enabled_users_group_removal_details' not set") + return self._value + + def get_permanent_delete_change_policy_details(self): + """ + Only call this if :meth:`is_permanent_delete_change_policy_details` is true. + + :rtype: PermanentDeleteChangePolicyDetails + """ + if not self.is_permanent_delete_change_policy_details(): + raise AttributeError("tag 'permanent_delete_change_policy_details' not set") + return self._value + + def get_sharing_change_folder_join_policy_details(self): + """ + Only call this if :meth:`is_sharing_change_folder_join_policy_details` is true. + + :rtype: SharingChangeFolderJoinPolicyDetails + """ + if not self.is_sharing_change_folder_join_policy_details(): + raise AttributeError("tag 'sharing_change_folder_join_policy_details' not set") + return self._value + + def get_sharing_change_link_policy_details(self): + """ + Only call this if :meth:`is_sharing_change_link_policy_details` is true. + + :rtype: SharingChangeLinkPolicyDetails + """ + if not self.is_sharing_change_link_policy_details(): + raise AttributeError("tag 'sharing_change_link_policy_details' not set") + return self._value + + def get_sharing_change_member_policy_details(self): + """ + Only call this if :meth:`is_sharing_change_member_policy_details` is true. + + :rtype: SharingChangeMemberPolicyDetails + """ + if not self.is_sharing_change_member_policy_details(): + raise AttributeError("tag 'sharing_change_member_policy_details' not set") + return self._value + + def get_showcase_change_download_policy_details(self): + """ + Only call this if :meth:`is_showcase_change_download_policy_details` is true. + + :rtype: ShowcaseChangeDownloadPolicyDetails + """ + if not self.is_showcase_change_download_policy_details(): + raise AttributeError("tag 'showcase_change_download_policy_details' not set") + return self._value + + def get_showcase_change_enabled_policy_details(self): + """ + Only call this if :meth:`is_showcase_change_enabled_policy_details` is true. + + :rtype: ShowcaseChangeEnabledPolicyDetails + """ + if not self.is_showcase_change_enabled_policy_details(): + raise AttributeError("tag 'showcase_change_enabled_policy_details' not set") + return self._value + + def get_showcase_change_external_sharing_policy_details(self): + """ + Only call this if :meth:`is_showcase_change_external_sharing_policy_details` is true. + + :rtype: ShowcaseChangeExternalSharingPolicyDetails + """ + if not self.is_showcase_change_external_sharing_policy_details(): + raise AttributeError("tag 'showcase_change_external_sharing_policy_details' not set") + return self._value + + def get_smart_sync_change_policy_details(self): + """ + Only call this if :meth:`is_smart_sync_change_policy_details` is true. + + :rtype: SmartSyncChangePolicyDetails + """ + if not self.is_smart_sync_change_policy_details(): + raise AttributeError("tag 'smart_sync_change_policy_details' not set") + return self._value + + def get_smart_sync_not_opt_out_details(self): + """ + Only call this if :meth:`is_smart_sync_not_opt_out_details` is true. + + :rtype: SmartSyncNotOptOutDetails + """ + if not self.is_smart_sync_not_opt_out_details(): + raise AttributeError("tag 'smart_sync_not_opt_out_details' not set") + return self._value + + def get_smart_sync_opt_out_details(self): + """ + Only call this if :meth:`is_smart_sync_opt_out_details` is true. + + :rtype: SmartSyncOptOutDetails + """ + if not self.is_smart_sync_opt_out_details(): + raise AttributeError("tag 'smart_sync_opt_out_details' not set") + return self._value + + def get_sso_change_policy_details(self): + """ + Only call this if :meth:`is_sso_change_policy_details` is true. + + :rtype: SsoChangePolicyDetails + """ + if not self.is_sso_change_policy_details(): + raise AttributeError("tag 'sso_change_policy_details' not set") + return self._value + + def get_team_selective_sync_policy_changed_details(self): + """ + Only call this if :meth:`is_team_selective_sync_policy_changed_details` is true. + + :rtype: TeamSelectiveSyncPolicyChangedDetails + """ + if not self.is_team_selective_sync_policy_changed_details(): + raise AttributeError("tag 'team_selective_sync_policy_changed_details' not set") + return self._value + + def get_tfa_change_policy_details(self): + """ + Only call this if :meth:`is_tfa_change_policy_details` is true. + + :rtype: TfaChangePolicyDetails + """ + if not self.is_tfa_change_policy_details(): + raise AttributeError("tag 'tfa_change_policy_details' not set") + return self._value + + def get_two_account_change_policy_details(self): + """ + Only call this if :meth:`is_two_account_change_policy_details` is true. + + :rtype: TwoAccountChangePolicyDetails + """ + if not self.is_two_account_change_policy_details(): + raise AttributeError("tag 'two_account_change_policy_details' not set") + return self._value + + def get_viewer_info_policy_changed_details(self): + """ + Only call this if :meth:`is_viewer_info_policy_changed_details` is true. + + :rtype: ViewerInfoPolicyChangedDetails + """ + if not self.is_viewer_info_policy_changed_details(): + raise AttributeError("tag 'viewer_info_policy_changed_details' not set") + return self._value + + def get_web_sessions_change_fixed_length_policy_details(self): + """ + Only call this if :meth:`is_web_sessions_change_fixed_length_policy_details` is true. + + :rtype: WebSessionsChangeFixedLengthPolicyDetails + """ + if not self.is_web_sessions_change_fixed_length_policy_details(): + raise AttributeError("tag 'web_sessions_change_fixed_length_policy_details' not set") + return self._value + + def get_web_sessions_change_idle_length_policy_details(self): + """ + Only call this if :meth:`is_web_sessions_change_idle_length_policy_details` is true. + + :rtype: WebSessionsChangeIdleLengthPolicyDetails + """ + if not self.is_web_sessions_change_idle_length_policy_details(): + raise AttributeError("tag 'web_sessions_change_idle_length_policy_details' not set") + return self._value + + def get_team_merge_from_details(self): + """ + Only call this if :meth:`is_team_merge_from_details` is true. + + :rtype: TeamMergeFromDetails + """ + if not self.is_team_merge_from_details(): + raise AttributeError("tag 'team_merge_from_details' not set") + return self._value + + def get_team_merge_to_details(self): + """ + Only call this if :meth:`is_team_merge_to_details` is true. + + :rtype: TeamMergeToDetails + """ + if not self.is_team_merge_to_details(): + raise AttributeError("tag 'team_merge_to_details' not set") + return self._value + + def get_team_profile_add_logo_details(self): + """ + Only call this if :meth:`is_team_profile_add_logo_details` is true. + + :rtype: TeamProfileAddLogoDetails + """ + if not self.is_team_profile_add_logo_details(): + raise AttributeError("tag 'team_profile_add_logo_details' not set") + return self._value + + def get_team_profile_change_default_language_details(self): + """ + Only call this if :meth:`is_team_profile_change_default_language_details` is true. + + :rtype: TeamProfileChangeDefaultLanguageDetails + """ + if not self.is_team_profile_change_default_language_details(): + raise AttributeError("tag 'team_profile_change_default_language_details' not set") + return self._value + + def get_team_profile_change_logo_details(self): + """ + Only call this if :meth:`is_team_profile_change_logo_details` is true. + + :rtype: TeamProfileChangeLogoDetails + """ + if not self.is_team_profile_change_logo_details(): + raise AttributeError("tag 'team_profile_change_logo_details' not set") + return self._value + + def get_team_profile_change_name_details(self): + """ + Only call this if :meth:`is_team_profile_change_name_details` is true. + + :rtype: TeamProfileChangeNameDetails + """ + if not self.is_team_profile_change_name_details(): + raise AttributeError("tag 'team_profile_change_name_details' not set") + return self._value + + def get_team_profile_remove_logo_details(self): + """ + Only call this if :meth:`is_team_profile_remove_logo_details` is true. + + :rtype: TeamProfileRemoveLogoDetails + """ + if not self.is_team_profile_remove_logo_details(): + raise AttributeError("tag 'team_profile_remove_logo_details' not set") + return self._value + + def get_tfa_add_backup_phone_details(self): + """ + Only call this if :meth:`is_tfa_add_backup_phone_details` is true. + + :rtype: TfaAddBackupPhoneDetails + """ + if not self.is_tfa_add_backup_phone_details(): + raise AttributeError("tag 'tfa_add_backup_phone_details' not set") + return self._value + + def get_tfa_add_security_key_details(self): + """ + Only call this if :meth:`is_tfa_add_security_key_details` is true. + + :rtype: TfaAddSecurityKeyDetails + """ + if not self.is_tfa_add_security_key_details(): + raise AttributeError("tag 'tfa_add_security_key_details' not set") + return self._value + + def get_tfa_change_backup_phone_details(self): + """ + Only call this if :meth:`is_tfa_change_backup_phone_details` is true. + + :rtype: TfaChangeBackupPhoneDetails + """ + if not self.is_tfa_change_backup_phone_details(): + raise AttributeError("tag 'tfa_change_backup_phone_details' not set") + return self._value + + def get_tfa_change_status_details(self): + """ + Only call this if :meth:`is_tfa_change_status_details` is true. + + :rtype: TfaChangeStatusDetails + """ + if not self.is_tfa_change_status_details(): + raise AttributeError("tag 'tfa_change_status_details' not set") + return self._value + + def get_tfa_remove_backup_phone_details(self): + """ + Only call this if :meth:`is_tfa_remove_backup_phone_details` is true. + + :rtype: TfaRemoveBackupPhoneDetails + """ + if not self.is_tfa_remove_backup_phone_details(): + raise AttributeError("tag 'tfa_remove_backup_phone_details' not set") + return self._value + + def get_tfa_remove_security_key_details(self): + """ + Only call this if :meth:`is_tfa_remove_security_key_details` is true. + + :rtype: TfaRemoveSecurityKeyDetails + """ + if not self.is_tfa_remove_security_key_details(): + raise AttributeError("tag 'tfa_remove_security_key_details' not set") + return self._value + + def get_tfa_reset_details(self): + """ + Only call this if :meth:`is_tfa_reset_details` is true. + + :rtype: TfaResetDetails + """ + if not self.is_tfa_reset_details(): + raise AttributeError("tag 'tfa_reset_details' not set") + return self._value + + def get_missing_details(self): + """ + Hints that this event was returned with missing details due to an + internal error. + + Only call this if :meth:`is_missing_details` is true. + + :rtype: MissingDetails + """ + if not self.is_missing_details(): + raise AttributeError("tag 'missing_details' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(EventDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EventDetails(%r, %r)' % (self._tag, self._value) + +EventDetails_validator = bv.Union(EventDetails) + +class EventType(bb.Union): + """ + The type of the event. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar AppLinkTeamType app_link_team: (apps) Linked app for team + :ivar AppLinkUserType app_link_user: (apps) Linked app for member + :ivar AppUnlinkTeamType app_unlink_team: (apps) Unlinked app for team + :ivar AppUnlinkUserType app_unlink_user: (apps) Unlinked app for member + :ivar FileAddCommentType file_add_comment: (comments) Added file comment + :ivar FileChangeCommentSubscriptionType file_change_comment_subscription: + (comments) Subscribed to or unsubscribed from comment notifications for + file + :ivar FileDeleteCommentType file_delete_comment: (comments) Deleted file + comment + :ivar FileEditCommentType file_edit_comment: (comments) Edited file comment + :ivar FileLikeCommentType file_like_comment: (comments) Liked file comment + (deprecated, no longer logged) + :ivar FileResolveCommentType file_resolve_comment: (comments) Resolved file + comment + :ivar FileUnlikeCommentType file_unlike_comment: (comments) Unliked file + comment (deprecated, no longer logged) + :ivar FileUnresolveCommentType file_unresolve_comment: (comments) Unresolved + file comment + :ivar DeviceChangeIpDesktopType device_change_ip_desktop: (devices) Changed + IP address associated with active desktop session + :ivar DeviceChangeIpMobileType device_change_ip_mobile: (devices) Changed IP + address associated with active mobile session + :ivar DeviceChangeIpWebType device_change_ip_web: (devices) Changed IP + address associated with active web session + :ivar DeviceDeleteOnUnlinkFailType device_delete_on_unlink_fail: (devices) + Failed to delete all files from unlinked device + :ivar DeviceDeleteOnUnlinkSuccessType device_delete_on_unlink_success: + (devices) Deleted all files from unlinked device + :ivar DeviceLinkFailType device_link_fail: (devices) Failed to link device + :ivar DeviceLinkSuccessType device_link_success: (devices) Linked device + :ivar DeviceManagementDisabledType device_management_disabled: (devices) + Disabled device management (deprecated, no longer logged) + :ivar DeviceManagementEnabledType device_management_enabled: (devices) + Enabled device management (deprecated, no longer logged) + :ivar DeviceUnlinkType device_unlink: (devices) Disconnected device + :ivar EmmRefreshAuthTokenType emm_refresh_auth_token: (devices) Refreshed + auth token used for setting up enterprise mobility management + :ivar AccountCaptureChangeAvailabilityType + account_capture_change_availability: (domains) Granted/revoked option to + enable account capture on team domains + :ivar AccountCaptureMigrateAccountType account_capture_migrate_account: + (domains) Account-captured user migrated account to team + :ivar AccountCaptureNotificationEmailsSentType + account_capture_notification_emails_sent: (domains) Sent proactive + account capture email to all unmanaged members + :ivar AccountCaptureRelinquishAccountType + account_capture_relinquish_account: (domains) Account-captured user + changed account email to personal email + :ivar DisabledDomainInvitesType disabled_domain_invites: (domains) Disabled + domain invites (deprecated, no longer logged) + :ivar DomainInvitesApproveRequestToJoinTeamType + domain_invites_approve_request_to_join_team: (domains) Approved user's + request to join team + :ivar DomainInvitesDeclineRequestToJoinTeamType + domain_invites_decline_request_to_join_team: (domains) Declined user's + request to join team + :ivar DomainInvitesEmailExistingUsersType + domain_invites_email_existing_users: (domains) Sent domain invites to + existing domain accounts (deprecated, no longer logged) + :ivar DomainInvitesRequestToJoinTeamType + domain_invites_request_to_join_team: (domains) Requested to join team + :ivar DomainInvitesSetInviteNewUserPrefToNoType + domain_invites_set_invite_new_user_pref_to_no: (domains) Disabled + "Automatically invite new users" (deprecated, no longer logged) + :ivar DomainInvitesSetInviteNewUserPrefToYesType + domain_invites_set_invite_new_user_pref_to_yes: (domains) Enabled + "Automatically invite new users" (deprecated, no longer logged) + :ivar DomainVerificationAddDomainFailType + domain_verification_add_domain_fail: (domains) Failed to verify team + domain + :ivar DomainVerificationAddDomainSuccessType + domain_verification_add_domain_success: (domains) Verified team domain + :ivar DomainVerificationRemoveDomainType domain_verification_remove_domain: + (domains) Removed domain from list of verified team domains + :ivar EnabledDomainInvitesType enabled_domain_invites: (domains) Enabled + domain invites (deprecated, no longer logged) + :ivar CreateFolderType create_folder: (file_operations) Created folders + (deprecated, no longer logged) + :ivar FileAddType file_add: (file_operations) Added files and/or folders + :ivar FileCopyType file_copy: (file_operations) Copied files and/or folders + :ivar FileDeleteType file_delete: (file_operations) Deleted files and/or + folders + :ivar FileDownloadType file_download: (file_operations) Downloaded files + and/or folders + :ivar FileEditType file_edit: (file_operations) Edited files + :ivar FileGetCopyReferenceType file_get_copy_reference: (file_operations) + Created copy reference to file/folder + :ivar FileMoveType file_move: (file_operations) Moved files and/or folders + :ivar FilePermanentlyDeleteType file_permanently_delete: (file_operations) + Permanently deleted files and/or folders + :ivar FilePreviewType file_preview: (file_operations) Previewed files and/or + folders + :ivar FileRenameType file_rename: (file_operations) Renamed files and/or + folders + :ivar FileRestoreType file_restore: (file_operations) Restored deleted files + and/or folders + :ivar FileRevertType file_revert: (file_operations) Reverted files to + previous version + :ivar FileRollbackChangesType file_rollback_changes: (file_operations) + Rolled back file actions + :ivar FileSaveCopyReferenceType file_save_copy_reference: (file_operations) + Saved file/folder using copy reference + :ivar FileRequestChangeType file_request_change: (file_requests) Changed + file request + :ivar FileRequestCloseType file_request_close: (file_requests) Closed file + request + :ivar FileRequestCreateType file_request_create: (file_requests) Created + file request + :ivar FileRequestReceiveFileType file_request_receive_file: (file_requests) + Received files for file request + :ivar GroupAddExternalIdType group_add_external_id: (groups) Added external + ID for group + :ivar GroupAddMemberType group_add_member: (groups) Added team members to + group + :ivar GroupChangeExternalIdType group_change_external_id: (groups) Changed + external ID for group + :ivar GroupChangeManagementTypeType group_change_management_type: (groups) + Changed group management type + :ivar GroupChangeMemberRoleType group_change_member_role: (groups) Changed + manager permissions of group member + :ivar GroupCreateType group_create: (groups) Created group + :ivar GroupDeleteType group_delete: (groups) Deleted group + :ivar GroupDescriptionUpdatedType group_description_updated: (groups) + Updated group (deprecated, no longer logged) + :ivar GroupJoinPolicyUpdatedType group_join_policy_updated: (groups) Updated + group join policy (deprecated, no longer logged) + :ivar GroupMovedType group_moved: (groups) Moved group (deprecated, no + longer logged) + :ivar GroupRemoveExternalIdType group_remove_external_id: (groups) Removed + external ID for group + :ivar GroupRemoveMemberType group_remove_member: (groups) Removed team + members from group + :ivar GroupRenameType group_rename: (groups) Renamed group + :ivar EmmErrorType emm_error: (logins) Failed to sign in via EMM + (deprecated, replaced by 'Failed to sign in') + :ivar LoginFailType login_fail: (logins) Failed to sign in + :ivar LoginSuccessType login_success: (logins) Signed in + :ivar LogoutType logout: (logins) Signed out + :ivar ResellerSupportSessionEndType reseller_support_session_end: (logins) + Ended reseller support session + :ivar ResellerSupportSessionStartType reseller_support_session_start: + (logins) Started reseller support session + :ivar SignInAsSessionEndType sign_in_as_session_end: (logins) Ended admin + sign-in-as session + :ivar SignInAsSessionStartType sign_in_as_session_start: (logins) Started + admin sign-in-as session + :ivar SsoErrorType sso_error: (logins) Failed to sign in via SSO + (deprecated, replaced by 'Failed to sign in') + :ivar MemberAddNameType member_add_name: (members) Added team member name + :ivar MemberChangeAdminRoleType member_change_admin_role: (members) Changed + team member admin role + :ivar MemberChangeEmailType member_change_email: (members) Changed team + member email + :ivar MemberChangeMembershipTypeType member_change_membership_type: + (members) Changed membership type (limited/full) of member (deprecated, + no longer logged) + :ivar MemberChangeNameType member_change_name: (members) Changed team member + name + :ivar MemberChangeStatusType member_change_status: (members) Changed member + status (invited, joined, suspended, etc.) + :ivar MemberDeleteManualContactsType member_delete_manual_contacts: + (members) Cleared manually added contacts + :ivar MemberPermanentlyDeleteAccountContentsType + member_permanently_delete_account_contents: (members) Permanently + deleted contents of deleted team member account + :ivar MemberSpaceLimitsAddCustomQuotaType + member_space_limits_add_custom_quota: (members) Set custom member space + limit + :ivar MemberSpaceLimitsChangeCustomQuotaType + member_space_limits_change_custom_quota: (members) Changed custom member + space limit + :ivar MemberSpaceLimitsChangeStatusType member_space_limits_change_status: + (members) Changed space limit status + :ivar MemberSpaceLimitsRemoveCustomQuotaType + member_space_limits_remove_custom_quota: (members) Removed custom member + space limit + :ivar MemberSuggestType member_suggest: (members) Suggested person to add to + team + :ivar MemberTransferAccountContentsType member_transfer_account_contents: + (members) Transferred contents of deleted member account to another + member + :ivar SecondaryMailsPolicyChangedType secondary_mails_policy_changed: + (members) Secondary mails policy changed + :ivar PaperContentAddMemberType paper_content_add_member: (paper) Added team + member to Paper doc/folder + :ivar PaperContentAddToFolderType paper_content_add_to_folder: (paper) Added + Paper doc/folder to folder + :ivar PaperContentArchiveType paper_content_archive: (paper) Archived Paper + doc/folder + :ivar PaperContentCreateType paper_content_create: (paper) Created Paper + doc/folder + :ivar PaperContentPermanentlyDeleteType paper_content_permanently_delete: + (paper) Permanently deleted Paper doc/folder + :ivar PaperContentRemoveFromFolderType paper_content_remove_from_folder: + (paper) Removed Paper doc/folder from folder + :ivar PaperContentRemoveMemberType paper_content_remove_member: (paper) + Removed team member from Paper doc/folder + :ivar PaperContentRenameType paper_content_rename: (paper) Renamed Paper + doc/folder + :ivar PaperContentRestoreType paper_content_restore: (paper) Restored + archived Paper doc/folder + :ivar PaperDocAddCommentType paper_doc_add_comment: (paper) Added Paper doc + comment + :ivar PaperDocChangeMemberRoleType paper_doc_change_member_role: (paper) + Changed team member permissions for Paper doc + :ivar PaperDocChangeSharingPolicyType paper_doc_change_sharing_policy: + (paper) Changed sharing setting for Paper doc + :ivar PaperDocChangeSubscriptionType paper_doc_change_subscription: (paper) + Followed/unfollowed Paper doc + :ivar PaperDocDeletedType paper_doc_deleted: (paper) Archived Paper doc + (deprecated, no longer logged) + :ivar PaperDocDeleteCommentType paper_doc_delete_comment: (paper) Deleted + Paper doc comment + :ivar PaperDocDownloadType paper_doc_download: (paper) Downloaded Paper doc + in specific format + :ivar PaperDocEditType paper_doc_edit: (paper) Edited Paper doc + :ivar PaperDocEditCommentType paper_doc_edit_comment: (paper) Edited Paper + doc comment + :ivar PaperDocFollowedType paper_doc_followed: (paper) Followed Paper doc + (deprecated, replaced by 'Followed/unfollowed Paper doc') + :ivar PaperDocMentionType paper_doc_mention: (paper) Mentioned team member + in Paper doc + :ivar PaperDocOwnershipChangedType paper_doc_ownership_changed: (paper) + Transferred ownership of Paper doc + :ivar PaperDocRequestAccessType paper_doc_request_access: (paper) Requested + access to Paper doc + :ivar PaperDocResolveCommentType paper_doc_resolve_comment: (paper) Resolved + Paper doc comment + :ivar PaperDocRevertType paper_doc_revert: (paper) Restored Paper doc to + previous version + :ivar PaperDocSlackShareType paper_doc_slack_share: (paper) Shared Paper doc + via Slack + :ivar PaperDocTeamInviteType paper_doc_team_invite: (paper) Shared Paper doc + with team member (deprecated, no longer logged) + :ivar PaperDocTrashedType paper_doc_trashed: (paper) Deleted Paper doc + :ivar PaperDocUnresolveCommentType paper_doc_unresolve_comment: (paper) + Unresolved Paper doc comment + :ivar PaperDocUntrashedType paper_doc_untrashed: (paper) Restored Paper doc + :ivar PaperDocViewType paper_doc_view: (paper) Viewed Paper doc + :ivar PaperExternalViewAllowType paper_external_view_allow: (paper) Changed + Paper external sharing setting to anyone (deprecated, no longer logged) + :ivar PaperExternalViewDefaultTeamType paper_external_view_default_team: + (paper) Changed Paper external sharing setting to default team + (deprecated, no longer logged) + :ivar PaperExternalViewForbidType paper_external_view_forbid: (paper) + Changed Paper external sharing setting to team-only (deprecated, no + longer logged) + :ivar PaperFolderChangeSubscriptionType paper_folder_change_subscription: + (paper) Followed/unfollowed Paper folder + :ivar PaperFolderDeletedType paper_folder_deleted: (paper) Archived Paper + folder (deprecated, no longer logged) + :ivar PaperFolderFollowedType paper_folder_followed: (paper) Followed Paper + folder (deprecated, replaced by 'Followed/unfollowed Paper folder') + :ivar PaperFolderTeamInviteType paper_folder_team_invite: (paper) Shared + Paper folder with member (deprecated, no longer logged) + :ivar PasswordChangeType password_change: (passwords) Changed password + :ivar PasswordResetType password_reset: (passwords) Reset password + :ivar PasswordResetAllType password_reset_all: (passwords) Reset all team + member passwords + :ivar EmmCreateExceptionsReportType emm_create_exceptions_report: (reports) + Created EMM-excluded users report + :ivar EmmCreateUsageReportType emm_create_usage_report: (reports) Created + EMM mobile app usage report + :ivar ExportMembersReportType export_members_report: (reports) Created + member data report + :ivar PaperAdminExportStartType paper_admin_export_start: (reports) Exported + all team Paper docs + :ivar SmartSyncCreateAdminPrivilegeReportType + smart_sync_create_admin_privilege_report: (reports) Created Smart Sync + non-admin devices report + :ivar TeamActivityCreateReportType team_activity_create_report: (reports) + Created team activity report + :ivar CollectionShareType collection_share: (sharing) Shared album + :ivar NoteAclInviteOnlyType note_acl_invite_only: (sharing) Changed Paper + doc to invite-only (deprecated, no longer logged) + :ivar NoteAclLinkType note_acl_link: (sharing) Changed Paper doc to + link-accessible (deprecated, no longer logged) + :ivar NoteAclTeamLinkType note_acl_team_link: (sharing) Changed Paper doc to + link-accessible for team (deprecated, no longer logged) + :ivar NoteSharedType note_shared: (sharing) Shared Paper doc (deprecated, no + longer logged) + :ivar NoteShareReceiveType note_share_receive: (sharing) Shared received + Paper doc (deprecated, no longer logged) + :ivar OpenNoteSharedType open_note_shared: (sharing) Opened shared Paper doc + (deprecated, no longer logged) + :ivar SfAddGroupType sf_add_group: (sharing) Added team to shared folder + (deprecated, no longer logged) + :ivar SfAllowNonMembersToViewSharedLinksType + sf_allow_non_members_to_view_shared_links: (sharing) Allowed + non-collaborators to view links to files in shared folder (deprecated, + no longer logged) + :ivar SfExternalInviteWarnType sf_external_invite_warn: (sharing) Set team + members to see warning before sharing folders outside team (deprecated, + no longer logged) + :ivar SfFbInviteType sf_fb_invite: (sharing) Invited Facebook users to + shared folder (deprecated, no longer logged) + :ivar SfFbInviteChangeRoleType sf_fb_invite_change_role: (sharing) Changed + Facebook user's role in shared folder (deprecated, no longer logged) + :ivar SfFbUninviteType sf_fb_uninvite: (sharing) Uninvited Facebook user + from shared folder (deprecated, no longer logged) + :ivar SfInviteGroupType sf_invite_group: (sharing) Invited group to shared + folder (deprecated, no longer logged) + :ivar SfTeamGrantAccessType sf_team_grant_access: (sharing) Granted access + to shared folder (deprecated, no longer logged) + :ivar SfTeamInviteType sf_team_invite: (sharing) Invited team members to + shared folder (deprecated, replaced by 'Invited user to Dropbox and + added them to shared file/folder') + :ivar SfTeamInviteChangeRoleType sf_team_invite_change_role: (sharing) + Changed team member's role in shared folder (deprecated, no longer + logged) + :ivar SfTeamJoinType sf_team_join: (sharing) Joined team member's shared + folder (deprecated, no longer logged) + :ivar SfTeamJoinFromOobLinkType sf_team_join_from_oob_link: (sharing) Joined + team member's shared folder from link (deprecated, no longer logged) + :ivar SfTeamUninviteType sf_team_uninvite: (sharing) Unshared folder with + team member (deprecated, replaced by 'Removed invitee from shared + file/folder before invite was accepted') + :ivar SharedContentAddInviteesType shared_content_add_invitees: (sharing) + Invited user to Dropbox and added them to shared file/folder + :ivar SharedContentAddLinkExpiryType shared_content_add_link_expiry: + (sharing) Added expiration date to link for shared file/folder + :ivar SharedContentAddLinkPasswordType shared_content_add_link_password: + (sharing) Added password to link for shared file/folder + :ivar SharedContentAddMemberType shared_content_add_member: (sharing) Added + users and/or groups to shared file/folder + :ivar SharedContentChangeDownloadsPolicyType + shared_content_change_downloads_policy: (sharing) Changed whether + members can download shared file/folder + :ivar SharedContentChangeInviteeRoleType shared_content_change_invitee_role: + (sharing) Changed access type of invitee to shared file/folder before + invite was accepted + :ivar SharedContentChangeLinkAudienceType + shared_content_change_link_audience: (sharing) Changed link audience of + shared file/folder + :ivar SharedContentChangeLinkExpiryType shared_content_change_link_expiry: + (sharing) Changed link expiration of shared file/folder + :ivar SharedContentChangeLinkPasswordType + shared_content_change_link_password: (sharing) Changed link password of + shared file/folder + :ivar SharedContentChangeMemberRoleType shared_content_change_member_role: + (sharing) Changed access type of shared file/folder member + :ivar SharedContentChangeViewerInfoPolicyType + shared_content_change_viewer_info_policy: (sharing) Changed whether + members can see who viewed shared file/folder + :ivar SharedContentClaimInvitationType shared_content_claim_invitation: + (sharing) Acquired membership of shared file/folder by accepting invite + :ivar SharedContentCopyType shared_content_copy: (sharing) Copied shared + file/folder to own Dropbox + :ivar SharedContentDownloadType shared_content_download: (sharing) + Downloaded shared file/folder + :ivar SharedContentRelinquishMembershipType + shared_content_relinquish_membership: (sharing) Left shared file/folder + :ivar SharedContentRemoveInviteesType shared_content_remove_invitees: + (sharing) Removed invitee from shared file/folder before invite was + accepted + :ivar SharedContentRemoveLinkExpiryType shared_content_remove_link_expiry: + (sharing) Removed link expiration date of shared file/folder + :ivar SharedContentRemoveLinkPasswordType + shared_content_remove_link_password: (sharing) Removed link password of + shared file/folder + :ivar SharedContentRemoveMemberType shared_content_remove_member: (sharing) + Removed user/group from shared file/folder + :ivar SharedContentRequestAccessType shared_content_request_access: + (sharing) Requested access to shared file/folder + :ivar SharedContentUnshareType shared_content_unshare: (sharing) Unshared + file/folder by clearing membership and turning off link + :ivar SharedContentViewType shared_content_view: (sharing) Previewed shared + file/folder + :ivar SharedFolderChangeLinkPolicyType shared_folder_change_link_policy: + (sharing) Changed who can access shared folder via link + :ivar SharedFolderChangeMembersInheritancePolicyType + shared_folder_change_members_inheritance_policy: (sharing) Changed + whether shared folder inherits members from parent folder + :ivar SharedFolderChangeMembersManagementPolicyType + shared_folder_change_members_management_policy: (sharing) Changed who + can add/remove members of shared folder + :ivar SharedFolderChangeMembersPolicyType + shared_folder_change_members_policy: (sharing) Changed who can become + member of shared folder + :ivar SharedFolderCreateType shared_folder_create: (sharing) Created shared + folder + :ivar SharedFolderDeclineInvitationType shared_folder_decline_invitation: + (sharing) Declined team member's invite to shared folder + :ivar SharedFolderMountType shared_folder_mount: (sharing) Added shared + folder to own Dropbox + :ivar SharedFolderNestType shared_folder_nest: (sharing) Changed parent of + shared folder + :ivar SharedFolderTransferOwnershipType shared_folder_transfer_ownership: + (sharing) Transferred ownership of shared folder to another member + :ivar SharedFolderUnmountType shared_folder_unmount: (sharing) Deleted + shared folder from Dropbox + :ivar SharedLinkAddExpiryType shared_link_add_expiry: (sharing) Added shared + link expiration date + :ivar SharedLinkChangeExpiryType shared_link_change_expiry: (sharing) + Changed shared link expiration date + :ivar SharedLinkChangeVisibilityType shared_link_change_visibility: + (sharing) Changed visibility of shared link + :ivar SharedLinkCopyType shared_link_copy: (sharing) Added file/folder to + Dropbox from shared link + :ivar SharedLinkCreateType shared_link_create: (sharing) Created shared link + :ivar SharedLinkDisableType shared_link_disable: (sharing) Removed shared + link + :ivar SharedLinkDownloadType shared_link_download: (sharing) Downloaded + file/folder from shared link + :ivar SharedLinkRemoveExpiryType shared_link_remove_expiry: (sharing) + Removed shared link expiration date + :ivar SharedLinkShareType shared_link_share: (sharing) Added members as + audience of shared link + :ivar SharedLinkViewType shared_link_view: (sharing) Opened shared link + :ivar SharedNoteOpenedType shared_note_opened: (sharing) Opened shared Paper + doc (deprecated, no longer logged) + :ivar ShmodelGroupShareType shmodel_group_share: (sharing) Shared link with + group (deprecated, no longer logged) + :ivar ShowcaseAccessGrantedType showcase_access_granted: (showcase) Granted + access to showcase + :ivar ShowcaseAddMemberType showcase_add_member: (showcase) Added member to + showcase + :ivar ShowcaseArchivedType showcase_archived: (showcase) Archived showcase + :ivar ShowcaseCreatedType showcase_created: (showcase) Created showcase + :ivar ShowcaseDeleteCommentType showcase_delete_comment: (showcase) Deleted + showcase comment + :ivar ShowcaseEditedType showcase_edited: (showcase) Edited showcase + :ivar ShowcaseEditCommentType showcase_edit_comment: (showcase) Edited + showcase comment + :ivar ShowcaseFileAddedType showcase_file_added: (showcase) Added file to + showcase + :ivar ShowcaseFileDownloadType showcase_file_download: (showcase) Downloaded + file from showcase + :ivar ShowcaseFileRemovedType showcase_file_removed: (showcase) Removed file + from showcase + :ivar ShowcaseFileViewType showcase_file_view: (showcase) Viewed file in + showcase + :ivar ShowcasePermanentlyDeletedType showcase_permanently_deleted: + (showcase) Permanently deleted showcase + :ivar ShowcasePostCommentType showcase_post_comment: (showcase) Added + showcase comment + :ivar ShowcaseRemoveMemberType showcase_remove_member: (showcase) Removed + member from showcase + :ivar ShowcaseRenamedType showcase_renamed: (showcase) Renamed showcase + :ivar ShowcaseRequestAccessType showcase_request_access: (showcase) + Requested access to showcase + :ivar ShowcaseResolveCommentType showcase_resolve_comment: (showcase) + Resolved showcase comment + :ivar ShowcaseRestoredType showcase_restored: (showcase) Unarchived showcase + :ivar ShowcaseTrashedType showcase_trashed: (showcase) Deleted showcase + :ivar ShowcaseTrashedDeprecatedType showcase_trashed_deprecated: (showcase) + Deleted showcase (old version) (deprecated, replaced by 'Deleted + showcase') + :ivar ShowcaseUnresolveCommentType showcase_unresolve_comment: (showcase) + Unresolved showcase comment + :ivar ShowcaseUntrashedType showcase_untrashed: (showcase) Restored showcase + :ivar ShowcaseUntrashedDeprecatedType showcase_untrashed_deprecated: + (showcase) Restored showcase (old version) (deprecated, replaced by + 'Restored showcase') + :ivar ShowcaseViewType showcase_view: (showcase) Viewed showcase + :ivar SsoAddCertType sso_add_cert: (sso) Added X.509 certificate for SSO + :ivar SsoAddLoginUrlType sso_add_login_url: (sso) Added sign-in URL for SSO + :ivar SsoAddLogoutUrlType sso_add_logout_url: (sso) Added sign-out URL for + SSO + :ivar SsoChangeCertType sso_change_cert: (sso) Changed X.509 certificate for + SSO + :ivar SsoChangeLoginUrlType sso_change_login_url: (sso) Changed sign-in URL + for SSO + :ivar SsoChangeLogoutUrlType sso_change_logout_url: (sso) Changed sign-out + URL for SSO + :ivar SsoChangeSamlIdentityModeType sso_change_saml_identity_mode: (sso) + Changed SAML identity mode for SSO + :ivar SsoRemoveCertType sso_remove_cert: (sso) Removed X.509 certificate for + SSO + :ivar SsoRemoveLoginUrlType sso_remove_login_url: (sso) Removed sign-in URL + for SSO + :ivar SsoRemoveLogoutUrlType sso_remove_logout_url: (sso) Removed sign-out + URL for SSO + :ivar TeamFolderChangeStatusType team_folder_change_status: (team_folders) + Changed archival status of team folder + :ivar TeamFolderCreateType team_folder_create: (team_folders) Created team + folder in active status + :ivar TeamFolderDowngradeType team_folder_downgrade: (team_folders) + Downgraded team folder to regular shared folder + :ivar TeamFolderPermanentlyDeleteType team_folder_permanently_delete: + (team_folders) Permanently deleted archived team folder + :ivar TeamFolderRenameType team_folder_rename: (team_folders) Renamed + active/archived team folder + :ivar TeamSelectiveSyncSettingsChangedType + team_selective_sync_settings_changed: (team_folders) Changed sync + default + :ivar AccountCaptureChangePolicyType account_capture_change_policy: + (team_policies) Changed account capture setting on team domain + :ivar AllowDownloadDisabledType allow_download_disabled: (team_policies) + Disabled downloads (deprecated, no longer logged) + :ivar AllowDownloadEnabledType allow_download_enabled: (team_policies) + Enabled downloads (deprecated, no longer logged) + :ivar CameraUploadsPolicyChangedType camera_uploads_policy_changed: + (team_policies) Changed camera uploads setting for team + :ivar DataPlacementRestrictionChangePolicyType + data_placement_restriction_change_policy: (team_policies) Set + restrictions on data center locations where team data resides + :ivar DataPlacementRestrictionSatisfyPolicyType + data_placement_restriction_satisfy_policy: (team_policies) Completed + restrictions on data center locations where team data resides + :ivar DeviceApprovalsChangeDesktopPolicyType + device_approvals_change_desktop_policy: (team_policies) Set/removed + limit on number of computers member can link to team Dropbox account + :ivar DeviceApprovalsChangeMobilePolicyType + device_approvals_change_mobile_policy: (team_policies) Set/removed limit + on number of mobile devices member can link to team Dropbox account + :ivar DeviceApprovalsChangeOverageActionType + device_approvals_change_overage_action: (team_policies) Changed device + approvals setting when member is over limit + :ivar DeviceApprovalsChangeUnlinkActionType + device_approvals_change_unlink_action: (team_policies) Changed device + approvals setting when member unlinks approved device + :ivar DirectoryRestrictionsAddMembersType + directory_restrictions_add_members: (team_policies) Added members to + directory restrictions list + :ivar DirectoryRestrictionsRemoveMembersType + directory_restrictions_remove_members: (team_policies) Removed members + from directory restrictions list + :ivar EmmAddExceptionType emm_add_exception: (team_policies) Added members + to EMM exception list + :ivar EmmChangePolicyType emm_change_policy: (team_policies) + Enabled/disabled enterprise mobility management for members + :ivar EmmRemoveExceptionType emm_remove_exception: (team_policies) Removed + members from EMM exception list + :ivar ExtendedVersionHistoryChangePolicyType + extended_version_history_change_policy: (team_policies) Accepted/opted + out of extended version history + :ivar FileCommentsChangePolicyType file_comments_change_policy: + (team_policies) Enabled/disabled commenting on team files + :ivar FileRequestsChangePolicyType file_requests_change_policy: + (team_policies) Enabled/disabled file requests + :ivar FileRequestsEmailsEnabledType file_requests_emails_enabled: + (team_policies) Enabled file request emails for everyone (deprecated, no + longer logged) + :ivar FileRequestsEmailsRestrictedToTeamOnlyType + file_requests_emails_restricted_to_team_only: (team_policies) Enabled + file request emails for team (deprecated, no longer logged) + :ivar GoogleSsoChangePolicyType google_sso_change_policy: (team_policies) + Enabled/disabled Google single sign-on for team + :ivar GroupUserManagementChangePolicyType + group_user_management_change_policy: (team_policies) Changed who can + create groups + :ivar MemberRequestsChangePolicyType member_requests_change_policy: + (team_policies) Changed whether users can find team when not invited + :ivar MemberSpaceLimitsAddExceptionType member_space_limits_add_exception: + (team_policies) Added members to member space limit exception list + :ivar MemberSpaceLimitsChangeCapsTypePolicyType + member_space_limits_change_caps_type_policy: (team_policies) Changed + member space limit type for team + :ivar MemberSpaceLimitsChangePolicyType member_space_limits_change_policy: + (team_policies) Changed team default member space limit + :ivar MemberSpaceLimitsRemoveExceptionType + member_space_limits_remove_exception: (team_policies) Removed members + from member space limit exception list + :ivar MemberSuggestionsChangePolicyType member_suggestions_change_policy: + (team_policies) Enabled/disabled option for team members to suggest + people to add to team + :ivar MicrosoftOfficeAddinChangePolicyType + microsoft_office_addin_change_policy: (team_policies) Enabled/disabled + Microsoft Office add-in + :ivar NetworkControlChangePolicyType network_control_change_policy: + (team_policies) Enabled/disabled network control + :ivar PaperChangeDeploymentPolicyType paper_change_deployment_policy: + (team_policies) Changed whether Dropbox Paper, when enabled, is deployed + to all members or to specific members + :ivar PaperChangeMemberLinkPolicyType paper_change_member_link_policy: + (team_policies) Changed whether non-members can view Paper docs with + link (deprecated, no longer logged) + :ivar PaperChangeMemberPolicyType paper_change_member_policy: + (team_policies) Changed whether members can share Paper docs outside + team, and if docs are accessible only by team members or anyone by + default + :ivar PaperChangePolicyType paper_change_policy: (team_policies) + Enabled/disabled Dropbox Paper for team + :ivar PaperEnabledUsersGroupAdditionType paper_enabled_users_group_addition: + (team_policies) Added users to Paper-enabled users list + :ivar PaperEnabledUsersGroupRemovalType paper_enabled_users_group_removal: + (team_policies) Removed users from Paper-enabled users list + :ivar PermanentDeleteChangePolicyType permanent_delete_change_policy: + (team_policies) Enabled/disabled ability of team members to permanently + delete content + :ivar SharingChangeFolderJoinPolicyType sharing_change_folder_join_policy: + (team_policies) Changed whether team members can join shared folders + owned outside team + :ivar SharingChangeLinkPolicyType sharing_change_link_policy: + (team_policies) Changed whether members can share links outside team, + and if links are accessible only by team members or anyone by default + :ivar SharingChangeMemberPolicyType sharing_change_member_policy: + (team_policies) Changed whether members can share files/folders outside + team + :ivar ShowcaseChangeDownloadPolicyType showcase_change_download_policy: + (team_policies) Enabled/disabled downloading files from Dropbox Showcase + for team + :ivar ShowcaseChangeEnabledPolicyType showcase_change_enabled_policy: + (team_policies) Enabled/disabled Dropbox Showcase for team + :ivar ShowcaseChangeExternalSharingPolicyType + showcase_change_external_sharing_policy: (team_policies) + Enabled/disabled sharing Dropbox Showcase externally for team + :ivar SmartSyncChangePolicyType smart_sync_change_policy: (team_policies) + Changed default Smart Sync setting for team members + :ivar SmartSyncNotOptOutType smart_sync_not_opt_out: (team_policies) Opted + team into Smart Sync + :ivar SmartSyncOptOutType smart_sync_opt_out: (team_policies) Opted team out + of Smart Sync + :ivar SsoChangePolicyType sso_change_policy: (team_policies) Changed single + sign-on setting for team + :ivar TeamSelectiveSyncPolicyChangedType team_selective_sync_policy_changed: + (team_policies) Enabled/disabled Team Selective Sync for team + :ivar TfaChangePolicyType tfa_change_policy: (team_policies) Changed + two-step verification setting for team + :ivar TwoAccountChangePolicyType two_account_change_policy: (team_policies) + Enabled/disabled option for members to link personal Dropbox account and + team account to same computer + :ivar ViewerInfoPolicyChangedType viewer_info_policy_changed: + (team_policies) Changed team policy for viewer info + :ivar WebSessionsChangeFixedLengthPolicyType + web_sessions_change_fixed_length_policy: (team_policies) Changed how + long members can stay signed in to Dropbox.com + :ivar WebSessionsChangeIdleLengthPolicyType + web_sessions_change_idle_length_policy: (team_policies) Changed how long + team members can be idle while signed in to Dropbox.com + :ivar TeamMergeFromType team_merge_from: (team_profile) Merged another team + into this team + :ivar TeamMergeToType team_merge_to: (team_profile) Merged this team into + another team + :ivar TeamProfileAddLogoType team_profile_add_logo: (team_profile) Added + team logo to display on shared link headers + :ivar TeamProfileChangeDefaultLanguageType + team_profile_change_default_language: (team_profile) Changed default + language for team + :ivar TeamProfileChangeLogoType team_profile_change_logo: (team_profile) + Changed team logo displayed on shared link headers + :ivar TeamProfileChangeNameType team_profile_change_name: (team_profile) + Changed team name + :ivar TeamProfileRemoveLogoType team_profile_remove_logo: (team_profile) + Removed team logo displayed on shared link headers + :ivar TfaAddBackupPhoneType tfa_add_backup_phone: (tfa) Added backup phone + for two-step verification + :ivar TfaAddSecurityKeyType tfa_add_security_key: (tfa) Added security key + for two-step verification + :ivar TfaChangeBackupPhoneType tfa_change_backup_phone: (tfa) Changed backup + phone for two-step verification + :ivar TfaChangeStatusType tfa_change_status: (tfa) Enabled/disabled/changed + two-step verification setting + :ivar TfaRemoveBackupPhoneType tfa_remove_backup_phone: (tfa) Removed backup + phone for two-step verification + :ivar TfaRemoveSecurityKeyType tfa_remove_security_key: (tfa) Removed + security key for two-step verification + :ivar TfaResetType tfa_reset: (tfa) Reset two-step verification for team + member + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def app_link_team(cls, val): + """ + Create an instance of this class set to the ``app_link_team`` tag with + value ``val``. + + :param AppLinkTeamType val: + :rtype: EventType + """ + return cls('app_link_team', val) + + @classmethod + def app_link_user(cls, val): + """ + Create an instance of this class set to the ``app_link_user`` tag with + value ``val``. + + :param AppLinkUserType val: + :rtype: EventType + """ + return cls('app_link_user', val) + + @classmethod + def app_unlink_team(cls, val): + """ + Create an instance of this class set to the ``app_unlink_team`` tag with + value ``val``. + + :param AppUnlinkTeamType val: + :rtype: EventType + """ + return cls('app_unlink_team', val) + + @classmethod + def app_unlink_user(cls, val): + """ + Create an instance of this class set to the ``app_unlink_user`` tag with + value ``val``. + + :param AppUnlinkUserType val: + :rtype: EventType + """ + return cls('app_unlink_user', val) + + @classmethod + def file_add_comment(cls, val): + """ + Create an instance of this class set to the ``file_add_comment`` tag + with value ``val``. + + :param FileAddCommentType val: + :rtype: EventType + """ + return cls('file_add_comment', val) + + @classmethod + def file_change_comment_subscription(cls, val): + """ + Create an instance of this class set to the + ``file_change_comment_subscription`` tag with value ``val``. + + :param FileChangeCommentSubscriptionType val: + :rtype: EventType + """ + return cls('file_change_comment_subscription', val) + + @classmethod + def file_delete_comment(cls, val): + """ + Create an instance of this class set to the ``file_delete_comment`` tag + with value ``val``. + + :param FileDeleteCommentType val: + :rtype: EventType + """ + return cls('file_delete_comment', val) + + @classmethod + def file_edit_comment(cls, val): + """ + Create an instance of this class set to the ``file_edit_comment`` tag + with value ``val``. + + :param FileEditCommentType val: + :rtype: EventType + """ + return cls('file_edit_comment', val) + + @classmethod + def file_like_comment(cls, val): + """ + Create an instance of this class set to the ``file_like_comment`` tag + with value ``val``. + + :param FileLikeCommentType val: + :rtype: EventType + """ + return cls('file_like_comment', val) + + @classmethod + def file_resolve_comment(cls, val): + """ + Create an instance of this class set to the ``file_resolve_comment`` tag + with value ``val``. + + :param FileResolveCommentType val: + :rtype: EventType + """ + return cls('file_resolve_comment', val) + + @classmethod + def file_unlike_comment(cls, val): + """ + Create an instance of this class set to the ``file_unlike_comment`` tag + with value ``val``. + + :param FileUnlikeCommentType val: + :rtype: EventType + """ + return cls('file_unlike_comment', val) + + @classmethod + def file_unresolve_comment(cls, val): + """ + Create an instance of this class set to the ``file_unresolve_comment`` + tag with value ``val``. + + :param FileUnresolveCommentType val: + :rtype: EventType + """ + return cls('file_unresolve_comment', val) + + @classmethod + def device_change_ip_desktop(cls, val): + """ + Create an instance of this class set to the ``device_change_ip_desktop`` + tag with value ``val``. + + :param DeviceChangeIpDesktopType val: + :rtype: EventType + """ + return cls('device_change_ip_desktop', val) + + @classmethod + def device_change_ip_mobile(cls, val): + """ + Create an instance of this class set to the ``device_change_ip_mobile`` + tag with value ``val``. + + :param DeviceChangeIpMobileType val: + :rtype: EventType + """ + return cls('device_change_ip_mobile', val) + + @classmethod + def device_change_ip_web(cls, val): + """ + Create an instance of this class set to the ``device_change_ip_web`` tag + with value ``val``. + + :param DeviceChangeIpWebType val: + :rtype: EventType + """ + return cls('device_change_ip_web', val) + + @classmethod + def device_delete_on_unlink_fail(cls, val): + """ + Create an instance of this class set to the + ``device_delete_on_unlink_fail`` tag with value ``val``. + + :param DeviceDeleteOnUnlinkFailType val: + :rtype: EventType + """ + return cls('device_delete_on_unlink_fail', val) + + @classmethod + def device_delete_on_unlink_success(cls, val): + """ + Create an instance of this class set to the + ``device_delete_on_unlink_success`` tag with value ``val``. + + :param DeviceDeleteOnUnlinkSuccessType val: + :rtype: EventType + """ + return cls('device_delete_on_unlink_success', val) + + @classmethod + def device_link_fail(cls, val): + """ + Create an instance of this class set to the ``device_link_fail`` tag + with value ``val``. + + :param DeviceLinkFailType val: + :rtype: EventType + """ + return cls('device_link_fail', val) + + @classmethod + def device_link_success(cls, val): + """ + Create an instance of this class set to the ``device_link_success`` tag + with value ``val``. + + :param DeviceLinkSuccessType val: + :rtype: EventType + """ + return cls('device_link_success', val) + + @classmethod + def device_management_disabled(cls, val): + """ + Create an instance of this class set to the + ``device_management_disabled`` tag with value ``val``. + + :param DeviceManagementDisabledType val: + :rtype: EventType + """ + return cls('device_management_disabled', val) + + @classmethod + def device_management_enabled(cls, val): + """ + Create an instance of this class set to the + ``device_management_enabled`` tag with value ``val``. + + :param DeviceManagementEnabledType val: + :rtype: EventType + """ + return cls('device_management_enabled', val) + + @classmethod + def device_unlink(cls, val): + """ + Create an instance of this class set to the ``device_unlink`` tag with + value ``val``. + + :param DeviceUnlinkType val: + :rtype: EventType + """ + return cls('device_unlink', val) + + @classmethod + def emm_refresh_auth_token(cls, val): + """ + Create an instance of this class set to the ``emm_refresh_auth_token`` + tag with value ``val``. + + :param EmmRefreshAuthTokenType val: + :rtype: EventType + """ + return cls('emm_refresh_auth_token', val) + + @classmethod + def account_capture_change_availability(cls, val): + """ + Create an instance of this class set to the + ``account_capture_change_availability`` tag with value ``val``. + + :param AccountCaptureChangeAvailabilityType val: + :rtype: EventType + """ + return cls('account_capture_change_availability', val) + + @classmethod + def account_capture_migrate_account(cls, val): + """ + Create an instance of this class set to the + ``account_capture_migrate_account`` tag with value ``val``. + + :param AccountCaptureMigrateAccountType val: + :rtype: EventType + """ + return cls('account_capture_migrate_account', val) + + @classmethod + def account_capture_notification_emails_sent(cls, val): + """ + Create an instance of this class set to the + ``account_capture_notification_emails_sent`` tag with value ``val``. + + :param AccountCaptureNotificationEmailsSentType val: + :rtype: EventType + """ + return cls('account_capture_notification_emails_sent', val) + + @classmethod + def account_capture_relinquish_account(cls, val): + """ + Create an instance of this class set to the + ``account_capture_relinquish_account`` tag with value ``val``. + + :param AccountCaptureRelinquishAccountType val: + :rtype: EventType + """ + return cls('account_capture_relinquish_account', val) + + @classmethod + def disabled_domain_invites(cls, val): + """ + Create an instance of this class set to the ``disabled_domain_invites`` + tag with value ``val``. + + :param DisabledDomainInvitesType val: + :rtype: EventType + """ + return cls('disabled_domain_invites', val) + + @classmethod + def domain_invites_approve_request_to_join_team(cls, val): + """ + Create an instance of this class set to the + ``domain_invites_approve_request_to_join_team`` tag with value ``val``. + + :param DomainInvitesApproveRequestToJoinTeamType val: + :rtype: EventType + """ + return cls('domain_invites_approve_request_to_join_team', val) + + @classmethod + def domain_invites_decline_request_to_join_team(cls, val): + """ + Create an instance of this class set to the + ``domain_invites_decline_request_to_join_team`` tag with value ``val``. + + :param DomainInvitesDeclineRequestToJoinTeamType val: + :rtype: EventType + """ + return cls('domain_invites_decline_request_to_join_team', val) + + @classmethod + def domain_invites_email_existing_users(cls, val): + """ + Create an instance of this class set to the + ``domain_invites_email_existing_users`` tag with value ``val``. + + :param DomainInvitesEmailExistingUsersType val: + :rtype: EventType + """ + return cls('domain_invites_email_existing_users', val) + + @classmethod + def domain_invites_request_to_join_team(cls, val): + """ + Create an instance of this class set to the + ``domain_invites_request_to_join_team`` tag with value ``val``. + + :param DomainInvitesRequestToJoinTeamType val: + :rtype: EventType + """ + return cls('domain_invites_request_to_join_team', val) + + @classmethod + def domain_invites_set_invite_new_user_pref_to_no(cls, val): + """ + Create an instance of this class set to the + ``domain_invites_set_invite_new_user_pref_to_no`` tag with value + ``val``. + + :param DomainInvitesSetInviteNewUserPrefToNoType val: + :rtype: EventType + """ + return cls('domain_invites_set_invite_new_user_pref_to_no', val) + + @classmethod + def domain_invites_set_invite_new_user_pref_to_yes(cls, val): + """ + Create an instance of this class set to the + ``domain_invites_set_invite_new_user_pref_to_yes`` tag with value + ``val``. + + :param DomainInvitesSetInviteNewUserPrefToYesType val: + :rtype: EventType + """ + return cls('domain_invites_set_invite_new_user_pref_to_yes', val) + + @classmethod + def domain_verification_add_domain_fail(cls, val): + """ + Create an instance of this class set to the + ``domain_verification_add_domain_fail`` tag with value ``val``. + + :param DomainVerificationAddDomainFailType val: + :rtype: EventType + """ + return cls('domain_verification_add_domain_fail', val) + + @classmethod + def domain_verification_add_domain_success(cls, val): + """ + Create an instance of this class set to the + ``domain_verification_add_domain_success`` tag with value ``val``. + + :param DomainVerificationAddDomainSuccessType val: + :rtype: EventType + """ + return cls('domain_verification_add_domain_success', val) + + @classmethod + def domain_verification_remove_domain(cls, val): + """ + Create an instance of this class set to the + ``domain_verification_remove_domain`` tag with value ``val``. + + :param DomainVerificationRemoveDomainType val: + :rtype: EventType + """ + return cls('domain_verification_remove_domain', val) + + @classmethod + def enabled_domain_invites(cls, val): + """ + Create an instance of this class set to the ``enabled_domain_invites`` + tag with value ``val``. + + :param EnabledDomainInvitesType val: + :rtype: EventType + """ + return cls('enabled_domain_invites', val) + + @classmethod + def create_folder(cls, val): + """ + Create an instance of this class set to the ``create_folder`` tag with + value ``val``. + + :param CreateFolderType val: + :rtype: EventType + """ + return cls('create_folder', val) + + @classmethod + def file_add(cls, val): + """ + Create an instance of this class set to the ``file_add`` tag with value + ``val``. + + :param FileAddType val: + :rtype: EventType + """ + return cls('file_add', val) + + @classmethod + def file_copy(cls, val): + """ + Create an instance of this class set to the ``file_copy`` tag with value + ``val``. + + :param FileCopyType val: + :rtype: EventType + """ + return cls('file_copy', val) + + @classmethod + def file_delete(cls, val): + """ + Create an instance of this class set to the ``file_delete`` tag with + value ``val``. + + :param FileDeleteType val: + :rtype: EventType + """ + return cls('file_delete', val) + + @classmethod + def file_download(cls, val): + """ + Create an instance of this class set to the ``file_download`` tag with + value ``val``. + + :param FileDownloadType val: + :rtype: EventType + """ + return cls('file_download', val) + + @classmethod + def file_edit(cls, val): + """ + Create an instance of this class set to the ``file_edit`` tag with value + ``val``. + + :param FileEditType val: + :rtype: EventType + """ + return cls('file_edit', val) + + @classmethod + def file_get_copy_reference(cls, val): + """ + Create an instance of this class set to the ``file_get_copy_reference`` + tag with value ``val``. + + :param FileGetCopyReferenceType val: + :rtype: EventType + """ + return cls('file_get_copy_reference', val) + + @classmethod + def file_move(cls, val): + """ + Create an instance of this class set to the ``file_move`` tag with value + ``val``. + + :param FileMoveType val: + :rtype: EventType + """ + return cls('file_move', val) + + @classmethod + def file_permanently_delete(cls, val): + """ + Create an instance of this class set to the ``file_permanently_delete`` + tag with value ``val``. + + :param FilePermanentlyDeleteType val: + :rtype: EventType + """ + return cls('file_permanently_delete', val) + + @classmethod + def file_preview(cls, val): + """ + Create an instance of this class set to the ``file_preview`` tag with + value ``val``. + + :param FilePreviewType val: + :rtype: EventType + """ + return cls('file_preview', val) + + @classmethod + def file_rename(cls, val): + """ + Create an instance of this class set to the ``file_rename`` tag with + value ``val``. + + :param FileRenameType val: + :rtype: EventType + """ + return cls('file_rename', val) + + @classmethod + def file_restore(cls, val): + """ + Create an instance of this class set to the ``file_restore`` tag with + value ``val``. + + :param FileRestoreType val: + :rtype: EventType + """ + return cls('file_restore', val) + + @classmethod + def file_revert(cls, val): + """ + Create an instance of this class set to the ``file_revert`` tag with + value ``val``. + + :param FileRevertType val: + :rtype: EventType + """ + return cls('file_revert', val) + + @classmethod + def file_rollback_changes(cls, val): + """ + Create an instance of this class set to the ``file_rollback_changes`` + tag with value ``val``. + + :param FileRollbackChangesType val: + :rtype: EventType + """ + return cls('file_rollback_changes', val) + + @classmethod + def file_save_copy_reference(cls, val): + """ + Create an instance of this class set to the ``file_save_copy_reference`` + tag with value ``val``. + + :param FileSaveCopyReferenceType val: + :rtype: EventType + """ + return cls('file_save_copy_reference', val) + + @classmethod + def file_request_change(cls, val): + """ + Create an instance of this class set to the ``file_request_change`` tag + with value ``val``. + + :param FileRequestChangeType val: + :rtype: EventType + """ + return cls('file_request_change', val) + + @classmethod + def file_request_close(cls, val): + """ + Create an instance of this class set to the ``file_request_close`` tag + with value ``val``. + + :param FileRequestCloseType val: + :rtype: EventType + """ + return cls('file_request_close', val) + + @classmethod + def file_request_create(cls, val): + """ + Create an instance of this class set to the ``file_request_create`` tag + with value ``val``. + + :param FileRequestCreateType val: + :rtype: EventType + """ + return cls('file_request_create', val) + + @classmethod + def file_request_receive_file(cls, val): + """ + Create an instance of this class set to the + ``file_request_receive_file`` tag with value ``val``. + + :param FileRequestReceiveFileType val: + :rtype: EventType + """ + return cls('file_request_receive_file', val) + + @classmethod + def group_add_external_id(cls, val): + """ + Create an instance of this class set to the ``group_add_external_id`` + tag with value ``val``. + + :param GroupAddExternalIdType val: + :rtype: EventType + """ + return cls('group_add_external_id', val) + + @classmethod + def group_add_member(cls, val): + """ + Create an instance of this class set to the ``group_add_member`` tag + with value ``val``. + + :param GroupAddMemberType val: + :rtype: EventType + """ + return cls('group_add_member', val) + + @classmethod + def group_change_external_id(cls, val): + """ + Create an instance of this class set to the ``group_change_external_id`` + tag with value ``val``. + + :param GroupChangeExternalIdType val: + :rtype: EventType + """ + return cls('group_change_external_id', val) + + @classmethod + def group_change_management_type(cls, val): + """ + Create an instance of this class set to the + ``group_change_management_type`` tag with value ``val``. + + :param GroupChangeManagementTypeType val: + :rtype: EventType + """ + return cls('group_change_management_type', val) + + @classmethod + def group_change_member_role(cls, val): + """ + Create an instance of this class set to the ``group_change_member_role`` + tag with value ``val``. + + :param GroupChangeMemberRoleType val: + :rtype: EventType + """ + return cls('group_change_member_role', val) + + @classmethod + def group_create(cls, val): + """ + Create an instance of this class set to the ``group_create`` tag with + value ``val``. + + :param GroupCreateType val: + :rtype: EventType + """ + return cls('group_create', val) + + @classmethod + def group_delete(cls, val): + """ + Create an instance of this class set to the ``group_delete`` tag with + value ``val``. + + :param GroupDeleteType val: + :rtype: EventType + """ + return cls('group_delete', val) + + @classmethod + def group_description_updated(cls, val): + """ + Create an instance of this class set to the + ``group_description_updated`` tag with value ``val``. + + :param GroupDescriptionUpdatedType val: + :rtype: EventType + """ + return cls('group_description_updated', val) + + @classmethod + def group_join_policy_updated(cls, val): + """ + Create an instance of this class set to the + ``group_join_policy_updated`` tag with value ``val``. + + :param GroupJoinPolicyUpdatedType val: + :rtype: EventType + """ + return cls('group_join_policy_updated', val) + + @classmethod + def group_moved(cls, val): + """ + Create an instance of this class set to the ``group_moved`` tag with + value ``val``. + + :param GroupMovedType val: + :rtype: EventType + """ + return cls('group_moved', val) + + @classmethod + def group_remove_external_id(cls, val): + """ + Create an instance of this class set to the ``group_remove_external_id`` + tag with value ``val``. + + :param GroupRemoveExternalIdType val: + :rtype: EventType + """ + return cls('group_remove_external_id', val) + + @classmethod + def group_remove_member(cls, val): + """ + Create an instance of this class set to the ``group_remove_member`` tag + with value ``val``. + + :param GroupRemoveMemberType val: + :rtype: EventType + """ + return cls('group_remove_member', val) + + @classmethod + def group_rename(cls, val): + """ + Create an instance of this class set to the ``group_rename`` tag with + value ``val``. + + :param GroupRenameType val: + :rtype: EventType + """ + return cls('group_rename', val) + + @classmethod + def emm_error(cls, val): + """ + Create an instance of this class set to the ``emm_error`` tag with value + ``val``. + + :param EmmErrorType val: + :rtype: EventType + """ + return cls('emm_error', val) + + @classmethod + def login_fail(cls, val): + """ + Create an instance of this class set to the ``login_fail`` tag with + value ``val``. + + :param LoginFailType val: + :rtype: EventType + """ + return cls('login_fail', val) + + @classmethod + def login_success(cls, val): + """ + Create an instance of this class set to the ``login_success`` tag with + value ``val``. + + :param LoginSuccessType val: + :rtype: EventType + """ + return cls('login_success', val) + + @classmethod + def logout(cls, val): + """ + Create an instance of this class set to the ``logout`` tag with value + ``val``. + + :param LogoutType val: + :rtype: EventType + """ + return cls('logout', val) + + @classmethod + def reseller_support_session_end(cls, val): + """ + Create an instance of this class set to the + ``reseller_support_session_end`` tag with value ``val``. + + :param ResellerSupportSessionEndType val: + :rtype: EventType + """ + return cls('reseller_support_session_end', val) + + @classmethod + def reseller_support_session_start(cls, val): + """ + Create an instance of this class set to the + ``reseller_support_session_start`` tag with value ``val``. + + :param ResellerSupportSessionStartType val: + :rtype: EventType + """ + return cls('reseller_support_session_start', val) + + @classmethod + def sign_in_as_session_end(cls, val): + """ + Create an instance of this class set to the ``sign_in_as_session_end`` + tag with value ``val``. + + :param SignInAsSessionEndType val: + :rtype: EventType + """ + return cls('sign_in_as_session_end', val) + + @classmethod + def sign_in_as_session_start(cls, val): + """ + Create an instance of this class set to the ``sign_in_as_session_start`` + tag with value ``val``. + + :param SignInAsSessionStartType val: + :rtype: EventType + """ + return cls('sign_in_as_session_start', val) + + @classmethod + def sso_error(cls, val): + """ + Create an instance of this class set to the ``sso_error`` tag with value + ``val``. + + :param SsoErrorType val: + :rtype: EventType + """ + return cls('sso_error', val) + + @classmethod + def member_add_name(cls, val): + """ + Create an instance of this class set to the ``member_add_name`` tag with + value ``val``. + + :param MemberAddNameType val: + :rtype: EventType + """ + return cls('member_add_name', val) + + @classmethod + def member_change_admin_role(cls, val): + """ + Create an instance of this class set to the ``member_change_admin_role`` + tag with value ``val``. + + :param MemberChangeAdminRoleType val: + :rtype: EventType + """ + return cls('member_change_admin_role', val) + + @classmethod + def member_change_email(cls, val): + """ + Create an instance of this class set to the ``member_change_email`` tag + with value ``val``. + + :param MemberChangeEmailType val: + :rtype: EventType + """ + return cls('member_change_email', val) + + @classmethod + def member_change_membership_type(cls, val): + """ + Create an instance of this class set to the + ``member_change_membership_type`` tag with value ``val``. + + :param MemberChangeMembershipTypeType val: + :rtype: EventType + """ + return cls('member_change_membership_type', val) + + @classmethod + def member_change_name(cls, val): + """ + Create an instance of this class set to the ``member_change_name`` tag + with value ``val``. + + :param MemberChangeNameType val: + :rtype: EventType + """ + return cls('member_change_name', val) + + @classmethod + def member_change_status(cls, val): + """ + Create an instance of this class set to the ``member_change_status`` tag + with value ``val``. + + :param MemberChangeStatusType val: + :rtype: EventType + """ + return cls('member_change_status', val) + + @classmethod + def member_delete_manual_contacts(cls, val): + """ + Create an instance of this class set to the + ``member_delete_manual_contacts`` tag with value ``val``. + + :param MemberDeleteManualContactsType val: + :rtype: EventType + """ + return cls('member_delete_manual_contacts', val) + + @classmethod + def member_permanently_delete_account_contents(cls, val): + """ + Create an instance of this class set to the + ``member_permanently_delete_account_contents`` tag with value ``val``. + + :param MemberPermanentlyDeleteAccountContentsType val: + :rtype: EventType + """ + return cls('member_permanently_delete_account_contents', val) + + @classmethod + def member_space_limits_add_custom_quota(cls, val): + """ + Create an instance of this class set to the + ``member_space_limits_add_custom_quota`` tag with value ``val``. + + :param MemberSpaceLimitsAddCustomQuotaType val: + :rtype: EventType + """ + return cls('member_space_limits_add_custom_quota', val) + + @classmethod + def member_space_limits_change_custom_quota(cls, val): + """ + Create an instance of this class set to the + ``member_space_limits_change_custom_quota`` tag with value ``val``. + + :param MemberSpaceLimitsChangeCustomQuotaType val: + :rtype: EventType + """ + return cls('member_space_limits_change_custom_quota', val) + + @classmethod + def member_space_limits_change_status(cls, val): + """ + Create an instance of this class set to the + ``member_space_limits_change_status`` tag with value ``val``. + + :param MemberSpaceLimitsChangeStatusType val: + :rtype: EventType + """ + return cls('member_space_limits_change_status', val) + + @classmethod + def member_space_limits_remove_custom_quota(cls, val): + """ + Create an instance of this class set to the + ``member_space_limits_remove_custom_quota`` tag with value ``val``. + + :param MemberSpaceLimitsRemoveCustomQuotaType val: + :rtype: EventType + """ + return cls('member_space_limits_remove_custom_quota', val) + + @classmethod + def member_suggest(cls, val): + """ + Create an instance of this class set to the ``member_suggest`` tag with + value ``val``. + + :param MemberSuggestType val: + :rtype: EventType + """ + return cls('member_suggest', val) + + @classmethod + def member_transfer_account_contents(cls, val): + """ + Create an instance of this class set to the + ``member_transfer_account_contents`` tag with value ``val``. + + :param MemberTransferAccountContentsType val: + :rtype: EventType + """ + return cls('member_transfer_account_contents', val) + + @classmethod + def secondary_mails_policy_changed(cls, val): + """ + Create an instance of this class set to the + ``secondary_mails_policy_changed`` tag with value ``val``. + + :param SecondaryMailsPolicyChangedType val: + :rtype: EventType + """ + return cls('secondary_mails_policy_changed', val) + + @classmethod + def paper_content_add_member(cls, val): + """ + Create an instance of this class set to the ``paper_content_add_member`` + tag with value ``val``. + + :param PaperContentAddMemberType val: + :rtype: EventType + """ + return cls('paper_content_add_member', val) + + @classmethod + def paper_content_add_to_folder(cls, val): + """ + Create an instance of this class set to the + ``paper_content_add_to_folder`` tag with value ``val``. + + :param PaperContentAddToFolderType val: + :rtype: EventType + """ + return cls('paper_content_add_to_folder', val) + + @classmethod + def paper_content_archive(cls, val): + """ + Create an instance of this class set to the ``paper_content_archive`` + tag with value ``val``. + + :param PaperContentArchiveType val: + :rtype: EventType + """ + return cls('paper_content_archive', val) + + @classmethod + def paper_content_create(cls, val): + """ + Create an instance of this class set to the ``paper_content_create`` tag + with value ``val``. + + :param PaperContentCreateType val: + :rtype: EventType + """ + return cls('paper_content_create', val) + + @classmethod + def paper_content_permanently_delete(cls, val): + """ + Create an instance of this class set to the + ``paper_content_permanently_delete`` tag with value ``val``. + + :param PaperContentPermanentlyDeleteType val: + :rtype: EventType + """ + return cls('paper_content_permanently_delete', val) + + @classmethod + def paper_content_remove_from_folder(cls, val): + """ + Create an instance of this class set to the + ``paper_content_remove_from_folder`` tag with value ``val``. + + :param PaperContentRemoveFromFolderType val: + :rtype: EventType + """ + return cls('paper_content_remove_from_folder', val) + + @classmethod + def paper_content_remove_member(cls, val): + """ + Create an instance of this class set to the + ``paper_content_remove_member`` tag with value ``val``. + + :param PaperContentRemoveMemberType val: + :rtype: EventType + """ + return cls('paper_content_remove_member', val) + + @classmethod + def paper_content_rename(cls, val): + """ + Create an instance of this class set to the ``paper_content_rename`` tag + with value ``val``. + + :param PaperContentRenameType val: + :rtype: EventType + """ + return cls('paper_content_rename', val) + + @classmethod + def paper_content_restore(cls, val): + """ + Create an instance of this class set to the ``paper_content_restore`` + tag with value ``val``. + + :param PaperContentRestoreType val: + :rtype: EventType + """ + return cls('paper_content_restore', val) + + @classmethod + def paper_doc_add_comment(cls, val): + """ + Create an instance of this class set to the ``paper_doc_add_comment`` + tag with value ``val``. + + :param PaperDocAddCommentType val: + :rtype: EventType + """ + return cls('paper_doc_add_comment', val) + + @classmethod + def paper_doc_change_member_role(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_change_member_role`` tag with value ``val``. + + :param PaperDocChangeMemberRoleType val: + :rtype: EventType + """ + return cls('paper_doc_change_member_role', val) + + @classmethod + def paper_doc_change_sharing_policy(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_change_sharing_policy`` tag with value ``val``. + + :param PaperDocChangeSharingPolicyType val: + :rtype: EventType + """ + return cls('paper_doc_change_sharing_policy', val) + + @classmethod + def paper_doc_change_subscription(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_change_subscription`` tag with value ``val``. + + :param PaperDocChangeSubscriptionType val: + :rtype: EventType + """ + return cls('paper_doc_change_subscription', val) + + @classmethod + def paper_doc_deleted(cls, val): + """ + Create an instance of this class set to the ``paper_doc_deleted`` tag + with value ``val``. + + :param PaperDocDeletedType val: + :rtype: EventType + """ + return cls('paper_doc_deleted', val) + + @classmethod + def paper_doc_delete_comment(cls, val): + """ + Create an instance of this class set to the ``paper_doc_delete_comment`` + tag with value ``val``. + + :param PaperDocDeleteCommentType val: + :rtype: EventType + """ + return cls('paper_doc_delete_comment', val) + + @classmethod + def paper_doc_download(cls, val): + """ + Create an instance of this class set to the ``paper_doc_download`` tag + with value ``val``. + + :param PaperDocDownloadType val: + :rtype: EventType + """ + return cls('paper_doc_download', val) + + @classmethod + def paper_doc_edit(cls, val): + """ + Create an instance of this class set to the ``paper_doc_edit`` tag with + value ``val``. + + :param PaperDocEditType val: + :rtype: EventType + """ + return cls('paper_doc_edit', val) + + @classmethod + def paper_doc_edit_comment(cls, val): + """ + Create an instance of this class set to the ``paper_doc_edit_comment`` + tag with value ``val``. + + :param PaperDocEditCommentType val: + :rtype: EventType + """ + return cls('paper_doc_edit_comment', val) + + @classmethod + def paper_doc_followed(cls, val): + """ + Create an instance of this class set to the ``paper_doc_followed`` tag + with value ``val``. + + :param PaperDocFollowedType val: + :rtype: EventType + """ + return cls('paper_doc_followed', val) + + @classmethod + def paper_doc_mention(cls, val): + """ + Create an instance of this class set to the ``paper_doc_mention`` tag + with value ``val``. + + :param PaperDocMentionType val: + :rtype: EventType + """ + return cls('paper_doc_mention', val) + + @classmethod + def paper_doc_ownership_changed(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_ownership_changed`` tag with value ``val``. + + :param PaperDocOwnershipChangedType val: + :rtype: EventType + """ + return cls('paper_doc_ownership_changed', val) + + @classmethod + def paper_doc_request_access(cls, val): + """ + Create an instance of this class set to the ``paper_doc_request_access`` + tag with value ``val``. + + :param PaperDocRequestAccessType val: + :rtype: EventType + """ + return cls('paper_doc_request_access', val) + + @classmethod + def paper_doc_resolve_comment(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_resolve_comment`` tag with value ``val``. + + :param PaperDocResolveCommentType val: + :rtype: EventType + """ + return cls('paper_doc_resolve_comment', val) + + @classmethod + def paper_doc_revert(cls, val): + """ + Create an instance of this class set to the ``paper_doc_revert`` tag + with value ``val``. + + :param PaperDocRevertType val: + :rtype: EventType + """ + return cls('paper_doc_revert', val) + + @classmethod + def paper_doc_slack_share(cls, val): + """ + Create an instance of this class set to the ``paper_doc_slack_share`` + tag with value ``val``. + + :param PaperDocSlackShareType val: + :rtype: EventType + """ + return cls('paper_doc_slack_share', val) + + @classmethod + def paper_doc_team_invite(cls, val): + """ + Create an instance of this class set to the ``paper_doc_team_invite`` + tag with value ``val``. + + :param PaperDocTeamInviteType val: + :rtype: EventType + """ + return cls('paper_doc_team_invite', val) + + @classmethod + def paper_doc_trashed(cls, val): + """ + Create an instance of this class set to the ``paper_doc_trashed`` tag + with value ``val``. + + :param PaperDocTrashedType val: + :rtype: EventType + """ + return cls('paper_doc_trashed', val) + + @classmethod + def paper_doc_unresolve_comment(cls, val): + """ + Create an instance of this class set to the + ``paper_doc_unresolve_comment`` tag with value ``val``. + + :param PaperDocUnresolveCommentType val: + :rtype: EventType + """ + return cls('paper_doc_unresolve_comment', val) + + @classmethod + def paper_doc_untrashed(cls, val): + """ + Create an instance of this class set to the ``paper_doc_untrashed`` tag + with value ``val``. + + :param PaperDocUntrashedType val: + :rtype: EventType + """ + return cls('paper_doc_untrashed', val) + + @classmethod + def paper_doc_view(cls, val): + """ + Create an instance of this class set to the ``paper_doc_view`` tag with + value ``val``. + + :param PaperDocViewType val: + :rtype: EventType + """ + return cls('paper_doc_view', val) + + @classmethod + def paper_external_view_allow(cls, val): + """ + Create an instance of this class set to the + ``paper_external_view_allow`` tag with value ``val``. + + :param PaperExternalViewAllowType val: + :rtype: EventType + """ + return cls('paper_external_view_allow', val) + + @classmethod + def paper_external_view_default_team(cls, val): + """ + Create an instance of this class set to the + ``paper_external_view_default_team`` tag with value ``val``. + + :param PaperExternalViewDefaultTeamType val: + :rtype: EventType + """ + return cls('paper_external_view_default_team', val) + + @classmethod + def paper_external_view_forbid(cls, val): + """ + Create an instance of this class set to the + ``paper_external_view_forbid`` tag with value ``val``. + + :param PaperExternalViewForbidType val: + :rtype: EventType + """ + return cls('paper_external_view_forbid', val) + + @classmethod + def paper_folder_change_subscription(cls, val): + """ + Create an instance of this class set to the + ``paper_folder_change_subscription`` tag with value ``val``. + + :param PaperFolderChangeSubscriptionType val: + :rtype: EventType + """ + return cls('paper_folder_change_subscription', val) + + @classmethod + def paper_folder_deleted(cls, val): + """ + Create an instance of this class set to the ``paper_folder_deleted`` tag + with value ``val``. + + :param PaperFolderDeletedType val: + :rtype: EventType + """ + return cls('paper_folder_deleted', val) + + @classmethod + def paper_folder_followed(cls, val): + """ + Create an instance of this class set to the ``paper_folder_followed`` + tag with value ``val``. + + :param PaperFolderFollowedType val: + :rtype: EventType + """ + return cls('paper_folder_followed', val) + + @classmethod + def paper_folder_team_invite(cls, val): + """ + Create an instance of this class set to the ``paper_folder_team_invite`` + tag with value ``val``. + + :param PaperFolderTeamInviteType val: + :rtype: EventType + """ + return cls('paper_folder_team_invite', val) + + @classmethod + def password_change(cls, val): + """ + Create an instance of this class set to the ``password_change`` tag with + value ``val``. + + :param PasswordChangeType val: + :rtype: EventType + """ + return cls('password_change', val) + + @classmethod + def password_reset(cls, val): + """ + Create an instance of this class set to the ``password_reset`` tag with + value ``val``. + + :param PasswordResetType val: + :rtype: EventType + """ + return cls('password_reset', val) + + @classmethod + def password_reset_all(cls, val): + """ + Create an instance of this class set to the ``password_reset_all`` tag + with value ``val``. + + :param PasswordResetAllType val: + :rtype: EventType + """ + return cls('password_reset_all', val) + + @classmethod + def emm_create_exceptions_report(cls, val): + """ + Create an instance of this class set to the + ``emm_create_exceptions_report`` tag with value ``val``. + + :param EmmCreateExceptionsReportType val: + :rtype: EventType + """ + return cls('emm_create_exceptions_report', val) + + @classmethod + def emm_create_usage_report(cls, val): + """ + Create an instance of this class set to the ``emm_create_usage_report`` + tag with value ``val``. + + :param EmmCreateUsageReportType val: + :rtype: EventType + """ + return cls('emm_create_usage_report', val) + + @classmethod + def export_members_report(cls, val): + """ + Create an instance of this class set to the ``export_members_report`` + tag with value ``val``. + + :param ExportMembersReportType val: + :rtype: EventType + """ + return cls('export_members_report', val) + + @classmethod + def paper_admin_export_start(cls, val): + """ + Create an instance of this class set to the ``paper_admin_export_start`` + tag with value ``val``. + + :param PaperAdminExportStartType val: + :rtype: EventType + """ + return cls('paper_admin_export_start', val) + + @classmethod + def smart_sync_create_admin_privilege_report(cls, val): + """ + Create an instance of this class set to the + ``smart_sync_create_admin_privilege_report`` tag with value ``val``. + + :param SmartSyncCreateAdminPrivilegeReportType val: + :rtype: EventType + """ + return cls('smart_sync_create_admin_privilege_report', val) + + @classmethod + def team_activity_create_report(cls, val): + """ + Create an instance of this class set to the + ``team_activity_create_report`` tag with value ``val``. + + :param TeamActivityCreateReportType val: + :rtype: EventType + """ + return cls('team_activity_create_report', val) + + @classmethod + def collection_share(cls, val): + """ + Create an instance of this class set to the ``collection_share`` tag + with value ``val``. + + :param CollectionShareType val: + :rtype: EventType + """ + return cls('collection_share', val) + + @classmethod + def note_acl_invite_only(cls, val): + """ + Create an instance of this class set to the ``note_acl_invite_only`` tag + with value ``val``. + + :param NoteAclInviteOnlyType val: + :rtype: EventType + """ + return cls('note_acl_invite_only', val) + + @classmethod + def note_acl_link(cls, val): + """ + Create an instance of this class set to the ``note_acl_link`` tag with + value ``val``. + + :param NoteAclLinkType val: + :rtype: EventType + """ + return cls('note_acl_link', val) + + @classmethod + def note_acl_team_link(cls, val): + """ + Create an instance of this class set to the ``note_acl_team_link`` tag + with value ``val``. + + :param NoteAclTeamLinkType val: + :rtype: EventType + """ + return cls('note_acl_team_link', val) + + @classmethod + def note_shared(cls, val): + """ + Create an instance of this class set to the ``note_shared`` tag with + value ``val``. + + :param NoteSharedType val: + :rtype: EventType + """ + return cls('note_shared', val) + + @classmethod + def note_share_receive(cls, val): + """ + Create an instance of this class set to the ``note_share_receive`` tag + with value ``val``. + + :param NoteShareReceiveType val: + :rtype: EventType + """ + return cls('note_share_receive', val) + + @classmethod + def open_note_shared(cls, val): + """ + Create an instance of this class set to the ``open_note_shared`` tag + with value ``val``. + + :param OpenNoteSharedType val: + :rtype: EventType + """ + return cls('open_note_shared', val) + + @classmethod + def sf_add_group(cls, val): + """ + Create an instance of this class set to the ``sf_add_group`` tag with + value ``val``. + + :param SfAddGroupType val: + :rtype: EventType + """ + return cls('sf_add_group', val) + + @classmethod + def sf_allow_non_members_to_view_shared_links(cls, val): + """ + Create an instance of this class set to the + ``sf_allow_non_members_to_view_shared_links`` tag with value ``val``. + + :param SfAllowNonMembersToViewSharedLinksType val: + :rtype: EventType + """ + return cls('sf_allow_non_members_to_view_shared_links', val) + + @classmethod + def sf_external_invite_warn(cls, val): + """ + Create an instance of this class set to the ``sf_external_invite_warn`` + tag with value ``val``. + + :param SfExternalInviteWarnType val: + :rtype: EventType + """ + return cls('sf_external_invite_warn', val) + + @classmethod + def sf_fb_invite(cls, val): + """ + Create an instance of this class set to the ``sf_fb_invite`` tag with + value ``val``. + + :param SfFbInviteType val: + :rtype: EventType + """ + return cls('sf_fb_invite', val) + + @classmethod + def sf_fb_invite_change_role(cls, val): + """ + Create an instance of this class set to the ``sf_fb_invite_change_role`` + tag with value ``val``. + + :param SfFbInviteChangeRoleType val: + :rtype: EventType + """ + return cls('sf_fb_invite_change_role', val) + + @classmethod + def sf_fb_uninvite(cls, val): + """ + Create an instance of this class set to the ``sf_fb_uninvite`` tag with + value ``val``. + + :param SfFbUninviteType val: + :rtype: EventType + """ + return cls('sf_fb_uninvite', val) + + @classmethod + def sf_invite_group(cls, val): + """ + Create an instance of this class set to the ``sf_invite_group`` tag with + value ``val``. + + :param SfInviteGroupType val: + :rtype: EventType + """ + return cls('sf_invite_group', val) + + @classmethod + def sf_team_grant_access(cls, val): + """ + Create an instance of this class set to the ``sf_team_grant_access`` tag + with value ``val``. + + :param SfTeamGrantAccessType val: + :rtype: EventType + """ + return cls('sf_team_grant_access', val) + + @classmethod + def sf_team_invite(cls, val): + """ + Create an instance of this class set to the ``sf_team_invite`` tag with + value ``val``. + + :param SfTeamInviteType val: + :rtype: EventType + """ + return cls('sf_team_invite', val) + + @classmethod + def sf_team_invite_change_role(cls, val): + """ + Create an instance of this class set to the + ``sf_team_invite_change_role`` tag with value ``val``. + + :param SfTeamInviteChangeRoleType val: + :rtype: EventType + """ + return cls('sf_team_invite_change_role', val) + + @classmethod + def sf_team_join(cls, val): + """ + Create an instance of this class set to the ``sf_team_join`` tag with + value ``val``. + + :param SfTeamJoinType val: + :rtype: EventType + """ + return cls('sf_team_join', val) + + @classmethod + def sf_team_join_from_oob_link(cls, val): + """ + Create an instance of this class set to the + ``sf_team_join_from_oob_link`` tag with value ``val``. + + :param SfTeamJoinFromOobLinkType val: + :rtype: EventType + """ + return cls('sf_team_join_from_oob_link', val) + + @classmethod + def sf_team_uninvite(cls, val): + """ + Create an instance of this class set to the ``sf_team_uninvite`` tag + with value ``val``. + + :param SfTeamUninviteType val: + :rtype: EventType + """ + return cls('sf_team_uninvite', val) + + @classmethod + def shared_content_add_invitees(cls, val): + """ + Create an instance of this class set to the + ``shared_content_add_invitees`` tag with value ``val``. + + :param SharedContentAddInviteesType val: + :rtype: EventType + """ + return cls('shared_content_add_invitees', val) + + @classmethod + def shared_content_add_link_expiry(cls, val): + """ + Create an instance of this class set to the + ``shared_content_add_link_expiry`` tag with value ``val``. + + :param SharedContentAddLinkExpiryType val: + :rtype: EventType + """ + return cls('shared_content_add_link_expiry', val) + + @classmethod + def shared_content_add_link_password(cls, val): + """ + Create an instance of this class set to the + ``shared_content_add_link_password`` tag with value ``val``. + + :param SharedContentAddLinkPasswordType val: + :rtype: EventType + """ + return cls('shared_content_add_link_password', val) + + @classmethod + def shared_content_add_member(cls, val): + """ + Create an instance of this class set to the + ``shared_content_add_member`` tag with value ``val``. + + :param SharedContentAddMemberType val: + :rtype: EventType + """ + return cls('shared_content_add_member', val) + + @classmethod + def shared_content_change_downloads_policy(cls, val): + """ + Create an instance of this class set to the + ``shared_content_change_downloads_policy`` tag with value ``val``. + + :param SharedContentChangeDownloadsPolicyType val: + :rtype: EventType + """ + return cls('shared_content_change_downloads_policy', val) + + @classmethod + def shared_content_change_invitee_role(cls, val): + """ + Create an instance of this class set to the + ``shared_content_change_invitee_role`` tag with value ``val``. + + :param SharedContentChangeInviteeRoleType val: + :rtype: EventType + """ + return cls('shared_content_change_invitee_role', val) + + @classmethod + def shared_content_change_link_audience(cls, val): + """ + Create an instance of this class set to the + ``shared_content_change_link_audience`` tag with value ``val``. + + :param SharedContentChangeLinkAudienceType val: + :rtype: EventType + """ + return cls('shared_content_change_link_audience', val) + + @classmethod + def shared_content_change_link_expiry(cls, val): + """ + Create an instance of this class set to the + ``shared_content_change_link_expiry`` tag with value ``val``. + + :param SharedContentChangeLinkExpiryType val: + :rtype: EventType + """ + return cls('shared_content_change_link_expiry', val) + + @classmethod + def shared_content_change_link_password(cls, val): + """ + Create an instance of this class set to the + ``shared_content_change_link_password`` tag with value ``val``. + + :param SharedContentChangeLinkPasswordType val: + :rtype: EventType + """ + return cls('shared_content_change_link_password', val) + + @classmethod + def shared_content_change_member_role(cls, val): + """ + Create an instance of this class set to the + ``shared_content_change_member_role`` tag with value ``val``. + + :param SharedContentChangeMemberRoleType val: + :rtype: EventType + """ + return cls('shared_content_change_member_role', val) + + @classmethod + def shared_content_change_viewer_info_policy(cls, val): + """ + Create an instance of this class set to the + ``shared_content_change_viewer_info_policy`` tag with value ``val``. + + :param SharedContentChangeViewerInfoPolicyType val: + :rtype: EventType + """ + return cls('shared_content_change_viewer_info_policy', val) + + @classmethod + def shared_content_claim_invitation(cls, val): + """ + Create an instance of this class set to the + ``shared_content_claim_invitation`` tag with value ``val``. + + :param SharedContentClaimInvitationType val: + :rtype: EventType + """ + return cls('shared_content_claim_invitation', val) + + @classmethod + def shared_content_copy(cls, val): + """ + Create an instance of this class set to the ``shared_content_copy`` tag + with value ``val``. + + :param SharedContentCopyType val: + :rtype: EventType + """ + return cls('shared_content_copy', val) + + @classmethod + def shared_content_download(cls, val): + """ + Create an instance of this class set to the ``shared_content_download`` + tag with value ``val``. + + :param SharedContentDownloadType val: + :rtype: EventType + """ + return cls('shared_content_download', val) + + @classmethod + def shared_content_relinquish_membership(cls, val): + """ + Create an instance of this class set to the + ``shared_content_relinquish_membership`` tag with value ``val``. + + :param SharedContentRelinquishMembershipType val: + :rtype: EventType + """ + return cls('shared_content_relinquish_membership', val) + + @classmethod + def shared_content_remove_invitees(cls, val): + """ + Create an instance of this class set to the + ``shared_content_remove_invitees`` tag with value ``val``. + + :param SharedContentRemoveInviteesType val: + :rtype: EventType + """ + return cls('shared_content_remove_invitees', val) + + @classmethod + def shared_content_remove_link_expiry(cls, val): + """ + Create an instance of this class set to the + ``shared_content_remove_link_expiry`` tag with value ``val``. + + :param SharedContentRemoveLinkExpiryType val: + :rtype: EventType + """ + return cls('shared_content_remove_link_expiry', val) + + @classmethod + def shared_content_remove_link_password(cls, val): + """ + Create an instance of this class set to the + ``shared_content_remove_link_password`` tag with value ``val``. + + :param SharedContentRemoveLinkPasswordType val: + :rtype: EventType + """ + return cls('shared_content_remove_link_password', val) + + @classmethod + def shared_content_remove_member(cls, val): + """ + Create an instance of this class set to the + ``shared_content_remove_member`` tag with value ``val``. + + :param SharedContentRemoveMemberType val: + :rtype: EventType + """ + return cls('shared_content_remove_member', val) + + @classmethod + def shared_content_request_access(cls, val): + """ + Create an instance of this class set to the + ``shared_content_request_access`` tag with value ``val``. + + :param SharedContentRequestAccessType val: + :rtype: EventType + """ + return cls('shared_content_request_access', val) + + @classmethod + def shared_content_unshare(cls, val): + """ + Create an instance of this class set to the ``shared_content_unshare`` + tag with value ``val``. + + :param SharedContentUnshareType val: + :rtype: EventType + """ + return cls('shared_content_unshare', val) + + @classmethod + def shared_content_view(cls, val): + """ + Create an instance of this class set to the ``shared_content_view`` tag + with value ``val``. + + :param SharedContentViewType val: + :rtype: EventType + """ + return cls('shared_content_view', val) + + @classmethod + def shared_folder_change_link_policy(cls, val): + """ + Create an instance of this class set to the + ``shared_folder_change_link_policy`` tag with value ``val``. + + :param SharedFolderChangeLinkPolicyType val: + :rtype: EventType + """ + return cls('shared_folder_change_link_policy', val) + + @classmethod + def shared_folder_change_members_inheritance_policy(cls, val): + """ + Create an instance of this class set to the + ``shared_folder_change_members_inheritance_policy`` tag with value + ``val``. + + :param SharedFolderChangeMembersInheritancePolicyType val: + :rtype: EventType + """ + return cls('shared_folder_change_members_inheritance_policy', val) + + @classmethod + def shared_folder_change_members_management_policy(cls, val): + """ + Create an instance of this class set to the + ``shared_folder_change_members_management_policy`` tag with value + ``val``. + + :param SharedFolderChangeMembersManagementPolicyType val: + :rtype: EventType + """ + return cls('shared_folder_change_members_management_policy', val) + + @classmethod + def shared_folder_change_members_policy(cls, val): + """ + Create an instance of this class set to the + ``shared_folder_change_members_policy`` tag with value ``val``. + + :param SharedFolderChangeMembersPolicyType val: + :rtype: EventType + """ + return cls('shared_folder_change_members_policy', val) + + @classmethod + def shared_folder_create(cls, val): + """ + Create an instance of this class set to the ``shared_folder_create`` tag + with value ``val``. + + :param SharedFolderCreateType val: + :rtype: EventType + """ + return cls('shared_folder_create', val) + + @classmethod + def shared_folder_decline_invitation(cls, val): + """ + Create an instance of this class set to the + ``shared_folder_decline_invitation`` tag with value ``val``. + + :param SharedFolderDeclineInvitationType val: + :rtype: EventType + """ + return cls('shared_folder_decline_invitation', val) + + @classmethod + def shared_folder_mount(cls, val): + """ + Create an instance of this class set to the ``shared_folder_mount`` tag + with value ``val``. + + :param SharedFolderMountType val: + :rtype: EventType + """ + return cls('shared_folder_mount', val) + + @classmethod + def shared_folder_nest(cls, val): + """ + Create an instance of this class set to the ``shared_folder_nest`` tag + with value ``val``. + + :param SharedFolderNestType val: + :rtype: EventType + """ + return cls('shared_folder_nest', val) + + @classmethod + def shared_folder_transfer_ownership(cls, val): + """ + Create an instance of this class set to the + ``shared_folder_transfer_ownership`` tag with value ``val``. + + :param SharedFolderTransferOwnershipType val: + :rtype: EventType + """ + return cls('shared_folder_transfer_ownership', val) + + @classmethod + def shared_folder_unmount(cls, val): + """ + Create an instance of this class set to the ``shared_folder_unmount`` + tag with value ``val``. + + :param SharedFolderUnmountType val: + :rtype: EventType + """ + return cls('shared_folder_unmount', val) + + @classmethod + def shared_link_add_expiry(cls, val): + """ + Create an instance of this class set to the ``shared_link_add_expiry`` + tag with value ``val``. + + :param SharedLinkAddExpiryType val: + :rtype: EventType + """ + return cls('shared_link_add_expiry', val) + + @classmethod + def shared_link_change_expiry(cls, val): + """ + Create an instance of this class set to the + ``shared_link_change_expiry`` tag with value ``val``. + + :param SharedLinkChangeExpiryType val: + :rtype: EventType + """ + return cls('shared_link_change_expiry', val) + + @classmethod + def shared_link_change_visibility(cls, val): + """ + Create an instance of this class set to the + ``shared_link_change_visibility`` tag with value ``val``. + + :param SharedLinkChangeVisibilityType val: + :rtype: EventType + """ + return cls('shared_link_change_visibility', val) + + @classmethod + def shared_link_copy(cls, val): + """ + Create an instance of this class set to the ``shared_link_copy`` tag + with value ``val``. + + :param SharedLinkCopyType val: + :rtype: EventType + """ + return cls('shared_link_copy', val) + + @classmethod + def shared_link_create(cls, val): + """ + Create an instance of this class set to the ``shared_link_create`` tag + with value ``val``. + + :param SharedLinkCreateType val: + :rtype: EventType + """ + return cls('shared_link_create', val) + + @classmethod + def shared_link_disable(cls, val): + """ + Create an instance of this class set to the ``shared_link_disable`` tag + with value ``val``. + + :param SharedLinkDisableType val: + :rtype: EventType + """ + return cls('shared_link_disable', val) + + @classmethod + def shared_link_download(cls, val): + """ + Create an instance of this class set to the ``shared_link_download`` tag + with value ``val``. + + :param SharedLinkDownloadType val: + :rtype: EventType + """ + return cls('shared_link_download', val) + + @classmethod + def shared_link_remove_expiry(cls, val): + """ + Create an instance of this class set to the + ``shared_link_remove_expiry`` tag with value ``val``. + + :param SharedLinkRemoveExpiryType val: + :rtype: EventType + """ + return cls('shared_link_remove_expiry', val) + + @classmethod + def shared_link_share(cls, val): + """ + Create an instance of this class set to the ``shared_link_share`` tag + with value ``val``. + + :param SharedLinkShareType val: + :rtype: EventType + """ + return cls('shared_link_share', val) + + @classmethod + def shared_link_view(cls, val): + """ + Create an instance of this class set to the ``shared_link_view`` tag + with value ``val``. + + :param SharedLinkViewType val: + :rtype: EventType + """ + return cls('shared_link_view', val) + + @classmethod + def shared_note_opened(cls, val): + """ + Create an instance of this class set to the ``shared_note_opened`` tag + with value ``val``. + + :param SharedNoteOpenedType val: + :rtype: EventType + """ + return cls('shared_note_opened', val) + + @classmethod + def shmodel_group_share(cls, val): + """ + Create an instance of this class set to the ``shmodel_group_share`` tag + with value ``val``. + + :param ShmodelGroupShareType val: + :rtype: EventType + """ + return cls('shmodel_group_share', val) + + @classmethod + def showcase_access_granted(cls, val): + """ + Create an instance of this class set to the ``showcase_access_granted`` + tag with value ``val``. + + :param ShowcaseAccessGrantedType val: + :rtype: EventType + """ + return cls('showcase_access_granted', val) + + @classmethod + def showcase_add_member(cls, val): + """ + Create an instance of this class set to the ``showcase_add_member`` tag + with value ``val``. + + :param ShowcaseAddMemberType val: + :rtype: EventType + """ + return cls('showcase_add_member', val) + + @classmethod + def showcase_archived(cls, val): + """ + Create an instance of this class set to the ``showcase_archived`` tag + with value ``val``. + + :param ShowcaseArchivedType val: + :rtype: EventType + """ + return cls('showcase_archived', val) + + @classmethod + def showcase_created(cls, val): + """ + Create an instance of this class set to the ``showcase_created`` tag + with value ``val``. + + :param ShowcaseCreatedType val: + :rtype: EventType + """ + return cls('showcase_created', val) + + @classmethod + def showcase_delete_comment(cls, val): + """ + Create an instance of this class set to the ``showcase_delete_comment`` + tag with value ``val``. + + :param ShowcaseDeleteCommentType val: + :rtype: EventType + """ + return cls('showcase_delete_comment', val) + + @classmethod + def showcase_edited(cls, val): + """ + Create an instance of this class set to the ``showcase_edited`` tag with + value ``val``. + + :param ShowcaseEditedType val: + :rtype: EventType + """ + return cls('showcase_edited', val) + + @classmethod + def showcase_edit_comment(cls, val): + """ + Create an instance of this class set to the ``showcase_edit_comment`` + tag with value ``val``. + + :param ShowcaseEditCommentType val: + :rtype: EventType + """ + return cls('showcase_edit_comment', val) + + @classmethod + def showcase_file_added(cls, val): + """ + Create an instance of this class set to the ``showcase_file_added`` tag + with value ``val``. + + :param ShowcaseFileAddedType val: + :rtype: EventType + """ + return cls('showcase_file_added', val) + + @classmethod + def showcase_file_download(cls, val): + """ + Create an instance of this class set to the ``showcase_file_download`` + tag with value ``val``. + + :param ShowcaseFileDownloadType val: + :rtype: EventType + """ + return cls('showcase_file_download', val) + + @classmethod + def showcase_file_removed(cls, val): + """ + Create an instance of this class set to the ``showcase_file_removed`` + tag with value ``val``. + + :param ShowcaseFileRemovedType val: + :rtype: EventType + """ + return cls('showcase_file_removed', val) + + @classmethod + def showcase_file_view(cls, val): + """ + Create an instance of this class set to the ``showcase_file_view`` tag + with value ``val``. + + :param ShowcaseFileViewType val: + :rtype: EventType + """ + return cls('showcase_file_view', val) + + @classmethod + def showcase_permanently_deleted(cls, val): + """ + Create an instance of this class set to the + ``showcase_permanently_deleted`` tag with value ``val``. + + :param ShowcasePermanentlyDeletedType val: + :rtype: EventType + """ + return cls('showcase_permanently_deleted', val) + + @classmethod + def showcase_post_comment(cls, val): + """ + Create an instance of this class set to the ``showcase_post_comment`` + tag with value ``val``. + + :param ShowcasePostCommentType val: + :rtype: EventType + """ + return cls('showcase_post_comment', val) + + @classmethod + def showcase_remove_member(cls, val): + """ + Create an instance of this class set to the ``showcase_remove_member`` + tag with value ``val``. + + :param ShowcaseRemoveMemberType val: + :rtype: EventType + """ + return cls('showcase_remove_member', val) + + @classmethod + def showcase_renamed(cls, val): + """ + Create an instance of this class set to the ``showcase_renamed`` tag + with value ``val``. + + :param ShowcaseRenamedType val: + :rtype: EventType + """ + return cls('showcase_renamed', val) + + @classmethod + def showcase_request_access(cls, val): + """ + Create an instance of this class set to the ``showcase_request_access`` + tag with value ``val``. + + :param ShowcaseRequestAccessType val: + :rtype: EventType + """ + return cls('showcase_request_access', val) + + @classmethod + def showcase_resolve_comment(cls, val): + """ + Create an instance of this class set to the ``showcase_resolve_comment`` + tag with value ``val``. + + :param ShowcaseResolveCommentType val: + :rtype: EventType + """ + return cls('showcase_resolve_comment', val) + + @classmethod + def showcase_restored(cls, val): + """ + Create an instance of this class set to the ``showcase_restored`` tag + with value ``val``. + + :param ShowcaseRestoredType val: + :rtype: EventType + """ + return cls('showcase_restored', val) + + @classmethod + def showcase_trashed(cls, val): + """ + Create an instance of this class set to the ``showcase_trashed`` tag + with value ``val``. + + :param ShowcaseTrashedType val: + :rtype: EventType + """ + return cls('showcase_trashed', val) + + @classmethod + def showcase_trashed_deprecated(cls, val): + """ + Create an instance of this class set to the + ``showcase_trashed_deprecated`` tag with value ``val``. + + :param ShowcaseTrashedDeprecatedType val: + :rtype: EventType + """ + return cls('showcase_trashed_deprecated', val) + + @classmethod + def showcase_unresolve_comment(cls, val): + """ + Create an instance of this class set to the + ``showcase_unresolve_comment`` tag with value ``val``. + + :param ShowcaseUnresolveCommentType val: + :rtype: EventType + """ + return cls('showcase_unresolve_comment', val) + + @classmethod + def showcase_untrashed(cls, val): + """ + Create an instance of this class set to the ``showcase_untrashed`` tag + with value ``val``. + + :param ShowcaseUntrashedType val: + :rtype: EventType + """ + return cls('showcase_untrashed', val) + + @classmethod + def showcase_untrashed_deprecated(cls, val): + """ + Create an instance of this class set to the + ``showcase_untrashed_deprecated`` tag with value ``val``. + + :param ShowcaseUntrashedDeprecatedType val: + :rtype: EventType + """ + return cls('showcase_untrashed_deprecated', val) + + @classmethod + def showcase_view(cls, val): + """ + Create an instance of this class set to the ``showcase_view`` tag with + value ``val``. + + :param ShowcaseViewType val: + :rtype: EventType + """ + return cls('showcase_view', val) + + @classmethod + def sso_add_cert(cls, val): + """ + Create an instance of this class set to the ``sso_add_cert`` tag with + value ``val``. + + :param SsoAddCertType val: + :rtype: EventType + """ + return cls('sso_add_cert', val) + + @classmethod + def sso_add_login_url(cls, val): + """ + Create an instance of this class set to the ``sso_add_login_url`` tag + with value ``val``. + + :param SsoAddLoginUrlType val: + :rtype: EventType + """ + return cls('sso_add_login_url', val) + + @classmethod + def sso_add_logout_url(cls, val): + """ + Create an instance of this class set to the ``sso_add_logout_url`` tag + with value ``val``. + + :param SsoAddLogoutUrlType val: + :rtype: EventType + """ + return cls('sso_add_logout_url', val) + + @classmethod + def sso_change_cert(cls, val): + """ + Create an instance of this class set to the ``sso_change_cert`` tag with + value ``val``. + + :param SsoChangeCertType val: + :rtype: EventType + """ + return cls('sso_change_cert', val) + + @classmethod + def sso_change_login_url(cls, val): + """ + Create an instance of this class set to the ``sso_change_login_url`` tag + with value ``val``. + + :param SsoChangeLoginUrlType val: + :rtype: EventType + """ + return cls('sso_change_login_url', val) + + @classmethod + def sso_change_logout_url(cls, val): + """ + Create an instance of this class set to the ``sso_change_logout_url`` + tag with value ``val``. + + :param SsoChangeLogoutUrlType val: + :rtype: EventType + """ + return cls('sso_change_logout_url', val) + + @classmethod + def sso_change_saml_identity_mode(cls, val): + """ + Create an instance of this class set to the + ``sso_change_saml_identity_mode`` tag with value ``val``. + + :param SsoChangeSamlIdentityModeType val: + :rtype: EventType + """ + return cls('sso_change_saml_identity_mode', val) + + @classmethod + def sso_remove_cert(cls, val): + """ + Create an instance of this class set to the ``sso_remove_cert`` tag with + value ``val``. + + :param SsoRemoveCertType val: + :rtype: EventType + """ + return cls('sso_remove_cert', val) + + @classmethod + def sso_remove_login_url(cls, val): + """ + Create an instance of this class set to the ``sso_remove_login_url`` tag + with value ``val``. + + :param SsoRemoveLoginUrlType val: + :rtype: EventType + """ + return cls('sso_remove_login_url', val) + + @classmethod + def sso_remove_logout_url(cls, val): + """ + Create an instance of this class set to the ``sso_remove_logout_url`` + tag with value ``val``. + + :param SsoRemoveLogoutUrlType val: + :rtype: EventType + """ + return cls('sso_remove_logout_url', val) + + @classmethod + def team_folder_change_status(cls, val): + """ + Create an instance of this class set to the + ``team_folder_change_status`` tag with value ``val``. + + :param TeamFolderChangeStatusType val: + :rtype: EventType + """ + return cls('team_folder_change_status', val) + + @classmethod + def team_folder_create(cls, val): + """ + Create an instance of this class set to the ``team_folder_create`` tag + with value ``val``. + + :param TeamFolderCreateType val: + :rtype: EventType + """ + return cls('team_folder_create', val) + + @classmethod + def team_folder_downgrade(cls, val): + """ + Create an instance of this class set to the ``team_folder_downgrade`` + tag with value ``val``. + + :param TeamFolderDowngradeType val: + :rtype: EventType + """ + return cls('team_folder_downgrade', val) + + @classmethod + def team_folder_permanently_delete(cls, val): + """ + Create an instance of this class set to the + ``team_folder_permanently_delete`` tag with value ``val``. + + :param TeamFolderPermanentlyDeleteType val: + :rtype: EventType + """ + return cls('team_folder_permanently_delete', val) + + @classmethod + def team_folder_rename(cls, val): + """ + Create an instance of this class set to the ``team_folder_rename`` tag + with value ``val``. + + :param TeamFolderRenameType val: + :rtype: EventType + """ + return cls('team_folder_rename', val) + + @classmethod + def team_selective_sync_settings_changed(cls, val): + """ + Create an instance of this class set to the + ``team_selective_sync_settings_changed`` tag with value ``val``. + + :param TeamSelectiveSyncSettingsChangedType val: + :rtype: EventType + """ + return cls('team_selective_sync_settings_changed', val) + + @classmethod + def account_capture_change_policy(cls, val): + """ + Create an instance of this class set to the + ``account_capture_change_policy`` tag with value ``val``. + + :param AccountCaptureChangePolicyType val: + :rtype: EventType + """ + return cls('account_capture_change_policy', val) + + @classmethod + def allow_download_disabled(cls, val): + """ + Create an instance of this class set to the ``allow_download_disabled`` + tag with value ``val``. + + :param AllowDownloadDisabledType val: + :rtype: EventType + """ + return cls('allow_download_disabled', val) + + @classmethod + def allow_download_enabled(cls, val): + """ + Create an instance of this class set to the ``allow_download_enabled`` + tag with value ``val``. + + :param AllowDownloadEnabledType val: + :rtype: EventType + """ + return cls('allow_download_enabled', val) + + @classmethod + def camera_uploads_policy_changed(cls, val): + """ + Create an instance of this class set to the + ``camera_uploads_policy_changed`` tag with value ``val``. + + :param CameraUploadsPolicyChangedType val: + :rtype: EventType + """ + return cls('camera_uploads_policy_changed', val) + + @classmethod + def data_placement_restriction_change_policy(cls, val): + """ + Create an instance of this class set to the + ``data_placement_restriction_change_policy`` tag with value ``val``. + + :param DataPlacementRestrictionChangePolicyType val: + :rtype: EventType + """ + return cls('data_placement_restriction_change_policy', val) + + @classmethod + def data_placement_restriction_satisfy_policy(cls, val): + """ + Create an instance of this class set to the + ``data_placement_restriction_satisfy_policy`` tag with value ``val``. + + :param DataPlacementRestrictionSatisfyPolicyType val: + :rtype: EventType + """ + return cls('data_placement_restriction_satisfy_policy', val) + + @classmethod + def device_approvals_change_desktop_policy(cls, val): + """ + Create an instance of this class set to the + ``device_approvals_change_desktop_policy`` tag with value ``val``. + + :param DeviceApprovalsChangeDesktopPolicyType val: + :rtype: EventType + """ + return cls('device_approvals_change_desktop_policy', val) + + @classmethod + def device_approvals_change_mobile_policy(cls, val): + """ + Create an instance of this class set to the + ``device_approvals_change_mobile_policy`` tag with value ``val``. + + :param DeviceApprovalsChangeMobilePolicyType val: + :rtype: EventType + """ + return cls('device_approvals_change_mobile_policy', val) + + @classmethod + def device_approvals_change_overage_action(cls, val): + """ + Create an instance of this class set to the + ``device_approvals_change_overage_action`` tag with value ``val``. + + :param DeviceApprovalsChangeOverageActionType val: + :rtype: EventType + """ + return cls('device_approvals_change_overage_action', val) + + @classmethod + def device_approvals_change_unlink_action(cls, val): + """ + Create an instance of this class set to the + ``device_approvals_change_unlink_action`` tag with value ``val``. + + :param DeviceApprovalsChangeUnlinkActionType val: + :rtype: EventType + """ + return cls('device_approvals_change_unlink_action', val) + + @classmethod + def directory_restrictions_add_members(cls, val): + """ + Create an instance of this class set to the + ``directory_restrictions_add_members`` tag with value ``val``. + + :param DirectoryRestrictionsAddMembersType val: + :rtype: EventType + """ + return cls('directory_restrictions_add_members', val) + + @classmethod + def directory_restrictions_remove_members(cls, val): + """ + Create an instance of this class set to the + ``directory_restrictions_remove_members`` tag with value ``val``. + + :param DirectoryRestrictionsRemoveMembersType val: + :rtype: EventType + """ + return cls('directory_restrictions_remove_members', val) + + @classmethod + def emm_add_exception(cls, val): + """ + Create an instance of this class set to the ``emm_add_exception`` tag + with value ``val``. + + :param EmmAddExceptionType val: + :rtype: EventType + """ + return cls('emm_add_exception', val) + + @classmethod + def emm_change_policy(cls, val): + """ + Create an instance of this class set to the ``emm_change_policy`` tag + with value ``val``. + + :param EmmChangePolicyType val: + :rtype: EventType + """ + return cls('emm_change_policy', val) + + @classmethod + def emm_remove_exception(cls, val): + """ + Create an instance of this class set to the ``emm_remove_exception`` tag + with value ``val``. + + :param EmmRemoveExceptionType val: + :rtype: EventType + """ + return cls('emm_remove_exception', val) + + @classmethod + def extended_version_history_change_policy(cls, val): + """ + Create an instance of this class set to the + ``extended_version_history_change_policy`` tag with value ``val``. + + :param ExtendedVersionHistoryChangePolicyType val: + :rtype: EventType + """ + return cls('extended_version_history_change_policy', val) + + @classmethod + def file_comments_change_policy(cls, val): + """ + Create an instance of this class set to the + ``file_comments_change_policy`` tag with value ``val``. + + :param FileCommentsChangePolicyType val: + :rtype: EventType + """ + return cls('file_comments_change_policy', val) + + @classmethod + def file_requests_change_policy(cls, val): + """ + Create an instance of this class set to the + ``file_requests_change_policy`` tag with value ``val``. + + :param FileRequestsChangePolicyType val: + :rtype: EventType + """ + return cls('file_requests_change_policy', val) + + @classmethod + def file_requests_emails_enabled(cls, val): + """ + Create an instance of this class set to the + ``file_requests_emails_enabled`` tag with value ``val``. + + :param FileRequestsEmailsEnabledType val: + :rtype: EventType + """ + return cls('file_requests_emails_enabled', val) + + @classmethod + def file_requests_emails_restricted_to_team_only(cls, val): + """ + Create an instance of this class set to the + ``file_requests_emails_restricted_to_team_only`` tag with value ``val``. + + :param FileRequestsEmailsRestrictedToTeamOnlyType val: + :rtype: EventType + """ + return cls('file_requests_emails_restricted_to_team_only', val) + + @classmethod + def google_sso_change_policy(cls, val): + """ + Create an instance of this class set to the ``google_sso_change_policy`` + tag with value ``val``. + + :param GoogleSsoChangePolicyType val: + :rtype: EventType + """ + return cls('google_sso_change_policy', val) + + @classmethod + def group_user_management_change_policy(cls, val): + """ + Create an instance of this class set to the + ``group_user_management_change_policy`` tag with value ``val``. + + :param GroupUserManagementChangePolicyType val: + :rtype: EventType + """ + return cls('group_user_management_change_policy', val) + + @classmethod + def member_requests_change_policy(cls, val): + """ + Create an instance of this class set to the + ``member_requests_change_policy`` tag with value ``val``. + + :param MemberRequestsChangePolicyType val: + :rtype: EventType + """ + return cls('member_requests_change_policy', val) + + @classmethod + def member_space_limits_add_exception(cls, val): + """ + Create an instance of this class set to the + ``member_space_limits_add_exception`` tag with value ``val``. + + :param MemberSpaceLimitsAddExceptionType val: + :rtype: EventType + """ + return cls('member_space_limits_add_exception', val) + + @classmethod + def member_space_limits_change_caps_type_policy(cls, val): + """ + Create an instance of this class set to the + ``member_space_limits_change_caps_type_policy`` tag with value ``val``. + + :param MemberSpaceLimitsChangeCapsTypePolicyType val: + :rtype: EventType + """ + return cls('member_space_limits_change_caps_type_policy', val) + + @classmethod + def member_space_limits_change_policy(cls, val): + """ + Create an instance of this class set to the + ``member_space_limits_change_policy`` tag with value ``val``. + + :param MemberSpaceLimitsChangePolicyType val: + :rtype: EventType + """ + return cls('member_space_limits_change_policy', val) + + @classmethod + def member_space_limits_remove_exception(cls, val): + """ + Create an instance of this class set to the + ``member_space_limits_remove_exception`` tag with value ``val``. + + :param MemberSpaceLimitsRemoveExceptionType val: + :rtype: EventType + """ + return cls('member_space_limits_remove_exception', val) + + @classmethod + def member_suggestions_change_policy(cls, val): + """ + Create an instance of this class set to the + ``member_suggestions_change_policy`` tag with value ``val``. + + :param MemberSuggestionsChangePolicyType val: + :rtype: EventType + """ + return cls('member_suggestions_change_policy', val) + + @classmethod + def microsoft_office_addin_change_policy(cls, val): + """ + Create an instance of this class set to the + ``microsoft_office_addin_change_policy`` tag with value ``val``. + + :param MicrosoftOfficeAddinChangePolicyType val: + :rtype: EventType + """ + return cls('microsoft_office_addin_change_policy', val) + + @classmethod + def network_control_change_policy(cls, val): + """ + Create an instance of this class set to the + ``network_control_change_policy`` tag with value ``val``. + + :param NetworkControlChangePolicyType val: + :rtype: EventType + """ + return cls('network_control_change_policy', val) + + @classmethod + def paper_change_deployment_policy(cls, val): + """ + Create an instance of this class set to the + ``paper_change_deployment_policy`` tag with value ``val``. + + :param PaperChangeDeploymentPolicyType val: + :rtype: EventType + """ + return cls('paper_change_deployment_policy', val) + + @classmethod + def paper_change_member_link_policy(cls, val): + """ + Create an instance of this class set to the + ``paper_change_member_link_policy`` tag with value ``val``. + + :param PaperChangeMemberLinkPolicyType val: + :rtype: EventType + """ + return cls('paper_change_member_link_policy', val) + + @classmethod + def paper_change_member_policy(cls, val): + """ + Create an instance of this class set to the + ``paper_change_member_policy`` tag with value ``val``. + + :param PaperChangeMemberPolicyType val: + :rtype: EventType + """ + return cls('paper_change_member_policy', val) + + @classmethod + def paper_change_policy(cls, val): + """ + Create an instance of this class set to the ``paper_change_policy`` tag + with value ``val``. + + :param PaperChangePolicyType val: + :rtype: EventType + """ + return cls('paper_change_policy', val) + + @classmethod + def paper_enabled_users_group_addition(cls, val): + """ + Create an instance of this class set to the + ``paper_enabled_users_group_addition`` tag with value ``val``. + + :param PaperEnabledUsersGroupAdditionType val: + :rtype: EventType + """ + return cls('paper_enabled_users_group_addition', val) + + @classmethod + def paper_enabled_users_group_removal(cls, val): + """ + Create an instance of this class set to the + ``paper_enabled_users_group_removal`` tag with value ``val``. + + :param PaperEnabledUsersGroupRemovalType val: + :rtype: EventType + """ + return cls('paper_enabled_users_group_removal', val) + + @classmethod + def permanent_delete_change_policy(cls, val): + """ + Create an instance of this class set to the + ``permanent_delete_change_policy`` tag with value ``val``. + + :param PermanentDeleteChangePolicyType val: + :rtype: EventType + """ + return cls('permanent_delete_change_policy', val) + + @classmethod + def sharing_change_folder_join_policy(cls, val): + """ + Create an instance of this class set to the + ``sharing_change_folder_join_policy`` tag with value ``val``. + + :param SharingChangeFolderJoinPolicyType val: + :rtype: EventType + """ + return cls('sharing_change_folder_join_policy', val) + + @classmethod + def sharing_change_link_policy(cls, val): + """ + Create an instance of this class set to the + ``sharing_change_link_policy`` tag with value ``val``. + + :param SharingChangeLinkPolicyType val: + :rtype: EventType + """ + return cls('sharing_change_link_policy', val) + + @classmethod + def sharing_change_member_policy(cls, val): + """ + Create an instance of this class set to the + ``sharing_change_member_policy`` tag with value ``val``. + + :param SharingChangeMemberPolicyType val: + :rtype: EventType + """ + return cls('sharing_change_member_policy', val) + + @classmethod + def showcase_change_download_policy(cls, val): + """ + Create an instance of this class set to the + ``showcase_change_download_policy`` tag with value ``val``. + + :param ShowcaseChangeDownloadPolicyType val: + :rtype: EventType + """ + return cls('showcase_change_download_policy', val) + + @classmethod + def showcase_change_enabled_policy(cls, val): + """ + Create an instance of this class set to the + ``showcase_change_enabled_policy`` tag with value ``val``. + + :param ShowcaseChangeEnabledPolicyType val: + :rtype: EventType + """ + return cls('showcase_change_enabled_policy', val) + + @classmethod + def showcase_change_external_sharing_policy(cls, val): + """ + Create an instance of this class set to the + ``showcase_change_external_sharing_policy`` tag with value ``val``. + + :param ShowcaseChangeExternalSharingPolicyType val: + :rtype: EventType + """ + return cls('showcase_change_external_sharing_policy', val) + + @classmethod + def smart_sync_change_policy(cls, val): + """ + Create an instance of this class set to the ``smart_sync_change_policy`` + tag with value ``val``. + + :param SmartSyncChangePolicyType val: + :rtype: EventType + """ + return cls('smart_sync_change_policy', val) + + @classmethod + def smart_sync_not_opt_out(cls, val): + """ + Create an instance of this class set to the ``smart_sync_not_opt_out`` + tag with value ``val``. + + :param SmartSyncNotOptOutType val: + :rtype: EventType + """ + return cls('smart_sync_not_opt_out', val) + + @classmethod + def smart_sync_opt_out(cls, val): + """ + Create an instance of this class set to the ``smart_sync_opt_out`` tag + with value ``val``. + + :param SmartSyncOptOutType val: + :rtype: EventType + """ + return cls('smart_sync_opt_out', val) + + @classmethod + def sso_change_policy(cls, val): + """ + Create an instance of this class set to the ``sso_change_policy`` tag + with value ``val``. + + :param SsoChangePolicyType val: + :rtype: EventType + """ + return cls('sso_change_policy', val) + + @classmethod + def team_selective_sync_policy_changed(cls, val): + """ + Create an instance of this class set to the + ``team_selective_sync_policy_changed`` tag with value ``val``. + + :param TeamSelectiveSyncPolicyChangedType val: + :rtype: EventType + """ + return cls('team_selective_sync_policy_changed', val) + + @classmethod + def tfa_change_policy(cls, val): + """ + Create an instance of this class set to the ``tfa_change_policy`` tag + with value ``val``. + + :param TfaChangePolicyType val: + :rtype: EventType + """ + return cls('tfa_change_policy', val) + + @classmethod + def two_account_change_policy(cls, val): + """ + Create an instance of this class set to the + ``two_account_change_policy`` tag with value ``val``. + + :param TwoAccountChangePolicyType val: + :rtype: EventType + """ + return cls('two_account_change_policy', val) + + @classmethod + def viewer_info_policy_changed(cls, val): + """ + Create an instance of this class set to the + ``viewer_info_policy_changed`` tag with value ``val``. + + :param ViewerInfoPolicyChangedType val: + :rtype: EventType + """ + return cls('viewer_info_policy_changed', val) + + @classmethod + def web_sessions_change_fixed_length_policy(cls, val): + """ + Create an instance of this class set to the + ``web_sessions_change_fixed_length_policy`` tag with value ``val``. + + :param WebSessionsChangeFixedLengthPolicyType val: + :rtype: EventType + """ + return cls('web_sessions_change_fixed_length_policy', val) + + @classmethod + def web_sessions_change_idle_length_policy(cls, val): + """ + Create an instance of this class set to the + ``web_sessions_change_idle_length_policy`` tag with value ``val``. + + :param WebSessionsChangeIdleLengthPolicyType val: + :rtype: EventType + """ + return cls('web_sessions_change_idle_length_policy', val) + + @classmethod + def team_merge_from(cls, val): + """ + Create an instance of this class set to the ``team_merge_from`` tag with + value ``val``. + + :param TeamMergeFromType val: + :rtype: EventType + """ + return cls('team_merge_from', val) + + @classmethod + def team_merge_to(cls, val): + """ + Create an instance of this class set to the ``team_merge_to`` tag with + value ``val``. + + :param TeamMergeToType val: + :rtype: EventType + """ + return cls('team_merge_to', val) + + @classmethod + def team_profile_add_logo(cls, val): + """ + Create an instance of this class set to the ``team_profile_add_logo`` + tag with value ``val``. + + :param TeamProfileAddLogoType val: + :rtype: EventType + """ + return cls('team_profile_add_logo', val) + + @classmethod + def team_profile_change_default_language(cls, val): + """ + Create an instance of this class set to the + ``team_profile_change_default_language`` tag with value ``val``. + + :param TeamProfileChangeDefaultLanguageType val: + :rtype: EventType + """ + return cls('team_profile_change_default_language', val) + + @classmethod + def team_profile_change_logo(cls, val): + """ + Create an instance of this class set to the ``team_profile_change_logo`` + tag with value ``val``. + + :param TeamProfileChangeLogoType val: + :rtype: EventType + """ + return cls('team_profile_change_logo', val) + + @classmethod + def team_profile_change_name(cls, val): + """ + Create an instance of this class set to the ``team_profile_change_name`` + tag with value ``val``. + + :param TeamProfileChangeNameType val: + :rtype: EventType + """ + return cls('team_profile_change_name', val) + + @classmethod + def team_profile_remove_logo(cls, val): + """ + Create an instance of this class set to the ``team_profile_remove_logo`` + tag with value ``val``. + + :param TeamProfileRemoveLogoType val: + :rtype: EventType + """ + return cls('team_profile_remove_logo', val) + + @classmethod + def tfa_add_backup_phone(cls, val): + """ + Create an instance of this class set to the ``tfa_add_backup_phone`` tag + with value ``val``. + + :param TfaAddBackupPhoneType val: + :rtype: EventType + """ + return cls('tfa_add_backup_phone', val) + + @classmethod + def tfa_add_security_key(cls, val): + """ + Create an instance of this class set to the ``tfa_add_security_key`` tag + with value ``val``. + + :param TfaAddSecurityKeyType val: + :rtype: EventType + """ + return cls('tfa_add_security_key', val) + + @classmethod + def tfa_change_backup_phone(cls, val): + """ + Create an instance of this class set to the ``tfa_change_backup_phone`` + tag with value ``val``. + + :param TfaChangeBackupPhoneType val: + :rtype: EventType + """ + return cls('tfa_change_backup_phone', val) + + @classmethod + def tfa_change_status(cls, val): + """ + Create an instance of this class set to the ``tfa_change_status`` tag + with value ``val``. + + :param TfaChangeStatusType val: + :rtype: EventType + """ + return cls('tfa_change_status', val) + + @classmethod + def tfa_remove_backup_phone(cls, val): + """ + Create an instance of this class set to the ``tfa_remove_backup_phone`` + tag with value ``val``. + + :param TfaRemoveBackupPhoneType val: + :rtype: EventType + """ + return cls('tfa_remove_backup_phone', val) + + @classmethod + def tfa_remove_security_key(cls, val): + """ + Create an instance of this class set to the ``tfa_remove_security_key`` + tag with value ``val``. + + :param TfaRemoveSecurityKeyType val: + :rtype: EventType + """ + return cls('tfa_remove_security_key', val) + + @classmethod + def tfa_reset(cls, val): + """ + Create an instance of this class set to the ``tfa_reset`` tag with value + ``val``. + + :param TfaResetType val: + :rtype: EventType + """ + return cls('tfa_reset', val) + + def is_app_link_team(self): + """ + Check if the union tag is ``app_link_team``. + + :rtype: bool + """ + return self._tag == 'app_link_team' + + def is_app_link_user(self): + """ + Check if the union tag is ``app_link_user``. + + :rtype: bool + """ + return self._tag == 'app_link_user' + + def is_app_unlink_team(self): + """ + Check if the union tag is ``app_unlink_team``. + + :rtype: bool + """ + return self._tag == 'app_unlink_team' + + def is_app_unlink_user(self): + """ + Check if the union tag is ``app_unlink_user``. + + :rtype: bool + """ + return self._tag == 'app_unlink_user' + + def is_file_add_comment(self): + """ + Check if the union tag is ``file_add_comment``. + + :rtype: bool + """ + return self._tag == 'file_add_comment' + + def is_file_change_comment_subscription(self): + """ + Check if the union tag is ``file_change_comment_subscription``. + + :rtype: bool + """ + return self._tag == 'file_change_comment_subscription' + + def is_file_delete_comment(self): + """ + Check if the union tag is ``file_delete_comment``. + + :rtype: bool + """ + return self._tag == 'file_delete_comment' + + def is_file_edit_comment(self): + """ + Check if the union tag is ``file_edit_comment``. + + :rtype: bool + """ + return self._tag == 'file_edit_comment' + + def is_file_like_comment(self): + """ + Check if the union tag is ``file_like_comment``. + + :rtype: bool + """ + return self._tag == 'file_like_comment' + + def is_file_resolve_comment(self): + """ + Check if the union tag is ``file_resolve_comment``. + + :rtype: bool + """ + return self._tag == 'file_resolve_comment' + + def is_file_unlike_comment(self): + """ + Check if the union tag is ``file_unlike_comment``. + + :rtype: bool + """ + return self._tag == 'file_unlike_comment' + + def is_file_unresolve_comment(self): + """ + Check if the union tag is ``file_unresolve_comment``. + + :rtype: bool + """ + return self._tag == 'file_unresolve_comment' + + def is_device_change_ip_desktop(self): + """ + Check if the union tag is ``device_change_ip_desktop``. + + :rtype: bool + """ + return self._tag == 'device_change_ip_desktop' + + def is_device_change_ip_mobile(self): + """ + Check if the union tag is ``device_change_ip_mobile``. + + :rtype: bool + """ + return self._tag == 'device_change_ip_mobile' + + def is_device_change_ip_web(self): + """ + Check if the union tag is ``device_change_ip_web``. + + :rtype: bool + """ + return self._tag == 'device_change_ip_web' + + def is_device_delete_on_unlink_fail(self): + """ + Check if the union tag is ``device_delete_on_unlink_fail``. + + :rtype: bool + """ + return self._tag == 'device_delete_on_unlink_fail' + + def is_device_delete_on_unlink_success(self): + """ + Check if the union tag is ``device_delete_on_unlink_success``. + + :rtype: bool + """ + return self._tag == 'device_delete_on_unlink_success' + + def is_device_link_fail(self): + """ + Check if the union tag is ``device_link_fail``. + + :rtype: bool + """ + return self._tag == 'device_link_fail' + + def is_device_link_success(self): + """ + Check if the union tag is ``device_link_success``. + + :rtype: bool + """ + return self._tag == 'device_link_success' + + def is_device_management_disabled(self): + """ + Check if the union tag is ``device_management_disabled``. + + :rtype: bool + """ + return self._tag == 'device_management_disabled' + + def is_device_management_enabled(self): + """ + Check if the union tag is ``device_management_enabled``. + + :rtype: bool + """ + return self._tag == 'device_management_enabled' + + def is_device_unlink(self): + """ + Check if the union tag is ``device_unlink``. + + :rtype: bool + """ + return self._tag == 'device_unlink' + + def is_emm_refresh_auth_token(self): + """ + Check if the union tag is ``emm_refresh_auth_token``. + + :rtype: bool + """ + return self._tag == 'emm_refresh_auth_token' + + def is_account_capture_change_availability(self): + """ + Check if the union tag is ``account_capture_change_availability``. + + :rtype: bool + """ + return self._tag == 'account_capture_change_availability' + + def is_account_capture_migrate_account(self): + """ + Check if the union tag is ``account_capture_migrate_account``. + + :rtype: bool + """ + return self._tag == 'account_capture_migrate_account' + + def is_account_capture_notification_emails_sent(self): + """ + Check if the union tag is ``account_capture_notification_emails_sent``. + + :rtype: bool + """ + return self._tag == 'account_capture_notification_emails_sent' + + def is_account_capture_relinquish_account(self): + """ + Check if the union tag is ``account_capture_relinquish_account``. + + :rtype: bool + """ + return self._tag == 'account_capture_relinquish_account' + + def is_disabled_domain_invites(self): + """ + Check if the union tag is ``disabled_domain_invites``. + + :rtype: bool + """ + return self._tag == 'disabled_domain_invites' + + def is_domain_invites_approve_request_to_join_team(self): + """ + Check if the union tag is ``domain_invites_approve_request_to_join_team``. + + :rtype: bool + """ + return self._tag == 'domain_invites_approve_request_to_join_team' + + def is_domain_invites_decline_request_to_join_team(self): + """ + Check if the union tag is ``domain_invites_decline_request_to_join_team``. + + :rtype: bool + """ + return self._tag == 'domain_invites_decline_request_to_join_team' + + def is_domain_invites_email_existing_users(self): + """ + Check if the union tag is ``domain_invites_email_existing_users``. + + :rtype: bool + """ + return self._tag == 'domain_invites_email_existing_users' + + def is_domain_invites_request_to_join_team(self): + """ + Check if the union tag is ``domain_invites_request_to_join_team``. + + :rtype: bool + """ + return self._tag == 'domain_invites_request_to_join_team' + + def is_domain_invites_set_invite_new_user_pref_to_no(self): + """ + Check if the union tag is ``domain_invites_set_invite_new_user_pref_to_no``. + + :rtype: bool + """ + return self._tag == 'domain_invites_set_invite_new_user_pref_to_no' + + def is_domain_invites_set_invite_new_user_pref_to_yes(self): + """ + Check if the union tag is ``domain_invites_set_invite_new_user_pref_to_yes``. + + :rtype: bool + """ + return self._tag == 'domain_invites_set_invite_new_user_pref_to_yes' + + def is_domain_verification_add_domain_fail(self): + """ + Check if the union tag is ``domain_verification_add_domain_fail``. + + :rtype: bool + """ + return self._tag == 'domain_verification_add_domain_fail' + + def is_domain_verification_add_domain_success(self): + """ + Check if the union tag is ``domain_verification_add_domain_success``. + + :rtype: bool + """ + return self._tag == 'domain_verification_add_domain_success' + + def is_domain_verification_remove_domain(self): + """ + Check if the union tag is ``domain_verification_remove_domain``. + + :rtype: bool + """ + return self._tag == 'domain_verification_remove_domain' + + def is_enabled_domain_invites(self): + """ + Check if the union tag is ``enabled_domain_invites``. + + :rtype: bool + """ + return self._tag == 'enabled_domain_invites' + + def is_create_folder(self): + """ + Check if the union tag is ``create_folder``. + + :rtype: bool + """ + return self._tag == 'create_folder' + + def is_file_add(self): + """ + Check if the union tag is ``file_add``. + + :rtype: bool + """ + return self._tag == 'file_add' + + def is_file_copy(self): + """ + Check if the union tag is ``file_copy``. + + :rtype: bool + """ + return self._tag == 'file_copy' + + def is_file_delete(self): + """ + Check if the union tag is ``file_delete``. + + :rtype: bool + """ + return self._tag == 'file_delete' + + def is_file_download(self): + """ + Check if the union tag is ``file_download``. + + :rtype: bool + """ + return self._tag == 'file_download' + + def is_file_edit(self): + """ + Check if the union tag is ``file_edit``. + + :rtype: bool + """ + return self._tag == 'file_edit' + + def is_file_get_copy_reference(self): + """ + Check if the union tag is ``file_get_copy_reference``. + + :rtype: bool + """ + return self._tag == 'file_get_copy_reference' + + def is_file_move(self): + """ + Check if the union tag is ``file_move``. + + :rtype: bool + """ + return self._tag == 'file_move' + + def is_file_permanently_delete(self): + """ + Check if the union tag is ``file_permanently_delete``. + + :rtype: bool + """ + return self._tag == 'file_permanently_delete' + + def is_file_preview(self): + """ + Check if the union tag is ``file_preview``. + + :rtype: bool + """ + return self._tag == 'file_preview' + + def is_file_rename(self): + """ + Check if the union tag is ``file_rename``. + + :rtype: bool + """ + return self._tag == 'file_rename' + + def is_file_restore(self): + """ + Check if the union tag is ``file_restore``. + + :rtype: bool + """ + return self._tag == 'file_restore' + + def is_file_revert(self): + """ + Check if the union tag is ``file_revert``. + + :rtype: bool + """ + return self._tag == 'file_revert' + + def is_file_rollback_changes(self): + """ + Check if the union tag is ``file_rollback_changes``. + + :rtype: bool + """ + return self._tag == 'file_rollback_changes' + + def is_file_save_copy_reference(self): + """ + Check if the union tag is ``file_save_copy_reference``. + + :rtype: bool + """ + return self._tag == 'file_save_copy_reference' + + def is_file_request_change(self): + """ + Check if the union tag is ``file_request_change``. + + :rtype: bool + """ + return self._tag == 'file_request_change' + + def is_file_request_close(self): + """ + Check if the union tag is ``file_request_close``. + + :rtype: bool + """ + return self._tag == 'file_request_close' + + def is_file_request_create(self): + """ + Check if the union tag is ``file_request_create``. + + :rtype: bool + """ + return self._tag == 'file_request_create' + + def is_file_request_receive_file(self): + """ + Check if the union tag is ``file_request_receive_file``. + + :rtype: bool + """ + return self._tag == 'file_request_receive_file' + + def is_group_add_external_id(self): + """ + Check if the union tag is ``group_add_external_id``. + + :rtype: bool + """ + return self._tag == 'group_add_external_id' + + def is_group_add_member(self): + """ + Check if the union tag is ``group_add_member``. + + :rtype: bool + """ + return self._tag == 'group_add_member' + + def is_group_change_external_id(self): + """ + Check if the union tag is ``group_change_external_id``. + + :rtype: bool + """ + return self._tag == 'group_change_external_id' + + def is_group_change_management_type(self): + """ + Check if the union tag is ``group_change_management_type``. + + :rtype: bool + """ + return self._tag == 'group_change_management_type' + + def is_group_change_member_role(self): + """ + Check if the union tag is ``group_change_member_role``. + + :rtype: bool + """ + return self._tag == 'group_change_member_role' + + def is_group_create(self): + """ + Check if the union tag is ``group_create``. + + :rtype: bool + """ + return self._tag == 'group_create' + + def is_group_delete(self): + """ + Check if the union tag is ``group_delete``. + + :rtype: bool + """ + return self._tag == 'group_delete' + + def is_group_description_updated(self): + """ + Check if the union tag is ``group_description_updated``. + + :rtype: bool + """ + return self._tag == 'group_description_updated' + + def is_group_join_policy_updated(self): + """ + Check if the union tag is ``group_join_policy_updated``. + + :rtype: bool + """ + return self._tag == 'group_join_policy_updated' + + def is_group_moved(self): + """ + Check if the union tag is ``group_moved``. + + :rtype: bool + """ + return self._tag == 'group_moved' + + def is_group_remove_external_id(self): + """ + Check if the union tag is ``group_remove_external_id``. + + :rtype: bool + """ + return self._tag == 'group_remove_external_id' + + def is_group_remove_member(self): + """ + Check if the union tag is ``group_remove_member``. + + :rtype: bool + """ + return self._tag == 'group_remove_member' + + def is_group_rename(self): + """ + Check if the union tag is ``group_rename``. + + :rtype: bool + """ + return self._tag == 'group_rename' + + def is_emm_error(self): + """ + Check if the union tag is ``emm_error``. + + :rtype: bool + """ + return self._tag == 'emm_error' + + def is_login_fail(self): + """ + Check if the union tag is ``login_fail``. + + :rtype: bool + """ + return self._tag == 'login_fail' + + def is_login_success(self): + """ + Check if the union tag is ``login_success``. + + :rtype: bool + """ + return self._tag == 'login_success' + + def is_logout(self): + """ + Check if the union tag is ``logout``. + + :rtype: bool + """ + return self._tag == 'logout' + + def is_reseller_support_session_end(self): + """ + Check if the union tag is ``reseller_support_session_end``. + + :rtype: bool + """ + return self._tag == 'reseller_support_session_end' + + def is_reseller_support_session_start(self): + """ + Check if the union tag is ``reseller_support_session_start``. + + :rtype: bool + """ + return self._tag == 'reseller_support_session_start' + + def is_sign_in_as_session_end(self): + """ + Check if the union tag is ``sign_in_as_session_end``. + + :rtype: bool + """ + return self._tag == 'sign_in_as_session_end' + + def is_sign_in_as_session_start(self): + """ + Check if the union tag is ``sign_in_as_session_start``. + + :rtype: bool + """ + return self._tag == 'sign_in_as_session_start' + + def is_sso_error(self): + """ + Check if the union tag is ``sso_error``. + + :rtype: bool + """ + return self._tag == 'sso_error' + + def is_member_add_name(self): + """ + Check if the union tag is ``member_add_name``. + + :rtype: bool + """ + return self._tag == 'member_add_name' + + def is_member_change_admin_role(self): + """ + Check if the union tag is ``member_change_admin_role``. + + :rtype: bool + """ + return self._tag == 'member_change_admin_role' + + def is_member_change_email(self): + """ + Check if the union tag is ``member_change_email``. + + :rtype: bool + """ + return self._tag == 'member_change_email' + + def is_member_change_membership_type(self): + """ + Check if the union tag is ``member_change_membership_type``. + + :rtype: bool + """ + return self._tag == 'member_change_membership_type' + + def is_member_change_name(self): + """ + Check if the union tag is ``member_change_name``. + + :rtype: bool + """ + return self._tag == 'member_change_name' + + def is_member_change_status(self): + """ + Check if the union tag is ``member_change_status``. + + :rtype: bool + """ + return self._tag == 'member_change_status' + + def is_member_delete_manual_contacts(self): + """ + Check if the union tag is ``member_delete_manual_contacts``. + + :rtype: bool + """ + return self._tag == 'member_delete_manual_contacts' + + def is_member_permanently_delete_account_contents(self): + """ + Check if the union tag is ``member_permanently_delete_account_contents``. + + :rtype: bool + """ + return self._tag == 'member_permanently_delete_account_contents' + + def is_member_space_limits_add_custom_quota(self): + """ + Check if the union tag is ``member_space_limits_add_custom_quota``. + + :rtype: bool + """ + return self._tag == 'member_space_limits_add_custom_quota' + + def is_member_space_limits_change_custom_quota(self): + """ + Check if the union tag is ``member_space_limits_change_custom_quota``. + + :rtype: bool + """ + return self._tag == 'member_space_limits_change_custom_quota' + + def is_member_space_limits_change_status(self): + """ + Check if the union tag is ``member_space_limits_change_status``. + + :rtype: bool + """ + return self._tag == 'member_space_limits_change_status' + + def is_member_space_limits_remove_custom_quota(self): + """ + Check if the union tag is ``member_space_limits_remove_custom_quota``. + + :rtype: bool + """ + return self._tag == 'member_space_limits_remove_custom_quota' + + def is_member_suggest(self): + """ + Check if the union tag is ``member_suggest``. + + :rtype: bool + """ + return self._tag == 'member_suggest' + + def is_member_transfer_account_contents(self): + """ + Check if the union tag is ``member_transfer_account_contents``. + + :rtype: bool + """ + return self._tag == 'member_transfer_account_contents' + + def is_secondary_mails_policy_changed(self): + """ + Check if the union tag is ``secondary_mails_policy_changed``. + + :rtype: bool + """ + return self._tag == 'secondary_mails_policy_changed' + + def is_paper_content_add_member(self): + """ + Check if the union tag is ``paper_content_add_member``. + + :rtype: bool + """ + return self._tag == 'paper_content_add_member' + + def is_paper_content_add_to_folder(self): + """ + Check if the union tag is ``paper_content_add_to_folder``. + + :rtype: bool + """ + return self._tag == 'paper_content_add_to_folder' + + def is_paper_content_archive(self): + """ + Check if the union tag is ``paper_content_archive``. + + :rtype: bool + """ + return self._tag == 'paper_content_archive' + + def is_paper_content_create(self): + """ + Check if the union tag is ``paper_content_create``. + + :rtype: bool + """ + return self._tag == 'paper_content_create' + + def is_paper_content_permanently_delete(self): + """ + Check if the union tag is ``paper_content_permanently_delete``. + + :rtype: bool + """ + return self._tag == 'paper_content_permanently_delete' + + def is_paper_content_remove_from_folder(self): + """ + Check if the union tag is ``paper_content_remove_from_folder``. + + :rtype: bool + """ + return self._tag == 'paper_content_remove_from_folder' + + def is_paper_content_remove_member(self): + """ + Check if the union tag is ``paper_content_remove_member``. + + :rtype: bool + """ + return self._tag == 'paper_content_remove_member' + + def is_paper_content_rename(self): + """ + Check if the union tag is ``paper_content_rename``. + + :rtype: bool + """ + return self._tag == 'paper_content_rename' + + def is_paper_content_restore(self): + """ + Check if the union tag is ``paper_content_restore``. + + :rtype: bool + """ + return self._tag == 'paper_content_restore' + + def is_paper_doc_add_comment(self): + """ + Check if the union tag is ``paper_doc_add_comment``. + + :rtype: bool + """ + return self._tag == 'paper_doc_add_comment' + + def is_paper_doc_change_member_role(self): + """ + Check if the union tag is ``paper_doc_change_member_role``. + + :rtype: bool + """ + return self._tag == 'paper_doc_change_member_role' + + def is_paper_doc_change_sharing_policy(self): + """ + Check if the union tag is ``paper_doc_change_sharing_policy``. + + :rtype: bool + """ + return self._tag == 'paper_doc_change_sharing_policy' + + def is_paper_doc_change_subscription(self): + """ + Check if the union tag is ``paper_doc_change_subscription``. + + :rtype: bool + """ + return self._tag == 'paper_doc_change_subscription' + + def is_paper_doc_deleted(self): + """ + Check if the union tag is ``paper_doc_deleted``. + + :rtype: bool + """ + return self._tag == 'paper_doc_deleted' + + def is_paper_doc_delete_comment(self): + """ + Check if the union tag is ``paper_doc_delete_comment``. + + :rtype: bool + """ + return self._tag == 'paper_doc_delete_comment' + + def is_paper_doc_download(self): + """ + Check if the union tag is ``paper_doc_download``. + + :rtype: bool + """ + return self._tag == 'paper_doc_download' + + def is_paper_doc_edit(self): + """ + Check if the union tag is ``paper_doc_edit``. + + :rtype: bool + """ + return self._tag == 'paper_doc_edit' + + def is_paper_doc_edit_comment(self): + """ + Check if the union tag is ``paper_doc_edit_comment``. + + :rtype: bool + """ + return self._tag == 'paper_doc_edit_comment' + + def is_paper_doc_followed(self): + """ + Check if the union tag is ``paper_doc_followed``. + + :rtype: bool + """ + return self._tag == 'paper_doc_followed' + + def is_paper_doc_mention(self): + """ + Check if the union tag is ``paper_doc_mention``. + + :rtype: bool + """ + return self._tag == 'paper_doc_mention' + + def is_paper_doc_ownership_changed(self): + """ + Check if the union tag is ``paper_doc_ownership_changed``. + + :rtype: bool + """ + return self._tag == 'paper_doc_ownership_changed' + + def is_paper_doc_request_access(self): + """ + Check if the union tag is ``paper_doc_request_access``. + + :rtype: bool + """ + return self._tag == 'paper_doc_request_access' + + def is_paper_doc_resolve_comment(self): + """ + Check if the union tag is ``paper_doc_resolve_comment``. + + :rtype: bool + """ + return self._tag == 'paper_doc_resolve_comment' + + def is_paper_doc_revert(self): + """ + Check if the union tag is ``paper_doc_revert``. + + :rtype: bool + """ + return self._tag == 'paper_doc_revert' + + def is_paper_doc_slack_share(self): + """ + Check if the union tag is ``paper_doc_slack_share``. + + :rtype: bool + """ + return self._tag == 'paper_doc_slack_share' + + def is_paper_doc_team_invite(self): + """ + Check if the union tag is ``paper_doc_team_invite``. + + :rtype: bool + """ + return self._tag == 'paper_doc_team_invite' + + def is_paper_doc_trashed(self): + """ + Check if the union tag is ``paper_doc_trashed``. + + :rtype: bool + """ + return self._tag == 'paper_doc_trashed' + + def is_paper_doc_unresolve_comment(self): + """ + Check if the union tag is ``paper_doc_unresolve_comment``. + + :rtype: bool + """ + return self._tag == 'paper_doc_unresolve_comment' + + def is_paper_doc_untrashed(self): + """ + Check if the union tag is ``paper_doc_untrashed``. + + :rtype: bool + """ + return self._tag == 'paper_doc_untrashed' + + def is_paper_doc_view(self): + """ + Check if the union tag is ``paper_doc_view``. + + :rtype: bool + """ + return self._tag == 'paper_doc_view' + + def is_paper_external_view_allow(self): + """ + Check if the union tag is ``paper_external_view_allow``. + + :rtype: bool + """ + return self._tag == 'paper_external_view_allow' + + def is_paper_external_view_default_team(self): + """ + Check if the union tag is ``paper_external_view_default_team``. + + :rtype: bool + """ + return self._tag == 'paper_external_view_default_team' + + def is_paper_external_view_forbid(self): + """ + Check if the union tag is ``paper_external_view_forbid``. + + :rtype: bool + """ + return self._tag == 'paper_external_view_forbid' + + def is_paper_folder_change_subscription(self): + """ + Check if the union tag is ``paper_folder_change_subscription``. + + :rtype: bool + """ + return self._tag == 'paper_folder_change_subscription' + + def is_paper_folder_deleted(self): + """ + Check if the union tag is ``paper_folder_deleted``. + + :rtype: bool + """ + return self._tag == 'paper_folder_deleted' + + def is_paper_folder_followed(self): + """ + Check if the union tag is ``paper_folder_followed``. + + :rtype: bool + """ + return self._tag == 'paper_folder_followed' + + def is_paper_folder_team_invite(self): + """ + Check if the union tag is ``paper_folder_team_invite``. + + :rtype: bool + """ + return self._tag == 'paper_folder_team_invite' + + def is_password_change(self): + """ + Check if the union tag is ``password_change``. + + :rtype: bool + """ + return self._tag == 'password_change' + + def is_password_reset(self): + """ + Check if the union tag is ``password_reset``. + + :rtype: bool + """ + return self._tag == 'password_reset' + + def is_password_reset_all(self): + """ + Check if the union tag is ``password_reset_all``. + + :rtype: bool + """ + return self._tag == 'password_reset_all' + + def is_emm_create_exceptions_report(self): + """ + Check if the union tag is ``emm_create_exceptions_report``. + + :rtype: bool + """ + return self._tag == 'emm_create_exceptions_report' + + def is_emm_create_usage_report(self): + """ + Check if the union tag is ``emm_create_usage_report``. + + :rtype: bool + """ + return self._tag == 'emm_create_usage_report' + + def is_export_members_report(self): + """ + Check if the union tag is ``export_members_report``. + + :rtype: bool + """ + return self._tag == 'export_members_report' + + def is_paper_admin_export_start(self): + """ + Check if the union tag is ``paper_admin_export_start``. + + :rtype: bool + """ + return self._tag == 'paper_admin_export_start' + + def is_smart_sync_create_admin_privilege_report(self): + """ + Check if the union tag is ``smart_sync_create_admin_privilege_report``. + + :rtype: bool + """ + return self._tag == 'smart_sync_create_admin_privilege_report' + + def is_team_activity_create_report(self): + """ + Check if the union tag is ``team_activity_create_report``. + + :rtype: bool + """ + return self._tag == 'team_activity_create_report' + + def is_collection_share(self): + """ + Check if the union tag is ``collection_share``. + + :rtype: bool + """ + return self._tag == 'collection_share' + + def is_note_acl_invite_only(self): + """ + Check if the union tag is ``note_acl_invite_only``. + + :rtype: bool + """ + return self._tag == 'note_acl_invite_only' + + def is_note_acl_link(self): + """ + Check if the union tag is ``note_acl_link``. + + :rtype: bool + """ + return self._tag == 'note_acl_link' + + def is_note_acl_team_link(self): + """ + Check if the union tag is ``note_acl_team_link``. + + :rtype: bool + """ + return self._tag == 'note_acl_team_link' + + def is_note_shared(self): + """ + Check if the union tag is ``note_shared``. + + :rtype: bool + """ + return self._tag == 'note_shared' + + def is_note_share_receive(self): + """ + Check if the union tag is ``note_share_receive``. + + :rtype: bool + """ + return self._tag == 'note_share_receive' + + def is_open_note_shared(self): + """ + Check if the union tag is ``open_note_shared``. + + :rtype: bool + """ + return self._tag == 'open_note_shared' + + def is_sf_add_group(self): + """ + Check if the union tag is ``sf_add_group``. + + :rtype: bool + """ + return self._tag == 'sf_add_group' + + def is_sf_allow_non_members_to_view_shared_links(self): + """ + Check if the union tag is ``sf_allow_non_members_to_view_shared_links``. + + :rtype: bool + """ + return self._tag == 'sf_allow_non_members_to_view_shared_links' + + def is_sf_external_invite_warn(self): + """ + Check if the union tag is ``sf_external_invite_warn``. + + :rtype: bool + """ + return self._tag == 'sf_external_invite_warn' + + def is_sf_fb_invite(self): + """ + Check if the union tag is ``sf_fb_invite``. + + :rtype: bool + """ + return self._tag == 'sf_fb_invite' + + def is_sf_fb_invite_change_role(self): + """ + Check if the union tag is ``sf_fb_invite_change_role``. + + :rtype: bool + """ + return self._tag == 'sf_fb_invite_change_role' + + def is_sf_fb_uninvite(self): + """ + Check if the union tag is ``sf_fb_uninvite``. + + :rtype: bool + """ + return self._tag == 'sf_fb_uninvite' + + def is_sf_invite_group(self): + """ + Check if the union tag is ``sf_invite_group``. + + :rtype: bool + """ + return self._tag == 'sf_invite_group' + + def is_sf_team_grant_access(self): + """ + Check if the union tag is ``sf_team_grant_access``. + + :rtype: bool + """ + return self._tag == 'sf_team_grant_access' + + def is_sf_team_invite(self): + """ + Check if the union tag is ``sf_team_invite``. + + :rtype: bool + """ + return self._tag == 'sf_team_invite' + + def is_sf_team_invite_change_role(self): + """ + Check if the union tag is ``sf_team_invite_change_role``. + + :rtype: bool + """ + return self._tag == 'sf_team_invite_change_role' + + def is_sf_team_join(self): + """ + Check if the union tag is ``sf_team_join``. + + :rtype: bool + """ + return self._tag == 'sf_team_join' + + def is_sf_team_join_from_oob_link(self): + """ + Check if the union tag is ``sf_team_join_from_oob_link``. + + :rtype: bool + """ + return self._tag == 'sf_team_join_from_oob_link' + + def is_sf_team_uninvite(self): + """ + Check if the union tag is ``sf_team_uninvite``. + + :rtype: bool + """ + return self._tag == 'sf_team_uninvite' + + def is_shared_content_add_invitees(self): + """ + Check if the union tag is ``shared_content_add_invitees``. + + :rtype: bool + """ + return self._tag == 'shared_content_add_invitees' + + def is_shared_content_add_link_expiry(self): + """ + Check if the union tag is ``shared_content_add_link_expiry``. + + :rtype: bool + """ + return self._tag == 'shared_content_add_link_expiry' + + def is_shared_content_add_link_password(self): + """ + Check if the union tag is ``shared_content_add_link_password``. + + :rtype: bool + """ + return self._tag == 'shared_content_add_link_password' + + def is_shared_content_add_member(self): + """ + Check if the union tag is ``shared_content_add_member``. + + :rtype: bool + """ + return self._tag == 'shared_content_add_member' + + def is_shared_content_change_downloads_policy(self): + """ + Check if the union tag is ``shared_content_change_downloads_policy``. + + :rtype: bool + """ + return self._tag == 'shared_content_change_downloads_policy' + + def is_shared_content_change_invitee_role(self): + """ + Check if the union tag is ``shared_content_change_invitee_role``. + + :rtype: bool + """ + return self._tag == 'shared_content_change_invitee_role' + + def is_shared_content_change_link_audience(self): + """ + Check if the union tag is ``shared_content_change_link_audience``. + + :rtype: bool + """ + return self._tag == 'shared_content_change_link_audience' + + def is_shared_content_change_link_expiry(self): + """ + Check if the union tag is ``shared_content_change_link_expiry``. + + :rtype: bool + """ + return self._tag == 'shared_content_change_link_expiry' + + def is_shared_content_change_link_password(self): + """ + Check if the union tag is ``shared_content_change_link_password``. + + :rtype: bool + """ + return self._tag == 'shared_content_change_link_password' + + def is_shared_content_change_member_role(self): + """ + Check if the union tag is ``shared_content_change_member_role``. + + :rtype: bool + """ + return self._tag == 'shared_content_change_member_role' + + def is_shared_content_change_viewer_info_policy(self): + """ + Check if the union tag is ``shared_content_change_viewer_info_policy``. + + :rtype: bool + """ + return self._tag == 'shared_content_change_viewer_info_policy' + + def is_shared_content_claim_invitation(self): + """ + Check if the union tag is ``shared_content_claim_invitation``. + + :rtype: bool + """ + return self._tag == 'shared_content_claim_invitation' + + def is_shared_content_copy(self): + """ + Check if the union tag is ``shared_content_copy``. + + :rtype: bool + """ + return self._tag == 'shared_content_copy' + + def is_shared_content_download(self): + """ + Check if the union tag is ``shared_content_download``. + + :rtype: bool + """ + return self._tag == 'shared_content_download' + + def is_shared_content_relinquish_membership(self): + """ + Check if the union tag is ``shared_content_relinquish_membership``. + + :rtype: bool + """ + return self._tag == 'shared_content_relinquish_membership' + + def is_shared_content_remove_invitees(self): + """ + Check if the union tag is ``shared_content_remove_invitees``. + + :rtype: bool + """ + return self._tag == 'shared_content_remove_invitees' + + def is_shared_content_remove_link_expiry(self): + """ + Check if the union tag is ``shared_content_remove_link_expiry``. + + :rtype: bool + """ + return self._tag == 'shared_content_remove_link_expiry' + + def is_shared_content_remove_link_password(self): + """ + Check if the union tag is ``shared_content_remove_link_password``. + + :rtype: bool + """ + return self._tag == 'shared_content_remove_link_password' + + def is_shared_content_remove_member(self): + """ + Check if the union tag is ``shared_content_remove_member``. + + :rtype: bool + """ + return self._tag == 'shared_content_remove_member' + + def is_shared_content_request_access(self): + """ + Check if the union tag is ``shared_content_request_access``. + + :rtype: bool + """ + return self._tag == 'shared_content_request_access' + + def is_shared_content_unshare(self): + """ + Check if the union tag is ``shared_content_unshare``. + + :rtype: bool + """ + return self._tag == 'shared_content_unshare' + + def is_shared_content_view(self): + """ + Check if the union tag is ``shared_content_view``. + + :rtype: bool + """ + return self._tag == 'shared_content_view' + + def is_shared_folder_change_link_policy(self): + """ + Check if the union tag is ``shared_folder_change_link_policy``. + + :rtype: bool + """ + return self._tag == 'shared_folder_change_link_policy' + + def is_shared_folder_change_members_inheritance_policy(self): + """ + Check if the union tag is ``shared_folder_change_members_inheritance_policy``. + + :rtype: bool + """ + return self._tag == 'shared_folder_change_members_inheritance_policy' + + def is_shared_folder_change_members_management_policy(self): + """ + Check if the union tag is ``shared_folder_change_members_management_policy``. + + :rtype: bool + """ + return self._tag == 'shared_folder_change_members_management_policy' + + def is_shared_folder_change_members_policy(self): + """ + Check if the union tag is ``shared_folder_change_members_policy``. + + :rtype: bool + """ + return self._tag == 'shared_folder_change_members_policy' + + def is_shared_folder_create(self): + """ + Check if the union tag is ``shared_folder_create``. + + :rtype: bool + """ + return self._tag == 'shared_folder_create' + + def is_shared_folder_decline_invitation(self): + """ + Check if the union tag is ``shared_folder_decline_invitation``. + + :rtype: bool + """ + return self._tag == 'shared_folder_decline_invitation' + + def is_shared_folder_mount(self): + """ + Check if the union tag is ``shared_folder_mount``. + + :rtype: bool + """ + return self._tag == 'shared_folder_mount' + + def is_shared_folder_nest(self): + """ + Check if the union tag is ``shared_folder_nest``. + + :rtype: bool + """ + return self._tag == 'shared_folder_nest' + + def is_shared_folder_transfer_ownership(self): + """ + Check if the union tag is ``shared_folder_transfer_ownership``. + + :rtype: bool + """ + return self._tag == 'shared_folder_transfer_ownership' + + def is_shared_folder_unmount(self): + """ + Check if the union tag is ``shared_folder_unmount``. + + :rtype: bool + """ + return self._tag == 'shared_folder_unmount' + + def is_shared_link_add_expiry(self): + """ + Check if the union tag is ``shared_link_add_expiry``. + + :rtype: bool + """ + return self._tag == 'shared_link_add_expiry' + + def is_shared_link_change_expiry(self): + """ + Check if the union tag is ``shared_link_change_expiry``. + + :rtype: bool + """ + return self._tag == 'shared_link_change_expiry' + + def is_shared_link_change_visibility(self): + """ + Check if the union tag is ``shared_link_change_visibility``. + + :rtype: bool + """ + return self._tag == 'shared_link_change_visibility' + + def is_shared_link_copy(self): + """ + Check if the union tag is ``shared_link_copy``. + + :rtype: bool + """ + return self._tag == 'shared_link_copy' + + def is_shared_link_create(self): + """ + Check if the union tag is ``shared_link_create``. + + :rtype: bool + """ + return self._tag == 'shared_link_create' + + def is_shared_link_disable(self): + """ + Check if the union tag is ``shared_link_disable``. + + :rtype: bool + """ + return self._tag == 'shared_link_disable' + + def is_shared_link_download(self): + """ + Check if the union tag is ``shared_link_download``. + + :rtype: bool + """ + return self._tag == 'shared_link_download' + + def is_shared_link_remove_expiry(self): + """ + Check if the union tag is ``shared_link_remove_expiry``. + + :rtype: bool + """ + return self._tag == 'shared_link_remove_expiry' + + def is_shared_link_share(self): + """ + Check if the union tag is ``shared_link_share``. + + :rtype: bool + """ + return self._tag == 'shared_link_share' + + def is_shared_link_view(self): + """ + Check if the union tag is ``shared_link_view``. + + :rtype: bool + """ + return self._tag == 'shared_link_view' + + def is_shared_note_opened(self): + """ + Check if the union tag is ``shared_note_opened``. + + :rtype: bool + """ + return self._tag == 'shared_note_opened' + + def is_shmodel_group_share(self): + """ + Check if the union tag is ``shmodel_group_share``. + + :rtype: bool + """ + return self._tag == 'shmodel_group_share' + + def is_showcase_access_granted(self): + """ + Check if the union tag is ``showcase_access_granted``. + + :rtype: bool + """ + return self._tag == 'showcase_access_granted' + + def is_showcase_add_member(self): + """ + Check if the union tag is ``showcase_add_member``. + + :rtype: bool + """ + return self._tag == 'showcase_add_member' + + def is_showcase_archived(self): + """ + Check if the union tag is ``showcase_archived``. + + :rtype: bool + """ + return self._tag == 'showcase_archived' + + def is_showcase_created(self): + """ + Check if the union tag is ``showcase_created``. + + :rtype: bool + """ + return self._tag == 'showcase_created' + + def is_showcase_delete_comment(self): + """ + Check if the union tag is ``showcase_delete_comment``. + + :rtype: bool + """ + return self._tag == 'showcase_delete_comment' + + def is_showcase_edited(self): + """ + Check if the union tag is ``showcase_edited``. + + :rtype: bool + """ + return self._tag == 'showcase_edited' + + def is_showcase_edit_comment(self): + """ + Check if the union tag is ``showcase_edit_comment``. + + :rtype: bool + """ + return self._tag == 'showcase_edit_comment' + + def is_showcase_file_added(self): + """ + Check if the union tag is ``showcase_file_added``. + + :rtype: bool + """ + return self._tag == 'showcase_file_added' + + def is_showcase_file_download(self): + """ + Check if the union tag is ``showcase_file_download``. + + :rtype: bool + """ + return self._tag == 'showcase_file_download' + + def is_showcase_file_removed(self): + """ + Check if the union tag is ``showcase_file_removed``. + + :rtype: bool + """ + return self._tag == 'showcase_file_removed' + + def is_showcase_file_view(self): + """ + Check if the union tag is ``showcase_file_view``. + + :rtype: bool + """ + return self._tag == 'showcase_file_view' + + def is_showcase_permanently_deleted(self): + """ + Check if the union tag is ``showcase_permanently_deleted``. + + :rtype: bool + """ + return self._tag == 'showcase_permanently_deleted' + + def is_showcase_post_comment(self): + """ + Check if the union tag is ``showcase_post_comment``. + + :rtype: bool + """ + return self._tag == 'showcase_post_comment' + + def is_showcase_remove_member(self): + """ + Check if the union tag is ``showcase_remove_member``. + + :rtype: bool + """ + return self._tag == 'showcase_remove_member' + + def is_showcase_renamed(self): + """ + Check if the union tag is ``showcase_renamed``. + + :rtype: bool + """ + return self._tag == 'showcase_renamed' + + def is_showcase_request_access(self): + """ + Check if the union tag is ``showcase_request_access``. + + :rtype: bool + """ + return self._tag == 'showcase_request_access' + + def is_showcase_resolve_comment(self): + """ + Check if the union tag is ``showcase_resolve_comment``. + + :rtype: bool + """ + return self._tag == 'showcase_resolve_comment' + + def is_showcase_restored(self): + """ + Check if the union tag is ``showcase_restored``. + + :rtype: bool + """ + return self._tag == 'showcase_restored' + + def is_showcase_trashed(self): + """ + Check if the union tag is ``showcase_trashed``. + + :rtype: bool + """ + return self._tag == 'showcase_trashed' + + def is_showcase_trashed_deprecated(self): + """ + Check if the union tag is ``showcase_trashed_deprecated``. + + :rtype: bool + """ + return self._tag == 'showcase_trashed_deprecated' + + def is_showcase_unresolve_comment(self): + """ + Check if the union tag is ``showcase_unresolve_comment``. + + :rtype: bool + """ + return self._tag == 'showcase_unresolve_comment' + + def is_showcase_untrashed(self): + """ + Check if the union tag is ``showcase_untrashed``. + + :rtype: bool + """ + return self._tag == 'showcase_untrashed' + + def is_showcase_untrashed_deprecated(self): + """ + Check if the union tag is ``showcase_untrashed_deprecated``. + + :rtype: bool + """ + return self._tag == 'showcase_untrashed_deprecated' + + def is_showcase_view(self): + """ + Check if the union tag is ``showcase_view``. + + :rtype: bool + """ + return self._tag == 'showcase_view' + + def is_sso_add_cert(self): + """ + Check if the union tag is ``sso_add_cert``. + + :rtype: bool + """ + return self._tag == 'sso_add_cert' + + def is_sso_add_login_url(self): + """ + Check if the union tag is ``sso_add_login_url``. + + :rtype: bool + """ + return self._tag == 'sso_add_login_url' + + def is_sso_add_logout_url(self): + """ + Check if the union tag is ``sso_add_logout_url``. + + :rtype: bool + """ + return self._tag == 'sso_add_logout_url' + + def is_sso_change_cert(self): + """ + Check if the union tag is ``sso_change_cert``. + + :rtype: bool + """ + return self._tag == 'sso_change_cert' + + def is_sso_change_login_url(self): + """ + Check if the union tag is ``sso_change_login_url``. + + :rtype: bool + """ + return self._tag == 'sso_change_login_url' + + def is_sso_change_logout_url(self): + """ + Check if the union tag is ``sso_change_logout_url``. + + :rtype: bool + """ + return self._tag == 'sso_change_logout_url' + + def is_sso_change_saml_identity_mode(self): + """ + Check if the union tag is ``sso_change_saml_identity_mode``. + + :rtype: bool + """ + return self._tag == 'sso_change_saml_identity_mode' + + def is_sso_remove_cert(self): + """ + Check if the union tag is ``sso_remove_cert``. + + :rtype: bool + """ + return self._tag == 'sso_remove_cert' + + def is_sso_remove_login_url(self): + """ + Check if the union tag is ``sso_remove_login_url``. + + :rtype: bool + """ + return self._tag == 'sso_remove_login_url' + + def is_sso_remove_logout_url(self): + """ + Check if the union tag is ``sso_remove_logout_url``. + + :rtype: bool + """ + return self._tag == 'sso_remove_logout_url' + + def is_team_folder_change_status(self): + """ + Check if the union tag is ``team_folder_change_status``. + + :rtype: bool + """ + return self._tag == 'team_folder_change_status' + + def is_team_folder_create(self): + """ + Check if the union tag is ``team_folder_create``. + + :rtype: bool + """ + return self._tag == 'team_folder_create' + + def is_team_folder_downgrade(self): + """ + Check if the union tag is ``team_folder_downgrade``. + + :rtype: bool + """ + return self._tag == 'team_folder_downgrade' + + def is_team_folder_permanently_delete(self): + """ + Check if the union tag is ``team_folder_permanently_delete``. + + :rtype: bool + """ + return self._tag == 'team_folder_permanently_delete' + + def is_team_folder_rename(self): + """ + Check if the union tag is ``team_folder_rename``. + + :rtype: bool + """ + return self._tag == 'team_folder_rename' + + def is_team_selective_sync_settings_changed(self): + """ + Check if the union tag is ``team_selective_sync_settings_changed``. + + :rtype: bool + """ + return self._tag == 'team_selective_sync_settings_changed' + + def is_account_capture_change_policy(self): + """ + Check if the union tag is ``account_capture_change_policy``. + + :rtype: bool + """ + return self._tag == 'account_capture_change_policy' + + def is_allow_download_disabled(self): + """ + Check if the union tag is ``allow_download_disabled``. + + :rtype: bool + """ + return self._tag == 'allow_download_disabled' + + def is_allow_download_enabled(self): + """ + Check if the union tag is ``allow_download_enabled``. + + :rtype: bool + """ + return self._tag == 'allow_download_enabled' + + def is_camera_uploads_policy_changed(self): + """ + Check if the union tag is ``camera_uploads_policy_changed``. + + :rtype: bool + """ + return self._tag == 'camera_uploads_policy_changed' + + def is_data_placement_restriction_change_policy(self): + """ + Check if the union tag is ``data_placement_restriction_change_policy``. + + :rtype: bool + """ + return self._tag == 'data_placement_restriction_change_policy' + + def is_data_placement_restriction_satisfy_policy(self): + """ + Check if the union tag is ``data_placement_restriction_satisfy_policy``. + + :rtype: bool + """ + return self._tag == 'data_placement_restriction_satisfy_policy' + + def is_device_approvals_change_desktop_policy(self): + """ + Check if the union tag is ``device_approvals_change_desktop_policy``. + + :rtype: bool + """ + return self._tag == 'device_approvals_change_desktop_policy' + + def is_device_approvals_change_mobile_policy(self): + """ + Check if the union tag is ``device_approvals_change_mobile_policy``. + + :rtype: bool + """ + return self._tag == 'device_approvals_change_mobile_policy' + + def is_device_approvals_change_overage_action(self): + """ + Check if the union tag is ``device_approvals_change_overage_action``. + + :rtype: bool + """ + return self._tag == 'device_approvals_change_overage_action' + + def is_device_approvals_change_unlink_action(self): + """ + Check if the union tag is ``device_approvals_change_unlink_action``. + + :rtype: bool + """ + return self._tag == 'device_approvals_change_unlink_action' + + def is_directory_restrictions_add_members(self): + """ + Check if the union tag is ``directory_restrictions_add_members``. + + :rtype: bool + """ + return self._tag == 'directory_restrictions_add_members' + + def is_directory_restrictions_remove_members(self): + """ + Check if the union tag is ``directory_restrictions_remove_members``. + + :rtype: bool + """ + return self._tag == 'directory_restrictions_remove_members' + + def is_emm_add_exception(self): + """ + Check if the union tag is ``emm_add_exception``. + + :rtype: bool + """ + return self._tag == 'emm_add_exception' + + def is_emm_change_policy(self): + """ + Check if the union tag is ``emm_change_policy``. + + :rtype: bool + """ + return self._tag == 'emm_change_policy' + + def is_emm_remove_exception(self): + """ + Check if the union tag is ``emm_remove_exception``. + + :rtype: bool + """ + return self._tag == 'emm_remove_exception' + + def is_extended_version_history_change_policy(self): + """ + Check if the union tag is ``extended_version_history_change_policy``. + + :rtype: bool + """ + return self._tag == 'extended_version_history_change_policy' + + def is_file_comments_change_policy(self): + """ + Check if the union tag is ``file_comments_change_policy``. + + :rtype: bool + """ + return self._tag == 'file_comments_change_policy' + + def is_file_requests_change_policy(self): + """ + Check if the union tag is ``file_requests_change_policy``. + + :rtype: bool + """ + return self._tag == 'file_requests_change_policy' + + def is_file_requests_emails_enabled(self): + """ + Check if the union tag is ``file_requests_emails_enabled``. + + :rtype: bool + """ + return self._tag == 'file_requests_emails_enabled' + + def is_file_requests_emails_restricted_to_team_only(self): + """ + Check if the union tag is ``file_requests_emails_restricted_to_team_only``. + + :rtype: bool + """ + return self._tag == 'file_requests_emails_restricted_to_team_only' + + def is_google_sso_change_policy(self): + """ + Check if the union tag is ``google_sso_change_policy``. + + :rtype: bool + """ + return self._tag == 'google_sso_change_policy' + + def is_group_user_management_change_policy(self): + """ + Check if the union tag is ``group_user_management_change_policy``. + + :rtype: bool + """ + return self._tag == 'group_user_management_change_policy' + + def is_member_requests_change_policy(self): + """ + Check if the union tag is ``member_requests_change_policy``. + + :rtype: bool + """ + return self._tag == 'member_requests_change_policy' + + def is_member_space_limits_add_exception(self): + """ + Check if the union tag is ``member_space_limits_add_exception``. + + :rtype: bool + """ + return self._tag == 'member_space_limits_add_exception' + + def is_member_space_limits_change_caps_type_policy(self): + """ + Check if the union tag is ``member_space_limits_change_caps_type_policy``. + + :rtype: bool + """ + return self._tag == 'member_space_limits_change_caps_type_policy' + + def is_member_space_limits_change_policy(self): + """ + Check if the union tag is ``member_space_limits_change_policy``. + + :rtype: bool + """ + return self._tag == 'member_space_limits_change_policy' + + def is_member_space_limits_remove_exception(self): + """ + Check if the union tag is ``member_space_limits_remove_exception``. + + :rtype: bool + """ + return self._tag == 'member_space_limits_remove_exception' + + def is_member_suggestions_change_policy(self): + """ + Check if the union tag is ``member_suggestions_change_policy``. + + :rtype: bool + """ + return self._tag == 'member_suggestions_change_policy' + + def is_microsoft_office_addin_change_policy(self): + """ + Check if the union tag is ``microsoft_office_addin_change_policy``. + + :rtype: bool + """ + return self._tag == 'microsoft_office_addin_change_policy' + + def is_network_control_change_policy(self): + """ + Check if the union tag is ``network_control_change_policy``. + + :rtype: bool + """ + return self._tag == 'network_control_change_policy' + + def is_paper_change_deployment_policy(self): + """ + Check if the union tag is ``paper_change_deployment_policy``. + + :rtype: bool + """ + return self._tag == 'paper_change_deployment_policy' + + def is_paper_change_member_link_policy(self): + """ + Check if the union tag is ``paper_change_member_link_policy``. + + :rtype: bool + """ + return self._tag == 'paper_change_member_link_policy' + + def is_paper_change_member_policy(self): + """ + Check if the union tag is ``paper_change_member_policy``. + + :rtype: bool + """ + return self._tag == 'paper_change_member_policy' + + def is_paper_change_policy(self): + """ + Check if the union tag is ``paper_change_policy``. + + :rtype: bool + """ + return self._tag == 'paper_change_policy' + + def is_paper_enabled_users_group_addition(self): + """ + Check if the union tag is ``paper_enabled_users_group_addition``. + + :rtype: bool + """ + return self._tag == 'paper_enabled_users_group_addition' + + def is_paper_enabled_users_group_removal(self): + """ + Check if the union tag is ``paper_enabled_users_group_removal``. + + :rtype: bool + """ + return self._tag == 'paper_enabled_users_group_removal' + + def is_permanent_delete_change_policy(self): + """ + Check if the union tag is ``permanent_delete_change_policy``. + + :rtype: bool + """ + return self._tag == 'permanent_delete_change_policy' + + def is_sharing_change_folder_join_policy(self): + """ + Check if the union tag is ``sharing_change_folder_join_policy``. + + :rtype: bool + """ + return self._tag == 'sharing_change_folder_join_policy' + + def is_sharing_change_link_policy(self): + """ + Check if the union tag is ``sharing_change_link_policy``. + + :rtype: bool + """ + return self._tag == 'sharing_change_link_policy' + + def is_sharing_change_member_policy(self): + """ + Check if the union tag is ``sharing_change_member_policy``. + + :rtype: bool + """ + return self._tag == 'sharing_change_member_policy' + + def is_showcase_change_download_policy(self): + """ + Check if the union tag is ``showcase_change_download_policy``. + + :rtype: bool + """ + return self._tag == 'showcase_change_download_policy' + + def is_showcase_change_enabled_policy(self): + """ + Check if the union tag is ``showcase_change_enabled_policy``. + + :rtype: bool + """ + return self._tag == 'showcase_change_enabled_policy' + + def is_showcase_change_external_sharing_policy(self): + """ + Check if the union tag is ``showcase_change_external_sharing_policy``. + + :rtype: bool + """ + return self._tag == 'showcase_change_external_sharing_policy' + + def is_smart_sync_change_policy(self): + """ + Check if the union tag is ``smart_sync_change_policy``. + + :rtype: bool + """ + return self._tag == 'smart_sync_change_policy' + + def is_smart_sync_not_opt_out(self): + """ + Check if the union tag is ``smart_sync_not_opt_out``. + + :rtype: bool + """ + return self._tag == 'smart_sync_not_opt_out' + + def is_smart_sync_opt_out(self): + """ + Check if the union tag is ``smart_sync_opt_out``. + + :rtype: bool + """ + return self._tag == 'smart_sync_opt_out' + + def is_sso_change_policy(self): + """ + Check if the union tag is ``sso_change_policy``. + + :rtype: bool + """ + return self._tag == 'sso_change_policy' + + def is_team_selective_sync_policy_changed(self): + """ + Check if the union tag is ``team_selective_sync_policy_changed``. + + :rtype: bool + """ + return self._tag == 'team_selective_sync_policy_changed' + + def is_tfa_change_policy(self): + """ + Check if the union tag is ``tfa_change_policy``. + + :rtype: bool + """ + return self._tag == 'tfa_change_policy' + + def is_two_account_change_policy(self): + """ + Check if the union tag is ``two_account_change_policy``. + + :rtype: bool + """ + return self._tag == 'two_account_change_policy' + + def is_viewer_info_policy_changed(self): + """ + Check if the union tag is ``viewer_info_policy_changed``. + + :rtype: bool + """ + return self._tag == 'viewer_info_policy_changed' + + def is_web_sessions_change_fixed_length_policy(self): + """ + Check if the union tag is ``web_sessions_change_fixed_length_policy``. + + :rtype: bool + """ + return self._tag == 'web_sessions_change_fixed_length_policy' + + def is_web_sessions_change_idle_length_policy(self): + """ + Check if the union tag is ``web_sessions_change_idle_length_policy``. + + :rtype: bool + """ + return self._tag == 'web_sessions_change_idle_length_policy' + + def is_team_merge_from(self): + """ + Check if the union tag is ``team_merge_from``. + + :rtype: bool + """ + return self._tag == 'team_merge_from' + + def is_team_merge_to(self): + """ + Check if the union tag is ``team_merge_to``. + + :rtype: bool + """ + return self._tag == 'team_merge_to' + + def is_team_profile_add_logo(self): + """ + Check if the union tag is ``team_profile_add_logo``. + + :rtype: bool + """ + return self._tag == 'team_profile_add_logo' + + def is_team_profile_change_default_language(self): + """ + Check if the union tag is ``team_profile_change_default_language``. + + :rtype: bool + """ + return self._tag == 'team_profile_change_default_language' + + def is_team_profile_change_logo(self): + """ + Check if the union tag is ``team_profile_change_logo``. + + :rtype: bool + """ + return self._tag == 'team_profile_change_logo' + + def is_team_profile_change_name(self): + """ + Check if the union tag is ``team_profile_change_name``. + + :rtype: bool + """ + return self._tag == 'team_profile_change_name' + + def is_team_profile_remove_logo(self): + """ + Check if the union tag is ``team_profile_remove_logo``. + + :rtype: bool + """ + return self._tag == 'team_profile_remove_logo' + + def is_tfa_add_backup_phone(self): + """ + Check if the union tag is ``tfa_add_backup_phone``. + + :rtype: bool + """ + return self._tag == 'tfa_add_backup_phone' + + def is_tfa_add_security_key(self): + """ + Check if the union tag is ``tfa_add_security_key``. + + :rtype: bool + """ + return self._tag == 'tfa_add_security_key' + + def is_tfa_change_backup_phone(self): + """ + Check if the union tag is ``tfa_change_backup_phone``. + + :rtype: bool + """ + return self._tag == 'tfa_change_backup_phone' + + def is_tfa_change_status(self): + """ + Check if the union tag is ``tfa_change_status``. + + :rtype: bool + """ + return self._tag == 'tfa_change_status' + + def is_tfa_remove_backup_phone(self): + """ + Check if the union tag is ``tfa_remove_backup_phone``. + + :rtype: bool + """ + return self._tag == 'tfa_remove_backup_phone' + + def is_tfa_remove_security_key(self): + """ + Check if the union tag is ``tfa_remove_security_key``. + + :rtype: bool + """ + return self._tag == 'tfa_remove_security_key' + + def is_tfa_reset(self): + """ + Check if the union tag is ``tfa_reset``. + + :rtype: bool + """ + return self._tag == 'tfa_reset' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_app_link_team(self): + """ + (apps) Linked app for team + + Only call this if :meth:`is_app_link_team` is true. + + :rtype: AppLinkTeamType + """ + if not self.is_app_link_team(): + raise AttributeError("tag 'app_link_team' not set") + return self._value + + def get_app_link_user(self): + """ + (apps) Linked app for member + + Only call this if :meth:`is_app_link_user` is true. + + :rtype: AppLinkUserType + """ + if not self.is_app_link_user(): + raise AttributeError("tag 'app_link_user' not set") + return self._value + + def get_app_unlink_team(self): + """ + (apps) Unlinked app for team + + Only call this if :meth:`is_app_unlink_team` is true. + + :rtype: AppUnlinkTeamType + """ + if not self.is_app_unlink_team(): + raise AttributeError("tag 'app_unlink_team' not set") + return self._value + + def get_app_unlink_user(self): + """ + (apps) Unlinked app for member + + Only call this if :meth:`is_app_unlink_user` is true. + + :rtype: AppUnlinkUserType + """ + if not self.is_app_unlink_user(): + raise AttributeError("tag 'app_unlink_user' not set") + return self._value + + def get_file_add_comment(self): + """ + (comments) Added file comment + + Only call this if :meth:`is_file_add_comment` is true. + + :rtype: FileAddCommentType + """ + if not self.is_file_add_comment(): + raise AttributeError("tag 'file_add_comment' not set") + return self._value + + def get_file_change_comment_subscription(self): + """ + (comments) Subscribed to or unsubscribed from comment notifications for + file + + Only call this if :meth:`is_file_change_comment_subscription` is true. + + :rtype: FileChangeCommentSubscriptionType + """ + if not self.is_file_change_comment_subscription(): + raise AttributeError("tag 'file_change_comment_subscription' not set") + return self._value + + def get_file_delete_comment(self): + """ + (comments) Deleted file comment + + Only call this if :meth:`is_file_delete_comment` is true. + + :rtype: FileDeleteCommentType + """ + if not self.is_file_delete_comment(): + raise AttributeError("tag 'file_delete_comment' not set") + return self._value + + def get_file_edit_comment(self): + """ + (comments) Edited file comment + + Only call this if :meth:`is_file_edit_comment` is true. + + :rtype: FileEditCommentType + """ + if not self.is_file_edit_comment(): + raise AttributeError("tag 'file_edit_comment' not set") + return self._value + + def get_file_like_comment(self): + """ + (comments) Liked file comment (deprecated, no longer logged) + + Only call this if :meth:`is_file_like_comment` is true. + + :rtype: FileLikeCommentType + """ + if not self.is_file_like_comment(): + raise AttributeError("tag 'file_like_comment' not set") + return self._value + + def get_file_resolve_comment(self): + """ + (comments) Resolved file comment + + Only call this if :meth:`is_file_resolve_comment` is true. + + :rtype: FileResolveCommentType + """ + if not self.is_file_resolve_comment(): + raise AttributeError("tag 'file_resolve_comment' not set") + return self._value + + def get_file_unlike_comment(self): + """ + (comments) Unliked file comment (deprecated, no longer logged) + + Only call this if :meth:`is_file_unlike_comment` is true. + + :rtype: FileUnlikeCommentType + """ + if not self.is_file_unlike_comment(): + raise AttributeError("tag 'file_unlike_comment' not set") + return self._value + + def get_file_unresolve_comment(self): + """ + (comments) Unresolved file comment + + Only call this if :meth:`is_file_unresolve_comment` is true. + + :rtype: FileUnresolveCommentType + """ + if not self.is_file_unresolve_comment(): + raise AttributeError("tag 'file_unresolve_comment' not set") + return self._value + + def get_device_change_ip_desktop(self): + """ + (devices) Changed IP address associated with active desktop session + + Only call this if :meth:`is_device_change_ip_desktop` is true. + + :rtype: DeviceChangeIpDesktopType + """ + if not self.is_device_change_ip_desktop(): + raise AttributeError("tag 'device_change_ip_desktop' not set") + return self._value + + def get_device_change_ip_mobile(self): + """ + (devices) Changed IP address associated with active mobile session + + Only call this if :meth:`is_device_change_ip_mobile` is true. + + :rtype: DeviceChangeIpMobileType + """ + if not self.is_device_change_ip_mobile(): + raise AttributeError("tag 'device_change_ip_mobile' not set") + return self._value + + def get_device_change_ip_web(self): + """ + (devices) Changed IP address associated with active web session + + Only call this if :meth:`is_device_change_ip_web` is true. + + :rtype: DeviceChangeIpWebType + """ + if not self.is_device_change_ip_web(): + raise AttributeError("tag 'device_change_ip_web' not set") + return self._value + + def get_device_delete_on_unlink_fail(self): + """ + (devices) Failed to delete all files from unlinked device + + Only call this if :meth:`is_device_delete_on_unlink_fail` is true. + + :rtype: DeviceDeleteOnUnlinkFailType + """ + if not self.is_device_delete_on_unlink_fail(): + raise AttributeError("tag 'device_delete_on_unlink_fail' not set") + return self._value + + def get_device_delete_on_unlink_success(self): + """ + (devices) Deleted all files from unlinked device + + Only call this if :meth:`is_device_delete_on_unlink_success` is true. + + :rtype: DeviceDeleteOnUnlinkSuccessType + """ + if not self.is_device_delete_on_unlink_success(): + raise AttributeError("tag 'device_delete_on_unlink_success' not set") + return self._value + + def get_device_link_fail(self): + """ + (devices) Failed to link device + + Only call this if :meth:`is_device_link_fail` is true. + + :rtype: DeviceLinkFailType + """ + if not self.is_device_link_fail(): + raise AttributeError("tag 'device_link_fail' not set") + return self._value + + def get_device_link_success(self): + """ + (devices) Linked device + + Only call this if :meth:`is_device_link_success` is true. + + :rtype: DeviceLinkSuccessType + """ + if not self.is_device_link_success(): + raise AttributeError("tag 'device_link_success' not set") + return self._value + + def get_device_management_disabled(self): + """ + (devices) Disabled device management (deprecated, no longer logged) + + Only call this if :meth:`is_device_management_disabled` is true. + + :rtype: DeviceManagementDisabledType + """ + if not self.is_device_management_disabled(): + raise AttributeError("tag 'device_management_disabled' not set") + return self._value + + def get_device_management_enabled(self): + """ + (devices) Enabled device management (deprecated, no longer logged) + + Only call this if :meth:`is_device_management_enabled` is true. + + :rtype: DeviceManagementEnabledType + """ + if not self.is_device_management_enabled(): + raise AttributeError("tag 'device_management_enabled' not set") + return self._value + + def get_device_unlink(self): + """ + (devices) Disconnected device + + Only call this if :meth:`is_device_unlink` is true. + + :rtype: DeviceUnlinkType + """ + if not self.is_device_unlink(): + raise AttributeError("tag 'device_unlink' not set") + return self._value + + def get_emm_refresh_auth_token(self): + """ + (devices) Refreshed auth token used for setting up enterprise mobility + management + + Only call this if :meth:`is_emm_refresh_auth_token` is true. + + :rtype: EmmRefreshAuthTokenType + """ + if not self.is_emm_refresh_auth_token(): + raise AttributeError("tag 'emm_refresh_auth_token' not set") + return self._value + + def get_account_capture_change_availability(self): + """ + (domains) Granted/revoked option to enable account capture on team + domains + + Only call this if :meth:`is_account_capture_change_availability` is true. + + :rtype: AccountCaptureChangeAvailabilityType + """ + if not self.is_account_capture_change_availability(): + raise AttributeError("tag 'account_capture_change_availability' not set") + return self._value + + def get_account_capture_migrate_account(self): + """ + (domains) Account-captured user migrated account to team + + Only call this if :meth:`is_account_capture_migrate_account` is true. + + :rtype: AccountCaptureMigrateAccountType + """ + if not self.is_account_capture_migrate_account(): + raise AttributeError("tag 'account_capture_migrate_account' not set") + return self._value + + def get_account_capture_notification_emails_sent(self): + """ + (domains) Sent proactive account capture email to all unmanaged members + + Only call this if :meth:`is_account_capture_notification_emails_sent` is true. + + :rtype: AccountCaptureNotificationEmailsSentType + """ + if not self.is_account_capture_notification_emails_sent(): + raise AttributeError("tag 'account_capture_notification_emails_sent' not set") + return self._value + + def get_account_capture_relinquish_account(self): + """ + (domains) Account-captured user changed account email to personal email + + Only call this if :meth:`is_account_capture_relinquish_account` is true. + + :rtype: AccountCaptureRelinquishAccountType + """ + if not self.is_account_capture_relinquish_account(): + raise AttributeError("tag 'account_capture_relinquish_account' not set") + return self._value + + def get_disabled_domain_invites(self): + """ + (domains) Disabled domain invites (deprecated, no longer logged) + + Only call this if :meth:`is_disabled_domain_invites` is true. + + :rtype: DisabledDomainInvitesType + """ + if not self.is_disabled_domain_invites(): + raise AttributeError("tag 'disabled_domain_invites' not set") + return self._value + + def get_domain_invites_approve_request_to_join_team(self): + """ + (domains) Approved user's request to join team + + Only call this if :meth:`is_domain_invites_approve_request_to_join_team` is true. + + :rtype: DomainInvitesApproveRequestToJoinTeamType + """ + if not self.is_domain_invites_approve_request_to_join_team(): + raise AttributeError("tag 'domain_invites_approve_request_to_join_team' not set") + return self._value + + def get_domain_invites_decline_request_to_join_team(self): + """ + (domains) Declined user's request to join team + + Only call this if :meth:`is_domain_invites_decline_request_to_join_team` is true. + + :rtype: DomainInvitesDeclineRequestToJoinTeamType + """ + if not self.is_domain_invites_decline_request_to_join_team(): + raise AttributeError("tag 'domain_invites_decline_request_to_join_team' not set") + return self._value + + def get_domain_invites_email_existing_users(self): + """ + (domains) Sent domain invites to existing domain accounts (deprecated, + no longer logged) + + Only call this if :meth:`is_domain_invites_email_existing_users` is true. + + :rtype: DomainInvitesEmailExistingUsersType + """ + if not self.is_domain_invites_email_existing_users(): + raise AttributeError("tag 'domain_invites_email_existing_users' not set") + return self._value + + def get_domain_invites_request_to_join_team(self): + """ + (domains) Requested to join team + + Only call this if :meth:`is_domain_invites_request_to_join_team` is true. + + :rtype: DomainInvitesRequestToJoinTeamType + """ + if not self.is_domain_invites_request_to_join_team(): + raise AttributeError("tag 'domain_invites_request_to_join_team' not set") + return self._value + + def get_domain_invites_set_invite_new_user_pref_to_no(self): + """ + (domains) Disabled "Automatically invite new users" (deprecated, no + longer logged) + + Only call this if :meth:`is_domain_invites_set_invite_new_user_pref_to_no` is true. + + :rtype: DomainInvitesSetInviteNewUserPrefToNoType + """ + if not self.is_domain_invites_set_invite_new_user_pref_to_no(): + raise AttributeError("tag 'domain_invites_set_invite_new_user_pref_to_no' not set") + return self._value + + def get_domain_invites_set_invite_new_user_pref_to_yes(self): + """ + (domains) Enabled "Automatically invite new users" (deprecated, no + longer logged) + + Only call this if :meth:`is_domain_invites_set_invite_new_user_pref_to_yes` is true. + + :rtype: DomainInvitesSetInviteNewUserPrefToYesType + """ + if not self.is_domain_invites_set_invite_new_user_pref_to_yes(): + raise AttributeError("tag 'domain_invites_set_invite_new_user_pref_to_yes' not set") + return self._value + + def get_domain_verification_add_domain_fail(self): + """ + (domains) Failed to verify team domain + + Only call this if :meth:`is_domain_verification_add_domain_fail` is true. + + :rtype: DomainVerificationAddDomainFailType + """ + if not self.is_domain_verification_add_domain_fail(): + raise AttributeError("tag 'domain_verification_add_domain_fail' not set") + return self._value + + def get_domain_verification_add_domain_success(self): + """ + (domains) Verified team domain + + Only call this if :meth:`is_domain_verification_add_domain_success` is true. + + :rtype: DomainVerificationAddDomainSuccessType + """ + if not self.is_domain_verification_add_domain_success(): + raise AttributeError("tag 'domain_verification_add_domain_success' not set") + return self._value + + def get_domain_verification_remove_domain(self): + """ + (domains) Removed domain from list of verified team domains + + Only call this if :meth:`is_domain_verification_remove_domain` is true. + + :rtype: DomainVerificationRemoveDomainType + """ + if not self.is_domain_verification_remove_domain(): + raise AttributeError("tag 'domain_verification_remove_domain' not set") + return self._value + + def get_enabled_domain_invites(self): + """ + (domains) Enabled domain invites (deprecated, no longer logged) + + Only call this if :meth:`is_enabled_domain_invites` is true. + + :rtype: EnabledDomainInvitesType + """ + if not self.is_enabled_domain_invites(): + raise AttributeError("tag 'enabled_domain_invites' not set") + return self._value + + def get_create_folder(self): + """ + (file_operations) Created folders (deprecated, no longer logged) + + Only call this if :meth:`is_create_folder` is true. + + :rtype: CreateFolderType + """ + if not self.is_create_folder(): + raise AttributeError("tag 'create_folder' not set") + return self._value + + def get_file_add(self): + """ + (file_operations) Added files and/or folders + + Only call this if :meth:`is_file_add` is true. + + :rtype: FileAddType + """ + if not self.is_file_add(): + raise AttributeError("tag 'file_add' not set") + return self._value + + def get_file_copy(self): + """ + (file_operations) Copied files and/or folders + + Only call this if :meth:`is_file_copy` is true. + + :rtype: FileCopyType + """ + if not self.is_file_copy(): + raise AttributeError("tag 'file_copy' not set") + return self._value + + def get_file_delete(self): + """ + (file_operations) Deleted files and/or folders + + Only call this if :meth:`is_file_delete` is true. + + :rtype: FileDeleteType + """ + if not self.is_file_delete(): + raise AttributeError("tag 'file_delete' not set") + return self._value + + def get_file_download(self): + """ + (file_operations) Downloaded files and/or folders + + Only call this if :meth:`is_file_download` is true. + + :rtype: FileDownloadType + """ + if not self.is_file_download(): + raise AttributeError("tag 'file_download' not set") + return self._value + + def get_file_edit(self): + """ + (file_operations) Edited files + + Only call this if :meth:`is_file_edit` is true. + + :rtype: FileEditType + """ + if not self.is_file_edit(): + raise AttributeError("tag 'file_edit' not set") + return self._value + + def get_file_get_copy_reference(self): + """ + (file_operations) Created copy reference to file/folder + + Only call this if :meth:`is_file_get_copy_reference` is true. + + :rtype: FileGetCopyReferenceType + """ + if not self.is_file_get_copy_reference(): + raise AttributeError("tag 'file_get_copy_reference' not set") + return self._value + + def get_file_move(self): + """ + (file_operations) Moved files and/or folders + + Only call this if :meth:`is_file_move` is true. + + :rtype: FileMoveType + """ + if not self.is_file_move(): + raise AttributeError("tag 'file_move' not set") + return self._value + + def get_file_permanently_delete(self): + """ + (file_operations) Permanently deleted files and/or folders + + Only call this if :meth:`is_file_permanently_delete` is true. + + :rtype: FilePermanentlyDeleteType + """ + if not self.is_file_permanently_delete(): + raise AttributeError("tag 'file_permanently_delete' not set") + return self._value + + def get_file_preview(self): + """ + (file_operations) Previewed files and/or folders + + Only call this if :meth:`is_file_preview` is true. + + :rtype: FilePreviewType + """ + if not self.is_file_preview(): + raise AttributeError("tag 'file_preview' not set") + return self._value + + def get_file_rename(self): + """ + (file_operations) Renamed files and/or folders + + Only call this if :meth:`is_file_rename` is true. + + :rtype: FileRenameType + """ + if not self.is_file_rename(): + raise AttributeError("tag 'file_rename' not set") + return self._value + + def get_file_restore(self): + """ + (file_operations) Restored deleted files and/or folders + + Only call this if :meth:`is_file_restore` is true. + + :rtype: FileRestoreType + """ + if not self.is_file_restore(): + raise AttributeError("tag 'file_restore' not set") + return self._value + + def get_file_revert(self): + """ + (file_operations) Reverted files to previous version + + Only call this if :meth:`is_file_revert` is true. + + :rtype: FileRevertType + """ + if not self.is_file_revert(): + raise AttributeError("tag 'file_revert' not set") + return self._value + + def get_file_rollback_changes(self): + """ + (file_operations) Rolled back file actions + + Only call this if :meth:`is_file_rollback_changes` is true. + + :rtype: FileRollbackChangesType + """ + if not self.is_file_rollback_changes(): + raise AttributeError("tag 'file_rollback_changes' not set") + return self._value + + def get_file_save_copy_reference(self): + """ + (file_operations) Saved file/folder using copy reference + + Only call this if :meth:`is_file_save_copy_reference` is true. + + :rtype: FileSaveCopyReferenceType + """ + if not self.is_file_save_copy_reference(): + raise AttributeError("tag 'file_save_copy_reference' not set") + return self._value + + def get_file_request_change(self): + """ + (file_requests) Changed file request + + Only call this if :meth:`is_file_request_change` is true. + + :rtype: FileRequestChangeType + """ + if not self.is_file_request_change(): + raise AttributeError("tag 'file_request_change' not set") + return self._value + + def get_file_request_close(self): + """ + (file_requests) Closed file request + + Only call this if :meth:`is_file_request_close` is true. + + :rtype: FileRequestCloseType + """ + if not self.is_file_request_close(): + raise AttributeError("tag 'file_request_close' not set") + return self._value + + def get_file_request_create(self): + """ + (file_requests) Created file request + + Only call this if :meth:`is_file_request_create` is true. + + :rtype: FileRequestCreateType + """ + if not self.is_file_request_create(): + raise AttributeError("tag 'file_request_create' not set") + return self._value + + def get_file_request_receive_file(self): + """ + (file_requests) Received files for file request + + Only call this if :meth:`is_file_request_receive_file` is true. + + :rtype: FileRequestReceiveFileType + """ + if not self.is_file_request_receive_file(): + raise AttributeError("tag 'file_request_receive_file' not set") + return self._value + + def get_group_add_external_id(self): + """ + (groups) Added external ID for group + + Only call this if :meth:`is_group_add_external_id` is true. + + :rtype: GroupAddExternalIdType + """ + if not self.is_group_add_external_id(): + raise AttributeError("tag 'group_add_external_id' not set") + return self._value + + def get_group_add_member(self): + """ + (groups) Added team members to group + + Only call this if :meth:`is_group_add_member` is true. + + :rtype: GroupAddMemberType + """ + if not self.is_group_add_member(): + raise AttributeError("tag 'group_add_member' not set") + return self._value + + def get_group_change_external_id(self): + """ + (groups) Changed external ID for group + + Only call this if :meth:`is_group_change_external_id` is true. + + :rtype: GroupChangeExternalIdType + """ + if not self.is_group_change_external_id(): + raise AttributeError("tag 'group_change_external_id' not set") + return self._value + + def get_group_change_management_type(self): + """ + (groups) Changed group management type + + Only call this if :meth:`is_group_change_management_type` is true. + + :rtype: GroupChangeManagementTypeType + """ + if not self.is_group_change_management_type(): + raise AttributeError("tag 'group_change_management_type' not set") + return self._value + + def get_group_change_member_role(self): + """ + (groups) Changed manager permissions of group member + + Only call this if :meth:`is_group_change_member_role` is true. + + :rtype: GroupChangeMemberRoleType + """ + if not self.is_group_change_member_role(): + raise AttributeError("tag 'group_change_member_role' not set") + return self._value + + def get_group_create(self): + """ + (groups) Created group + + Only call this if :meth:`is_group_create` is true. + + :rtype: GroupCreateType + """ + if not self.is_group_create(): + raise AttributeError("tag 'group_create' not set") + return self._value + + def get_group_delete(self): + """ + (groups) Deleted group + + Only call this if :meth:`is_group_delete` is true. + + :rtype: GroupDeleteType + """ + if not self.is_group_delete(): + raise AttributeError("tag 'group_delete' not set") + return self._value + + def get_group_description_updated(self): + """ + (groups) Updated group (deprecated, no longer logged) + + Only call this if :meth:`is_group_description_updated` is true. + + :rtype: GroupDescriptionUpdatedType + """ + if not self.is_group_description_updated(): + raise AttributeError("tag 'group_description_updated' not set") + return self._value + + def get_group_join_policy_updated(self): + """ + (groups) Updated group join policy (deprecated, no longer logged) + + Only call this if :meth:`is_group_join_policy_updated` is true. + + :rtype: GroupJoinPolicyUpdatedType + """ + if not self.is_group_join_policy_updated(): + raise AttributeError("tag 'group_join_policy_updated' not set") + return self._value + + def get_group_moved(self): + """ + (groups) Moved group (deprecated, no longer logged) + + Only call this if :meth:`is_group_moved` is true. + + :rtype: GroupMovedType + """ + if not self.is_group_moved(): + raise AttributeError("tag 'group_moved' not set") + return self._value + + def get_group_remove_external_id(self): + """ + (groups) Removed external ID for group + + Only call this if :meth:`is_group_remove_external_id` is true. + + :rtype: GroupRemoveExternalIdType + """ + if not self.is_group_remove_external_id(): + raise AttributeError("tag 'group_remove_external_id' not set") + return self._value + + def get_group_remove_member(self): + """ + (groups) Removed team members from group + + Only call this if :meth:`is_group_remove_member` is true. + + :rtype: GroupRemoveMemberType + """ + if not self.is_group_remove_member(): + raise AttributeError("tag 'group_remove_member' not set") + return self._value + + def get_group_rename(self): + """ + (groups) Renamed group + + Only call this if :meth:`is_group_rename` is true. + + :rtype: GroupRenameType + """ + if not self.is_group_rename(): + raise AttributeError("tag 'group_rename' not set") + return self._value + + def get_emm_error(self): + """ + (logins) Failed to sign in via EMM (deprecated, replaced by 'Failed to + sign in') + + Only call this if :meth:`is_emm_error` is true. + + :rtype: EmmErrorType + """ + if not self.is_emm_error(): + raise AttributeError("tag 'emm_error' not set") + return self._value + + def get_login_fail(self): + """ + (logins) Failed to sign in + + Only call this if :meth:`is_login_fail` is true. + + :rtype: LoginFailType + """ + if not self.is_login_fail(): + raise AttributeError("tag 'login_fail' not set") + return self._value + + def get_login_success(self): + """ + (logins) Signed in + + Only call this if :meth:`is_login_success` is true. + + :rtype: LoginSuccessType + """ + if not self.is_login_success(): + raise AttributeError("tag 'login_success' not set") + return self._value + + def get_logout(self): + """ + (logins) Signed out + + Only call this if :meth:`is_logout` is true. + + :rtype: LogoutType + """ + if not self.is_logout(): + raise AttributeError("tag 'logout' not set") + return self._value + + def get_reseller_support_session_end(self): + """ + (logins) Ended reseller support session + + Only call this if :meth:`is_reseller_support_session_end` is true. + + :rtype: ResellerSupportSessionEndType + """ + if not self.is_reseller_support_session_end(): + raise AttributeError("tag 'reseller_support_session_end' not set") + return self._value + + def get_reseller_support_session_start(self): + """ + (logins) Started reseller support session + + Only call this if :meth:`is_reseller_support_session_start` is true. + + :rtype: ResellerSupportSessionStartType + """ + if not self.is_reseller_support_session_start(): + raise AttributeError("tag 'reseller_support_session_start' not set") + return self._value + + def get_sign_in_as_session_end(self): + """ + (logins) Ended admin sign-in-as session + + Only call this if :meth:`is_sign_in_as_session_end` is true. + + :rtype: SignInAsSessionEndType + """ + if not self.is_sign_in_as_session_end(): + raise AttributeError("tag 'sign_in_as_session_end' not set") + return self._value + + def get_sign_in_as_session_start(self): + """ + (logins) Started admin sign-in-as session + + Only call this if :meth:`is_sign_in_as_session_start` is true. + + :rtype: SignInAsSessionStartType + """ + if not self.is_sign_in_as_session_start(): + raise AttributeError("tag 'sign_in_as_session_start' not set") + return self._value + + def get_sso_error(self): + """ + (logins) Failed to sign in via SSO (deprecated, replaced by 'Failed to + sign in') + + Only call this if :meth:`is_sso_error` is true. + + :rtype: SsoErrorType + """ + if not self.is_sso_error(): + raise AttributeError("tag 'sso_error' not set") + return self._value + + def get_member_add_name(self): + """ + (members) Added team member name + + Only call this if :meth:`is_member_add_name` is true. + + :rtype: MemberAddNameType + """ + if not self.is_member_add_name(): + raise AttributeError("tag 'member_add_name' not set") + return self._value + + def get_member_change_admin_role(self): + """ + (members) Changed team member admin role + + Only call this if :meth:`is_member_change_admin_role` is true. + + :rtype: MemberChangeAdminRoleType + """ + if not self.is_member_change_admin_role(): + raise AttributeError("tag 'member_change_admin_role' not set") + return self._value + + def get_member_change_email(self): + """ + (members) Changed team member email + + Only call this if :meth:`is_member_change_email` is true. + + :rtype: MemberChangeEmailType + """ + if not self.is_member_change_email(): + raise AttributeError("tag 'member_change_email' not set") + return self._value + + def get_member_change_membership_type(self): + """ + (members) Changed membership type (limited/full) of member (deprecated, + no longer logged) + + Only call this if :meth:`is_member_change_membership_type` is true. + + :rtype: MemberChangeMembershipTypeType + """ + if not self.is_member_change_membership_type(): + raise AttributeError("tag 'member_change_membership_type' not set") + return self._value + + def get_member_change_name(self): + """ + (members) Changed team member name + + Only call this if :meth:`is_member_change_name` is true. + + :rtype: MemberChangeNameType + """ + if not self.is_member_change_name(): + raise AttributeError("tag 'member_change_name' not set") + return self._value + + def get_member_change_status(self): + """ + (members) Changed member status (invited, joined, suspended, etc.) + + Only call this if :meth:`is_member_change_status` is true. + + :rtype: MemberChangeStatusType + """ + if not self.is_member_change_status(): + raise AttributeError("tag 'member_change_status' not set") + return self._value + + def get_member_delete_manual_contacts(self): + """ + (members) Cleared manually added contacts + + Only call this if :meth:`is_member_delete_manual_contacts` is true. + + :rtype: MemberDeleteManualContactsType + """ + if not self.is_member_delete_manual_contacts(): + raise AttributeError("tag 'member_delete_manual_contacts' not set") + return self._value + + def get_member_permanently_delete_account_contents(self): + """ + (members) Permanently deleted contents of deleted team member account + + Only call this if :meth:`is_member_permanently_delete_account_contents` is true. + + :rtype: MemberPermanentlyDeleteAccountContentsType + """ + if not self.is_member_permanently_delete_account_contents(): + raise AttributeError("tag 'member_permanently_delete_account_contents' not set") + return self._value + + def get_member_space_limits_add_custom_quota(self): + """ + (members) Set custom member space limit + + Only call this if :meth:`is_member_space_limits_add_custom_quota` is true. + + :rtype: MemberSpaceLimitsAddCustomQuotaType + """ + if not self.is_member_space_limits_add_custom_quota(): + raise AttributeError("tag 'member_space_limits_add_custom_quota' not set") + return self._value + + def get_member_space_limits_change_custom_quota(self): + """ + (members) Changed custom member space limit + + Only call this if :meth:`is_member_space_limits_change_custom_quota` is true. + + :rtype: MemberSpaceLimitsChangeCustomQuotaType + """ + if not self.is_member_space_limits_change_custom_quota(): + raise AttributeError("tag 'member_space_limits_change_custom_quota' not set") + return self._value + + def get_member_space_limits_change_status(self): + """ + (members) Changed space limit status + + Only call this if :meth:`is_member_space_limits_change_status` is true. + + :rtype: MemberSpaceLimitsChangeStatusType + """ + if not self.is_member_space_limits_change_status(): + raise AttributeError("tag 'member_space_limits_change_status' not set") + return self._value + + def get_member_space_limits_remove_custom_quota(self): + """ + (members) Removed custom member space limit + + Only call this if :meth:`is_member_space_limits_remove_custom_quota` is true. + + :rtype: MemberSpaceLimitsRemoveCustomQuotaType + """ + if not self.is_member_space_limits_remove_custom_quota(): + raise AttributeError("tag 'member_space_limits_remove_custom_quota' not set") + return self._value + + def get_member_suggest(self): + """ + (members) Suggested person to add to team + + Only call this if :meth:`is_member_suggest` is true. + + :rtype: MemberSuggestType + """ + if not self.is_member_suggest(): + raise AttributeError("tag 'member_suggest' not set") + return self._value + + def get_member_transfer_account_contents(self): + """ + (members) Transferred contents of deleted member account to another + member + + Only call this if :meth:`is_member_transfer_account_contents` is true. + + :rtype: MemberTransferAccountContentsType + """ + if not self.is_member_transfer_account_contents(): + raise AttributeError("tag 'member_transfer_account_contents' not set") + return self._value + + def get_secondary_mails_policy_changed(self): + """ + (members) Secondary mails policy changed + + Only call this if :meth:`is_secondary_mails_policy_changed` is true. + + :rtype: SecondaryMailsPolicyChangedType + """ + if not self.is_secondary_mails_policy_changed(): + raise AttributeError("tag 'secondary_mails_policy_changed' not set") + return self._value + + def get_paper_content_add_member(self): + """ + (paper) Added team member to Paper doc/folder + + Only call this if :meth:`is_paper_content_add_member` is true. + + :rtype: PaperContentAddMemberType + """ + if not self.is_paper_content_add_member(): + raise AttributeError("tag 'paper_content_add_member' not set") + return self._value + + def get_paper_content_add_to_folder(self): + """ + (paper) Added Paper doc/folder to folder + + Only call this if :meth:`is_paper_content_add_to_folder` is true. + + :rtype: PaperContentAddToFolderType + """ + if not self.is_paper_content_add_to_folder(): + raise AttributeError("tag 'paper_content_add_to_folder' not set") + return self._value + + def get_paper_content_archive(self): + """ + (paper) Archived Paper doc/folder + + Only call this if :meth:`is_paper_content_archive` is true. + + :rtype: PaperContentArchiveType + """ + if not self.is_paper_content_archive(): + raise AttributeError("tag 'paper_content_archive' not set") + return self._value + + def get_paper_content_create(self): + """ + (paper) Created Paper doc/folder + + Only call this if :meth:`is_paper_content_create` is true. + + :rtype: PaperContentCreateType + """ + if not self.is_paper_content_create(): + raise AttributeError("tag 'paper_content_create' not set") + return self._value + + def get_paper_content_permanently_delete(self): + """ + (paper) Permanently deleted Paper doc/folder + + Only call this if :meth:`is_paper_content_permanently_delete` is true. + + :rtype: PaperContentPermanentlyDeleteType + """ + if not self.is_paper_content_permanently_delete(): + raise AttributeError("tag 'paper_content_permanently_delete' not set") + return self._value + + def get_paper_content_remove_from_folder(self): + """ + (paper) Removed Paper doc/folder from folder + + Only call this if :meth:`is_paper_content_remove_from_folder` is true. + + :rtype: PaperContentRemoveFromFolderType + """ + if not self.is_paper_content_remove_from_folder(): + raise AttributeError("tag 'paper_content_remove_from_folder' not set") + return self._value + + def get_paper_content_remove_member(self): + """ + (paper) Removed team member from Paper doc/folder + + Only call this if :meth:`is_paper_content_remove_member` is true. + + :rtype: PaperContentRemoveMemberType + """ + if not self.is_paper_content_remove_member(): + raise AttributeError("tag 'paper_content_remove_member' not set") + return self._value + + def get_paper_content_rename(self): + """ + (paper) Renamed Paper doc/folder + + Only call this if :meth:`is_paper_content_rename` is true. + + :rtype: PaperContentRenameType + """ + if not self.is_paper_content_rename(): + raise AttributeError("tag 'paper_content_rename' not set") + return self._value + + def get_paper_content_restore(self): + """ + (paper) Restored archived Paper doc/folder + + Only call this if :meth:`is_paper_content_restore` is true. + + :rtype: PaperContentRestoreType + """ + if not self.is_paper_content_restore(): + raise AttributeError("tag 'paper_content_restore' not set") + return self._value + + def get_paper_doc_add_comment(self): + """ + (paper) Added Paper doc comment + + Only call this if :meth:`is_paper_doc_add_comment` is true. + + :rtype: PaperDocAddCommentType + """ + if not self.is_paper_doc_add_comment(): + raise AttributeError("tag 'paper_doc_add_comment' not set") + return self._value + + def get_paper_doc_change_member_role(self): + """ + (paper) Changed team member permissions for Paper doc + + Only call this if :meth:`is_paper_doc_change_member_role` is true. + + :rtype: PaperDocChangeMemberRoleType + """ + if not self.is_paper_doc_change_member_role(): + raise AttributeError("tag 'paper_doc_change_member_role' not set") + return self._value + + def get_paper_doc_change_sharing_policy(self): + """ + (paper) Changed sharing setting for Paper doc + + Only call this if :meth:`is_paper_doc_change_sharing_policy` is true. + + :rtype: PaperDocChangeSharingPolicyType + """ + if not self.is_paper_doc_change_sharing_policy(): + raise AttributeError("tag 'paper_doc_change_sharing_policy' not set") + return self._value + + def get_paper_doc_change_subscription(self): + """ + (paper) Followed/unfollowed Paper doc + + Only call this if :meth:`is_paper_doc_change_subscription` is true. + + :rtype: PaperDocChangeSubscriptionType + """ + if not self.is_paper_doc_change_subscription(): + raise AttributeError("tag 'paper_doc_change_subscription' not set") + return self._value + + def get_paper_doc_deleted(self): + """ + (paper) Archived Paper doc (deprecated, no longer logged) + + Only call this if :meth:`is_paper_doc_deleted` is true. + + :rtype: PaperDocDeletedType + """ + if not self.is_paper_doc_deleted(): + raise AttributeError("tag 'paper_doc_deleted' not set") + return self._value + + def get_paper_doc_delete_comment(self): + """ + (paper) Deleted Paper doc comment + + Only call this if :meth:`is_paper_doc_delete_comment` is true. + + :rtype: PaperDocDeleteCommentType + """ + if not self.is_paper_doc_delete_comment(): + raise AttributeError("tag 'paper_doc_delete_comment' not set") + return self._value + + def get_paper_doc_download(self): + """ + (paper) Downloaded Paper doc in specific format + + Only call this if :meth:`is_paper_doc_download` is true. + + :rtype: PaperDocDownloadType + """ + if not self.is_paper_doc_download(): + raise AttributeError("tag 'paper_doc_download' not set") + return self._value + + def get_paper_doc_edit(self): + """ + (paper) Edited Paper doc + + Only call this if :meth:`is_paper_doc_edit` is true. + + :rtype: PaperDocEditType + """ + if not self.is_paper_doc_edit(): + raise AttributeError("tag 'paper_doc_edit' not set") + return self._value + + def get_paper_doc_edit_comment(self): + """ + (paper) Edited Paper doc comment + + Only call this if :meth:`is_paper_doc_edit_comment` is true. + + :rtype: PaperDocEditCommentType + """ + if not self.is_paper_doc_edit_comment(): + raise AttributeError("tag 'paper_doc_edit_comment' not set") + return self._value + + def get_paper_doc_followed(self): + """ + (paper) Followed Paper doc (deprecated, replaced by 'Followed/unfollowed + Paper doc') + + Only call this if :meth:`is_paper_doc_followed` is true. + + :rtype: PaperDocFollowedType + """ + if not self.is_paper_doc_followed(): + raise AttributeError("tag 'paper_doc_followed' not set") + return self._value + + def get_paper_doc_mention(self): + """ + (paper) Mentioned team member in Paper doc + + Only call this if :meth:`is_paper_doc_mention` is true. + + :rtype: PaperDocMentionType + """ + if not self.is_paper_doc_mention(): + raise AttributeError("tag 'paper_doc_mention' not set") + return self._value + + def get_paper_doc_ownership_changed(self): + """ + (paper) Transferred ownership of Paper doc + + Only call this if :meth:`is_paper_doc_ownership_changed` is true. + + :rtype: PaperDocOwnershipChangedType + """ + if not self.is_paper_doc_ownership_changed(): + raise AttributeError("tag 'paper_doc_ownership_changed' not set") + return self._value + + def get_paper_doc_request_access(self): + """ + (paper) Requested access to Paper doc + + Only call this if :meth:`is_paper_doc_request_access` is true. + + :rtype: PaperDocRequestAccessType + """ + if not self.is_paper_doc_request_access(): + raise AttributeError("tag 'paper_doc_request_access' not set") + return self._value + + def get_paper_doc_resolve_comment(self): + """ + (paper) Resolved Paper doc comment + + Only call this if :meth:`is_paper_doc_resolve_comment` is true. + + :rtype: PaperDocResolveCommentType + """ + if not self.is_paper_doc_resolve_comment(): + raise AttributeError("tag 'paper_doc_resolve_comment' not set") + return self._value + + def get_paper_doc_revert(self): + """ + (paper) Restored Paper doc to previous version + + Only call this if :meth:`is_paper_doc_revert` is true. + + :rtype: PaperDocRevertType + """ + if not self.is_paper_doc_revert(): + raise AttributeError("tag 'paper_doc_revert' not set") + return self._value + + def get_paper_doc_slack_share(self): + """ + (paper) Shared Paper doc via Slack + + Only call this if :meth:`is_paper_doc_slack_share` is true. + + :rtype: PaperDocSlackShareType + """ + if not self.is_paper_doc_slack_share(): + raise AttributeError("tag 'paper_doc_slack_share' not set") + return self._value + + def get_paper_doc_team_invite(self): + """ + (paper) Shared Paper doc with team member (deprecated, no longer logged) + + Only call this if :meth:`is_paper_doc_team_invite` is true. + + :rtype: PaperDocTeamInviteType + """ + if not self.is_paper_doc_team_invite(): + raise AttributeError("tag 'paper_doc_team_invite' not set") + return self._value + + def get_paper_doc_trashed(self): + """ + (paper) Deleted Paper doc + + Only call this if :meth:`is_paper_doc_trashed` is true. + + :rtype: PaperDocTrashedType + """ + if not self.is_paper_doc_trashed(): + raise AttributeError("tag 'paper_doc_trashed' not set") + return self._value + + def get_paper_doc_unresolve_comment(self): + """ + (paper) Unresolved Paper doc comment + + Only call this if :meth:`is_paper_doc_unresolve_comment` is true. + + :rtype: PaperDocUnresolveCommentType + """ + if not self.is_paper_doc_unresolve_comment(): + raise AttributeError("tag 'paper_doc_unresolve_comment' not set") + return self._value + + def get_paper_doc_untrashed(self): + """ + (paper) Restored Paper doc + + Only call this if :meth:`is_paper_doc_untrashed` is true. + + :rtype: PaperDocUntrashedType + """ + if not self.is_paper_doc_untrashed(): + raise AttributeError("tag 'paper_doc_untrashed' not set") + return self._value + + def get_paper_doc_view(self): + """ + (paper) Viewed Paper doc + + Only call this if :meth:`is_paper_doc_view` is true. + + :rtype: PaperDocViewType + """ + if not self.is_paper_doc_view(): + raise AttributeError("tag 'paper_doc_view' not set") + return self._value + + def get_paper_external_view_allow(self): + """ + (paper) Changed Paper external sharing setting to anyone (deprecated, no + longer logged) + + Only call this if :meth:`is_paper_external_view_allow` is true. + + :rtype: PaperExternalViewAllowType + """ + if not self.is_paper_external_view_allow(): + raise AttributeError("tag 'paper_external_view_allow' not set") + return self._value + + def get_paper_external_view_default_team(self): + """ + (paper) Changed Paper external sharing setting to default team + (deprecated, no longer logged) + + Only call this if :meth:`is_paper_external_view_default_team` is true. + + :rtype: PaperExternalViewDefaultTeamType + """ + if not self.is_paper_external_view_default_team(): + raise AttributeError("tag 'paper_external_view_default_team' not set") + return self._value + + def get_paper_external_view_forbid(self): + """ + (paper) Changed Paper external sharing setting to team-only (deprecated, + no longer logged) + + Only call this if :meth:`is_paper_external_view_forbid` is true. + + :rtype: PaperExternalViewForbidType + """ + if not self.is_paper_external_view_forbid(): + raise AttributeError("tag 'paper_external_view_forbid' not set") + return self._value + + def get_paper_folder_change_subscription(self): + """ + (paper) Followed/unfollowed Paper folder + + Only call this if :meth:`is_paper_folder_change_subscription` is true. + + :rtype: PaperFolderChangeSubscriptionType + """ + if not self.is_paper_folder_change_subscription(): + raise AttributeError("tag 'paper_folder_change_subscription' not set") + return self._value + + def get_paper_folder_deleted(self): + """ + (paper) Archived Paper folder (deprecated, no longer logged) + + Only call this if :meth:`is_paper_folder_deleted` is true. + + :rtype: PaperFolderDeletedType + """ + if not self.is_paper_folder_deleted(): + raise AttributeError("tag 'paper_folder_deleted' not set") + return self._value + + def get_paper_folder_followed(self): + """ + (paper) Followed Paper folder (deprecated, replaced by + 'Followed/unfollowed Paper folder') + + Only call this if :meth:`is_paper_folder_followed` is true. + + :rtype: PaperFolderFollowedType + """ + if not self.is_paper_folder_followed(): + raise AttributeError("tag 'paper_folder_followed' not set") + return self._value + + def get_paper_folder_team_invite(self): + """ + (paper) Shared Paper folder with member (deprecated, no longer logged) + + Only call this if :meth:`is_paper_folder_team_invite` is true. + + :rtype: PaperFolderTeamInviteType + """ + if not self.is_paper_folder_team_invite(): + raise AttributeError("tag 'paper_folder_team_invite' not set") + return self._value + + def get_password_change(self): + """ + (passwords) Changed password + + Only call this if :meth:`is_password_change` is true. + + :rtype: PasswordChangeType + """ + if not self.is_password_change(): + raise AttributeError("tag 'password_change' not set") + return self._value + + def get_password_reset(self): + """ + (passwords) Reset password + + Only call this if :meth:`is_password_reset` is true. + + :rtype: PasswordResetType + """ + if not self.is_password_reset(): + raise AttributeError("tag 'password_reset' not set") + return self._value + + def get_password_reset_all(self): + """ + (passwords) Reset all team member passwords + + Only call this if :meth:`is_password_reset_all` is true. + + :rtype: PasswordResetAllType + """ + if not self.is_password_reset_all(): + raise AttributeError("tag 'password_reset_all' not set") + return self._value + + def get_emm_create_exceptions_report(self): + """ + (reports) Created EMM-excluded users report + + Only call this if :meth:`is_emm_create_exceptions_report` is true. + + :rtype: EmmCreateExceptionsReportType + """ + if not self.is_emm_create_exceptions_report(): + raise AttributeError("tag 'emm_create_exceptions_report' not set") + return self._value + + def get_emm_create_usage_report(self): + """ + (reports) Created EMM mobile app usage report + + Only call this if :meth:`is_emm_create_usage_report` is true. + + :rtype: EmmCreateUsageReportType + """ + if not self.is_emm_create_usage_report(): + raise AttributeError("tag 'emm_create_usage_report' not set") + return self._value + + def get_export_members_report(self): + """ + (reports) Created member data report + + Only call this if :meth:`is_export_members_report` is true. + + :rtype: ExportMembersReportType + """ + if not self.is_export_members_report(): + raise AttributeError("tag 'export_members_report' not set") + return self._value + + def get_paper_admin_export_start(self): + """ + (reports) Exported all team Paper docs + + Only call this if :meth:`is_paper_admin_export_start` is true. + + :rtype: PaperAdminExportStartType + """ + if not self.is_paper_admin_export_start(): + raise AttributeError("tag 'paper_admin_export_start' not set") + return self._value + + def get_smart_sync_create_admin_privilege_report(self): + """ + (reports) Created Smart Sync non-admin devices report + + Only call this if :meth:`is_smart_sync_create_admin_privilege_report` is true. + + :rtype: SmartSyncCreateAdminPrivilegeReportType + """ + if not self.is_smart_sync_create_admin_privilege_report(): + raise AttributeError("tag 'smart_sync_create_admin_privilege_report' not set") + return self._value + + def get_team_activity_create_report(self): + """ + (reports) Created team activity report + + Only call this if :meth:`is_team_activity_create_report` is true. + + :rtype: TeamActivityCreateReportType + """ + if not self.is_team_activity_create_report(): + raise AttributeError("tag 'team_activity_create_report' not set") + return self._value + + def get_collection_share(self): + """ + (sharing) Shared album + + Only call this if :meth:`is_collection_share` is true. + + :rtype: CollectionShareType + """ + if not self.is_collection_share(): + raise AttributeError("tag 'collection_share' not set") + return self._value + + def get_note_acl_invite_only(self): + """ + (sharing) Changed Paper doc to invite-only (deprecated, no longer + logged) + + Only call this if :meth:`is_note_acl_invite_only` is true. + + :rtype: NoteAclInviteOnlyType + """ + if not self.is_note_acl_invite_only(): + raise AttributeError("tag 'note_acl_invite_only' not set") + return self._value + + def get_note_acl_link(self): + """ + (sharing) Changed Paper doc to link-accessible (deprecated, no longer + logged) + + Only call this if :meth:`is_note_acl_link` is true. + + :rtype: NoteAclLinkType + """ + if not self.is_note_acl_link(): + raise AttributeError("tag 'note_acl_link' not set") + return self._value + + def get_note_acl_team_link(self): + """ + (sharing) Changed Paper doc to link-accessible for team (deprecated, no + longer logged) + + Only call this if :meth:`is_note_acl_team_link` is true. + + :rtype: NoteAclTeamLinkType + """ + if not self.is_note_acl_team_link(): + raise AttributeError("tag 'note_acl_team_link' not set") + return self._value + + def get_note_shared(self): + """ + (sharing) Shared Paper doc (deprecated, no longer logged) + + Only call this if :meth:`is_note_shared` is true. + + :rtype: NoteSharedType + """ + if not self.is_note_shared(): + raise AttributeError("tag 'note_shared' not set") + return self._value + + def get_note_share_receive(self): + """ + (sharing) Shared received Paper doc (deprecated, no longer logged) + + Only call this if :meth:`is_note_share_receive` is true. + + :rtype: NoteShareReceiveType + """ + if not self.is_note_share_receive(): + raise AttributeError("tag 'note_share_receive' not set") + return self._value + + def get_open_note_shared(self): + """ + (sharing) Opened shared Paper doc (deprecated, no longer logged) + + Only call this if :meth:`is_open_note_shared` is true. + + :rtype: OpenNoteSharedType + """ + if not self.is_open_note_shared(): + raise AttributeError("tag 'open_note_shared' not set") + return self._value + + def get_sf_add_group(self): + """ + (sharing) Added team to shared folder (deprecated, no longer logged) + + Only call this if :meth:`is_sf_add_group` is true. + + :rtype: SfAddGroupType + """ + if not self.is_sf_add_group(): + raise AttributeError("tag 'sf_add_group' not set") + return self._value + + def get_sf_allow_non_members_to_view_shared_links(self): + """ + (sharing) Allowed non-collaborators to view links to files in shared + folder (deprecated, no longer logged) + + Only call this if :meth:`is_sf_allow_non_members_to_view_shared_links` is true. + + :rtype: SfAllowNonMembersToViewSharedLinksType + """ + if not self.is_sf_allow_non_members_to_view_shared_links(): + raise AttributeError("tag 'sf_allow_non_members_to_view_shared_links' not set") + return self._value + + def get_sf_external_invite_warn(self): + """ + (sharing) Set team members to see warning before sharing folders outside + team (deprecated, no longer logged) + + Only call this if :meth:`is_sf_external_invite_warn` is true. + + :rtype: SfExternalInviteWarnType + """ + if not self.is_sf_external_invite_warn(): + raise AttributeError("tag 'sf_external_invite_warn' not set") + return self._value + + def get_sf_fb_invite(self): + """ + (sharing) Invited Facebook users to shared folder (deprecated, no longer + logged) + + Only call this if :meth:`is_sf_fb_invite` is true. + + :rtype: SfFbInviteType + """ + if not self.is_sf_fb_invite(): + raise AttributeError("tag 'sf_fb_invite' not set") + return self._value + + def get_sf_fb_invite_change_role(self): + """ + (sharing) Changed Facebook user's role in shared folder (deprecated, no + longer logged) + + Only call this if :meth:`is_sf_fb_invite_change_role` is true. + + :rtype: SfFbInviteChangeRoleType + """ + if not self.is_sf_fb_invite_change_role(): + raise AttributeError("tag 'sf_fb_invite_change_role' not set") + return self._value + + def get_sf_fb_uninvite(self): + """ + (sharing) Uninvited Facebook user from shared folder (deprecated, no + longer logged) + + Only call this if :meth:`is_sf_fb_uninvite` is true. + + :rtype: SfFbUninviteType + """ + if not self.is_sf_fb_uninvite(): + raise AttributeError("tag 'sf_fb_uninvite' not set") + return self._value + + def get_sf_invite_group(self): + """ + (sharing) Invited group to shared folder (deprecated, no longer logged) + + Only call this if :meth:`is_sf_invite_group` is true. + + :rtype: SfInviteGroupType + """ + if not self.is_sf_invite_group(): + raise AttributeError("tag 'sf_invite_group' not set") + return self._value + + def get_sf_team_grant_access(self): + """ + (sharing) Granted access to shared folder (deprecated, no longer logged) + + Only call this if :meth:`is_sf_team_grant_access` is true. + + :rtype: SfTeamGrantAccessType + """ + if not self.is_sf_team_grant_access(): + raise AttributeError("tag 'sf_team_grant_access' not set") + return self._value + + def get_sf_team_invite(self): + """ + (sharing) Invited team members to shared folder (deprecated, replaced by + 'Invited user to Dropbox and added them to shared file/folder') + + Only call this if :meth:`is_sf_team_invite` is true. + + :rtype: SfTeamInviteType + """ + if not self.is_sf_team_invite(): + raise AttributeError("tag 'sf_team_invite' not set") + return self._value + + def get_sf_team_invite_change_role(self): + """ + (sharing) Changed team member's role in shared folder (deprecated, no + longer logged) + + Only call this if :meth:`is_sf_team_invite_change_role` is true. + + :rtype: SfTeamInviteChangeRoleType + """ + if not self.is_sf_team_invite_change_role(): + raise AttributeError("tag 'sf_team_invite_change_role' not set") + return self._value + + def get_sf_team_join(self): + """ + (sharing) Joined team member's shared folder (deprecated, no longer + logged) + + Only call this if :meth:`is_sf_team_join` is true. + + :rtype: SfTeamJoinType + """ + if not self.is_sf_team_join(): + raise AttributeError("tag 'sf_team_join' not set") + return self._value + + def get_sf_team_join_from_oob_link(self): + """ + (sharing) Joined team member's shared folder from link (deprecated, no + longer logged) + + Only call this if :meth:`is_sf_team_join_from_oob_link` is true. + + :rtype: SfTeamJoinFromOobLinkType + """ + if not self.is_sf_team_join_from_oob_link(): + raise AttributeError("tag 'sf_team_join_from_oob_link' not set") + return self._value + + def get_sf_team_uninvite(self): + """ + (sharing) Unshared folder with team member (deprecated, replaced by + 'Removed invitee from shared file/folder before invite was accepted') + + Only call this if :meth:`is_sf_team_uninvite` is true. + + :rtype: SfTeamUninviteType + """ + if not self.is_sf_team_uninvite(): + raise AttributeError("tag 'sf_team_uninvite' not set") + return self._value + + def get_shared_content_add_invitees(self): + """ + (sharing) Invited user to Dropbox and added them to shared file/folder + + Only call this if :meth:`is_shared_content_add_invitees` is true. + + :rtype: SharedContentAddInviteesType + """ + if not self.is_shared_content_add_invitees(): + raise AttributeError("tag 'shared_content_add_invitees' not set") + return self._value + + def get_shared_content_add_link_expiry(self): + """ + (sharing) Added expiration date to link for shared file/folder + + Only call this if :meth:`is_shared_content_add_link_expiry` is true. + + :rtype: SharedContentAddLinkExpiryType + """ + if not self.is_shared_content_add_link_expiry(): + raise AttributeError("tag 'shared_content_add_link_expiry' not set") + return self._value + + def get_shared_content_add_link_password(self): + """ + (sharing) Added password to link for shared file/folder + + Only call this if :meth:`is_shared_content_add_link_password` is true. + + :rtype: SharedContentAddLinkPasswordType + """ + if not self.is_shared_content_add_link_password(): + raise AttributeError("tag 'shared_content_add_link_password' not set") + return self._value + + def get_shared_content_add_member(self): + """ + (sharing) Added users and/or groups to shared file/folder + + Only call this if :meth:`is_shared_content_add_member` is true. + + :rtype: SharedContentAddMemberType + """ + if not self.is_shared_content_add_member(): + raise AttributeError("tag 'shared_content_add_member' not set") + return self._value + + def get_shared_content_change_downloads_policy(self): + """ + (sharing) Changed whether members can download shared file/folder + + Only call this if :meth:`is_shared_content_change_downloads_policy` is true. + + :rtype: SharedContentChangeDownloadsPolicyType + """ + if not self.is_shared_content_change_downloads_policy(): + raise AttributeError("tag 'shared_content_change_downloads_policy' not set") + return self._value + + def get_shared_content_change_invitee_role(self): + """ + (sharing) Changed access type of invitee to shared file/folder before + invite was accepted + + Only call this if :meth:`is_shared_content_change_invitee_role` is true. + + :rtype: SharedContentChangeInviteeRoleType + """ + if not self.is_shared_content_change_invitee_role(): + raise AttributeError("tag 'shared_content_change_invitee_role' not set") + return self._value + + def get_shared_content_change_link_audience(self): + """ + (sharing) Changed link audience of shared file/folder + + Only call this if :meth:`is_shared_content_change_link_audience` is true. + + :rtype: SharedContentChangeLinkAudienceType + """ + if not self.is_shared_content_change_link_audience(): + raise AttributeError("tag 'shared_content_change_link_audience' not set") + return self._value + + def get_shared_content_change_link_expiry(self): + """ + (sharing) Changed link expiration of shared file/folder + + Only call this if :meth:`is_shared_content_change_link_expiry` is true. + + :rtype: SharedContentChangeLinkExpiryType + """ + if not self.is_shared_content_change_link_expiry(): + raise AttributeError("tag 'shared_content_change_link_expiry' not set") + return self._value + + def get_shared_content_change_link_password(self): + """ + (sharing) Changed link password of shared file/folder + + Only call this if :meth:`is_shared_content_change_link_password` is true. + + :rtype: SharedContentChangeLinkPasswordType + """ + if not self.is_shared_content_change_link_password(): + raise AttributeError("tag 'shared_content_change_link_password' not set") + return self._value + + def get_shared_content_change_member_role(self): + """ + (sharing) Changed access type of shared file/folder member + + Only call this if :meth:`is_shared_content_change_member_role` is true. + + :rtype: SharedContentChangeMemberRoleType + """ + if not self.is_shared_content_change_member_role(): + raise AttributeError("tag 'shared_content_change_member_role' not set") + return self._value + + def get_shared_content_change_viewer_info_policy(self): + """ + (sharing) Changed whether members can see who viewed shared file/folder + + Only call this if :meth:`is_shared_content_change_viewer_info_policy` is true. + + :rtype: SharedContentChangeViewerInfoPolicyType + """ + if not self.is_shared_content_change_viewer_info_policy(): + raise AttributeError("tag 'shared_content_change_viewer_info_policy' not set") + return self._value + + def get_shared_content_claim_invitation(self): + """ + (sharing) Acquired membership of shared file/folder by accepting invite + + Only call this if :meth:`is_shared_content_claim_invitation` is true. + + :rtype: SharedContentClaimInvitationType + """ + if not self.is_shared_content_claim_invitation(): + raise AttributeError("tag 'shared_content_claim_invitation' not set") + return self._value + + def get_shared_content_copy(self): + """ + (sharing) Copied shared file/folder to own Dropbox + + Only call this if :meth:`is_shared_content_copy` is true. + + :rtype: SharedContentCopyType + """ + if not self.is_shared_content_copy(): + raise AttributeError("tag 'shared_content_copy' not set") + return self._value + + def get_shared_content_download(self): + """ + (sharing) Downloaded shared file/folder + + Only call this if :meth:`is_shared_content_download` is true. + + :rtype: SharedContentDownloadType + """ + if not self.is_shared_content_download(): + raise AttributeError("tag 'shared_content_download' not set") + return self._value + + def get_shared_content_relinquish_membership(self): + """ + (sharing) Left shared file/folder + + Only call this if :meth:`is_shared_content_relinquish_membership` is true. + + :rtype: SharedContentRelinquishMembershipType + """ + if not self.is_shared_content_relinquish_membership(): + raise AttributeError("tag 'shared_content_relinquish_membership' not set") + return self._value + + def get_shared_content_remove_invitees(self): + """ + (sharing) Removed invitee from shared file/folder before invite was + accepted + + Only call this if :meth:`is_shared_content_remove_invitees` is true. + + :rtype: SharedContentRemoveInviteesType + """ + if not self.is_shared_content_remove_invitees(): + raise AttributeError("tag 'shared_content_remove_invitees' not set") + return self._value + + def get_shared_content_remove_link_expiry(self): + """ + (sharing) Removed link expiration date of shared file/folder + + Only call this if :meth:`is_shared_content_remove_link_expiry` is true. + + :rtype: SharedContentRemoveLinkExpiryType + """ + if not self.is_shared_content_remove_link_expiry(): + raise AttributeError("tag 'shared_content_remove_link_expiry' not set") + return self._value + + def get_shared_content_remove_link_password(self): + """ + (sharing) Removed link password of shared file/folder + + Only call this if :meth:`is_shared_content_remove_link_password` is true. + + :rtype: SharedContentRemoveLinkPasswordType + """ + if not self.is_shared_content_remove_link_password(): + raise AttributeError("tag 'shared_content_remove_link_password' not set") + return self._value + + def get_shared_content_remove_member(self): + """ + (sharing) Removed user/group from shared file/folder + + Only call this if :meth:`is_shared_content_remove_member` is true. + + :rtype: SharedContentRemoveMemberType + """ + if not self.is_shared_content_remove_member(): + raise AttributeError("tag 'shared_content_remove_member' not set") + return self._value + + def get_shared_content_request_access(self): + """ + (sharing) Requested access to shared file/folder + + Only call this if :meth:`is_shared_content_request_access` is true. + + :rtype: SharedContentRequestAccessType + """ + if not self.is_shared_content_request_access(): + raise AttributeError("tag 'shared_content_request_access' not set") + return self._value + + def get_shared_content_unshare(self): + """ + (sharing) Unshared file/folder by clearing membership and turning off + link + + Only call this if :meth:`is_shared_content_unshare` is true. + + :rtype: SharedContentUnshareType + """ + if not self.is_shared_content_unshare(): + raise AttributeError("tag 'shared_content_unshare' not set") + return self._value + + def get_shared_content_view(self): + """ + (sharing) Previewed shared file/folder + + Only call this if :meth:`is_shared_content_view` is true. + + :rtype: SharedContentViewType + """ + if not self.is_shared_content_view(): + raise AttributeError("tag 'shared_content_view' not set") + return self._value + + def get_shared_folder_change_link_policy(self): + """ + (sharing) Changed who can access shared folder via link + + Only call this if :meth:`is_shared_folder_change_link_policy` is true. + + :rtype: SharedFolderChangeLinkPolicyType + """ + if not self.is_shared_folder_change_link_policy(): + raise AttributeError("tag 'shared_folder_change_link_policy' not set") + return self._value + + def get_shared_folder_change_members_inheritance_policy(self): + """ + (sharing) Changed whether shared folder inherits members from parent + folder + + Only call this if :meth:`is_shared_folder_change_members_inheritance_policy` is true. + + :rtype: SharedFolderChangeMembersInheritancePolicyType + """ + if not self.is_shared_folder_change_members_inheritance_policy(): + raise AttributeError("tag 'shared_folder_change_members_inheritance_policy' not set") + return self._value + + def get_shared_folder_change_members_management_policy(self): + """ + (sharing) Changed who can add/remove members of shared folder + + Only call this if :meth:`is_shared_folder_change_members_management_policy` is true. + + :rtype: SharedFolderChangeMembersManagementPolicyType + """ + if not self.is_shared_folder_change_members_management_policy(): + raise AttributeError("tag 'shared_folder_change_members_management_policy' not set") + return self._value + + def get_shared_folder_change_members_policy(self): + """ + (sharing) Changed who can become member of shared folder + + Only call this if :meth:`is_shared_folder_change_members_policy` is true. + + :rtype: SharedFolderChangeMembersPolicyType + """ + if not self.is_shared_folder_change_members_policy(): + raise AttributeError("tag 'shared_folder_change_members_policy' not set") + return self._value + + def get_shared_folder_create(self): + """ + (sharing) Created shared folder + + Only call this if :meth:`is_shared_folder_create` is true. + + :rtype: SharedFolderCreateType + """ + if not self.is_shared_folder_create(): + raise AttributeError("tag 'shared_folder_create' not set") + return self._value + + def get_shared_folder_decline_invitation(self): + """ + (sharing) Declined team member's invite to shared folder + + Only call this if :meth:`is_shared_folder_decline_invitation` is true. + + :rtype: SharedFolderDeclineInvitationType + """ + if not self.is_shared_folder_decline_invitation(): + raise AttributeError("tag 'shared_folder_decline_invitation' not set") + return self._value + + def get_shared_folder_mount(self): + """ + (sharing) Added shared folder to own Dropbox + + Only call this if :meth:`is_shared_folder_mount` is true. + + :rtype: SharedFolderMountType + """ + if not self.is_shared_folder_mount(): + raise AttributeError("tag 'shared_folder_mount' not set") + return self._value + + def get_shared_folder_nest(self): + """ + (sharing) Changed parent of shared folder + + Only call this if :meth:`is_shared_folder_nest` is true. + + :rtype: SharedFolderNestType + """ + if not self.is_shared_folder_nest(): + raise AttributeError("tag 'shared_folder_nest' not set") + return self._value + + def get_shared_folder_transfer_ownership(self): + """ + (sharing) Transferred ownership of shared folder to another member + + Only call this if :meth:`is_shared_folder_transfer_ownership` is true. + + :rtype: SharedFolderTransferOwnershipType + """ + if not self.is_shared_folder_transfer_ownership(): + raise AttributeError("tag 'shared_folder_transfer_ownership' not set") + return self._value + + def get_shared_folder_unmount(self): + """ + (sharing) Deleted shared folder from Dropbox + + Only call this if :meth:`is_shared_folder_unmount` is true. + + :rtype: SharedFolderUnmountType + """ + if not self.is_shared_folder_unmount(): + raise AttributeError("tag 'shared_folder_unmount' not set") + return self._value + + def get_shared_link_add_expiry(self): + """ + (sharing) Added shared link expiration date + + Only call this if :meth:`is_shared_link_add_expiry` is true. + + :rtype: SharedLinkAddExpiryType + """ + if not self.is_shared_link_add_expiry(): + raise AttributeError("tag 'shared_link_add_expiry' not set") + return self._value + + def get_shared_link_change_expiry(self): + """ + (sharing) Changed shared link expiration date + + Only call this if :meth:`is_shared_link_change_expiry` is true. + + :rtype: SharedLinkChangeExpiryType + """ + if not self.is_shared_link_change_expiry(): + raise AttributeError("tag 'shared_link_change_expiry' not set") + return self._value + + def get_shared_link_change_visibility(self): + """ + (sharing) Changed visibility of shared link + + Only call this if :meth:`is_shared_link_change_visibility` is true. + + :rtype: SharedLinkChangeVisibilityType + """ + if not self.is_shared_link_change_visibility(): + raise AttributeError("tag 'shared_link_change_visibility' not set") + return self._value + + def get_shared_link_copy(self): + """ + (sharing) Added file/folder to Dropbox from shared link + + Only call this if :meth:`is_shared_link_copy` is true. + + :rtype: SharedLinkCopyType + """ + if not self.is_shared_link_copy(): + raise AttributeError("tag 'shared_link_copy' not set") + return self._value + + def get_shared_link_create(self): + """ + (sharing) Created shared link + + Only call this if :meth:`is_shared_link_create` is true. + + :rtype: SharedLinkCreateType + """ + if not self.is_shared_link_create(): + raise AttributeError("tag 'shared_link_create' not set") + return self._value + + def get_shared_link_disable(self): + """ + (sharing) Removed shared link + + Only call this if :meth:`is_shared_link_disable` is true. + + :rtype: SharedLinkDisableType + """ + if not self.is_shared_link_disable(): + raise AttributeError("tag 'shared_link_disable' not set") + return self._value + + def get_shared_link_download(self): + """ + (sharing) Downloaded file/folder from shared link + + Only call this if :meth:`is_shared_link_download` is true. + + :rtype: SharedLinkDownloadType + """ + if not self.is_shared_link_download(): + raise AttributeError("tag 'shared_link_download' not set") + return self._value + + def get_shared_link_remove_expiry(self): + """ + (sharing) Removed shared link expiration date + + Only call this if :meth:`is_shared_link_remove_expiry` is true. + + :rtype: SharedLinkRemoveExpiryType + """ + if not self.is_shared_link_remove_expiry(): + raise AttributeError("tag 'shared_link_remove_expiry' not set") + return self._value + + def get_shared_link_share(self): + """ + (sharing) Added members as audience of shared link + + Only call this if :meth:`is_shared_link_share` is true. + + :rtype: SharedLinkShareType + """ + if not self.is_shared_link_share(): + raise AttributeError("tag 'shared_link_share' not set") + return self._value + + def get_shared_link_view(self): + """ + (sharing) Opened shared link + + Only call this if :meth:`is_shared_link_view` is true. + + :rtype: SharedLinkViewType + """ + if not self.is_shared_link_view(): + raise AttributeError("tag 'shared_link_view' not set") + return self._value + + def get_shared_note_opened(self): + """ + (sharing) Opened shared Paper doc (deprecated, no longer logged) + + Only call this if :meth:`is_shared_note_opened` is true. + + :rtype: SharedNoteOpenedType + """ + if not self.is_shared_note_opened(): + raise AttributeError("tag 'shared_note_opened' not set") + return self._value + + def get_shmodel_group_share(self): + """ + (sharing) Shared link with group (deprecated, no longer logged) + + Only call this if :meth:`is_shmodel_group_share` is true. + + :rtype: ShmodelGroupShareType + """ + if not self.is_shmodel_group_share(): + raise AttributeError("tag 'shmodel_group_share' not set") + return self._value + + def get_showcase_access_granted(self): + """ + (showcase) Granted access to showcase + + Only call this if :meth:`is_showcase_access_granted` is true. + + :rtype: ShowcaseAccessGrantedType + """ + if not self.is_showcase_access_granted(): + raise AttributeError("tag 'showcase_access_granted' not set") + return self._value + + def get_showcase_add_member(self): + """ + (showcase) Added member to showcase + + Only call this if :meth:`is_showcase_add_member` is true. + + :rtype: ShowcaseAddMemberType + """ + if not self.is_showcase_add_member(): + raise AttributeError("tag 'showcase_add_member' not set") + return self._value + + def get_showcase_archived(self): + """ + (showcase) Archived showcase + + Only call this if :meth:`is_showcase_archived` is true. + + :rtype: ShowcaseArchivedType + """ + if not self.is_showcase_archived(): + raise AttributeError("tag 'showcase_archived' not set") + return self._value + + def get_showcase_created(self): + """ + (showcase) Created showcase + + Only call this if :meth:`is_showcase_created` is true. + + :rtype: ShowcaseCreatedType + """ + if not self.is_showcase_created(): + raise AttributeError("tag 'showcase_created' not set") + return self._value + + def get_showcase_delete_comment(self): + """ + (showcase) Deleted showcase comment + + Only call this if :meth:`is_showcase_delete_comment` is true. + + :rtype: ShowcaseDeleteCommentType + """ + if not self.is_showcase_delete_comment(): + raise AttributeError("tag 'showcase_delete_comment' not set") + return self._value + + def get_showcase_edited(self): + """ + (showcase) Edited showcase + + Only call this if :meth:`is_showcase_edited` is true. + + :rtype: ShowcaseEditedType + """ + if not self.is_showcase_edited(): + raise AttributeError("tag 'showcase_edited' not set") + return self._value + + def get_showcase_edit_comment(self): + """ + (showcase) Edited showcase comment + + Only call this if :meth:`is_showcase_edit_comment` is true. + + :rtype: ShowcaseEditCommentType + """ + if not self.is_showcase_edit_comment(): + raise AttributeError("tag 'showcase_edit_comment' not set") + return self._value + + def get_showcase_file_added(self): + """ + (showcase) Added file to showcase + + Only call this if :meth:`is_showcase_file_added` is true. + + :rtype: ShowcaseFileAddedType + """ + if not self.is_showcase_file_added(): + raise AttributeError("tag 'showcase_file_added' not set") + return self._value + + def get_showcase_file_download(self): + """ + (showcase) Downloaded file from showcase + + Only call this if :meth:`is_showcase_file_download` is true. + + :rtype: ShowcaseFileDownloadType + """ + if not self.is_showcase_file_download(): + raise AttributeError("tag 'showcase_file_download' not set") + return self._value + + def get_showcase_file_removed(self): + """ + (showcase) Removed file from showcase + + Only call this if :meth:`is_showcase_file_removed` is true. + + :rtype: ShowcaseFileRemovedType + """ + if not self.is_showcase_file_removed(): + raise AttributeError("tag 'showcase_file_removed' not set") + return self._value + + def get_showcase_file_view(self): + """ + (showcase) Viewed file in showcase + + Only call this if :meth:`is_showcase_file_view` is true. + + :rtype: ShowcaseFileViewType + """ + if not self.is_showcase_file_view(): + raise AttributeError("tag 'showcase_file_view' not set") + return self._value + + def get_showcase_permanently_deleted(self): + """ + (showcase) Permanently deleted showcase + + Only call this if :meth:`is_showcase_permanently_deleted` is true. + + :rtype: ShowcasePermanentlyDeletedType + """ + if not self.is_showcase_permanently_deleted(): + raise AttributeError("tag 'showcase_permanently_deleted' not set") + return self._value + + def get_showcase_post_comment(self): + """ + (showcase) Added showcase comment + + Only call this if :meth:`is_showcase_post_comment` is true. + + :rtype: ShowcasePostCommentType + """ + if not self.is_showcase_post_comment(): + raise AttributeError("tag 'showcase_post_comment' not set") + return self._value + + def get_showcase_remove_member(self): + """ + (showcase) Removed member from showcase + + Only call this if :meth:`is_showcase_remove_member` is true. + + :rtype: ShowcaseRemoveMemberType + """ + if not self.is_showcase_remove_member(): + raise AttributeError("tag 'showcase_remove_member' not set") + return self._value + + def get_showcase_renamed(self): + """ + (showcase) Renamed showcase + + Only call this if :meth:`is_showcase_renamed` is true. + + :rtype: ShowcaseRenamedType + """ + if not self.is_showcase_renamed(): + raise AttributeError("tag 'showcase_renamed' not set") + return self._value + + def get_showcase_request_access(self): + """ + (showcase) Requested access to showcase + + Only call this if :meth:`is_showcase_request_access` is true. + + :rtype: ShowcaseRequestAccessType + """ + if not self.is_showcase_request_access(): + raise AttributeError("tag 'showcase_request_access' not set") + return self._value + + def get_showcase_resolve_comment(self): + """ + (showcase) Resolved showcase comment + + Only call this if :meth:`is_showcase_resolve_comment` is true. + + :rtype: ShowcaseResolveCommentType + """ + if not self.is_showcase_resolve_comment(): + raise AttributeError("tag 'showcase_resolve_comment' not set") + return self._value + + def get_showcase_restored(self): + """ + (showcase) Unarchived showcase + + Only call this if :meth:`is_showcase_restored` is true. + + :rtype: ShowcaseRestoredType + """ + if not self.is_showcase_restored(): + raise AttributeError("tag 'showcase_restored' not set") + return self._value + + def get_showcase_trashed(self): + """ + (showcase) Deleted showcase + + Only call this if :meth:`is_showcase_trashed` is true. + + :rtype: ShowcaseTrashedType + """ + if not self.is_showcase_trashed(): + raise AttributeError("tag 'showcase_trashed' not set") + return self._value + + def get_showcase_trashed_deprecated(self): + """ + (showcase) Deleted showcase (old version) (deprecated, replaced by + 'Deleted showcase') + + Only call this if :meth:`is_showcase_trashed_deprecated` is true. + + :rtype: ShowcaseTrashedDeprecatedType + """ + if not self.is_showcase_trashed_deprecated(): + raise AttributeError("tag 'showcase_trashed_deprecated' not set") + return self._value + + def get_showcase_unresolve_comment(self): + """ + (showcase) Unresolved showcase comment + + Only call this if :meth:`is_showcase_unresolve_comment` is true. + + :rtype: ShowcaseUnresolveCommentType + """ + if not self.is_showcase_unresolve_comment(): + raise AttributeError("tag 'showcase_unresolve_comment' not set") + return self._value + + def get_showcase_untrashed(self): + """ + (showcase) Restored showcase + + Only call this if :meth:`is_showcase_untrashed` is true. + + :rtype: ShowcaseUntrashedType + """ + if not self.is_showcase_untrashed(): + raise AttributeError("tag 'showcase_untrashed' not set") + return self._value + + def get_showcase_untrashed_deprecated(self): + """ + (showcase) Restored showcase (old version) (deprecated, replaced by + 'Restored showcase') + + Only call this if :meth:`is_showcase_untrashed_deprecated` is true. + + :rtype: ShowcaseUntrashedDeprecatedType + """ + if not self.is_showcase_untrashed_deprecated(): + raise AttributeError("tag 'showcase_untrashed_deprecated' not set") + return self._value + + def get_showcase_view(self): + """ + (showcase) Viewed showcase + + Only call this if :meth:`is_showcase_view` is true. + + :rtype: ShowcaseViewType + """ + if not self.is_showcase_view(): + raise AttributeError("tag 'showcase_view' not set") + return self._value + + def get_sso_add_cert(self): + """ + (sso) Added X.509 certificate for SSO + + Only call this if :meth:`is_sso_add_cert` is true. + + :rtype: SsoAddCertType + """ + if not self.is_sso_add_cert(): + raise AttributeError("tag 'sso_add_cert' not set") + return self._value + + def get_sso_add_login_url(self): + """ + (sso) Added sign-in URL for SSO + + Only call this if :meth:`is_sso_add_login_url` is true. + + :rtype: SsoAddLoginUrlType + """ + if not self.is_sso_add_login_url(): + raise AttributeError("tag 'sso_add_login_url' not set") + return self._value + + def get_sso_add_logout_url(self): + """ + (sso) Added sign-out URL for SSO + + Only call this if :meth:`is_sso_add_logout_url` is true. + + :rtype: SsoAddLogoutUrlType + """ + if not self.is_sso_add_logout_url(): + raise AttributeError("tag 'sso_add_logout_url' not set") + return self._value + + def get_sso_change_cert(self): + """ + (sso) Changed X.509 certificate for SSO + + Only call this if :meth:`is_sso_change_cert` is true. + + :rtype: SsoChangeCertType + """ + if not self.is_sso_change_cert(): + raise AttributeError("tag 'sso_change_cert' not set") + return self._value + + def get_sso_change_login_url(self): + """ + (sso) Changed sign-in URL for SSO + + Only call this if :meth:`is_sso_change_login_url` is true. + + :rtype: SsoChangeLoginUrlType + """ + if not self.is_sso_change_login_url(): + raise AttributeError("tag 'sso_change_login_url' not set") + return self._value + + def get_sso_change_logout_url(self): + """ + (sso) Changed sign-out URL for SSO + + Only call this if :meth:`is_sso_change_logout_url` is true. + + :rtype: SsoChangeLogoutUrlType + """ + if not self.is_sso_change_logout_url(): + raise AttributeError("tag 'sso_change_logout_url' not set") + return self._value + + def get_sso_change_saml_identity_mode(self): + """ + (sso) Changed SAML identity mode for SSO + + Only call this if :meth:`is_sso_change_saml_identity_mode` is true. + + :rtype: SsoChangeSamlIdentityModeType + """ + if not self.is_sso_change_saml_identity_mode(): + raise AttributeError("tag 'sso_change_saml_identity_mode' not set") + return self._value + + def get_sso_remove_cert(self): + """ + (sso) Removed X.509 certificate for SSO + + Only call this if :meth:`is_sso_remove_cert` is true. + + :rtype: SsoRemoveCertType + """ + if not self.is_sso_remove_cert(): + raise AttributeError("tag 'sso_remove_cert' not set") + return self._value + + def get_sso_remove_login_url(self): + """ + (sso) Removed sign-in URL for SSO + + Only call this if :meth:`is_sso_remove_login_url` is true. + + :rtype: SsoRemoveLoginUrlType + """ + if not self.is_sso_remove_login_url(): + raise AttributeError("tag 'sso_remove_login_url' not set") + return self._value + + def get_sso_remove_logout_url(self): + """ + (sso) Removed sign-out URL for SSO + + Only call this if :meth:`is_sso_remove_logout_url` is true. + + :rtype: SsoRemoveLogoutUrlType + """ + if not self.is_sso_remove_logout_url(): + raise AttributeError("tag 'sso_remove_logout_url' not set") + return self._value + + def get_team_folder_change_status(self): + """ + (team_folders) Changed archival status of team folder + + Only call this if :meth:`is_team_folder_change_status` is true. + + :rtype: TeamFolderChangeStatusType + """ + if not self.is_team_folder_change_status(): + raise AttributeError("tag 'team_folder_change_status' not set") + return self._value + + def get_team_folder_create(self): + """ + (team_folders) Created team folder in active status + + Only call this if :meth:`is_team_folder_create` is true. + + :rtype: TeamFolderCreateType + """ + if not self.is_team_folder_create(): + raise AttributeError("tag 'team_folder_create' not set") + return self._value + + def get_team_folder_downgrade(self): + """ + (team_folders) Downgraded team folder to regular shared folder + + Only call this if :meth:`is_team_folder_downgrade` is true. + + :rtype: TeamFolderDowngradeType + """ + if not self.is_team_folder_downgrade(): + raise AttributeError("tag 'team_folder_downgrade' not set") + return self._value + + def get_team_folder_permanently_delete(self): + """ + (team_folders) Permanently deleted archived team folder + + Only call this if :meth:`is_team_folder_permanently_delete` is true. + + :rtype: TeamFolderPermanentlyDeleteType + """ + if not self.is_team_folder_permanently_delete(): + raise AttributeError("tag 'team_folder_permanently_delete' not set") + return self._value + + def get_team_folder_rename(self): + """ + (team_folders) Renamed active/archived team folder + + Only call this if :meth:`is_team_folder_rename` is true. + + :rtype: TeamFolderRenameType + """ + if not self.is_team_folder_rename(): + raise AttributeError("tag 'team_folder_rename' not set") + return self._value + + def get_team_selective_sync_settings_changed(self): + """ + (team_folders) Changed sync default + + Only call this if :meth:`is_team_selective_sync_settings_changed` is true. + + :rtype: TeamSelectiveSyncSettingsChangedType + """ + if not self.is_team_selective_sync_settings_changed(): + raise AttributeError("tag 'team_selective_sync_settings_changed' not set") + return self._value + + def get_account_capture_change_policy(self): + """ + (team_policies) Changed account capture setting on team domain + + Only call this if :meth:`is_account_capture_change_policy` is true. + + :rtype: AccountCaptureChangePolicyType + """ + if not self.is_account_capture_change_policy(): + raise AttributeError("tag 'account_capture_change_policy' not set") + return self._value + + def get_allow_download_disabled(self): + """ + (team_policies) Disabled downloads (deprecated, no longer logged) + + Only call this if :meth:`is_allow_download_disabled` is true. + + :rtype: AllowDownloadDisabledType + """ + if not self.is_allow_download_disabled(): + raise AttributeError("tag 'allow_download_disabled' not set") + return self._value + + def get_allow_download_enabled(self): + """ + (team_policies) Enabled downloads (deprecated, no longer logged) + + Only call this if :meth:`is_allow_download_enabled` is true. + + :rtype: AllowDownloadEnabledType + """ + if not self.is_allow_download_enabled(): + raise AttributeError("tag 'allow_download_enabled' not set") + return self._value + + def get_camera_uploads_policy_changed(self): + """ + (team_policies) Changed camera uploads setting for team + + Only call this if :meth:`is_camera_uploads_policy_changed` is true. + + :rtype: CameraUploadsPolicyChangedType + """ + if not self.is_camera_uploads_policy_changed(): + raise AttributeError("tag 'camera_uploads_policy_changed' not set") + return self._value + + def get_data_placement_restriction_change_policy(self): + """ + (team_policies) Set restrictions on data center locations where team + data resides + + Only call this if :meth:`is_data_placement_restriction_change_policy` is true. + + :rtype: DataPlacementRestrictionChangePolicyType + """ + if not self.is_data_placement_restriction_change_policy(): + raise AttributeError("tag 'data_placement_restriction_change_policy' not set") + return self._value + + def get_data_placement_restriction_satisfy_policy(self): + """ + (team_policies) Completed restrictions on data center locations where + team data resides + + Only call this if :meth:`is_data_placement_restriction_satisfy_policy` is true. + + :rtype: DataPlacementRestrictionSatisfyPolicyType + """ + if not self.is_data_placement_restriction_satisfy_policy(): + raise AttributeError("tag 'data_placement_restriction_satisfy_policy' not set") + return self._value + + def get_device_approvals_change_desktop_policy(self): + """ + (team_policies) Set/removed limit on number of computers member can link + to team Dropbox account + + Only call this if :meth:`is_device_approvals_change_desktop_policy` is true. + + :rtype: DeviceApprovalsChangeDesktopPolicyType + """ + if not self.is_device_approvals_change_desktop_policy(): + raise AttributeError("tag 'device_approvals_change_desktop_policy' not set") + return self._value + + def get_device_approvals_change_mobile_policy(self): + """ + (team_policies) Set/removed limit on number of mobile devices member can + link to team Dropbox account + + Only call this if :meth:`is_device_approvals_change_mobile_policy` is true. + + :rtype: DeviceApprovalsChangeMobilePolicyType + """ + if not self.is_device_approvals_change_mobile_policy(): + raise AttributeError("tag 'device_approvals_change_mobile_policy' not set") + return self._value + + def get_device_approvals_change_overage_action(self): + """ + (team_policies) Changed device approvals setting when member is over + limit + + Only call this if :meth:`is_device_approvals_change_overage_action` is true. + + :rtype: DeviceApprovalsChangeOverageActionType + """ + if not self.is_device_approvals_change_overage_action(): + raise AttributeError("tag 'device_approvals_change_overage_action' not set") + return self._value + + def get_device_approvals_change_unlink_action(self): + """ + (team_policies) Changed device approvals setting when member unlinks + approved device + + Only call this if :meth:`is_device_approvals_change_unlink_action` is true. + + :rtype: DeviceApprovalsChangeUnlinkActionType + """ + if not self.is_device_approvals_change_unlink_action(): + raise AttributeError("tag 'device_approvals_change_unlink_action' not set") + return self._value + + def get_directory_restrictions_add_members(self): + """ + (team_policies) Added members to directory restrictions list + + Only call this if :meth:`is_directory_restrictions_add_members` is true. + + :rtype: DirectoryRestrictionsAddMembersType + """ + if not self.is_directory_restrictions_add_members(): + raise AttributeError("tag 'directory_restrictions_add_members' not set") + return self._value + + def get_directory_restrictions_remove_members(self): + """ + (team_policies) Removed members from directory restrictions list + + Only call this if :meth:`is_directory_restrictions_remove_members` is true. + + :rtype: DirectoryRestrictionsRemoveMembersType + """ + if not self.is_directory_restrictions_remove_members(): + raise AttributeError("tag 'directory_restrictions_remove_members' not set") + return self._value + + def get_emm_add_exception(self): + """ + (team_policies) Added members to EMM exception list + + Only call this if :meth:`is_emm_add_exception` is true. + + :rtype: EmmAddExceptionType + """ + if not self.is_emm_add_exception(): + raise AttributeError("tag 'emm_add_exception' not set") + return self._value + + def get_emm_change_policy(self): + """ + (team_policies) Enabled/disabled enterprise mobility management for + members + + Only call this if :meth:`is_emm_change_policy` is true. + + :rtype: EmmChangePolicyType + """ + if not self.is_emm_change_policy(): + raise AttributeError("tag 'emm_change_policy' not set") + return self._value + + def get_emm_remove_exception(self): + """ + (team_policies) Removed members from EMM exception list + + Only call this if :meth:`is_emm_remove_exception` is true. + + :rtype: EmmRemoveExceptionType + """ + if not self.is_emm_remove_exception(): + raise AttributeError("tag 'emm_remove_exception' not set") + return self._value + + def get_extended_version_history_change_policy(self): + """ + (team_policies) Accepted/opted out of extended version history + + Only call this if :meth:`is_extended_version_history_change_policy` is true. + + :rtype: ExtendedVersionHistoryChangePolicyType + """ + if not self.is_extended_version_history_change_policy(): + raise AttributeError("tag 'extended_version_history_change_policy' not set") + return self._value + + def get_file_comments_change_policy(self): + """ + (team_policies) Enabled/disabled commenting on team files + + Only call this if :meth:`is_file_comments_change_policy` is true. + + :rtype: FileCommentsChangePolicyType + """ + if not self.is_file_comments_change_policy(): + raise AttributeError("tag 'file_comments_change_policy' not set") + return self._value + + def get_file_requests_change_policy(self): + """ + (team_policies) Enabled/disabled file requests + + Only call this if :meth:`is_file_requests_change_policy` is true. + + :rtype: FileRequestsChangePolicyType + """ + if not self.is_file_requests_change_policy(): + raise AttributeError("tag 'file_requests_change_policy' not set") + return self._value + + def get_file_requests_emails_enabled(self): + """ + (team_policies) Enabled file request emails for everyone (deprecated, no + longer logged) + + Only call this if :meth:`is_file_requests_emails_enabled` is true. + + :rtype: FileRequestsEmailsEnabledType + """ + if not self.is_file_requests_emails_enabled(): + raise AttributeError("tag 'file_requests_emails_enabled' not set") + return self._value + + def get_file_requests_emails_restricted_to_team_only(self): + """ + (team_policies) Enabled file request emails for team (deprecated, no + longer logged) + + Only call this if :meth:`is_file_requests_emails_restricted_to_team_only` is true. + + :rtype: FileRequestsEmailsRestrictedToTeamOnlyType + """ + if not self.is_file_requests_emails_restricted_to_team_only(): + raise AttributeError("tag 'file_requests_emails_restricted_to_team_only' not set") + return self._value + + def get_google_sso_change_policy(self): + """ + (team_policies) Enabled/disabled Google single sign-on for team + + Only call this if :meth:`is_google_sso_change_policy` is true. + + :rtype: GoogleSsoChangePolicyType + """ + if not self.is_google_sso_change_policy(): + raise AttributeError("tag 'google_sso_change_policy' not set") + return self._value + + def get_group_user_management_change_policy(self): + """ + (team_policies) Changed who can create groups + + Only call this if :meth:`is_group_user_management_change_policy` is true. + + :rtype: GroupUserManagementChangePolicyType + """ + if not self.is_group_user_management_change_policy(): + raise AttributeError("tag 'group_user_management_change_policy' not set") + return self._value + + def get_member_requests_change_policy(self): + """ + (team_policies) Changed whether users can find team when not invited + + Only call this if :meth:`is_member_requests_change_policy` is true. + + :rtype: MemberRequestsChangePolicyType + """ + if not self.is_member_requests_change_policy(): + raise AttributeError("tag 'member_requests_change_policy' not set") + return self._value + + def get_member_space_limits_add_exception(self): + """ + (team_policies) Added members to member space limit exception list + + Only call this if :meth:`is_member_space_limits_add_exception` is true. + + :rtype: MemberSpaceLimitsAddExceptionType + """ + if not self.is_member_space_limits_add_exception(): + raise AttributeError("tag 'member_space_limits_add_exception' not set") + return self._value + + def get_member_space_limits_change_caps_type_policy(self): + """ + (team_policies) Changed member space limit type for team + + Only call this if :meth:`is_member_space_limits_change_caps_type_policy` is true. + + :rtype: MemberSpaceLimitsChangeCapsTypePolicyType + """ + if not self.is_member_space_limits_change_caps_type_policy(): + raise AttributeError("tag 'member_space_limits_change_caps_type_policy' not set") + return self._value + + def get_member_space_limits_change_policy(self): + """ + (team_policies) Changed team default member space limit + + Only call this if :meth:`is_member_space_limits_change_policy` is true. + + :rtype: MemberSpaceLimitsChangePolicyType + """ + if not self.is_member_space_limits_change_policy(): + raise AttributeError("tag 'member_space_limits_change_policy' not set") + return self._value + + def get_member_space_limits_remove_exception(self): + """ + (team_policies) Removed members from member space limit exception list + + Only call this if :meth:`is_member_space_limits_remove_exception` is true. + + :rtype: MemberSpaceLimitsRemoveExceptionType + """ + if not self.is_member_space_limits_remove_exception(): + raise AttributeError("tag 'member_space_limits_remove_exception' not set") + return self._value + + def get_member_suggestions_change_policy(self): + """ + (team_policies) Enabled/disabled option for team members to suggest + people to add to team + + Only call this if :meth:`is_member_suggestions_change_policy` is true. + + :rtype: MemberSuggestionsChangePolicyType + """ + if not self.is_member_suggestions_change_policy(): + raise AttributeError("tag 'member_suggestions_change_policy' not set") + return self._value + + def get_microsoft_office_addin_change_policy(self): + """ + (team_policies) Enabled/disabled Microsoft Office add-in + + Only call this if :meth:`is_microsoft_office_addin_change_policy` is true. + + :rtype: MicrosoftOfficeAddinChangePolicyType + """ + if not self.is_microsoft_office_addin_change_policy(): + raise AttributeError("tag 'microsoft_office_addin_change_policy' not set") + return self._value + + def get_network_control_change_policy(self): + """ + (team_policies) Enabled/disabled network control + + Only call this if :meth:`is_network_control_change_policy` is true. + + :rtype: NetworkControlChangePolicyType + """ + if not self.is_network_control_change_policy(): + raise AttributeError("tag 'network_control_change_policy' not set") + return self._value + + def get_paper_change_deployment_policy(self): + """ + (team_policies) Changed whether Dropbox Paper, when enabled, is deployed + to all members or to specific members + + Only call this if :meth:`is_paper_change_deployment_policy` is true. + + :rtype: PaperChangeDeploymentPolicyType + """ + if not self.is_paper_change_deployment_policy(): + raise AttributeError("tag 'paper_change_deployment_policy' not set") + return self._value + + def get_paper_change_member_link_policy(self): + """ + (team_policies) Changed whether non-members can view Paper docs with + link (deprecated, no longer logged) + + Only call this if :meth:`is_paper_change_member_link_policy` is true. + + :rtype: PaperChangeMemberLinkPolicyType + """ + if not self.is_paper_change_member_link_policy(): + raise AttributeError("tag 'paper_change_member_link_policy' not set") + return self._value + + def get_paper_change_member_policy(self): + """ + (team_policies) Changed whether members can share Paper docs outside + team, and if docs are accessible only by team members or anyone by + default + + Only call this if :meth:`is_paper_change_member_policy` is true. + + :rtype: PaperChangeMemberPolicyType + """ + if not self.is_paper_change_member_policy(): + raise AttributeError("tag 'paper_change_member_policy' not set") + return self._value + + def get_paper_change_policy(self): + """ + (team_policies) Enabled/disabled Dropbox Paper for team + + Only call this if :meth:`is_paper_change_policy` is true. + + :rtype: PaperChangePolicyType + """ + if not self.is_paper_change_policy(): + raise AttributeError("tag 'paper_change_policy' not set") + return self._value + + def get_paper_enabled_users_group_addition(self): + """ + (team_policies) Added users to Paper-enabled users list + + Only call this if :meth:`is_paper_enabled_users_group_addition` is true. + + :rtype: PaperEnabledUsersGroupAdditionType + """ + if not self.is_paper_enabled_users_group_addition(): + raise AttributeError("tag 'paper_enabled_users_group_addition' not set") + return self._value + + def get_paper_enabled_users_group_removal(self): + """ + (team_policies) Removed users from Paper-enabled users list + + Only call this if :meth:`is_paper_enabled_users_group_removal` is true. + + :rtype: PaperEnabledUsersGroupRemovalType + """ + if not self.is_paper_enabled_users_group_removal(): + raise AttributeError("tag 'paper_enabled_users_group_removal' not set") + return self._value + + def get_permanent_delete_change_policy(self): + """ + (team_policies) Enabled/disabled ability of team members to permanently + delete content + + Only call this if :meth:`is_permanent_delete_change_policy` is true. + + :rtype: PermanentDeleteChangePolicyType + """ + if not self.is_permanent_delete_change_policy(): + raise AttributeError("tag 'permanent_delete_change_policy' not set") + return self._value + + def get_sharing_change_folder_join_policy(self): + """ + (team_policies) Changed whether team members can join shared folders + owned outside team + + Only call this if :meth:`is_sharing_change_folder_join_policy` is true. + + :rtype: SharingChangeFolderJoinPolicyType + """ + if not self.is_sharing_change_folder_join_policy(): + raise AttributeError("tag 'sharing_change_folder_join_policy' not set") + return self._value + + def get_sharing_change_link_policy(self): + """ + (team_policies) Changed whether members can share links outside team, + and if links are accessible only by team members or anyone by default + + Only call this if :meth:`is_sharing_change_link_policy` is true. + + :rtype: SharingChangeLinkPolicyType + """ + if not self.is_sharing_change_link_policy(): + raise AttributeError("tag 'sharing_change_link_policy' not set") + return self._value + + def get_sharing_change_member_policy(self): + """ + (team_policies) Changed whether members can share files/folders outside + team + + Only call this if :meth:`is_sharing_change_member_policy` is true. + + :rtype: SharingChangeMemberPolicyType + """ + if not self.is_sharing_change_member_policy(): + raise AttributeError("tag 'sharing_change_member_policy' not set") + return self._value + + def get_showcase_change_download_policy(self): + """ + (team_policies) Enabled/disabled downloading files from Dropbox Showcase + for team + + Only call this if :meth:`is_showcase_change_download_policy` is true. + + :rtype: ShowcaseChangeDownloadPolicyType + """ + if not self.is_showcase_change_download_policy(): + raise AttributeError("tag 'showcase_change_download_policy' not set") + return self._value + + def get_showcase_change_enabled_policy(self): + """ + (team_policies) Enabled/disabled Dropbox Showcase for team + + Only call this if :meth:`is_showcase_change_enabled_policy` is true. + + :rtype: ShowcaseChangeEnabledPolicyType + """ + if not self.is_showcase_change_enabled_policy(): + raise AttributeError("tag 'showcase_change_enabled_policy' not set") + return self._value + + def get_showcase_change_external_sharing_policy(self): + """ + (team_policies) Enabled/disabled sharing Dropbox Showcase externally for + team + + Only call this if :meth:`is_showcase_change_external_sharing_policy` is true. + + :rtype: ShowcaseChangeExternalSharingPolicyType + """ + if not self.is_showcase_change_external_sharing_policy(): + raise AttributeError("tag 'showcase_change_external_sharing_policy' not set") + return self._value + + def get_smart_sync_change_policy(self): + """ + (team_policies) Changed default Smart Sync setting for team members + + Only call this if :meth:`is_smart_sync_change_policy` is true. + + :rtype: SmartSyncChangePolicyType + """ + if not self.is_smart_sync_change_policy(): + raise AttributeError("tag 'smart_sync_change_policy' not set") + return self._value + + def get_smart_sync_not_opt_out(self): + """ + (team_policies) Opted team into Smart Sync + + Only call this if :meth:`is_smart_sync_not_opt_out` is true. + + :rtype: SmartSyncNotOptOutType + """ + if not self.is_smart_sync_not_opt_out(): + raise AttributeError("tag 'smart_sync_not_opt_out' not set") + return self._value + + def get_smart_sync_opt_out(self): + """ + (team_policies) Opted team out of Smart Sync + + Only call this if :meth:`is_smart_sync_opt_out` is true. + + :rtype: SmartSyncOptOutType + """ + if not self.is_smart_sync_opt_out(): + raise AttributeError("tag 'smart_sync_opt_out' not set") + return self._value + + def get_sso_change_policy(self): + """ + (team_policies) Changed single sign-on setting for team + + Only call this if :meth:`is_sso_change_policy` is true. + + :rtype: SsoChangePolicyType + """ + if not self.is_sso_change_policy(): + raise AttributeError("tag 'sso_change_policy' not set") + return self._value + + def get_team_selective_sync_policy_changed(self): + """ + (team_policies) Enabled/disabled Team Selective Sync for team + + Only call this if :meth:`is_team_selective_sync_policy_changed` is true. + + :rtype: TeamSelectiveSyncPolicyChangedType + """ + if not self.is_team_selective_sync_policy_changed(): + raise AttributeError("tag 'team_selective_sync_policy_changed' not set") + return self._value + + def get_tfa_change_policy(self): + """ + (team_policies) Changed two-step verification setting for team + + Only call this if :meth:`is_tfa_change_policy` is true. + + :rtype: TfaChangePolicyType + """ + if not self.is_tfa_change_policy(): + raise AttributeError("tag 'tfa_change_policy' not set") + return self._value + + def get_two_account_change_policy(self): + """ + (team_policies) Enabled/disabled option for members to link personal + Dropbox account and team account to same computer + + Only call this if :meth:`is_two_account_change_policy` is true. + + :rtype: TwoAccountChangePolicyType + """ + if not self.is_two_account_change_policy(): + raise AttributeError("tag 'two_account_change_policy' not set") + return self._value + + def get_viewer_info_policy_changed(self): + """ + (team_policies) Changed team policy for viewer info + + Only call this if :meth:`is_viewer_info_policy_changed` is true. + + :rtype: ViewerInfoPolicyChangedType + """ + if not self.is_viewer_info_policy_changed(): + raise AttributeError("tag 'viewer_info_policy_changed' not set") + return self._value + + def get_web_sessions_change_fixed_length_policy(self): + """ + (team_policies) Changed how long members can stay signed in to + Dropbox.com + + Only call this if :meth:`is_web_sessions_change_fixed_length_policy` is true. + + :rtype: WebSessionsChangeFixedLengthPolicyType + """ + if not self.is_web_sessions_change_fixed_length_policy(): + raise AttributeError("tag 'web_sessions_change_fixed_length_policy' not set") + return self._value + + def get_web_sessions_change_idle_length_policy(self): + """ + (team_policies) Changed how long team members can be idle while signed + in to Dropbox.com + + Only call this if :meth:`is_web_sessions_change_idle_length_policy` is true. + + :rtype: WebSessionsChangeIdleLengthPolicyType + """ + if not self.is_web_sessions_change_idle_length_policy(): + raise AttributeError("tag 'web_sessions_change_idle_length_policy' not set") + return self._value + + def get_team_merge_from(self): + """ + (team_profile) Merged another team into this team + + Only call this if :meth:`is_team_merge_from` is true. + + :rtype: TeamMergeFromType + """ + if not self.is_team_merge_from(): + raise AttributeError("tag 'team_merge_from' not set") + return self._value + + def get_team_merge_to(self): + """ + (team_profile) Merged this team into another team + + Only call this if :meth:`is_team_merge_to` is true. + + :rtype: TeamMergeToType + """ + if not self.is_team_merge_to(): + raise AttributeError("tag 'team_merge_to' not set") + return self._value + + def get_team_profile_add_logo(self): + """ + (team_profile) Added team logo to display on shared link headers + + Only call this if :meth:`is_team_profile_add_logo` is true. + + :rtype: TeamProfileAddLogoType + """ + if not self.is_team_profile_add_logo(): + raise AttributeError("tag 'team_profile_add_logo' not set") + return self._value + + def get_team_profile_change_default_language(self): + """ + (team_profile) Changed default language for team + + Only call this if :meth:`is_team_profile_change_default_language` is true. + + :rtype: TeamProfileChangeDefaultLanguageType + """ + if not self.is_team_profile_change_default_language(): + raise AttributeError("tag 'team_profile_change_default_language' not set") + return self._value + + def get_team_profile_change_logo(self): + """ + (team_profile) Changed team logo displayed on shared link headers + + Only call this if :meth:`is_team_profile_change_logo` is true. + + :rtype: TeamProfileChangeLogoType + """ + if not self.is_team_profile_change_logo(): + raise AttributeError("tag 'team_profile_change_logo' not set") + return self._value + + def get_team_profile_change_name(self): + """ + (team_profile) Changed team name + + Only call this if :meth:`is_team_profile_change_name` is true. + + :rtype: TeamProfileChangeNameType + """ + if not self.is_team_profile_change_name(): + raise AttributeError("tag 'team_profile_change_name' not set") + return self._value + + def get_team_profile_remove_logo(self): + """ + (team_profile) Removed team logo displayed on shared link headers + + Only call this if :meth:`is_team_profile_remove_logo` is true. + + :rtype: TeamProfileRemoveLogoType + """ + if not self.is_team_profile_remove_logo(): + raise AttributeError("tag 'team_profile_remove_logo' not set") + return self._value + + def get_tfa_add_backup_phone(self): + """ + (tfa) Added backup phone for two-step verification + + Only call this if :meth:`is_tfa_add_backup_phone` is true. + + :rtype: TfaAddBackupPhoneType + """ + if not self.is_tfa_add_backup_phone(): + raise AttributeError("tag 'tfa_add_backup_phone' not set") + return self._value + + def get_tfa_add_security_key(self): + """ + (tfa) Added security key for two-step verification + + Only call this if :meth:`is_tfa_add_security_key` is true. + + :rtype: TfaAddSecurityKeyType + """ + if not self.is_tfa_add_security_key(): + raise AttributeError("tag 'tfa_add_security_key' not set") + return self._value + + def get_tfa_change_backup_phone(self): + """ + (tfa) Changed backup phone for two-step verification + + Only call this if :meth:`is_tfa_change_backup_phone` is true. + + :rtype: TfaChangeBackupPhoneType + """ + if not self.is_tfa_change_backup_phone(): + raise AttributeError("tag 'tfa_change_backup_phone' not set") + return self._value + + def get_tfa_change_status(self): + """ + (tfa) Enabled/disabled/changed two-step verification setting + + Only call this if :meth:`is_tfa_change_status` is true. + + :rtype: TfaChangeStatusType + """ + if not self.is_tfa_change_status(): + raise AttributeError("tag 'tfa_change_status' not set") + return self._value + + def get_tfa_remove_backup_phone(self): + """ + (tfa) Removed backup phone for two-step verification + + Only call this if :meth:`is_tfa_remove_backup_phone` is true. + + :rtype: TfaRemoveBackupPhoneType + """ + if not self.is_tfa_remove_backup_phone(): + raise AttributeError("tag 'tfa_remove_backup_phone' not set") + return self._value + + def get_tfa_remove_security_key(self): + """ + (tfa) Removed security key for two-step verification + + Only call this if :meth:`is_tfa_remove_security_key` is true. + + :rtype: TfaRemoveSecurityKeyType + """ + if not self.is_tfa_remove_security_key(): + raise AttributeError("tag 'tfa_remove_security_key' not set") + return self._value + + def get_tfa_reset(self): + """ + (tfa) Reset two-step verification for team member + + Only call this if :meth:`is_tfa_reset` is true. + + :rtype: TfaResetType + """ + if not self.is_tfa_reset(): + raise AttributeError("tag 'tfa_reset' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(EventType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EventType(%r, %r)' % (self._tag, self._value) + +EventType_validator = bv.Union(EventType) + +class ExportMembersReportDetails(bb.Struct): + """ + Created member data report. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(ExportMembersReportDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ExportMembersReportDetails()' + +ExportMembersReportDetails_validator = bv.Struct(ExportMembersReportDetails) + +class ExportMembersReportType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ExportMembersReportType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ExportMembersReportType(description={!r})'.format( + self._description_value, + ) + +ExportMembersReportType_validator = bv.Struct(ExportMembersReportType) + +class ExtendedVersionHistoryChangePolicyDetails(bb.Struct): + """ + Accepted/opted out of extended version history. + + :ivar new_value: New extended version history policy. + :ivar previous_value: Previous extended version history policy. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New extended version history policy. + + :rtype: ExtendedVersionHistoryPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous extended version history policy. Might be missing due to + historical data gap. + + :rtype: ExtendedVersionHistoryPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ExtendedVersionHistoryChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ExtendedVersionHistoryChangePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +ExtendedVersionHistoryChangePolicyDetails_validator = bv.Struct(ExtendedVersionHistoryChangePolicyDetails) + +class ExtendedVersionHistoryChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ExtendedVersionHistoryChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ExtendedVersionHistoryChangePolicyType(description={!r})'.format( + self._description_value, + ) + +ExtendedVersionHistoryChangePolicyType_validator = bv.Struct(ExtendedVersionHistoryChangePolicyType) + +class ExtendedVersionHistoryPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + explicitly_limited = None + # Attribute is overwritten below the class definition + explicitly_unlimited = None + # Attribute is overwritten below the class definition + implicitly_limited = None + # Attribute is overwritten below the class definition + implicitly_unlimited = None + # Attribute is overwritten below the class definition + other = None + + def is_explicitly_limited(self): + """ + Check if the union tag is ``explicitly_limited``. + + :rtype: bool + """ + return self._tag == 'explicitly_limited' + + def is_explicitly_unlimited(self): + """ + Check if the union tag is ``explicitly_unlimited``. + + :rtype: bool + """ + return self._tag == 'explicitly_unlimited' + + def is_implicitly_limited(self): + """ + Check if the union tag is ``implicitly_limited``. + + :rtype: bool + """ + return self._tag == 'implicitly_limited' + + def is_implicitly_unlimited(self): + """ + Check if the union tag is ``implicitly_unlimited``. + + :rtype: bool + """ + return self._tag == 'implicitly_unlimited' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ExtendedVersionHistoryPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ExtendedVersionHistoryPolicy(%r, %r)' % (self._tag, self._value) + +ExtendedVersionHistoryPolicy_validator = bv.Union(ExtendedVersionHistoryPolicy) + +class ExternalUserLogInfo(bb.Struct): + """ + A user without a Dropbox account. + + :ivar user_identifier: An external user identifier. + :ivar identifier_type: Identifier type. + """ + + __slots__ = [ + '_user_identifier_value', + '_user_identifier_present', + '_identifier_type_value', + '_identifier_type_present', + ] + + _has_required_fields = True + + def __init__(self, + user_identifier=None, + identifier_type=None): + self._user_identifier_value = None + self._user_identifier_present = False + self._identifier_type_value = None + self._identifier_type_present = False + if user_identifier is not None: + self.user_identifier = user_identifier + if identifier_type is not None: + self.identifier_type = identifier_type + + @property + def user_identifier(self): + """ + An external user identifier. + + :rtype: str + """ + if self._user_identifier_present: + return self._user_identifier_value + else: + raise AttributeError("missing required field 'user_identifier'") + + @user_identifier.setter + def user_identifier(self, val): + val = self._user_identifier_validator.validate(val) + self._user_identifier_value = val + self._user_identifier_present = True + + @user_identifier.deleter + def user_identifier(self): + self._user_identifier_value = None + self._user_identifier_present = False + + @property + def identifier_type(self): + """ + Identifier type. + + :rtype: IdentifierType + """ + if self._identifier_type_present: + return self._identifier_type_value + else: + raise AttributeError("missing required field 'identifier_type'") + + @identifier_type.setter + def identifier_type(self, val): + self._identifier_type_validator.validate_type_only(val) + self._identifier_type_value = val + self._identifier_type_present = True + + @identifier_type.deleter + def identifier_type(self): + self._identifier_type_value = None + self._identifier_type_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ExternalUserLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ExternalUserLogInfo(user_identifier={!r}, identifier_type={!r})'.format( + self._user_identifier_value, + self._identifier_type_value, + ) + +ExternalUserLogInfo_validator = bv.Struct(ExternalUserLogInfo) + +class FailureDetailsLogInfo(bb.Struct): + """ + Provides details about a failure + + :ivar user_friendly_message: A user friendly explanation of the error. Might + be missing due to historical data gap. + :ivar technical_error_message: A technical explanation of the error. This is + relevant for some errors. + """ + + __slots__ = [ + '_user_friendly_message_value', + '_user_friendly_message_present', + '_technical_error_message_value', + '_technical_error_message_present', + ] + + _has_required_fields = False + + def __init__(self, + user_friendly_message=None, + technical_error_message=None): + self._user_friendly_message_value = None + self._user_friendly_message_present = False + self._technical_error_message_value = None + self._technical_error_message_present = False + if user_friendly_message is not None: + self.user_friendly_message = user_friendly_message + if technical_error_message is not None: + self.technical_error_message = technical_error_message + + @property + def user_friendly_message(self): + """ + A user friendly explanation of the error. Might be missing due to + historical data gap. + + :rtype: str + """ + if self._user_friendly_message_present: + return self._user_friendly_message_value + else: + return None + + @user_friendly_message.setter + def user_friendly_message(self, val): + if val is None: + del self.user_friendly_message + return + val = self._user_friendly_message_validator.validate(val) + self._user_friendly_message_value = val + self._user_friendly_message_present = True + + @user_friendly_message.deleter + def user_friendly_message(self): + self._user_friendly_message_value = None + self._user_friendly_message_present = False + + @property + def technical_error_message(self): + """ + A technical explanation of the error. This is relevant for some errors. + + :rtype: str + """ + if self._technical_error_message_present: + return self._technical_error_message_value + else: + return None + + @technical_error_message.setter + def technical_error_message(self, val): + if val is None: + del self.technical_error_message + return + val = self._technical_error_message_validator.validate(val) + self._technical_error_message_value = val + self._technical_error_message_present = True + + @technical_error_message.deleter + def technical_error_message(self): + self._technical_error_message_value = None + self._technical_error_message_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FailureDetailsLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FailureDetailsLogInfo(user_friendly_message={!r}, technical_error_message={!r})'.format( + self._user_friendly_message_value, + self._technical_error_message_value, + ) + +FailureDetailsLogInfo_validator = bv.Struct(FailureDetailsLogInfo) + +class FileAddCommentDetails(bb.Struct): + """ + Added file comment. + + :ivar comment_text: Comment text. Might be missing due to historical data + gap. + """ + + __slots__ = [ + '_comment_text_value', + '_comment_text_present', + ] + + _has_required_fields = False + + def __init__(self, + comment_text=None): + self._comment_text_value = None + self._comment_text_present = False + if comment_text is not None: + self.comment_text = comment_text + + @property + def comment_text(self): + """ + Comment text. Might be missing due to historical data gap. + + :rtype: str + """ + if self._comment_text_present: + return self._comment_text_value + else: + return None + + @comment_text.setter + def comment_text(self, val): + if val is None: + del self.comment_text + return + val = self._comment_text_validator.validate(val) + self._comment_text_value = val + self._comment_text_present = True + + @comment_text.deleter + def comment_text(self): + self._comment_text_value = None + self._comment_text_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileAddCommentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileAddCommentDetails(comment_text={!r})'.format( + self._comment_text_value, + ) + +FileAddCommentDetails_validator = bv.Struct(FileAddCommentDetails) + +class FileAddCommentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileAddCommentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileAddCommentType(description={!r})'.format( + self._description_value, + ) + +FileAddCommentType_validator = bv.Struct(FileAddCommentType) + +class FileAddDetails(bb.Struct): + """ + Added files and/or folders. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(FileAddDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileAddDetails()' + +FileAddDetails_validator = bv.Struct(FileAddDetails) + +class FileAddType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileAddType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileAddType(description={!r})'.format( + self._description_value, + ) + +FileAddType_validator = bv.Struct(FileAddType) + +class FileChangeCommentSubscriptionDetails(bb.Struct): + """ + Subscribed to or unsubscribed from comment notifications for file. + + :ivar new_value: New file comment subscription. + :ivar previous_value: Previous file comment subscription. Might be missing + due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New file comment subscription. + + :rtype: FileCommentNotificationPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous file comment subscription. Might be missing due to historical + data gap. + + :rtype: FileCommentNotificationPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileChangeCommentSubscriptionDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileChangeCommentSubscriptionDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +FileChangeCommentSubscriptionDetails_validator = bv.Struct(FileChangeCommentSubscriptionDetails) + +class FileChangeCommentSubscriptionType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileChangeCommentSubscriptionType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileChangeCommentSubscriptionType(description={!r})'.format( + self._description_value, + ) + +FileChangeCommentSubscriptionType_validator = bv.Struct(FileChangeCommentSubscriptionType) + +class FileCommentNotificationPolicy(bb.Union): + """ + Enable or disable file comments notifications + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(FileCommentNotificationPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileCommentNotificationPolicy(%r, %r)' % (self._tag, self._value) + +FileCommentNotificationPolicy_validator = bv.Union(FileCommentNotificationPolicy) + +class FileCommentsChangePolicyDetails(bb.Struct): + """ + Enabled/disabled commenting on team files. + + :ivar new_value: New commenting on team files policy. + :ivar previous_value: Previous commenting on team files policy. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New commenting on team files policy. + + :rtype: FileCommentsPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous commenting on team files policy. Might be missing due to + historical data gap. + + :rtype: FileCommentsPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileCommentsChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileCommentsChangePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +FileCommentsChangePolicyDetails_validator = bv.Struct(FileCommentsChangePolicyDetails) + +class FileCommentsChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileCommentsChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileCommentsChangePolicyType(description={!r})'.format( + self._description_value, + ) + +FileCommentsChangePolicyType_validator = bv.Struct(FileCommentsChangePolicyType) + +class FileCommentsPolicy(bb.Union): + """ + File comments policy + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(FileCommentsPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileCommentsPolicy(%r, %r)' % (self._tag, self._value) + +FileCommentsPolicy_validator = bv.Union(FileCommentsPolicy) + +class FileCopyDetails(bb.Struct): + """ + Copied files and/or folders. + + :ivar relocate_action_details: Relocate action details. + """ + + __slots__ = [ + '_relocate_action_details_value', + '_relocate_action_details_present', + ] + + _has_required_fields = True + + def __init__(self, + relocate_action_details=None): + self._relocate_action_details_value = None + self._relocate_action_details_present = False + if relocate_action_details is not None: + self.relocate_action_details = relocate_action_details + + @property + def relocate_action_details(self): + """ + Relocate action details. + + :rtype: list of [RelocateAssetReferencesLogInfo] + """ + if self._relocate_action_details_present: + return self._relocate_action_details_value + else: + raise AttributeError("missing required field 'relocate_action_details'") + + @relocate_action_details.setter + def relocate_action_details(self, val): + val = self._relocate_action_details_validator.validate(val) + self._relocate_action_details_value = val + self._relocate_action_details_present = True + + @relocate_action_details.deleter + def relocate_action_details(self): + self._relocate_action_details_value = None + self._relocate_action_details_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileCopyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileCopyDetails(relocate_action_details={!r})'.format( + self._relocate_action_details_value, + ) + +FileCopyDetails_validator = bv.Struct(FileCopyDetails) + +class FileCopyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileCopyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileCopyType(description={!r})'.format( + self._description_value, + ) + +FileCopyType_validator = bv.Struct(FileCopyType) + +class FileDeleteCommentDetails(bb.Struct): + """ + Deleted file comment. + + :ivar comment_text: Comment text. Might be missing due to historical data + gap. + """ + + __slots__ = [ + '_comment_text_value', + '_comment_text_present', + ] + + _has_required_fields = False + + def __init__(self, + comment_text=None): + self._comment_text_value = None + self._comment_text_present = False + if comment_text is not None: + self.comment_text = comment_text + + @property + def comment_text(self): + """ + Comment text. Might be missing due to historical data gap. + + :rtype: str + """ + if self._comment_text_present: + return self._comment_text_value + else: + return None + + @comment_text.setter + def comment_text(self, val): + if val is None: + del self.comment_text + return + val = self._comment_text_validator.validate(val) + self._comment_text_value = val + self._comment_text_present = True + + @comment_text.deleter + def comment_text(self): + self._comment_text_value = None + self._comment_text_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileDeleteCommentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileDeleteCommentDetails(comment_text={!r})'.format( + self._comment_text_value, + ) + +FileDeleteCommentDetails_validator = bv.Struct(FileDeleteCommentDetails) + +class FileDeleteCommentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileDeleteCommentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileDeleteCommentType(description={!r})'.format( + self._description_value, + ) + +FileDeleteCommentType_validator = bv.Struct(FileDeleteCommentType) + +class FileDeleteDetails(bb.Struct): + """ + Deleted files and/or folders. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(FileDeleteDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileDeleteDetails()' + +FileDeleteDetails_validator = bv.Struct(FileDeleteDetails) + +class FileDeleteType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileDeleteType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileDeleteType(description={!r})'.format( + self._description_value, + ) + +FileDeleteType_validator = bv.Struct(FileDeleteType) + +class FileDownloadDetails(bb.Struct): + """ + Downloaded files and/or folders. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(FileDownloadDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileDownloadDetails()' + +FileDownloadDetails_validator = bv.Struct(FileDownloadDetails) + +class FileDownloadType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileDownloadType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileDownloadType(description={!r})'.format( + self._description_value, + ) + +FileDownloadType_validator = bv.Struct(FileDownloadType) + +class FileEditCommentDetails(bb.Struct): + """ + Edited file comment. + + :ivar comment_text: Comment text. Might be missing due to historical data + gap. + :ivar previous_comment_text: Previous comment text. + """ + + __slots__ = [ + '_comment_text_value', + '_comment_text_present', + '_previous_comment_text_value', + '_previous_comment_text_present', + ] + + _has_required_fields = True + + def __init__(self, + previous_comment_text=None, + comment_text=None): + self._comment_text_value = None + self._comment_text_present = False + self._previous_comment_text_value = None + self._previous_comment_text_present = False + if comment_text is not None: + self.comment_text = comment_text + if previous_comment_text is not None: + self.previous_comment_text = previous_comment_text + + @property + def comment_text(self): + """ + Comment text. Might be missing due to historical data gap. + + :rtype: str + """ + if self._comment_text_present: + return self._comment_text_value + else: + return None + + @comment_text.setter + def comment_text(self, val): + if val is None: + del self.comment_text + return + val = self._comment_text_validator.validate(val) + self._comment_text_value = val + self._comment_text_present = True + + @comment_text.deleter + def comment_text(self): + self._comment_text_value = None + self._comment_text_present = False + + @property + def previous_comment_text(self): + """ + Previous comment text. + + :rtype: str + """ + if self._previous_comment_text_present: + return self._previous_comment_text_value + else: + raise AttributeError("missing required field 'previous_comment_text'") + + @previous_comment_text.setter + def previous_comment_text(self, val): + val = self._previous_comment_text_validator.validate(val) + self._previous_comment_text_value = val + self._previous_comment_text_present = True + + @previous_comment_text.deleter + def previous_comment_text(self): + self._previous_comment_text_value = None + self._previous_comment_text_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileEditCommentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileEditCommentDetails(previous_comment_text={!r}, comment_text={!r})'.format( + self._previous_comment_text_value, + self._comment_text_value, + ) + +FileEditCommentDetails_validator = bv.Struct(FileEditCommentDetails) + +class FileEditCommentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileEditCommentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileEditCommentType(description={!r})'.format( + self._description_value, + ) + +FileEditCommentType_validator = bv.Struct(FileEditCommentType) + +class FileEditDetails(bb.Struct): + """ + Edited files. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(FileEditDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileEditDetails()' + +FileEditDetails_validator = bv.Struct(FileEditDetails) + +class FileEditType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileEditType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileEditType(description={!r})'.format( + self._description_value, + ) + +FileEditType_validator = bv.Struct(FileEditType) + +class FileGetCopyReferenceDetails(bb.Struct): + """ + Created copy reference to file/folder. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(FileGetCopyReferenceDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileGetCopyReferenceDetails()' + +FileGetCopyReferenceDetails_validator = bv.Struct(FileGetCopyReferenceDetails) + +class FileGetCopyReferenceType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileGetCopyReferenceType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileGetCopyReferenceType(description={!r})'.format( + self._description_value, + ) + +FileGetCopyReferenceType_validator = bv.Struct(FileGetCopyReferenceType) + +class FileLikeCommentDetails(bb.Struct): + """ + Liked file comment. + + :ivar comment_text: Comment text. Might be missing due to historical data + gap. + """ + + __slots__ = [ + '_comment_text_value', + '_comment_text_present', + ] + + _has_required_fields = False + + def __init__(self, + comment_text=None): + self._comment_text_value = None + self._comment_text_present = False + if comment_text is not None: + self.comment_text = comment_text + + @property + def comment_text(self): + """ + Comment text. Might be missing due to historical data gap. + + :rtype: str + """ + if self._comment_text_present: + return self._comment_text_value + else: + return None + + @comment_text.setter + def comment_text(self, val): + if val is None: + del self.comment_text + return + val = self._comment_text_validator.validate(val) + self._comment_text_value = val + self._comment_text_present = True + + @comment_text.deleter + def comment_text(self): + self._comment_text_value = None + self._comment_text_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileLikeCommentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileLikeCommentDetails(comment_text={!r})'.format( + self._comment_text_value, + ) + +FileLikeCommentDetails_validator = bv.Struct(FileLikeCommentDetails) + +class FileLikeCommentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileLikeCommentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileLikeCommentType(description={!r})'.format( + self._description_value, + ) + +FileLikeCommentType_validator = bv.Struct(FileLikeCommentType) + +class FileOrFolderLogInfo(bb.Struct): + """ + Generic information relevant both for files and folders + + :ivar path: Path relative to event context. + :ivar display_name: Display name. Might be missing due to historical data + gap. + :ivar file_id: Unique ID. Might be missing due to historical data gap. + """ + + __slots__ = [ + '_path_value', + '_path_present', + '_display_name_value', + '_display_name_present', + '_file_id_value', + '_file_id_present', + ] + + _has_required_fields = True + + def __init__(self, + path=None, + display_name=None, + file_id=None): + self._path_value = None + self._path_present = False + self._display_name_value = None + self._display_name_present = False + self._file_id_value = None + self._file_id_present = False + if path is not None: + self.path = path + if display_name is not None: + self.display_name = display_name + if file_id is not None: + self.file_id = file_id + + @property + def path(self): + """ + Path relative to event context. + + :rtype: PathLogInfo + """ + if self._path_present: + return self._path_value + else: + raise AttributeError("missing required field 'path'") + + @path.setter + def path(self, val): + self._path_validator.validate_type_only(val) + self._path_value = val + self._path_present = True + + @path.deleter + def path(self): + self._path_value = None + self._path_present = False + + @property + def display_name(self): + """ + Display name. Might be missing due to historical data gap. + + :rtype: str + """ + if self._display_name_present: + return self._display_name_value + else: + return None + + @display_name.setter + def display_name(self, val): + if val is None: + del self.display_name + return + val = self._display_name_validator.validate(val) + self._display_name_value = val + self._display_name_present = True + + @display_name.deleter + def display_name(self): + self._display_name_value = None + self._display_name_present = False + + @property + def file_id(self): + """ + Unique ID. Might be missing due to historical data gap. + + :rtype: str + """ + if self._file_id_present: + return self._file_id_value + else: + return None + + @file_id.setter + def file_id(self, val): + if val is None: + del self.file_id + return + val = self._file_id_validator.validate(val) + self._file_id_value = val + self._file_id_present = True + + @file_id.deleter + def file_id(self): + self._file_id_value = None + self._file_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileOrFolderLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileOrFolderLogInfo(path={!r}, display_name={!r}, file_id={!r})'.format( + self._path_value, + self._display_name_value, + self._file_id_value, + ) + +FileOrFolderLogInfo_validator = bv.Struct(FileOrFolderLogInfo) + +class FileLogInfo(FileOrFolderLogInfo): + """ + File's logged information. + """ + + __slots__ = [ + ] + + _has_required_fields = True + + def __init__(self, + path=None, + display_name=None, + file_id=None): + super(FileLogInfo, self).__init__(path, + display_name, + file_id) + + def _process_custom_annotations(self, annotation_type, processor): + super(FileLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileLogInfo(path={!r}, display_name={!r}, file_id={!r})'.format( + self._path_value, + self._display_name_value, + self._file_id_value, + ) + +FileLogInfo_validator = bv.Struct(FileLogInfo) + +class FileMoveDetails(bb.Struct): + """ + Moved files and/or folders. + + :ivar relocate_action_details: Relocate action details. + """ + + __slots__ = [ + '_relocate_action_details_value', + '_relocate_action_details_present', + ] + + _has_required_fields = True + + def __init__(self, + relocate_action_details=None): + self._relocate_action_details_value = None + self._relocate_action_details_present = False + if relocate_action_details is not None: + self.relocate_action_details = relocate_action_details + + @property + def relocate_action_details(self): + """ + Relocate action details. + + :rtype: list of [RelocateAssetReferencesLogInfo] + """ + if self._relocate_action_details_present: + return self._relocate_action_details_value + else: + raise AttributeError("missing required field 'relocate_action_details'") + + @relocate_action_details.setter + def relocate_action_details(self, val): + val = self._relocate_action_details_validator.validate(val) + self._relocate_action_details_value = val + self._relocate_action_details_present = True + + @relocate_action_details.deleter + def relocate_action_details(self): + self._relocate_action_details_value = None + self._relocate_action_details_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileMoveDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileMoveDetails(relocate_action_details={!r})'.format( + self._relocate_action_details_value, + ) + +FileMoveDetails_validator = bv.Struct(FileMoveDetails) + +class FileMoveType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileMoveType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileMoveType(description={!r})'.format( + self._description_value, + ) + +FileMoveType_validator = bv.Struct(FileMoveType) + +class FilePermanentlyDeleteDetails(bb.Struct): + """ + Permanently deleted files and/or folders. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(FilePermanentlyDeleteDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FilePermanentlyDeleteDetails()' + +FilePermanentlyDeleteDetails_validator = bv.Struct(FilePermanentlyDeleteDetails) + +class FilePermanentlyDeleteType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FilePermanentlyDeleteType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FilePermanentlyDeleteType(description={!r})'.format( + self._description_value, + ) + +FilePermanentlyDeleteType_validator = bv.Struct(FilePermanentlyDeleteType) + +class FilePreviewDetails(bb.Struct): + """ + Previewed files and/or folders. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(FilePreviewDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FilePreviewDetails()' + +FilePreviewDetails_validator = bv.Struct(FilePreviewDetails) + +class FilePreviewType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FilePreviewType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FilePreviewType(description={!r})'.format( + self._description_value, + ) + +FilePreviewType_validator = bv.Struct(FilePreviewType) + +class FileRenameDetails(bb.Struct): + """ + Renamed files and/or folders. + + :ivar relocate_action_details: Relocate action details. + """ + + __slots__ = [ + '_relocate_action_details_value', + '_relocate_action_details_present', + ] + + _has_required_fields = True + + def __init__(self, + relocate_action_details=None): + self._relocate_action_details_value = None + self._relocate_action_details_present = False + if relocate_action_details is not None: + self.relocate_action_details = relocate_action_details + + @property + def relocate_action_details(self): + """ + Relocate action details. + + :rtype: list of [RelocateAssetReferencesLogInfo] + """ + if self._relocate_action_details_present: + return self._relocate_action_details_value + else: + raise AttributeError("missing required field 'relocate_action_details'") + + @relocate_action_details.setter + def relocate_action_details(self, val): + val = self._relocate_action_details_validator.validate(val) + self._relocate_action_details_value = val + self._relocate_action_details_present = True + + @relocate_action_details.deleter + def relocate_action_details(self): + self._relocate_action_details_value = None + self._relocate_action_details_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRenameDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRenameDetails(relocate_action_details={!r})'.format( + self._relocate_action_details_value, + ) + +FileRenameDetails_validator = bv.Struct(FileRenameDetails) + +class FileRenameType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRenameType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRenameType(description={!r})'.format( + self._description_value, + ) + +FileRenameType_validator = bv.Struct(FileRenameType) + +class FileRequestChangeDetails(bb.Struct): + """ + Changed file request. + + :ivar file_request_id: File request id. Might be missing due to historical + data gap. + :ivar previous_details: Previous file request details. Might be missing due + to historical data gap. + :ivar new_details: New file request details. + """ + + __slots__ = [ + '_file_request_id_value', + '_file_request_id_present', + '_previous_details_value', + '_previous_details_present', + '_new_details_value', + '_new_details_present', + ] + + _has_required_fields = True + + def __init__(self, + new_details=None, + file_request_id=None, + previous_details=None): + self._file_request_id_value = None + self._file_request_id_present = False + self._previous_details_value = None + self._previous_details_present = False + self._new_details_value = None + self._new_details_present = False + if file_request_id is not None: + self.file_request_id = file_request_id + if previous_details is not None: + self.previous_details = previous_details + if new_details is not None: + self.new_details = new_details + + @property + def file_request_id(self): + """ + File request id. Might be missing due to historical data gap. + + :rtype: str + """ + if self._file_request_id_present: + return self._file_request_id_value + else: + return None + + @file_request_id.setter + def file_request_id(self, val): + if val is None: + del self.file_request_id + return + val = self._file_request_id_validator.validate(val) + self._file_request_id_value = val + self._file_request_id_present = True + + @file_request_id.deleter + def file_request_id(self): + self._file_request_id_value = None + self._file_request_id_present = False + + @property + def previous_details(self): + """ + Previous file request details. Might be missing due to historical data + gap. + + :rtype: FileRequestDetails + """ + if self._previous_details_present: + return self._previous_details_value + else: + return None + + @previous_details.setter + def previous_details(self, val): + if val is None: + del self.previous_details + return + self._previous_details_validator.validate_type_only(val) + self._previous_details_value = val + self._previous_details_present = True + + @previous_details.deleter + def previous_details(self): + self._previous_details_value = None + self._previous_details_present = False + + @property + def new_details(self): + """ + New file request details. + + :rtype: FileRequestDetails + """ + if self._new_details_present: + return self._new_details_value + else: + raise AttributeError("missing required field 'new_details'") + + @new_details.setter + def new_details(self, val): + self._new_details_validator.validate_type_only(val) + self._new_details_value = val + self._new_details_present = True + + @new_details.deleter + def new_details(self): + self._new_details_value = None + self._new_details_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestChangeDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestChangeDetails(new_details={!r}, file_request_id={!r}, previous_details={!r})'.format( + self._new_details_value, + self._file_request_id_value, + self._previous_details_value, + ) + +FileRequestChangeDetails_validator = bv.Struct(FileRequestChangeDetails) + +class FileRequestChangeType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestChangeType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestChangeType(description={!r})'.format( + self._description_value, + ) + +FileRequestChangeType_validator = bv.Struct(FileRequestChangeType) + +class FileRequestCloseDetails(bb.Struct): + """ + Closed file request. + + :ivar file_request_id: File request id. Might be missing due to historical + data gap. + :ivar previous_details: Previous file request details. Might be missing due + to historical data gap. + """ + + __slots__ = [ + '_file_request_id_value', + '_file_request_id_present', + '_previous_details_value', + '_previous_details_present', + ] + + _has_required_fields = False + + def __init__(self, + file_request_id=None, + previous_details=None): + self._file_request_id_value = None + self._file_request_id_present = False + self._previous_details_value = None + self._previous_details_present = False + if file_request_id is not None: + self.file_request_id = file_request_id + if previous_details is not None: + self.previous_details = previous_details + + @property + def file_request_id(self): + """ + File request id. Might be missing due to historical data gap. + + :rtype: str + """ + if self._file_request_id_present: + return self._file_request_id_value + else: + return None + + @file_request_id.setter + def file_request_id(self, val): + if val is None: + del self.file_request_id + return + val = self._file_request_id_validator.validate(val) + self._file_request_id_value = val + self._file_request_id_present = True + + @file_request_id.deleter + def file_request_id(self): + self._file_request_id_value = None + self._file_request_id_present = False + + @property + def previous_details(self): + """ + Previous file request details. Might be missing due to historical data + gap. + + :rtype: FileRequestDetails + """ + if self._previous_details_present: + return self._previous_details_value + else: + return None + + @previous_details.setter + def previous_details(self, val): + if val is None: + del self.previous_details + return + self._previous_details_validator.validate_type_only(val) + self._previous_details_value = val + self._previous_details_present = True + + @previous_details.deleter + def previous_details(self): + self._previous_details_value = None + self._previous_details_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestCloseDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestCloseDetails(file_request_id={!r}, previous_details={!r})'.format( + self._file_request_id_value, + self._previous_details_value, + ) + +FileRequestCloseDetails_validator = bv.Struct(FileRequestCloseDetails) + +class FileRequestCloseType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestCloseType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestCloseType(description={!r})'.format( + self._description_value, + ) + +FileRequestCloseType_validator = bv.Struct(FileRequestCloseType) + +class FileRequestCreateDetails(bb.Struct): + """ + Created file request. + + :ivar file_request_id: File request id. Might be missing due to historical + data gap. + :ivar request_details: File request details. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_file_request_id_value', + '_file_request_id_present', + '_request_details_value', + '_request_details_present', + ] + + _has_required_fields = False + + def __init__(self, + file_request_id=None, + request_details=None): + self._file_request_id_value = None + self._file_request_id_present = False + self._request_details_value = None + self._request_details_present = False + if file_request_id is not None: + self.file_request_id = file_request_id + if request_details is not None: + self.request_details = request_details + + @property + def file_request_id(self): + """ + File request id. Might be missing due to historical data gap. + + :rtype: str + """ + if self._file_request_id_present: + return self._file_request_id_value + else: + return None + + @file_request_id.setter + def file_request_id(self, val): + if val is None: + del self.file_request_id + return + val = self._file_request_id_validator.validate(val) + self._file_request_id_value = val + self._file_request_id_present = True + + @file_request_id.deleter + def file_request_id(self): + self._file_request_id_value = None + self._file_request_id_present = False + + @property + def request_details(self): + """ + File request details. Might be missing due to historical data gap. + + :rtype: FileRequestDetails + """ + if self._request_details_present: + return self._request_details_value + else: + return None + + @request_details.setter + def request_details(self, val): + if val is None: + del self.request_details + return + self._request_details_validator.validate_type_only(val) + self._request_details_value = val + self._request_details_present = True + + @request_details.deleter + def request_details(self): + self._request_details_value = None + self._request_details_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestCreateDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestCreateDetails(file_request_id={!r}, request_details={!r})'.format( + self._file_request_id_value, + self._request_details_value, + ) + +FileRequestCreateDetails_validator = bv.Struct(FileRequestCreateDetails) + +class FileRequestCreateType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestCreateType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestCreateType(description={!r})'.format( + self._description_value, + ) + +FileRequestCreateType_validator = bv.Struct(FileRequestCreateType) + +class FileRequestDeadline(bb.Struct): + """ + File request deadline + + :ivar deadline: The deadline for this file request. Might be missing due to + historical data gap. + :ivar allow_late_uploads: If set, allow uploads after the deadline has + passed. Might be missing due to historical data gap. + """ + + __slots__ = [ + '_deadline_value', + '_deadline_present', + '_allow_late_uploads_value', + '_allow_late_uploads_present', + ] + + _has_required_fields = False + + def __init__(self, + deadline=None, + allow_late_uploads=None): + self._deadline_value = None + self._deadline_present = False + self._allow_late_uploads_value = None + self._allow_late_uploads_present = False + if deadline is not None: + self.deadline = deadline + if allow_late_uploads is not None: + self.allow_late_uploads = allow_late_uploads + + @property + def deadline(self): + """ + The deadline for this file request. Might be missing due to historical + data gap. + + :rtype: datetime.datetime + """ + if self._deadline_present: + return self._deadline_value + else: + return None + + @deadline.setter + def deadline(self, val): + if val is None: + del self.deadline + return + val = self._deadline_validator.validate(val) + self._deadline_value = val + self._deadline_present = True + + @deadline.deleter + def deadline(self): + self._deadline_value = None + self._deadline_present = False + + @property + def allow_late_uploads(self): + """ + If set, allow uploads after the deadline has passed. Might be missing + due to historical data gap. + + :rtype: str + """ + if self._allow_late_uploads_present: + return self._allow_late_uploads_value + else: + return None + + @allow_late_uploads.setter + def allow_late_uploads(self, val): + if val is None: + del self.allow_late_uploads + return + val = self._allow_late_uploads_validator.validate(val) + self._allow_late_uploads_value = val + self._allow_late_uploads_present = True + + @allow_late_uploads.deleter + def allow_late_uploads(self): + self._allow_late_uploads_value = None + self._allow_late_uploads_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestDeadline, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestDeadline(deadline={!r}, allow_late_uploads={!r})'.format( + self._deadline_value, + self._allow_late_uploads_value, + ) + +FileRequestDeadline_validator = bv.Struct(FileRequestDeadline) + +class FileRequestDetails(bb.Struct): + """ + File request details + + :ivar asset_index: Asset position in the Assets list. + :ivar deadline: File request deadline. Might be missing due to historical + data gap. + """ + + __slots__ = [ + '_asset_index_value', + '_asset_index_present', + '_deadline_value', + '_deadline_present', + ] + + _has_required_fields = True + + def __init__(self, + asset_index=None, + deadline=None): + self._asset_index_value = None + self._asset_index_present = False + self._deadline_value = None + self._deadline_present = False + if asset_index is not None: + self.asset_index = asset_index + if deadline is not None: + self.deadline = deadline + + @property + def asset_index(self): + """ + Asset position in the Assets list. + + :rtype: int + """ + if self._asset_index_present: + return self._asset_index_value + else: + raise AttributeError("missing required field 'asset_index'") + + @asset_index.setter + def asset_index(self, val): + val = self._asset_index_validator.validate(val) + self._asset_index_value = val + self._asset_index_present = True + + @asset_index.deleter + def asset_index(self): + self._asset_index_value = None + self._asset_index_present = False + + @property + def deadline(self): + """ + File request deadline. Might be missing due to historical data gap. + + :rtype: FileRequestDeadline + """ + if self._deadline_present: + return self._deadline_value + else: + return None + + @deadline.setter + def deadline(self, val): + if val is None: + del self.deadline + return + self._deadline_validator.validate_type_only(val) + self._deadline_value = val + self._deadline_present = True + + @deadline.deleter + def deadline(self): + self._deadline_value = None + self._deadline_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestDetails(asset_index={!r}, deadline={!r})'.format( + self._asset_index_value, + self._deadline_value, + ) + +FileRequestDetails_validator = bv.Struct(FileRequestDetails) + +class FileRequestReceiveFileDetails(bb.Struct): + """ + Received files for file request. + + :ivar file_request_id: File request id. Might be missing due to historical + data gap. + :ivar file_request_details: File request details. Might be missing due to + historical data gap. + :ivar submitted_file_names: Submitted file names. + :ivar submitter_name: The name as provided by the submitter. Might be + missing due to historical data gap. + :ivar submitter_email: The email as provided by the submitter. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_file_request_id_value', + '_file_request_id_present', + '_file_request_details_value', + '_file_request_details_present', + '_submitted_file_names_value', + '_submitted_file_names_present', + '_submitter_name_value', + '_submitter_name_present', + '_submitter_email_value', + '_submitter_email_present', + ] + + _has_required_fields = True + + def __init__(self, + submitted_file_names=None, + file_request_id=None, + file_request_details=None, + submitter_name=None, + submitter_email=None): + self._file_request_id_value = None + self._file_request_id_present = False + self._file_request_details_value = None + self._file_request_details_present = False + self._submitted_file_names_value = None + self._submitted_file_names_present = False + self._submitter_name_value = None + self._submitter_name_present = False + self._submitter_email_value = None + self._submitter_email_present = False + if file_request_id is not None: + self.file_request_id = file_request_id + if file_request_details is not None: + self.file_request_details = file_request_details + if submitted_file_names is not None: + self.submitted_file_names = submitted_file_names + if submitter_name is not None: + self.submitter_name = submitter_name + if submitter_email is not None: + self.submitter_email = submitter_email + + @property + def file_request_id(self): + """ + File request id. Might be missing due to historical data gap. + + :rtype: str + """ + if self._file_request_id_present: + return self._file_request_id_value + else: + return None + + @file_request_id.setter + def file_request_id(self, val): + if val is None: + del self.file_request_id + return + val = self._file_request_id_validator.validate(val) + self._file_request_id_value = val + self._file_request_id_present = True + + @file_request_id.deleter + def file_request_id(self): + self._file_request_id_value = None + self._file_request_id_present = False + + @property + def file_request_details(self): + """ + File request details. Might be missing due to historical data gap. + + :rtype: FileRequestDetails + """ + if self._file_request_details_present: + return self._file_request_details_value + else: + return None + + @file_request_details.setter + def file_request_details(self, val): + if val is None: + del self.file_request_details + return + self._file_request_details_validator.validate_type_only(val) + self._file_request_details_value = val + self._file_request_details_present = True + + @file_request_details.deleter + def file_request_details(self): + self._file_request_details_value = None + self._file_request_details_present = False + + @property + def submitted_file_names(self): + """ + Submitted file names. + + :rtype: list of [str] + """ + if self._submitted_file_names_present: + return self._submitted_file_names_value + else: + raise AttributeError("missing required field 'submitted_file_names'") + + @submitted_file_names.setter + def submitted_file_names(self, val): + val = self._submitted_file_names_validator.validate(val) + self._submitted_file_names_value = val + self._submitted_file_names_present = True + + @submitted_file_names.deleter + def submitted_file_names(self): + self._submitted_file_names_value = None + self._submitted_file_names_present = False + + @property + def submitter_name(self): + """ + The name as provided by the submitter. Might be missing due to + historical data gap. + + :rtype: str + """ + if self._submitter_name_present: + return self._submitter_name_value + else: + return None + + @submitter_name.setter + def submitter_name(self, val): + if val is None: + del self.submitter_name + return + val = self._submitter_name_validator.validate(val) + self._submitter_name_value = val + self._submitter_name_present = True + + @submitter_name.deleter + def submitter_name(self): + self._submitter_name_value = None + self._submitter_name_present = False + + @property + def submitter_email(self): + """ + The email as provided by the submitter. Might be missing due to + historical data gap. + + :rtype: str + """ + if self._submitter_email_present: + return self._submitter_email_value + else: + return None + + @submitter_email.setter + def submitter_email(self, val): + if val is None: + del self.submitter_email + return + val = self._submitter_email_validator.validate(val) + self._submitter_email_value = val + self._submitter_email_present = True + + @submitter_email.deleter + def submitter_email(self): + self._submitter_email_value = None + self._submitter_email_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestReceiveFileDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestReceiveFileDetails(submitted_file_names={!r}, file_request_id={!r}, file_request_details={!r}, submitter_name={!r}, submitter_email={!r})'.format( + self._submitted_file_names_value, + self._file_request_id_value, + self._file_request_details_value, + self._submitter_name_value, + self._submitter_email_value, + ) + +FileRequestReceiveFileDetails_validator = bv.Struct(FileRequestReceiveFileDetails) + +class FileRequestReceiveFileType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestReceiveFileType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestReceiveFileType(description={!r})'.format( + self._description_value, + ) + +FileRequestReceiveFileType_validator = bv.Struct(FileRequestReceiveFileType) + +class FileRequestsChangePolicyDetails(bb.Struct): + """ + Enabled/disabled file requests. + + :ivar new_value: New file requests policy. + :ivar previous_value: Previous file requests policy. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New file requests policy. + + :rtype: FileRequestsPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous file requests policy. Might be missing due to historical data + gap. + + :rtype: FileRequestsPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestsChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestsChangePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +FileRequestsChangePolicyDetails_validator = bv.Struct(FileRequestsChangePolicyDetails) + +class FileRequestsChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestsChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestsChangePolicyType(description={!r})'.format( + self._description_value, + ) + +FileRequestsChangePolicyType_validator = bv.Struct(FileRequestsChangePolicyType) + +class FileRequestsEmailsEnabledDetails(bb.Struct): + """ + Enabled file request emails for everyone. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestsEmailsEnabledDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestsEmailsEnabledDetails()' + +FileRequestsEmailsEnabledDetails_validator = bv.Struct(FileRequestsEmailsEnabledDetails) + +class FileRequestsEmailsEnabledType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestsEmailsEnabledType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestsEmailsEnabledType(description={!r})'.format( + self._description_value, + ) + +FileRequestsEmailsEnabledType_validator = bv.Struct(FileRequestsEmailsEnabledType) + +class FileRequestsEmailsRestrictedToTeamOnlyDetails(bb.Struct): + """ + Enabled file request emails for team. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestsEmailsRestrictedToTeamOnlyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestsEmailsRestrictedToTeamOnlyDetails()' + +FileRequestsEmailsRestrictedToTeamOnlyDetails_validator = bv.Struct(FileRequestsEmailsRestrictedToTeamOnlyDetails) + +class FileRequestsEmailsRestrictedToTeamOnlyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestsEmailsRestrictedToTeamOnlyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestsEmailsRestrictedToTeamOnlyType(description={!r})'.format( + self._description_value, + ) + +FileRequestsEmailsRestrictedToTeamOnlyType_validator = bv.Struct(FileRequestsEmailsRestrictedToTeamOnlyType) + +class FileRequestsPolicy(bb.Union): + """ + File requests policy + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRequestsPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRequestsPolicy(%r, %r)' % (self._tag, self._value) + +FileRequestsPolicy_validator = bv.Union(FileRequestsPolicy) + +class FileResolveCommentDetails(bb.Struct): + """ + Resolved file comment. + + :ivar comment_text: Comment text. Might be missing due to historical data + gap. + """ + + __slots__ = [ + '_comment_text_value', + '_comment_text_present', + ] + + _has_required_fields = False + + def __init__(self, + comment_text=None): + self._comment_text_value = None + self._comment_text_present = False + if comment_text is not None: + self.comment_text = comment_text + + @property + def comment_text(self): + """ + Comment text. Might be missing due to historical data gap. + + :rtype: str + """ + if self._comment_text_present: + return self._comment_text_value + else: + return None + + @comment_text.setter + def comment_text(self, val): + if val is None: + del self.comment_text + return + val = self._comment_text_validator.validate(val) + self._comment_text_value = val + self._comment_text_present = True + + @comment_text.deleter + def comment_text(self): + self._comment_text_value = None + self._comment_text_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileResolveCommentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileResolveCommentDetails(comment_text={!r})'.format( + self._comment_text_value, + ) + +FileResolveCommentDetails_validator = bv.Struct(FileResolveCommentDetails) + +class FileResolveCommentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileResolveCommentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileResolveCommentType(description={!r})'.format( + self._description_value, + ) + +FileResolveCommentType_validator = bv.Struct(FileResolveCommentType) + +class FileRestoreDetails(bb.Struct): + """ + Restored deleted files and/or folders. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRestoreDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRestoreDetails()' + +FileRestoreDetails_validator = bv.Struct(FileRestoreDetails) + +class FileRestoreType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRestoreType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRestoreType(description={!r})'.format( + self._description_value, + ) + +FileRestoreType_validator = bv.Struct(FileRestoreType) + +class FileRevertDetails(bb.Struct): + """ + Reverted files to previous version. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRevertDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRevertDetails()' + +FileRevertDetails_validator = bv.Struct(FileRevertDetails) + +class FileRevertType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRevertType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRevertType(description={!r})'.format( + self._description_value, + ) + +FileRevertType_validator = bv.Struct(FileRevertType) + +class FileRollbackChangesDetails(bb.Struct): + """ + Rolled back file actions. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRollbackChangesDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRollbackChangesDetails()' + +FileRollbackChangesDetails_validator = bv.Struct(FileRollbackChangesDetails) + +class FileRollbackChangesType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileRollbackChangesType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileRollbackChangesType(description={!r})'.format( + self._description_value, + ) + +FileRollbackChangesType_validator = bv.Struct(FileRollbackChangesType) + +class FileSaveCopyReferenceDetails(bb.Struct): + """ + Saved file/folder using copy reference. + + :ivar relocate_action_details: Relocate action details. + """ + + __slots__ = [ + '_relocate_action_details_value', + '_relocate_action_details_present', + ] + + _has_required_fields = True + + def __init__(self, + relocate_action_details=None): + self._relocate_action_details_value = None + self._relocate_action_details_present = False + if relocate_action_details is not None: + self.relocate_action_details = relocate_action_details + + @property + def relocate_action_details(self): + """ + Relocate action details. + + :rtype: list of [RelocateAssetReferencesLogInfo] + """ + if self._relocate_action_details_present: + return self._relocate_action_details_value + else: + raise AttributeError("missing required field 'relocate_action_details'") + + @relocate_action_details.setter + def relocate_action_details(self, val): + val = self._relocate_action_details_validator.validate(val) + self._relocate_action_details_value = val + self._relocate_action_details_present = True + + @relocate_action_details.deleter + def relocate_action_details(self): + self._relocate_action_details_value = None + self._relocate_action_details_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileSaveCopyReferenceDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileSaveCopyReferenceDetails(relocate_action_details={!r})'.format( + self._relocate_action_details_value, + ) + +FileSaveCopyReferenceDetails_validator = bv.Struct(FileSaveCopyReferenceDetails) + +class FileSaveCopyReferenceType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileSaveCopyReferenceType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileSaveCopyReferenceType(description={!r})'.format( + self._description_value, + ) + +FileSaveCopyReferenceType_validator = bv.Struct(FileSaveCopyReferenceType) + +class FileUnlikeCommentDetails(bb.Struct): + """ + Unliked file comment. + + :ivar comment_text: Comment text. Might be missing due to historical data + gap. + """ + + __slots__ = [ + '_comment_text_value', + '_comment_text_present', + ] + + _has_required_fields = False + + def __init__(self, + comment_text=None): + self._comment_text_value = None + self._comment_text_present = False + if comment_text is not None: + self.comment_text = comment_text + + @property + def comment_text(self): + """ + Comment text. Might be missing due to historical data gap. + + :rtype: str + """ + if self._comment_text_present: + return self._comment_text_value + else: + return None + + @comment_text.setter + def comment_text(self, val): + if val is None: + del self.comment_text + return + val = self._comment_text_validator.validate(val) + self._comment_text_value = val + self._comment_text_present = True + + @comment_text.deleter + def comment_text(self): + self._comment_text_value = None + self._comment_text_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileUnlikeCommentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileUnlikeCommentDetails(comment_text={!r})'.format( + self._comment_text_value, + ) + +FileUnlikeCommentDetails_validator = bv.Struct(FileUnlikeCommentDetails) + +class FileUnlikeCommentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileUnlikeCommentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileUnlikeCommentType(description={!r})'.format( + self._description_value, + ) + +FileUnlikeCommentType_validator = bv.Struct(FileUnlikeCommentType) + +class FileUnresolveCommentDetails(bb.Struct): + """ + Unresolved file comment. + + :ivar comment_text: Comment text. Might be missing due to historical data + gap. + """ + + __slots__ = [ + '_comment_text_value', + '_comment_text_present', + ] + + _has_required_fields = False + + def __init__(self, + comment_text=None): + self._comment_text_value = None + self._comment_text_present = False + if comment_text is not None: + self.comment_text = comment_text + + @property + def comment_text(self): + """ + Comment text. Might be missing due to historical data gap. + + :rtype: str + """ + if self._comment_text_present: + return self._comment_text_value + else: + return None + + @comment_text.setter + def comment_text(self, val): + if val is None: + del self.comment_text + return + val = self._comment_text_validator.validate(val) + self._comment_text_value = val + self._comment_text_present = True + + @comment_text.deleter + def comment_text(self): + self._comment_text_value = None + self._comment_text_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileUnresolveCommentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileUnresolveCommentDetails(comment_text={!r})'.format( + self._comment_text_value, + ) + +FileUnresolveCommentDetails_validator = bv.Struct(FileUnresolveCommentDetails) + +class FileUnresolveCommentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FileUnresolveCommentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FileUnresolveCommentType(description={!r})'.format( + self._description_value, + ) + +FileUnresolveCommentType_validator = bv.Struct(FileUnresolveCommentType) + +class FolderLogInfo(FileOrFolderLogInfo): + """ + Folder's logged information. + """ + + __slots__ = [ + ] + + _has_required_fields = True + + def __init__(self, + path=None, + display_name=None, + file_id=None): + super(FolderLogInfo, self).__init__(path, + display_name, + file_id) + + def _process_custom_annotations(self, annotation_type, processor): + super(FolderLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FolderLogInfo(path={!r}, display_name={!r}, file_id={!r})'.format( + self._path_value, + self._display_name_value, + self._file_id_value, + ) + +FolderLogInfo_validator = bv.Struct(FolderLogInfo) + +class GeoLocationLogInfo(bb.Struct): + """ + Geographic location details. + + :ivar city: City name. + :ivar region: Region name. + :ivar country: Country code. + :ivar ip_address: IP address. + """ + + __slots__ = [ + '_city_value', + '_city_present', + '_region_value', + '_region_present', + '_country_value', + '_country_present', + '_ip_address_value', + '_ip_address_present', + ] + + _has_required_fields = True + + def __init__(self, + ip_address=None, + city=None, + region=None, + country=None): + self._city_value = None + self._city_present = False + self._region_value = None + self._region_present = False + self._country_value = None + self._country_present = False + self._ip_address_value = None + self._ip_address_present = False + if city is not None: + self.city = city + if region is not None: + self.region = region + if country is not None: + self.country = country + if ip_address is not None: + self.ip_address = ip_address + + @property + def city(self): + """ + City name. + + :rtype: str + """ + if self._city_present: + return self._city_value + else: + return None + + @city.setter + def city(self, val): + if val is None: + del self.city + return + val = self._city_validator.validate(val) + self._city_value = val + self._city_present = True + + @city.deleter + def city(self): + self._city_value = None + self._city_present = False + + @property + def region(self): + """ + Region name. + + :rtype: str + """ + if self._region_present: + return self._region_value + else: + return None + + @region.setter + def region(self, val): + if val is None: + del self.region + return + val = self._region_validator.validate(val) + self._region_value = val + self._region_present = True + + @region.deleter + def region(self): + self._region_value = None + self._region_present = False + + @property + def country(self): + """ + Country code. + + :rtype: str + """ + if self._country_present: + return self._country_value + else: + return None + + @country.setter + def country(self, val): + if val is None: + del self.country + return + val = self._country_validator.validate(val) + self._country_value = val + self._country_present = True + + @country.deleter + def country(self): + self._country_value = None + self._country_present = False + + @property + def ip_address(self): + """ + IP address. + + :rtype: str + """ + if self._ip_address_present: + return self._ip_address_value + else: + raise AttributeError("missing required field 'ip_address'") + + @ip_address.setter + def ip_address(self, val): + val = self._ip_address_validator.validate(val) + self._ip_address_value = val + self._ip_address_present = True + + @ip_address.deleter + def ip_address(self): + self._ip_address_value = None + self._ip_address_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GeoLocationLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GeoLocationLogInfo(ip_address={!r}, city={!r}, region={!r}, country={!r})'.format( + self._ip_address_value, + self._city_value, + self._region_value, + self._country_value, + ) + +GeoLocationLogInfo_validator = bv.Struct(GeoLocationLogInfo) + +class GetTeamEventsArg(bb.Struct): + """ + :ivar limit: The maximal number of results to return per call. Note that + some calls may not return ``limit`` number of events, and may even + return no events, even with `has_more` set to true. In this case, + callers should fetch again using + :meth:`dropbox.dropbox.Dropbox.team_log_get_events_continue`. + :ivar account_id: Filter the events by account ID. Return ony events with + this account_id as either Actor, Context, or Participants. + :ivar time: Filter by time range. + :ivar category: Filter the returned events to a single category. + """ + + __slots__ = [ + '_limit_value', + '_limit_present', + '_account_id_value', + '_account_id_present', + '_time_value', + '_time_present', + '_category_value', + '_category_present', + ] + + _has_required_fields = False + + def __init__(self, + limit=None, + account_id=None, + time=None, + category=None): + self._limit_value = None + self._limit_present = False + self._account_id_value = None + self._account_id_present = False + self._time_value = None + self._time_present = False + self._category_value = None + self._category_present = False + if limit is not None: + self.limit = limit + if account_id is not None: + self.account_id = account_id + if time is not None: + self.time = time + if category is not None: + self.category = category + + @property + def limit(self): + """ + The maximal number of results to return per call. Note that some calls + may not return ``limit`` number of events, and may even return no + events, even with `has_more` set to true. In this case, callers should + fetch again using + :meth:`dropbox.dropbox.Dropbox.team_log_get_events_continue`. + + :rtype: int + """ + if self._limit_present: + return self._limit_value + else: + return 1000 + + @limit.setter + def limit(self, val): + val = self._limit_validator.validate(val) + self._limit_value = val + self._limit_present = True + + @limit.deleter + def limit(self): + self._limit_value = None + self._limit_present = False + + @property + def account_id(self): + """ + Filter the events by account ID. Return ony events with this account_id + as either Actor, Context, or Participants. + + :rtype: str + """ + if self._account_id_present: + return self._account_id_value + else: + return None + + @account_id.setter + def account_id(self, val): + if val is None: + del self.account_id + return + val = self._account_id_validator.validate(val) + self._account_id_value = val + self._account_id_present = True + + @account_id.deleter + def account_id(self): + self._account_id_value = None + self._account_id_present = False + + @property + def time(self): + """ + Filter by time range. + + :rtype: team_common.TimeRange + """ + if self._time_present: + return self._time_value + else: + return None + + @time.setter + def time(self, val): + if val is None: + del self.time + return + self._time_validator.validate_type_only(val) + self._time_value = val + self._time_present = True + + @time.deleter + def time(self): + self._time_value = None + self._time_present = False + + @property + def category(self): + """ + Filter the returned events to a single category. + + :rtype: EventCategory + """ + if self._category_present: + return self._category_value + else: + return None + + @category.setter + def category(self, val): + if val is None: + del self.category + return + self._category_validator.validate_type_only(val) + self._category_value = val + self._category_present = True + + @category.deleter + def category(self): + self._category_value = None + self._category_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetTeamEventsArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetTeamEventsArg(limit={!r}, account_id={!r}, time={!r}, category={!r})'.format( + self._limit_value, + self._account_id_value, + self._time_value, + self._category_value, + ) + +GetTeamEventsArg_validator = bv.Struct(GetTeamEventsArg) + +class GetTeamEventsContinueArg(bb.Struct): + """ + :ivar cursor: Indicates from what point to get the next set of events. + """ + + __slots__ = [ + '_cursor_value', + '_cursor_present', + ] + + _has_required_fields = True + + def __init__(self, + cursor=None): + self._cursor_value = None + self._cursor_present = False + if cursor is not None: + self.cursor = cursor + + @property + def cursor(self): + """ + Indicates from what point to get the next set of events. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetTeamEventsContinueArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetTeamEventsContinueArg(cursor={!r})'.format( + self._cursor_value, + ) + +GetTeamEventsContinueArg_validator = bv.Struct(GetTeamEventsContinueArg) + +class GetTeamEventsContinueError(bb.Union): + """ + Errors that can be raised when calling + :meth:`dropbox.dropbox.Dropbox.team_log_get_events_continue`. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar bad_cursor: Bad cursor. + :ivar datetime.datetime reset: Cursors are intended to be used quickly. + Individual cursor values are normally valid for days, but in rare cases + may be reset sooner. Cursor reset errors should be handled by fetching a + new cursor from :route:`get_events`. The associated value is the + approximate timestamp of the most recent event returned by the cursor. + This should be used as a resumption point when calling + :route:`get_events` to obtain a new cursor. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + bad_cursor = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def reset(cls, val): + """ + Create an instance of this class set to the ``reset`` tag with value + ``val``. + + :param datetime.datetime val: + :rtype: GetTeamEventsContinueError + """ + return cls('reset', val) + + def is_bad_cursor(self): + """ + Check if the union tag is ``bad_cursor``. + + :rtype: bool + """ + return self._tag == 'bad_cursor' + + def is_reset(self): + """ + Check if the union tag is ``reset``. + + :rtype: bool + """ + return self._tag == 'reset' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_reset(self): + """ + Cursors are intended to be used quickly. Individual cursor values are + normally valid for days, but in rare cases may be reset sooner. Cursor + reset errors should be handled by fetching a new cursor from + :meth:`dropbox.dropbox.Dropbox.team_log_get_events`. The associated + value is the approximate timestamp of the most recent event returned by + the cursor. This should be used as a resumption point when calling + :meth:`dropbox.dropbox.Dropbox.team_log_get_events` to obtain a new + cursor. + + Only call this if :meth:`is_reset` is true. + + :rtype: datetime.datetime + """ + if not self.is_reset(): + raise AttributeError("tag 'reset' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(GetTeamEventsContinueError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetTeamEventsContinueError(%r, %r)' % (self._tag, self._value) + +GetTeamEventsContinueError_validator = bv.Union(GetTeamEventsContinueError) + +class GetTeamEventsError(bb.Union): + """ + Errors that can be raised when calling + :meth:`dropbox.dropbox.Dropbox.team_log_get_events`. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar account_id_not_found: No user found matching the provided account_id. + :ivar invalid_time_range: Invalid time range. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + account_id_not_found = None + # Attribute is overwritten below the class definition + invalid_time_range = None + # Attribute is overwritten below the class definition + other = None + + def is_account_id_not_found(self): + """ + Check if the union tag is ``account_id_not_found``. + + :rtype: bool + """ + return self._tag == 'account_id_not_found' + + def is_invalid_time_range(self): + """ + Check if the union tag is ``invalid_time_range``. + + :rtype: bool + """ + return self._tag == 'invalid_time_range' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(GetTeamEventsError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetTeamEventsError(%r, %r)' % (self._tag, self._value) + +GetTeamEventsError_validator = bv.Union(GetTeamEventsError) + +class GetTeamEventsResult(bb.Struct): + """ + :ivar events: List of events. Note that events are not guaranteed to be + sorted by their timestamp value. + :ivar cursor: Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_log_get_events_continue` to obtain + additional events. The value of ``cursor`` may change for each response + from :meth:`dropbox.dropbox.Dropbox.team_log_get_events_continue`, + regardless of the value of ``has_more``; older cursor strings may + expire. Thus, callers should ensure that they update their cursor based + on the latest value of ``cursor`` after each call, and poll regularly if + they wish to poll for new events. Callers should handle reset exceptions + for expired cursors. + :ivar has_more: Is true if there may be additional events that have not been + returned yet. An additional call to + :meth:`dropbox.dropbox.Dropbox.team_log_get_events_continue` can + retrieve them. Note that ``has_more`` may be ``True``, even if + ``events`` is empty. + """ + + __slots__ = [ + '_events_value', + '_events_present', + '_cursor_value', + '_cursor_present', + '_has_more_value', + '_has_more_present', + ] + + _has_required_fields = True + + def __init__(self, + events=None, + cursor=None, + has_more=None): + self._events_value = None + self._events_present = False + self._cursor_value = None + self._cursor_present = False + self._has_more_value = None + self._has_more_present = False + if events is not None: + self.events = events + if cursor is not None: + self.cursor = cursor + if has_more is not None: + self.has_more = has_more + + @property + def events(self): + """ + List of events. Note that events are not guaranteed to be sorted by + their timestamp value. + + :rtype: list of [TeamEvent] + """ + if self._events_present: + return self._events_value + else: + raise AttributeError("missing required field 'events'") + + @events.setter + def events(self, val): + val = self._events_validator.validate(val) + self._events_value = val + self._events_present = True + + @events.deleter + def events(self): + self._events_value = None + self._events_present = False + + @property + def cursor(self): + """ + Pass the cursor into + :meth:`dropbox.dropbox.Dropbox.team_log_get_events_continue` to obtain + additional events. The value of ``cursor`` may change for each response + from :meth:`dropbox.dropbox.Dropbox.team_log_get_events_continue`, + regardless of the value of ``has_more``; older cursor strings may + expire. Thus, callers should ensure that they update their cursor based + on the latest value of ``cursor`` after each call, and poll regularly if + they wish to poll for new events. Callers should handle reset exceptions + for expired cursors. + + :rtype: str + """ + if self._cursor_present: + return self._cursor_value + else: + raise AttributeError("missing required field 'cursor'") + + @cursor.setter + def cursor(self, val): + val = self._cursor_validator.validate(val) + self._cursor_value = val + self._cursor_present = True + + @cursor.deleter + def cursor(self): + self._cursor_value = None + self._cursor_present = False + + @property + def has_more(self): + """ + Is true if there may be additional events that have not been returned + yet. An additional call to + :meth:`dropbox.dropbox.Dropbox.team_log_get_events_continue` can + retrieve them. Note that ``has_more`` may be ``True``, even if + ``events`` is empty. + + :rtype: bool + """ + if self._has_more_present: + return self._has_more_value + else: + raise AttributeError("missing required field 'has_more'") + + @has_more.setter + def has_more(self, val): + val = self._has_more_validator.validate(val) + self._has_more_value = val + self._has_more_present = True + + @has_more.deleter + def has_more(self): + self._has_more_value = None + self._has_more_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetTeamEventsResult, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetTeamEventsResult(events={!r}, cursor={!r}, has_more={!r})'.format( + self._events_value, + self._cursor_value, + self._has_more_value, + ) + +GetTeamEventsResult_validator = bv.Struct(GetTeamEventsResult) + +class GoogleSsoChangePolicyDetails(bb.Struct): + """ + Enabled/disabled Google single sign-on for team. + + :ivar new_value: New Google single sign-on policy. + :ivar previous_value: Previous Google single sign-on policy. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New Google single sign-on policy. + + :rtype: GoogleSsoPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous Google single sign-on policy. Might be missing due to + historical data gap. + + :rtype: GoogleSsoPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GoogleSsoChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GoogleSsoChangePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +GoogleSsoChangePolicyDetails_validator = bv.Struct(GoogleSsoChangePolicyDetails) + +class GoogleSsoChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GoogleSsoChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GoogleSsoChangePolicyType(description={!r})'.format( + self._description_value, + ) + +GoogleSsoChangePolicyType_validator = bv.Struct(GoogleSsoChangePolicyType) + +class GoogleSsoPolicy(bb.Union): + """ + Google SSO policy + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(GoogleSsoPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GoogleSsoPolicy(%r, %r)' % (self._tag, self._value) + +GoogleSsoPolicy_validator = bv.Union(GoogleSsoPolicy) + +class GroupAddExternalIdDetails(bb.Struct): + """ + Added external ID for group. + + :ivar new_value: Current external id. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None): + self._new_value_value = None + self._new_value_present = False + if new_value is not None: + self.new_value = new_value + + @property + def new_value(self): + """ + Current external id. + + :rtype: str + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + val = self._new_value_validator.validate(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupAddExternalIdDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupAddExternalIdDetails(new_value={!r})'.format( + self._new_value_value, + ) + +GroupAddExternalIdDetails_validator = bv.Struct(GroupAddExternalIdDetails) + +class GroupAddExternalIdType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupAddExternalIdType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupAddExternalIdType(description={!r})'.format( + self._description_value, + ) + +GroupAddExternalIdType_validator = bv.Struct(GroupAddExternalIdType) + +class GroupAddMemberDetails(bb.Struct): + """ + Added team members to group. + + :ivar is_group_owner: Is group owner. + """ + + __slots__ = [ + '_is_group_owner_value', + '_is_group_owner_present', + ] + + _has_required_fields = True + + def __init__(self, + is_group_owner=None): + self._is_group_owner_value = None + self._is_group_owner_present = False + if is_group_owner is not None: + self.is_group_owner = is_group_owner + + @property + def is_group_owner(self): + """ + Is group owner. + + :rtype: bool + """ + if self._is_group_owner_present: + return self._is_group_owner_value + else: + raise AttributeError("missing required field 'is_group_owner'") + + @is_group_owner.setter + def is_group_owner(self, val): + val = self._is_group_owner_validator.validate(val) + self._is_group_owner_value = val + self._is_group_owner_present = True + + @is_group_owner.deleter + def is_group_owner(self): + self._is_group_owner_value = None + self._is_group_owner_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupAddMemberDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupAddMemberDetails(is_group_owner={!r})'.format( + self._is_group_owner_value, + ) + +GroupAddMemberDetails_validator = bv.Struct(GroupAddMemberDetails) + +class GroupAddMemberType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupAddMemberType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupAddMemberType(description={!r})'.format( + self._description_value, + ) + +GroupAddMemberType_validator = bv.Struct(GroupAddMemberType) + +class GroupChangeExternalIdDetails(bb.Struct): + """ + Changed external ID for group. + + :ivar new_value: Current external id. + :ivar previous_value: Old external id. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + Current external id. + + :rtype: str + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + val = self._new_value_validator.validate(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Old external id. + + :rtype: str + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + val = self._previous_value_validator.validate(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupChangeExternalIdDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupChangeExternalIdDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +GroupChangeExternalIdDetails_validator = bv.Struct(GroupChangeExternalIdDetails) + +class GroupChangeExternalIdType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupChangeExternalIdType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupChangeExternalIdType(description={!r})'.format( + self._description_value, + ) + +GroupChangeExternalIdType_validator = bv.Struct(GroupChangeExternalIdType) + +class GroupChangeManagementTypeDetails(bb.Struct): + """ + Changed group management type. + + :ivar new_value: New group management type. + :ivar previous_value: Previous group management type. Might be missing due + to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New group management type. + + :rtype: team_common.GroupManagementType + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous group management type. Might be missing due to historical data + gap. + + :rtype: team_common.GroupManagementType + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupChangeManagementTypeDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupChangeManagementTypeDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +GroupChangeManagementTypeDetails_validator = bv.Struct(GroupChangeManagementTypeDetails) + +class GroupChangeManagementTypeType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupChangeManagementTypeType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupChangeManagementTypeType(description={!r})'.format( + self._description_value, + ) + +GroupChangeManagementTypeType_validator = bv.Struct(GroupChangeManagementTypeType) + +class GroupChangeMemberRoleDetails(bb.Struct): + """ + Changed manager permissions of group member. + + :ivar is_group_owner: Is group owner. + """ + + __slots__ = [ + '_is_group_owner_value', + '_is_group_owner_present', + ] + + _has_required_fields = True + + def __init__(self, + is_group_owner=None): + self._is_group_owner_value = None + self._is_group_owner_present = False + if is_group_owner is not None: + self.is_group_owner = is_group_owner + + @property + def is_group_owner(self): + """ + Is group owner. + + :rtype: bool + """ + if self._is_group_owner_present: + return self._is_group_owner_value + else: + raise AttributeError("missing required field 'is_group_owner'") + + @is_group_owner.setter + def is_group_owner(self, val): + val = self._is_group_owner_validator.validate(val) + self._is_group_owner_value = val + self._is_group_owner_present = True + + @is_group_owner.deleter + def is_group_owner(self): + self._is_group_owner_value = None + self._is_group_owner_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupChangeMemberRoleDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupChangeMemberRoleDetails(is_group_owner={!r})'.format( + self._is_group_owner_value, + ) + +GroupChangeMemberRoleDetails_validator = bv.Struct(GroupChangeMemberRoleDetails) + +class GroupChangeMemberRoleType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupChangeMemberRoleType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupChangeMemberRoleType(description={!r})'.format( + self._description_value, + ) + +GroupChangeMemberRoleType_validator = bv.Struct(GroupChangeMemberRoleType) + +class GroupCreateDetails(bb.Struct): + """ + Created group. + + :ivar is_company_managed: Is company managed group. Might be missing due to + historical data gap. + :ivar join_policy: Group join policy. + """ + + __slots__ = [ + '_is_company_managed_value', + '_is_company_managed_present', + '_join_policy_value', + '_join_policy_present', + ] + + _has_required_fields = False + + def __init__(self, + is_company_managed=None, + join_policy=None): + self._is_company_managed_value = None + self._is_company_managed_present = False + self._join_policy_value = None + self._join_policy_present = False + if is_company_managed is not None: + self.is_company_managed = is_company_managed + if join_policy is not None: + self.join_policy = join_policy + + @property + def is_company_managed(self): + """ + Is company managed group. Might be missing due to historical data gap. + + :rtype: bool + """ + if self._is_company_managed_present: + return self._is_company_managed_value + else: + return None + + @is_company_managed.setter + def is_company_managed(self, val): + if val is None: + del self.is_company_managed + return + val = self._is_company_managed_validator.validate(val) + self._is_company_managed_value = val + self._is_company_managed_present = True + + @is_company_managed.deleter + def is_company_managed(self): + self._is_company_managed_value = None + self._is_company_managed_present = False + + @property + def join_policy(self): + """ + Group join policy. + + :rtype: GroupJoinPolicy + """ + if self._join_policy_present: + return self._join_policy_value + else: + return None + + @join_policy.setter + def join_policy(self, val): + if val is None: + del self.join_policy + return + self._join_policy_validator.validate_type_only(val) + self._join_policy_value = val + self._join_policy_present = True + + @join_policy.deleter + def join_policy(self): + self._join_policy_value = None + self._join_policy_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupCreateDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupCreateDetails(is_company_managed={!r}, join_policy={!r})'.format( + self._is_company_managed_value, + self._join_policy_value, + ) + +GroupCreateDetails_validator = bv.Struct(GroupCreateDetails) + +class GroupCreateType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupCreateType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupCreateType(description={!r})'.format( + self._description_value, + ) + +GroupCreateType_validator = bv.Struct(GroupCreateType) + +class GroupDeleteDetails(bb.Struct): + """ + Deleted group. + + :ivar is_company_managed: Is company managed group. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_is_company_managed_value', + '_is_company_managed_present', + ] + + _has_required_fields = False + + def __init__(self, + is_company_managed=None): + self._is_company_managed_value = None + self._is_company_managed_present = False + if is_company_managed is not None: + self.is_company_managed = is_company_managed + + @property + def is_company_managed(self): + """ + Is company managed group. Might be missing due to historical data gap. + + :rtype: bool + """ + if self._is_company_managed_present: + return self._is_company_managed_value + else: + return None + + @is_company_managed.setter + def is_company_managed(self, val): + if val is None: + del self.is_company_managed + return + val = self._is_company_managed_validator.validate(val) + self._is_company_managed_value = val + self._is_company_managed_present = True + + @is_company_managed.deleter + def is_company_managed(self): + self._is_company_managed_value = None + self._is_company_managed_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupDeleteDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupDeleteDetails(is_company_managed={!r})'.format( + self._is_company_managed_value, + ) + +GroupDeleteDetails_validator = bv.Struct(GroupDeleteDetails) + +class GroupDeleteType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupDeleteType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupDeleteType(description={!r})'.format( + self._description_value, + ) + +GroupDeleteType_validator = bv.Struct(GroupDeleteType) + +class GroupDescriptionUpdatedDetails(bb.Struct): + """ + Updated group. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupDescriptionUpdatedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupDescriptionUpdatedDetails()' + +GroupDescriptionUpdatedDetails_validator = bv.Struct(GroupDescriptionUpdatedDetails) + +class GroupDescriptionUpdatedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupDescriptionUpdatedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupDescriptionUpdatedType(description={!r})'.format( + self._description_value, + ) + +GroupDescriptionUpdatedType_validator = bv.Struct(GroupDescriptionUpdatedType) + +class GroupJoinPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + open = None + # Attribute is overwritten below the class definition + request_to_join = None + # Attribute is overwritten below the class definition + other = None + + def is_open(self): + """ + Check if the union tag is ``open``. + + :rtype: bool + """ + return self._tag == 'open' + + def is_request_to_join(self): + """ + Check if the union tag is ``request_to_join``. + + :rtype: bool + """ + return self._tag == 'request_to_join' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupJoinPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupJoinPolicy(%r, %r)' % (self._tag, self._value) + +GroupJoinPolicy_validator = bv.Union(GroupJoinPolicy) + +class GroupJoinPolicyUpdatedDetails(bb.Struct): + """ + Updated group join policy. + + :ivar is_company_managed: Is company managed group. Might be missing due to + historical data gap. + :ivar join_policy: Group join policy. + """ + + __slots__ = [ + '_is_company_managed_value', + '_is_company_managed_present', + '_join_policy_value', + '_join_policy_present', + ] + + _has_required_fields = False + + def __init__(self, + is_company_managed=None, + join_policy=None): + self._is_company_managed_value = None + self._is_company_managed_present = False + self._join_policy_value = None + self._join_policy_present = False + if is_company_managed is not None: + self.is_company_managed = is_company_managed + if join_policy is not None: + self.join_policy = join_policy + + @property + def is_company_managed(self): + """ + Is company managed group. Might be missing due to historical data gap. + + :rtype: bool + """ + if self._is_company_managed_present: + return self._is_company_managed_value + else: + return None + + @is_company_managed.setter + def is_company_managed(self, val): + if val is None: + del self.is_company_managed + return + val = self._is_company_managed_validator.validate(val) + self._is_company_managed_value = val + self._is_company_managed_present = True + + @is_company_managed.deleter + def is_company_managed(self): + self._is_company_managed_value = None + self._is_company_managed_present = False + + @property + def join_policy(self): + """ + Group join policy. + + :rtype: GroupJoinPolicy + """ + if self._join_policy_present: + return self._join_policy_value + else: + return None + + @join_policy.setter + def join_policy(self, val): + if val is None: + del self.join_policy + return + self._join_policy_validator.validate_type_only(val) + self._join_policy_value = val + self._join_policy_present = True + + @join_policy.deleter + def join_policy(self): + self._join_policy_value = None + self._join_policy_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupJoinPolicyUpdatedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupJoinPolicyUpdatedDetails(is_company_managed={!r}, join_policy={!r})'.format( + self._is_company_managed_value, + self._join_policy_value, + ) + +GroupJoinPolicyUpdatedDetails_validator = bv.Struct(GroupJoinPolicyUpdatedDetails) + +class GroupJoinPolicyUpdatedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupJoinPolicyUpdatedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupJoinPolicyUpdatedType(description={!r})'.format( + self._description_value, + ) + +GroupJoinPolicyUpdatedType_validator = bv.Struct(GroupJoinPolicyUpdatedType) + +class GroupLogInfo(bb.Struct): + """ + Group's logged information. + + :ivar group_id: The unique id of this group. Might be missing due to + historical data gap. + :ivar display_name: The name of this group. + :ivar external_id: External group ID. Might be missing due to historical + data gap. + """ + + __slots__ = [ + '_group_id_value', + '_group_id_present', + '_display_name_value', + '_display_name_present', + '_external_id_value', + '_external_id_present', + ] + + _has_required_fields = True + + def __init__(self, + display_name=None, + group_id=None, + external_id=None): + self._group_id_value = None + self._group_id_present = False + self._display_name_value = None + self._display_name_present = False + self._external_id_value = None + self._external_id_present = False + if group_id is not None: + self.group_id = group_id + if display_name is not None: + self.display_name = display_name + if external_id is not None: + self.external_id = external_id + + @property + def group_id(self): + """ + The unique id of this group. Might be missing due to historical data + gap. + + :rtype: str + """ + if self._group_id_present: + return self._group_id_value + else: + return None + + @group_id.setter + def group_id(self, val): + if val is None: + del self.group_id + return + val = self._group_id_validator.validate(val) + self._group_id_value = val + self._group_id_present = True + + @group_id.deleter + def group_id(self): + self._group_id_value = None + self._group_id_present = False + + @property + def display_name(self): + """ + The name of this group. + + :rtype: str + """ + if self._display_name_present: + return self._display_name_value + else: + raise AttributeError("missing required field 'display_name'") + + @display_name.setter + def display_name(self, val): + val = self._display_name_validator.validate(val) + self._display_name_value = val + self._display_name_present = True + + @display_name.deleter + def display_name(self): + self._display_name_value = None + self._display_name_present = False + + @property + def external_id(self): + """ + External group ID. Might be missing due to historical data gap. + + :rtype: str + """ + if self._external_id_present: + return self._external_id_value + else: + return None + + @external_id.setter + def external_id(self, val): + if val is None: + del self.external_id + return + val = self._external_id_validator.validate(val) + self._external_id_value = val + self._external_id_present = True + + @external_id.deleter + def external_id(self): + self._external_id_value = None + self._external_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupLogInfo(display_name={!r}, group_id={!r}, external_id={!r})'.format( + self._display_name_value, + self._group_id_value, + self._external_id_value, + ) + +GroupLogInfo_validator = bv.Struct(GroupLogInfo) + +class GroupMovedDetails(bb.Struct): + """ + Moved group. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupMovedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupMovedDetails()' + +GroupMovedDetails_validator = bv.Struct(GroupMovedDetails) + +class GroupMovedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupMovedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupMovedType(description={!r})'.format( + self._description_value, + ) + +GroupMovedType_validator = bv.Struct(GroupMovedType) + +class GroupRemoveExternalIdDetails(bb.Struct): + """ + Removed external ID for group. + + :ivar previous_value: Old external id. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + previous_value=None): + self._previous_value_value = None + self._previous_value_present = False + if previous_value is not None: + self.previous_value = previous_value + + @property + def previous_value(self): + """ + Old external id. + + :rtype: str + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + val = self._previous_value_validator.validate(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupRemoveExternalIdDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupRemoveExternalIdDetails(previous_value={!r})'.format( + self._previous_value_value, + ) + +GroupRemoveExternalIdDetails_validator = bv.Struct(GroupRemoveExternalIdDetails) + +class GroupRemoveExternalIdType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupRemoveExternalIdType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupRemoveExternalIdType(description={!r})'.format( + self._description_value, + ) + +GroupRemoveExternalIdType_validator = bv.Struct(GroupRemoveExternalIdType) + +class GroupRemoveMemberDetails(bb.Struct): + """ + Removed team members from group. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupRemoveMemberDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupRemoveMemberDetails()' + +GroupRemoveMemberDetails_validator = bv.Struct(GroupRemoveMemberDetails) + +class GroupRemoveMemberType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupRemoveMemberType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupRemoveMemberType(description={!r})'.format( + self._description_value, + ) + +GroupRemoveMemberType_validator = bv.Struct(GroupRemoveMemberType) + +class GroupRenameDetails(bb.Struct): + """ + Renamed group. + + :ivar previous_value: Previous display name. + :ivar new_value: New display name. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + previous_value=None, + new_value=None): + self._previous_value_value = None + self._previous_value_present = False + self._new_value_value = None + self._new_value_present = False + if previous_value is not None: + self.previous_value = previous_value + if new_value is not None: + self.new_value = new_value + + @property + def previous_value(self): + """ + Previous display name. + + :rtype: str + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + val = self._previous_value_validator.validate(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + @property + def new_value(self): + """ + New display name. + + :rtype: str + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + val = self._new_value_validator.validate(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupRenameDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupRenameDetails(previous_value={!r}, new_value={!r})'.format( + self._previous_value_value, + self._new_value_value, + ) + +GroupRenameDetails_validator = bv.Struct(GroupRenameDetails) + +class GroupRenameType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupRenameType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupRenameType(description={!r})'.format( + self._description_value, + ) + +GroupRenameType_validator = bv.Struct(GroupRenameType) + +class GroupUserManagementChangePolicyDetails(bb.Struct): + """ + Changed who can create groups. + + :ivar new_value: New group users management policy. + :ivar previous_value: Previous group users management policy. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New group users management policy. + + :rtype: team_policies.GroupCreation + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous group users management policy. Might be missing due to + historical data gap. + + :rtype: team_policies.GroupCreation + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupUserManagementChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupUserManagementChangePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +GroupUserManagementChangePolicyDetails_validator = bv.Struct(GroupUserManagementChangePolicyDetails) + +class GroupUserManagementChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupUserManagementChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupUserManagementChangePolicyType(description={!r})'.format( + self._description_value, + ) + +GroupUserManagementChangePolicyType_validator = bv.Struct(GroupUserManagementChangePolicyType) + +class IdentifierType(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + email = None + # Attribute is overwritten below the class definition + facebook_profile_name = None + # Attribute is overwritten below the class definition + other = None + + def is_email(self): + """ + Check if the union tag is ``email``. + + :rtype: bool + """ + return self._tag == 'email' + + def is_facebook_profile_name(self): + """ + Check if the union tag is ``facebook_profile_name``. + + :rtype: bool + """ + return self._tag == 'facebook_profile_name' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(IdentifierType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'IdentifierType(%r, %r)' % (self._tag, self._value) + +IdentifierType_validator = bv.Union(IdentifierType) + +class JoinTeamDetails(bb.Struct): + """ + Additional information relevant when a new member joins the team. + + :ivar linked_apps: Linked applications. + :ivar linked_devices: Linked devices. + :ivar linked_shared_folders: Linked shared folders. + """ + + __slots__ = [ + '_linked_apps_value', + '_linked_apps_present', + '_linked_devices_value', + '_linked_devices_present', + '_linked_shared_folders_value', + '_linked_shared_folders_present', + ] + + _has_required_fields = True + + def __init__(self, + linked_apps=None, + linked_devices=None, + linked_shared_folders=None): + self._linked_apps_value = None + self._linked_apps_present = False + self._linked_devices_value = None + self._linked_devices_present = False + self._linked_shared_folders_value = None + self._linked_shared_folders_present = False + if linked_apps is not None: + self.linked_apps = linked_apps + if linked_devices is not None: + self.linked_devices = linked_devices + if linked_shared_folders is not None: + self.linked_shared_folders = linked_shared_folders + + @property + def linked_apps(self): + """ + Linked applications. + + :rtype: list of [UserLinkedAppLogInfo] + """ + if self._linked_apps_present: + return self._linked_apps_value + else: + raise AttributeError("missing required field 'linked_apps'") + + @linked_apps.setter + def linked_apps(self, val): + val = self._linked_apps_validator.validate(val) + self._linked_apps_value = val + self._linked_apps_present = True + + @linked_apps.deleter + def linked_apps(self): + self._linked_apps_value = None + self._linked_apps_present = False + + @property + def linked_devices(self): + """ + Linked devices. + + :rtype: list of [LinkedDeviceLogInfo] + """ + if self._linked_devices_present: + return self._linked_devices_value + else: + raise AttributeError("missing required field 'linked_devices'") + + @linked_devices.setter + def linked_devices(self, val): + val = self._linked_devices_validator.validate(val) + self._linked_devices_value = val + self._linked_devices_present = True + + @linked_devices.deleter + def linked_devices(self): + self._linked_devices_value = None + self._linked_devices_present = False + + @property + def linked_shared_folders(self): + """ + Linked shared folders. + + :rtype: list of [FolderLogInfo] + """ + if self._linked_shared_folders_present: + return self._linked_shared_folders_value + else: + raise AttributeError("missing required field 'linked_shared_folders'") + + @linked_shared_folders.setter + def linked_shared_folders(self, val): + val = self._linked_shared_folders_validator.validate(val) + self._linked_shared_folders_value = val + self._linked_shared_folders_present = True + + @linked_shared_folders.deleter + def linked_shared_folders(self): + self._linked_shared_folders_value = None + self._linked_shared_folders_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(JoinTeamDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'JoinTeamDetails(linked_apps={!r}, linked_devices={!r}, linked_shared_folders={!r})'.format( + self._linked_apps_value, + self._linked_devices_value, + self._linked_shared_folders_value, + ) + +JoinTeamDetails_validator = bv.Struct(JoinTeamDetails) + +class LegacyDeviceSessionLogInfo(DeviceSessionLogInfo): + """ + Information on sessions, in legacy format + + :ivar session_info: Session unique id. Might be missing due to historical + data gap. + :ivar display_name: The device name. Might be missing due to historical data + gap. + :ivar is_emm_managed: Is device managed by emm. Might be missing due to + historical data gap. + :ivar platform: Information on the hosting platform. Might be missing due to + historical data gap. + :ivar mac_address: The mac address of the last activity from this session. + Might be missing due to historical data gap. + :ivar os_version: The hosting OS version. Might be missing due to historical + data gap. + :ivar device_type: Information on the hosting device type. Might be missing + due to historical data gap. + :ivar client_version: The Dropbox client version. Might be missing due to + historical data gap. + :ivar legacy_uniq_id: Alternative unique device session id, instead of + session id field. Might be missing due to historical data gap. + """ + + __slots__ = [ + '_session_info_value', + '_session_info_present', + '_display_name_value', + '_display_name_present', + '_is_emm_managed_value', + '_is_emm_managed_present', + '_platform_value', + '_platform_present', + '_mac_address_value', + '_mac_address_present', + '_os_version_value', + '_os_version_present', + '_device_type_value', + '_device_type_present', + '_client_version_value', + '_client_version_present', + '_legacy_uniq_id_value', + '_legacy_uniq_id_present', + ] + + _has_required_fields = False + + def __init__(self, + ip_address=None, + created=None, + updated=None, + session_info=None, + display_name=None, + is_emm_managed=None, + platform=None, + mac_address=None, + os_version=None, + device_type=None, + client_version=None, + legacy_uniq_id=None): + super(LegacyDeviceSessionLogInfo, self).__init__(ip_address, + created, + updated) + self._session_info_value = None + self._session_info_present = False + self._display_name_value = None + self._display_name_present = False + self._is_emm_managed_value = None + self._is_emm_managed_present = False + self._platform_value = None + self._platform_present = False + self._mac_address_value = None + self._mac_address_present = False + self._os_version_value = None + self._os_version_present = False + self._device_type_value = None + self._device_type_present = False + self._client_version_value = None + self._client_version_present = False + self._legacy_uniq_id_value = None + self._legacy_uniq_id_present = False + if session_info is not None: + self.session_info = session_info + if display_name is not None: + self.display_name = display_name + if is_emm_managed is not None: + self.is_emm_managed = is_emm_managed + if platform is not None: + self.platform = platform + if mac_address is not None: + self.mac_address = mac_address + if os_version is not None: + self.os_version = os_version + if device_type is not None: + self.device_type = device_type + if client_version is not None: + self.client_version = client_version + if legacy_uniq_id is not None: + self.legacy_uniq_id = legacy_uniq_id + + @property + def session_info(self): + """ + Session unique id. Might be missing due to historical data gap. + + :rtype: SessionLogInfo + """ + if self._session_info_present: + return self._session_info_value + else: + return None + + @session_info.setter + def session_info(self, val): + if val is None: + del self.session_info + return + self._session_info_validator.validate_type_only(val) + self._session_info_value = val + self._session_info_present = True + + @session_info.deleter + def session_info(self): + self._session_info_value = None + self._session_info_present = False + + @property + def display_name(self): + """ + The device name. Might be missing due to historical data gap. + + :rtype: str + """ + if self._display_name_present: + return self._display_name_value + else: + return None + + @display_name.setter + def display_name(self, val): + if val is None: + del self.display_name + return + val = self._display_name_validator.validate(val) + self._display_name_value = val + self._display_name_present = True + + @display_name.deleter + def display_name(self): + self._display_name_value = None + self._display_name_present = False + + @property + def is_emm_managed(self): + """ + Is device managed by emm. Might be missing due to historical data gap. + + :rtype: bool + """ + if self._is_emm_managed_present: + return self._is_emm_managed_value + else: + return None + + @is_emm_managed.setter + def is_emm_managed(self, val): + if val is None: + del self.is_emm_managed + return + val = self._is_emm_managed_validator.validate(val) + self._is_emm_managed_value = val + self._is_emm_managed_present = True + + @is_emm_managed.deleter + def is_emm_managed(self): + self._is_emm_managed_value = None + self._is_emm_managed_present = False + + @property + def platform(self): + """ + Information on the hosting platform. Might be missing due to historical + data gap. + + :rtype: str + """ + if self._platform_present: + return self._platform_value + else: + return None + + @platform.setter + def platform(self, val): + if val is None: + del self.platform + return + val = self._platform_validator.validate(val) + self._platform_value = val + self._platform_present = True + + @platform.deleter + def platform(self): + self._platform_value = None + self._platform_present = False + + @property + def mac_address(self): + """ + The mac address of the last activity from this session. Might be missing + due to historical data gap. + + :rtype: str + """ + if self._mac_address_present: + return self._mac_address_value + else: + return None + + @mac_address.setter + def mac_address(self, val): + if val is None: + del self.mac_address + return + val = self._mac_address_validator.validate(val) + self._mac_address_value = val + self._mac_address_present = True + + @mac_address.deleter + def mac_address(self): + self._mac_address_value = None + self._mac_address_present = False + + @property + def os_version(self): + """ + The hosting OS version. Might be missing due to historical data gap. + + :rtype: str + """ + if self._os_version_present: + return self._os_version_value + else: + return None + + @os_version.setter + def os_version(self, val): + if val is None: + del self.os_version + return + val = self._os_version_validator.validate(val) + self._os_version_value = val + self._os_version_present = True + + @os_version.deleter + def os_version(self): + self._os_version_value = None + self._os_version_present = False + + @property + def device_type(self): + """ + Information on the hosting device type. Might be missing due to + historical data gap. + + :rtype: str + """ + if self._device_type_present: + return self._device_type_value + else: + return None + + @device_type.setter + def device_type(self, val): + if val is None: + del self.device_type + return + val = self._device_type_validator.validate(val) + self._device_type_value = val + self._device_type_present = True + + @device_type.deleter + def device_type(self): + self._device_type_value = None + self._device_type_present = False + + @property + def client_version(self): + """ + The Dropbox client version. Might be missing due to historical data gap. + + :rtype: str + """ + if self._client_version_present: + return self._client_version_value + else: + return None + + @client_version.setter + def client_version(self, val): + if val is None: + del self.client_version + return + val = self._client_version_validator.validate(val) + self._client_version_value = val + self._client_version_present = True + + @client_version.deleter + def client_version(self): + self._client_version_value = None + self._client_version_present = False + + @property + def legacy_uniq_id(self): + """ + Alternative unique device session id, instead of session id field. Might + be missing due to historical data gap. + + :rtype: str + """ + if self._legacy_uniq_id_present: + return self._legacy_uniq_id_value + else: + return None + + @legacy_uniq_id.setter + def legacy_uniq_id(self, val): + if val is None: + del self.legacy_uniq_id + return + val = self._legacy_uniq_id_validator.validate(val) + self._legacy_uniq_id_value = val + self._legacy_uniq_id_present = True + + @legacy_uniq_id.deleter + def legacy_uniq_id(self): + self._legacy_uniq_id_value = None + self._legacy_uniq_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(LegacyDeviceSessionLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LegacyDeviceSessionLogInfo(ip_address={!r}, created={!r}, updated={!r}, session_info={!r}, display_name={!r}, is_emm_managed={!r}, platform={!r}, mac_address={!r}, os_version={!r}, device_type={!r}, client_version={!r}, legacy_uniq_id={!r})'.format( + self._ip_address_value, + self._created_value, + self._updated_value, + self._session_info_value, + self._display_name_value, + self._is_emm_managed_value, + self._platform_value, + self._mac_address_value, + self._os_version_value, + self._device_type_value, + self._client_version_value, + self._legacy_uniq_id_value, + ) + +LegacyDeviceSessionLogInfo_validator = bv.Struct(LegacyDeviceSessionLogInfo) + +class LinkedDeviceLogInfo(bb.Union): + """ + The device sessions that user is linked to. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar MobileDeviceSessionLogInfo mobile_device_session: mobile device + session's details. + :ivar DesktopDeviceSessionLogInfo desktop_device_session: desktop device + session's details. + :ivar WebDeviceSessionLogInfo web_device_session: web device session's + details. + :ivar LegacyDeviceSessionLogInfo legacy_device_session: legacy device + session's details. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def mobile_device_session(cls, val): + """ + Create an instance of this class set to the ``mobile_device_session`` + tag with value ``val``. + + :param MobileDeviceSessionLogInfo val: + :rtype: LinkedDeviceLogInfo + """ + return cls('mobile_device_session', val) + + @classmethod + def desktop_device_session(cls, val): + """ + Create an instance of this class set to the ``desktop_device_session`` + tag with value ``val``. + + :param DesktopDeviceSessionLogInfo val: + :rtype: LinkedDeviceLogInfo + """ + return cls('desktop_device_session', val) + + @classmethod + def web_device_session(cls, val): + """ + Create an instance of this class set to the ``web_device_session`` tag + with value ``val``. + + :param WebDeviceSessionLogInfo val: + :rtype: LinkedDeviceLogInfo + """ + return cls('web_device_session', val) + + @classmethod + def legacy_device_session(cls, val): + """ + Create an instance of this class set to the ``legacy_device_session`` + tag with value ``val``. + + :param LegacyDeviceSessionLogInfo val: + :rtype: LinkedDeviceLogInfo + """ + return cls('legacy_device_session', val) + + def is_mobile_device_session(self): + """ + Check if the union tag is ``mobile_device_session``. + + :rtype: bool + """ + return self._tag == 'mobile_device_session' + + def is_desktop_device_session(self): + """ + Check if the union tag is ``desktop_device_session``. + + :rtype: bool + """ + return self._tag == 'desktop_device_session' + + def is_web_device_session(self): + """ + Check if the union tag is ``web_device_session``. + + :rtype: bool + """ + return self._tag == 'web_device_session' + + def is_legacy_device_session(self): + """ + Check if the union tag is ``legacy_device_session``. + + :rtype: bool + """ + return self._tag == 'legacy_device_session' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_mobile_device_session(self): + """ + mobile device session's details. + + Only call this if :meth:`is_mobile_device_session` is true. + + :rtype: MobileDeviceSessionLogInfo + """ + if not self.is_mobile_device_session(): + raise AttributeError("tag 'mobile_device_session' not set") + return self._value + + def get_desktop_device_session(self): + """ + desktop device session's details. + + Only call this if :meth:`is_desktop_device_session` is true. + + :rtype: DesktopDeviceSessionLogInfo + """ + if not self.is_desktop_device_session(): + raise AttributeError("tag 'desktop_device_session' not set") + return self._value + + def get_web_device_session(self): + """ + web device session's details. + + Only call this if :meth:`is_web_device_session` is true. + + :rtype: WebDeviceSessionLogInfo + """ + if not self.is_web_device_session(): + raise AttributeError("tag 'web_device_session' not set") + return self._value + + def get_legacy_device_session(self): + """ + legacy device session's details. + + Only call this if :meth:`is_legacy_device_session` is true. + + :rtype: LegacyDeviceSessionLogInfo + """ + if not self.is_legacy_device_session(): + raise AttributeError("tag 'legacy_device_session' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(LinkedDeviceLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LinkedDeviceLogInfo(%r, %r)' % (self._tag, self._value) + +LinkedDeviceLogInfo_validator = bv.Union(LinkedDeviceLogInfo) + +class LoginFailDetails(bb.Struct): + """ + Failed to sign in. + + :ivar is_emm_managed: Tells if the login device is EMM managed. Might be + missing due to historical data gap. + :ivar login_method: Login method. + :ivar error_details: Error details. + """ + + __slots__ = [ + '_is_emm_managed_value', + '_is_emm_managed_present', + '_login_method_value', + '_login_method_present', + '_error_details_value', + '_error_details_present', + ] + + _has_required_fields = True + + def __init__(self, + login_method=None, + error_details=None, + is_emm_managed=None): + self._is_emm_managed_value = None + self._is_emm_managed_present = False + self._login_method_value = None + self._login_method_present = False + self._error_details_value = None + self._error_details_present = False + if is_emm_managed is not None: + self.is_emm_managed = is_emm_managed + if login_method is not None: + self.login_method = login_method + if error_details is not None: + self.error_details = error_details + + @property + def is_emm_managed(self): + """ + Tells if the login device is EMM managed. Might be missing due to + historical data gap. + + :rtype: bool + """ + if self._is_emm_managed_present: + return self._is_emm_managed_value + else: + return None + + @is_emm_managed.setter + def is_emm_managed(self, val): + if val is None: + del self.is_emm_managed + return + val = self._is_emm_managed_validator.validate(val) + self._is_emm_managed_value = val + self._is_emm_managed_present = True + + @is_emm_managed.deleter + def is_emm_managed(self): + self._is_emm_managed_value = None + self._is_emm_managed_present = False + + @property + def login_method(self): + """ + Login method. + + :rtype: LoginMethod + """ + if self._login_method_present: + return self._login_method_value + else: + raise AttributeError("missing required field 'login_method'") + + @login_method.setter + def login_method(self, val): + self._login_method_validator.validate_type_only(val) + self._login_method_value = val + self._login_method_present = True + + @login_method.deleter + def login_method(self): + self._login_method_value = None + self._login_method_present = False + + @property + def error_details(self): + """ + Error details. + + :rtype: FailureDetailsLogInfo + """ + if self._error_details_present: + return self._error_details_value + else: + raise AttributeError("missing required field 'error_details'") + + @error_details.setter + def error_details(self, val): + self._error_details_validator.validate_type_only(val) + self._error_details_value = val + self._error_details_present = True + + @error_details.deleter + def error_details(self): + self._error_details_value = None + self._error_details_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(LoginFailDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LoginFailDetails(login_method={!r}, error_details={!r}, is_emm_managed={!r})'.format( + self._login_method_value, + self._error_details_value, + self._is_emm_managed_value, + ) + +LoginFailDetails_validator = bv.Struct(LoginFailDetails) + +class LoginFailType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(LoginFailType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LoginFailType(description={!r})'.format( + self._description_value, + ) + +LoginFailType_validator = bv.Struct(LoginFailType) + +class LoginMethod(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + password = None + # Attribute is overwritten below the class definition + two_factor_authentication = None + # Attribute is overwritten below the class definition + saml = None + # Attribute is overwritten below the class definition + other = None + + def is_password(self): + """ + Check if the union tag is ``password``. + + :rtype: bool + """ + return self._tag == 'password' + + def is_two_factor_authentication(self): + """ + Check if the union tag is ``two_factor_authentication``. + + :rtype: bool + """ + return self._tag == 'two_factor_authentication' + + def is_saml(self): + """ + Check if the union tag is ``saml``. + + :rtype: bool + """ + return self._tag == 'saml' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(LoginMethod, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LoginMethod(%r, %r)' % (self._tag, self._value) + +LoginMethod_validator = bv.Union(LoginMethod) + +class LoginSuccessDetails(bb.Struct): + """ + Signed in. + + :ivar is_emm_managed: Tells if the login device is EMM managed. Might be + missing due to historical data gap. + :ivar login_method: Login method. + """ + + __slots__ = [ + '_is_emm_managed_value', + '_is_emm_managed_present', + '_login_method_value', + '_login_method_present', + ] + + _has_required_fields = True + + def __init__(self, + login_method=None, + is_emm_managed=None): + self._is_emm_managed_value = None + self._is_emm_managed_present = False + self._login_method_value = None + self._login_method_present = False + if is_emm_managed is not None: + self.is_emm_managed = is_emm_managed + if login_method is not None: + self.login_method = login_method + + @property + def is_emm_managed(self): + """ + Tells if the login device is EMM managed. Might be missing due to + historical data gap. + + :rtype: bool + """ + if self._is_emm_managed_present: + return self._is_emm_managed_value + else: + return None + + @is_emm_managed.setter + def is_emm_managed(self, val): + if val is None: + del self.is_emm_managed + return + val = self._is_emm_managed_validator.validate(val) + self._is_emm_managed_value = val + self._is_emm_managed_present = True + + @is_emm_managed.deleter + def is_emm_managed(self): + self._is_emm_managed_value = None + self._is_emm_managed_present = False + + @property + def login_method(self): + """ + Login method. + + :rtype: LoginMethod + """ + if self._login_method_present: + return self._login_method_value + else: + raise AttributeError("missing required field 'login_method'") + + @login_method.setter + def login_method(self, val): + self._login_method_validator.validate_type_only(val) + self._login_method_value = val + self._login_method_present = True + + @login_method.deleter + def login_method(self): + self._login_method_value = None + self._login_method_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(LoginSuccessDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LoginSuccessDetails(login_method={!r}, is_emm_managed={!r})'.format( + self._login_method_value, + self._is_emm_managed_value, + ) + +LoginSuccessDetails_validator = bv.Struct(LoginSuccessDetails) + +class LoginSuccessType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(LoginSuccessType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LoginSuccessType(description={!r})'.format( + self._description_value, + ) + +LoginSuccessType_validator = bv.Struct(LoginSuccessType) + +class LogoutDetails(bb.Struct): + """ + Signed out. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(LogoutDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LogoutDetails()' + +LogoutDetails_validator = bv.Struct(LogoutDetails) + +class LogoutType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(LogoutType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'LogoutType(description={!r})'.format( + self._description_value, + ) + +LogoutType_validator = bv.Struct(LogoutType) + +class MemberAddNameDetails(bb.Struct): + """ + Added team member name. + + :ivar new_value: New user's name. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None): + self._new_value_value = None + self._new_value_present = False + if new_value is not None: + self.new_value = new_value + + @property + def new_value(self): + """ + New user's name. + + :rtype: UserNameLogInfo + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberAddNameDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberAddNameDetails(new_value={!r})'.format( + self._new_value_value, + ) + +MemberAddNameDetails_validator = bv.Struct(MemberAddNameDetails) + +class MemberAddNameType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberAddNameType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberAddNameType(description={!r})'.format( + self._description_value, + ) + +MemberAddNameType_validator = bv.Struct(MemberAddNameType) + +class MemberChangeAdminRoleDetails(bb.Struct): + """ + Changed team member admin role. + + :ivar new_value: New admin role. This field is relevant when the admin role + is changed or whenthe user role changes from no admin rights to with + admin rights. + :ivar previous_value: Previous admin role. This field is relevant when the + admin role is changed or when the admin role is removed. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = False + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New admin role. This field is relevant when the admin role is changed or + whenthe user role changes from no admin rights to with admin rights. + + :rtype: AdminRole + """ + if self._new_value_present: + return self._new_value_value + else: + return None + + @new_value.setter + def new_value(self, val): + if val is None: + del self.new_value + return + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous admin role. This field is relevant when the admin role is + changed or when the admin role is removed. + + :rtype: AdminRole + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberChangeAdminRoleDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberChangeAdminRoleDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +MemberChangeAdminRoleDetails_validator = bv.Struct(MemberChangeAdminRoleDetails) + +class MemberChangeAdminRoleType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberChangeAdminRoleType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberChangeAdminRoleType(description={!r})'.format( + self._description_value, + ) + +MemberChangeAdminRoleType_validator = bv.Struct(MemberChangeAdminRoleType) + +class MemberChangeEmailDetails(bb.Struct): + """ + Changed team member email. + + :ivar new_value: New email. + :ivar previous_value: Previous email. Might be missing due to historical + data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New email. + + :rtype: str + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + val = self._new_value_validator.validate(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous email. Might be missing due to historical data gap. + + :rtype: str + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + val = self._previous_value_validator.validate(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberChangeEmailDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberChangeEmailDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +MemberChangeEmailDetails_validator = bv.Struct(MemberChangeEmailDetails) + +class MemberChangeEmailType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberChangeEmailType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberChangeEmailType(description={!r})'.format( + self._description_value, + ) + +MemberChangeEmailType_validator = bv.Struct(MemberChangeEmailType) + +class MemberChangeMembershipTypeDetails(bb.Struct): + """ + Changed membership type (limited/full) of member. + + :ivar prev_value: Previous membership type. + :ivar new_value: New membership type. + """ + + __slots__ = [ + '_prev_value_value', + '_prev_value_present', + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + prev_value=None, + new_value=None): + self._prev_value_value = None + self._prev_value_present = False + self._new_value_value = None + self._new_value_present = False + if prev_value is not None: + self.prev_value = prev_value + if new_value is not None: + self.new_value = new_value + + @property + def prev_value(self): + """ + Previous membership type. + + :rtype: TeamMembershipType + """ + if self._prev_value_present: + return self._prev_value_value + else: + raise AttributeError("missing required field 'prev_value'") + + @prev_value.setter + def prev_value(self, val): + self._prev_value_validator.validate_type_only(val) + self._prev_value_value = val + self._prev_value_present = True + + @prev_value.deleter + def prev_value(self): + self._prev_value_value = None + self._prev_value_present = False + + @property + def new_value(self): + """ + New membership type. + + :rtype: TeamMembershipType + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberChangeMembershipTypeDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberChangeMembershipTypeDetails(prev_value={!r}, new_value={!r})'.format( + self._prev_value_value, + self._new_value_value, + ) + +MemberChangeMembershipTypeDetails_validator = bv.Struct(MemberChangeMembershipTypeDetails) + +class MemberChangeMembershipTypeType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberChangeMembershipTypeType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberChangeMembershipTypeType(description={!r})'.format( + self._description_value, + ) + +MemberChangeMembershipTypeType_validator = bv.Struct(MemberChangeMembershipTypeType) + +class MemberChangeNameDetails(bb.Struct): + """ + Changed team member name. + + :ivar new_value: New user's name. + :ivar previous_value: Previous user's name. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New user's name. + + :rtype: UserNameLogInfo + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous user's name. Might be missing due to historical data gap. + + :rtype: UserNameLogInfo + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberChangeNameDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberChangeNameDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +MemberChangeNameDetails_validator = bv.Struct(MemberChangeNameDetails) + +class MemberChangeNameType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberChangeNameType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberChangeNameType(description={!r})'.format( + self._description_value, + ) + +MemberChangeNameType_validator = bv.Struct(MemberChangeNameType) + +class MemberChangeStatusDetails(bb.Struct): + """ + Changed member status (invited, joined, suspended, etc.). + + :ivar previous_value: Previous member status. Might be missing due to + historical data gap. + :ivar new_value: New member status. + :ivar action: Additional information indicating the action taken that caused + status change. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + '_new_value_value', + '_new_value_present', + '_action_value', + '_action_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None, + action=None): + self._previous_value_value = None + self._previous_value_present = False + self._new_value_value = None + self._new_value_present = False + self._action_value = None + self._action_present = False + if previous_value is not None: + self.previous_value = previous_value + if new_value is not None: + self.new_value = new_value + if action is not None: + self.action = action + + @property + def previous_value(self): + """ + Previous member status. Might be missing due to historical data gap. + + :rtype: MemberStatus + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + @property + def new_value(self): + """ + New member status. + + :rtype: MemberStatus + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def action(self): + """ + Additional information indicating the action taken that caused status + change. + + :rtype: ActionDetails + """ + if self._action_present: + return self._action_value + else: + return None + + @action.setter + def action(self, val): + if val is None: + del self.action + return + self._action_validator.validate_type_only(val) + self._action_value = val + self._action_present = True + + @action.deleter + def action(self): + self._action_value = None + self._action_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberChangeStatusDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberChangeStatusDetails(new_value={!r}, previous_value={!r}, action={!r})'.format( + self._new_value_value, + self._previous_value_value, + self._action_value, + ) + +MemberChangeStatusDetails_validator = bv.Struct(MemberChangeStatusDetails) + +class MemberChangeStatusType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberChangeStatusType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberChangeStatusType(description={!r})'.format( + self._description_value, + ) + +MemberChangeStatusType_validator = bv.Struct(MemberChangeStatusType) + +class MemberDeleteManualContactsDetails(bb.Struct): + """ + Cleared manually added contacts. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberDeleteManualContactsDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberDeleteManualContactsDetails()' + +MemberDeleteManualContactsDetails_validator = bv.Struct(MemberDeleteManualContactsDetails) + +class MemberDeleteManualContactsType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberDeleteManualContactsType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberDeleteManualContactsType(description={!r})'.format( + self._description_value, + ) + +MemberDeleteManualContactsType_validator = bv.Struct(MemberDeleteManualContactsType) + +class MemberPermanentlyDeleteAccountContentsDetails(bb.Struct): + """ + Permanently deleted contents of deleted team member account. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberPermanentlyDeleteAccountContentsDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberPermanentlyDeleteAccountContentsDetails()' + +MemberPermanentlyDeleteAccountContentsDetails_validator = bv.Struct(MemberPermanentlyDeleteAccountContentsDetails) + +class MemberPermanentlyDeleteAccountContentsType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberPermanentlyDeleteAccountContentsType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberPermanentlyDeleteAccountContentsType(description={!r})'.format( + self._description_value, + ) + +MemberPermanentlyDeleteAccountContentsType_validator = bv.Struct(MemberPermanentlyDeleteAccountContentsType) + +class MemberRemoveActionType(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + delete = None + # Attribute is overwritten below the class definition + offboard = None + # Attribute is overwritten below the class definition + leave = None + # Attribute is overwritten below the class definition + other = None + + def is_delete(self): + """ + Check if the union tag is ``delete``. + + :rtype: bool + """ + return self._tag == 'delete' + + def is_offboard(self): + """ + Check if the union tag is ``offboard``. + + :rtype: bool + """ + return self._tag == 'offboard' + + def is_leave(self): + """ + Check if the union tag is ``leave``. + + :rtype: bool + """ + return self._tag == 'leave' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberRemoveActionType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberRemoveActionType(%r, %r)' % (self._tag, self._value) + +MemberRemoveActionType_validator = bv.Union(MemberRemoveActionType) + +class MemberRequestsChangePolicyDetails(bb.Struct): + """ + Changed whether users can find team when not invited. + + :ivar new_value: New member change requests policy. + :ivar previous_value: Previous member change requests policy. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New member change requests policy. + + :rtype: MemberRequestsPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous member change requests policy. Might be missing due to + historical data gap. + + :rtype: MemberRequestsPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberRequestsChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberRequestsChangePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +MemberRequestsChangePolicyDetails_validator = bv.Struct(MemberRequestsChangePolicyDetails) + +class MemberRequestsChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberRequestsChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberRequestsChangePolicyType(description={!r})'.format( + self._description_value, + ) + +MemberRequestsChangePolicyType_validator = bv.Struct(MemberRequestsChangePolicyType) + +class MemberRequestsPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + auto_accept = None + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + require_approval = None + # Attribute is overwritten below the class definition + other = None + + def is_auto_accept(self): + """ + Check if the union tag is ``auto_accept``. + + :rtype: bool + """ + return self._tag == 'auto_accept' + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_require_approval(self): + """ + Check if the union tag is ``require_approval``. + + :rtype: bool + """ + return self._tag == 'require_approval' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberRequestsPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberRequestsPolicy(%r, %r)' % (self._tag, self._value) + +MemberRequestsPolicy_validator = bv.Union(MemberRequestsPolicy) + +class MemberSpaceLimitsAddCustomQuotaDetails(bb.Struct): + """ + Set custom member space limit. + + :ivar new_value: New custom quota value in bytes. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None): + self._new_value_value = None + self._new_value_present = False + if new_value is not None: + self.new_value = new_value + + @property + def new_value(self): + """ + New custom quota value in bytes. + + :rtype: int + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + val = self._new_value_validator.validate(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSpaceLimitsAddCustomQuotaDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSpaceLimitsAddCustomQuotaDetails(new_value={!r})'.format( + self._new_value_value, + ) + +MemberSpaceLimitsAddCustomQuotaDetails_validator = bv.Struct(MemberSpaceLimitsAddCustomQuotaDetails) + +class MemberSpaceLimitsAddCustomQuotaType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSpaceLimitsAddCustomQuotaType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSpaceLimitsAddCustomQuotaType(description={!r})'.format( + self._description_value, + ) + +MemberSpaceLimitsAddCustomQuotaType_validator = bv.Struct(MemberSpaceLimitsAddCustomQuotaType) + +class MemberSpaceLimitsAddExceptionDetails(bb.Struct): + """ + Added members to member space limit exception list. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSpaceLimitsAddExceptionDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSpaceLimitsAddExceptionDetails()' + +MemberSpaceLimitsAddExceptionDetails_validator = bv.Struct(MemberSpaceLimitsAddExceptionDetails) + +class MemberSpaceLimitsAddExceptionType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSpaceLimitsAddExceptionType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSpaceLimitsAddExceptionType(description={!r})'.format( + self._description_value, + ) + +MemberSpaceLimitsAddExceptionType_validator = bv.Struct(MemberSpaceLimitsAddExceptionType) + +class MemberSpaceLimitsChangeCapsTypePolicyDetails(bb.Struct): + """ + Changed member space limit type for team. + + :ivar previous_value: Previous space limit type. + :ivar new_value: New space limit type. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + previous_value=None, + new_value=None): + self._previous_value_value = None + self._previous_value_present = False + self._new_value_value = None + self._new_value_present = False + if previous_value is not None: + self.previous_value = previous_value + if new_value is not None: + self.new_value = new_value + + @property + def previous_value(self): + """ + Previous space limit type. + + :rtype: SpaceCapsType + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + @property + def new_value(self): + """ + New space limit type. + + :rtype: SpaceCapsType + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSpaceLimitsChangeCapsTypePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSpaceLimitsChangeCapsTypePolicyDetails(previous_value={!r}, new_value={!r})'.format( + self._previous_value_value, + self._new_value_value, + ) + +MemberSpaceLimitsChangeCapsTypePolicyDetails_validator = bv.Struct(MemberSpaceLimitsChangeCapsTypePolicyDetails) + +class MemberSpaceLimitsChangeCapsTypePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSpaceLimitsChangeCapsTypePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSpaceLimitsChangeCapsTypePolicyType(description={!r})'.format( + self._description_value, + ) + +MemberSpaceLimitsChangeCapsTypePolicyType_validator = bv.Struct(MemberSpaceLimitsChangeCapsTypePolicyType) + +class MemberSpaceLimitsChangeCustomQuotaDetails(bb.Struct): + """ + Changed custom member space limit. + + :ivar previous_value: Previous custom quota value in bytes. + :ivar new_value: New custom quota value in bytes. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + previous_value=None, + new_value=None): + self._previous_value_value = None + self._previous_value_present = False + self._new_value_value = None + self._new_value_present = False + if previous_value is not None: + self.previous_value = previous_value + if new_value is not None: + self.new_value = new_value + + @property + def previous_value(self): + """ + Previous custom quota value in bytes. + + :rtype: int + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + val = self._previous_value_validator.validate(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + @property + def new_value(self): + """ + New custom quota value in bytes. + + :rtype: int + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + val = self._new_value_validator.validate(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSpaceLimitsChangeCustomQuotaDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSpaceLimitsChangeCustomQuotaDetails(previous_value={!r}, new_value={!r})'.format( + self._previous_value_value, + self._new_value_value, + ) + +MemberSpaceLimitsChangeCustomQuotaDetails_validator = bv.Struct(MemberSpaceLimitsChangeCustomQuotaDetails) + +class MemberSpaceLimitsChangeCustomQuotaType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSpaceLimitsChangeCustomQuotaType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSpaceLimitsChangeCustomQuotaType(description={!r})'.format( + self._description_value, + ) + +MemberSpaceLimitsChangeCustomQuotaType_validator = bv.Struct(MemberSpaceLimitsChangeCustomQuotaType) + +class MemberSpaceLimitsChangePolicyDetails(bb.Struct): + """ + Changed team default member space limit. + + :ivar previous_value: Previous team default limit value in bytes. Might be + missing due to historical data gap. + :ivar new_value: New team default limit value in bytes. Might be missing due + to historical data gap. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = False + + def __init__(self, + previous_value=None, + new_value=None): + self._previous_value_value = None + self._previous_value_present = False + self._new_value_value = None + self._new_value_present = False + if previous_value is not None: + self.previous_value = previous_value + if new_value is not None: + self.new_value = new_value + + @property + def previous_value(self): + """ + Previous team default limit value in bytes. Might be missing due to + historical data gap. + + :rtype: int + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + val = self._previous_value_validator.validate(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + @property + def new_value(self): + """ + New team default limit value in bytes. Might be missing due to + historical data gap. + + :rtype: int + """ + if self._new_value_present: + return self._new_value_value + else: + return None + + @new_value.setter + def new_value(self, val): + if val is None: + del self.new_value + return + val = self._new_value_validator.validate(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSpaceLimitsChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSpaceLimitsChangePolicyDetails(previous_value={!r}, new_value={!r})'.format( + self._previous_value_value, + self._new_value_value, + ) + +MemberSpaceLimitsChangePolicyDetails_validator = bv.Struct(MemberSpaceLimitsChangePolicyDetails) + +class MemberSpaceLimitsChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSpaceLimitsChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSpaceLimitsChangePolicyType(description={!r})'.format( + self._description_value, + ) + +MemberSpaceLimitsChangePolicyType_validator = bv.Struct(MemberSpaceLimitsChangePolicyType) + +class MemberSpaceLimitsChangeStatusDetails(bb.Struct): + """ + Changed space limit status. + + :ivar previous_value: Previous storage quota status. + :ivar new_value: New storage quota status. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + previous_value=None, + new_value=None): + self._previous_value_value = None + self._previous_value_present = False + self._new_value_value = None + self._new_value_present = False + if previous_value is not None: + self.previous_value = previous_value + if new_value is not None: + self.new_value = new_value + + @property + def previous_value(self): + """ + Previous storage quota status. + + :rtype: SpaceLimitsStatus + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + @property + def new_value(self): + """ + New storage quota status. + + :rtype: SpaceLimitsStatus + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSpaceLimitsChangeStatusDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSpaceLimitsChangeStatusDetails(previous_value={!r}, new_value={!r})'.format( + self._previous_value_value, + self._new_value_value, + ) + +MemberSpaceLimitsChangeStatusDetails_validator = bv.Struct(MemberSpaceLimitsChangeStatusDetails) + +class MemberSpaceLimitsChangeStatusType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSpaceLimitsChangeStatusType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSpaceLimitsChangeStatusType(description={!r})'.format( + self._description_value, + ) + +MemberSpaceLimitsChangeStatusType_validator = bv.Struct(MemberSpaceLimitsChangeStatusType) + +class MemberSpaceLimitsRemoveCustomQuotaDetails(bb.Struct): + """ + Removed custom member space limit. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSpaceLimitsRemoveCustomQuotaDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSpaceLimitsRemoveCustomQuotaDetails()' + +MemberSpaceLimitsRemoveCustomQuotaDetails_validator = bv.Struct(MemberSpaceLimitsRemoveCustomQuotaDetails) + +class MemberSpaceLimitsRemoveCustomQuotaType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSpaceLimitsRemoveCustomQuotaType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSpaceLimitsRemoveCustomQuotaType(description={!r})'.format( + self._description_value, + ) + +MemberSpaceLimitsRemoveCustomQuotaType_validator = bv.Struct(MemberSpaceLimitsRemoveCustomQuotaType) + +class MemberSpaceLimitsRemoveExceptionDetails(bb.Struct): + """ + Removed members from member space limit exception list. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSpaceLimitsRemoveExceptionDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSpaceLimitsRemoveExceptionDetails()' + +MemberSpaceLimitsRemoveExceptionDetails_validator = bv.Struct(MemberSpaceLimitsRemoveExceptionDetails) + +class MemberSpaceLimitsRemoveExceptionType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSpaceLimitsRemoveExceptionType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSpaceLimitsRemoveExceptionType(description={!r})'.format( + self._description_value, + ) + +MemberSpaceLimitsRemoveExceptionType_validator = bv.Struct(MemberSpaceLimitsRemoveExceptionType) + +class MemberStatus(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + not_joined = None + # Attribute is overwritten below the class definition + invited = None + # Attribute is overwritten below the class definition + active = None + # Attribute is overwritten below the class definition + suspended = None + # Attribute is overwritten below the class definition + removed = None + # Attribute is overwritten below the class definition + other = None + + def is_not_joined(self): + """ + Check if the union tag is ``not_joined``. + + :rtype: bool + """ + return self._tag == 'not_joined' + + def is_invited(self): + """ + Check if the union tag is ``invited``. + + :rtype: bool + """ + return self._tag == 'invited' + + def is_active(self): + """ + Check if the union tag is ``active``. + + :rtype: bool + """ + return self._tag == 'active' + + def is_suspended(self): + """ + Check if the union tag is ``suspended``. + + :rtype: bool + """ + return self._tag == 'suspended' + + def is_removed(self): + """ + Check if the union tag is ``removed``. + + :rtype: bool + """ + return self._tag == 'removed' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberStatus(%r, %r)' % (self._tag, self._value) + +MemberStatus_validator = bv.Union(MemberStatus) + +class MemberSuggestDetails(bb.Struct): + """ + Suggested person to add to team. + + :ivar suggested_members: suggested users emails. + """ + + __slots__ = [ + '_suggested_members_value', + '_suggested_members_present', + ] + + _has_required_fields = True + + def __init__(self, + suggested_members=None): + self._suggested_members_value = None + self._suggested_members_present = False + if suggested_members is not None: + self.suggested_members = suggested_members + + @property + def suggested_members(self): + """ + suggested users emails. + + :rtype: list of [str] + """ + if self._suggested_members_present: + return self._suggested_members_value + else: + raise AttributeError("missing required field 'suggested_members'") + + @suggested_members.setter + def suggested_members(self, val): + val = self._suggested_members_validator.validate(val) + self._suggested_members_value = val + self._suggested_members_present = True + + @suggested_members.deleter + def suggested_members(self): + self._suggested_members_value = None + self._suggested_members_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSuggestDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSuggestDetails(suggested_members={!r})'.format( + self._suggested_members_value, + ) + +MemberSuggestDetails_validator = bv.Struct(MemberSuggestDetails) + +class MemberSuggestType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSuggestType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSuggestType(description={!r})'.format( + self._description_value, + ) + +MemberSuggestType_validator = bv.Struct(MemberSuggestType) + +class MemberSuggestionsChangePolicyDetails(bb.Struct): + """ + Enabled/disabled option for team members to suggest people to add to team. + + :ivar new_value: New team member suggestions policy. + :ivar previous_value: Previous team member suggestions policy. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New team member suggestions policy. + + :rtype: MemberSuggestionsPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous team member suggestions policy. Might be missing due to + historical data gap. + + :rtype: MemberSuggestionsPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSuggestionsChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSuggestionsChangePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +MemberSuggestionsChangePolicyDetails_validator = bv.Struct(MemberSuggestionsChangePolicyDetails) + +class MemberSuggestionsChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSuggestionsChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSuggestionsChangePolicyType(description={!r})'.format( + self._description_value, + ) + +MemberSuggestionsChangePolicyType_validator = bv.Struct(MemberSuggestionsChangePolicyType) + +class MemberSuggestionsPolicy(bb.Union): + """ + Member suggestions policy + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberSuggestionsPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberSuggestionsPolicy(%r, %r)' % (self._tag, self._value) + +MemberSuggestionsPolicy_validator = bv.Union(MemberSuggestionsPolicy) + +class MemberTransferAccountContentsDetails(bb.Struct): + """ + Transferred contents of deleted member account to another member. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberTransferAccountContentsDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberTransferAccountContentsDetails()' + +MemberTransferAccountContentsDetails_validator = bv.Struct(MemberTransferAccountContentsDetails) + +class MemberTransferAccountContentsType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MemberTransferAccountContentsType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MemberTransferAccountContentsType(description={!r})'.format( + self._description_value, + ) + +MemberTransferAccountContentsType_validator = bv.Struct(MemberTransferAccountContentsType) + +class MicrosoftOfficeAddinChangePolicyDetails(bb.Struct): + """ + Enabled/disabled Microsoft Office add-in. + + :ivar new_value: New Microsoft Office addin policy. + :ivar previous_value: Previous Microsoft Office addin policy. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New Microsoft Office addin policy. + + :rtype: MicrosoftOfficeAddinPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous Microsoft Office addin policy. Might be missing due to + historical data gap. + + :rtype: MicrosoftOfficeAddinPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MicrosoftOfficeAddinChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MicrosoftOfficeAddinChangePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +MicrosoftOfficeAddinChangePolicyDetails_validator = bv.Struct(MicrosoftOfficeAddinChangePolicyDetails) + +class MicrosoftOfficeAddinChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MicrosoftOfficeAddinChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MicrosoftOfficeAddinChangePolicyType(description={!r})'.format( + self._description_value, + ) + +MicrosoftOfficeAddinChangePolicyType_validator = bv.Struct(MicrosoftOfficeAddinChangePolicyType) + +class MicrosoftOfficeAddinPolicy(bb.Union): + """ + Microsoft Office addin policy + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(MicrosoftOfficeAddinPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MicrosoftOfficeAddinPolicy(%r, %r)' % (self._tag, self._value) + +MicrosoftOfficeAddinPolicy_validator = bv.Union(MicrosoftOfficeAddinPolicy) + +class MissingDetails(bb.Struct): + """ + An indication that an error occurred while retrieving the event. Some + attributes of the event may be omitted as a result. + + :ivar source_event_fields: All the data that could be retrieved and + converted from the source event. + """ + + __slots__ = [ + '_source_event_fields_value', + '_source_event_fields_present', + ] + + _has_required_fields = False + + def __init__(self, + source_event_fields=None): + self._source_event_fields_value = None + self._source_event_fields_present = False + if source_event_fields is not None: + self.source_event_fields = source_event_fields + + @property + def source_event_fields(self): + """ + All the data that could be retrieved and converted from the source + event. + + :rtype: str + """ + if self._source_event_fields_present: + return self._source_event_fields_value + else: + return None + + @source_event_fields.setter + def source_event_fields(self, val): + if val is None: + del self.source_event_fields + return + val = self._source_event_fields_validator.validate(val) + self._source_event_fields_value = val + self._source_event_fields_present = True + + @source_event_fields.deleter + def source_event_fields(self): + self._source_event_fields_value = None + self._source_event_fields_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MissingDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MissingDetails(source_event_fields={!r})'.format( + self._source_event_fields_value, + ) + +MissingDetails_validator = bv.Struct(MissingDetails) + +class MobileDeviceSessionLogInfo(DeviceSessionLogInfo): + """ + Information about linked Dropbox mobile client sessions + + :ivar session_info: Mobile session unique id. Might be missing due to + historical data gap. + :ivar device_name: The device name. + :ivar client_type: The mobile application type. + :ivar client_version: The Dropbox client version. + :ivar os_version: The hosting OS version. + :ivar last_carrier: last carrier used by the device. + """ + + __slots__ = [ + '_session_info_value', + '_session_info_present', + '_device_name_value', + '_device_name_present', + '_client_type_value', + '_client_type_present', + '_client_version_value', + '_client_version_present', + '_os_version_value', + '_os_version_present', + '_last_carrier_value', + '_last_carrier_present', + ] + + _has_required_fields = True + + def __init__(self, + device_name=None, + client_type=None, + ip_address=None, + created=None, + updated=None, + session_info=None, + client_version=None, + os_version=None, + last_carrier=None): + super(MobileDeviceSessionLogInfo, self).__init__(ip_address, + created, + updated) + self._session_info_value = None + self._session_info_present = False + self._device_name_value = None + self._device_name_present = False + self._client_type_value = None + self._client_type_present = False + self._client_version_value = None + self._client_version_present = False + self._os_version_value = None + self._os_version_present = False + self._last_carrier_value = None + self._last_carrier_present = False + if session_info is not None: + self.session_info = session_info + if device_name is not None: + self.device_name = device_name + if client_type is not None: + self.client_type = client_type + if client_version is not None: + self.client_version = client_version + if os_version is not None: + self.os_version = os_version + if last_carrier is not None: + self.last_carrier = last_carrier + + @property + def session_info(self): + """ + Mobile session unique id. Might be missing due to historical data gap. + + :rtype: MobileSessionLogInfo + """ + if self._session_info_present: + return self._session_info_value + else: + return None + + @session_info.setter + def session_info(self, val): + if val is None: + del self.session_info + return + self._session_info_validator.validate_type_only(val) + self._session_info_value = val + self._session_info_present = True + + @session_info.deleter + def session_info(self): + self._session_info_value = None + self._session_info_present = False + + @property + def device_name(self): + """ + The device name. + + :rtype: str + """ + if self._device_name_present: + return self._device_name_value + else: + raise AttributeError("missing required field 'device_name'") + + @device_name.setter + def device_name(self, val): + val = self._device_name_validator.validate(val) + self._device_name_value = val + self._device_name_present = True + + @device_name.deleter + def device_name(self): + self._device_name_value = None + self._device_name_present = False + + @property + def client_type(self): + """ + The mobile application type. + + :rtype: team.MobileClientPlatform + """ + if self._client_type_present: + return self._client_type_value + else: + raise AttributeError("missing required field 'client_type'") + + @client_type.setter + def client_type(self, val): + self._client_type_validator.validate_type_only(val) + self._client_type_value = val + self._client_type_present = True + + @client_type.deleter + def client_type(self): + self._client_type_value = None + self._client_type_present = False + + @property + def client_version(self): + """ + The Dropbox client version. + + :rtype: str + """ + if self._client_version_present: + return self._client_version_value + else: + return None + + @client_version.setter + def client_version(self, val): + if val is None: + del self.client_version + return + val = self._client_version_validator.validate(val) + self._client_version_value = val + self._client_version_present = True + + @client_version.deleter + def client_version(self): + self._client_version_value = None + self._client_version_present = False + + @property + def os_version(self): + """ + The hosting OS version. + + :rtype: str + """ + if self._os_version_present: + return self._os_version_value + else: + return None + + @os_version.setter + def os_version(self, val): + if val is None: + del self.os_version + return + val = self._os_version_validator.validate(val) + self._os_version_value = val + self._os_version_present = True + + @os_version.deleter + def os_version(self): + self._os_version_value = None + self._os_version_present = False + + @property + def last_carrier(self): + """ + last carrier used by the device. + + :rtype: str + """ + if self._last_carrier_present: + return self._last_carrier_value + else: + return None + + @last_carrier.setter + def last_carrier(self, val): + if val is None: + del self.last_carrier + return + val = self._last_carrier_validator.validate(val) + self._last_carrier_value = val + self._last_carrier_present = True + + @last_carrier.deleter + def last_carrier(self): + self._last_carrier_value = None + self._last_carrier_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(MobileDeviceSessionLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MobileDeviceSessionLogInfo(device_name={!r}, client_type={!r}, ip_address={!r}, created={!r}, updated={!r}, session_info={!r}, client_version={!r}, os_version={!r}, last_carrier={!r})'.format( + self._device_name_value, + self._client_type_value, + self._ip_address_value, + self._created_value, + self._updated_value, + self._session_info_value, + self._client_version_value, + self._os_version_value, + self._last_carrier_value, + ) + +MobileDeviceSessionLogInfo_validator = bv.Struct(MobileDeviceSessionLogInfo) + +class MobileSessionLogInfo(SessionLogInfo): + """ + Mobile session. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self, + session_id=None): + super(MobileSessionLogInfo, self).__init__(session_id) + + def _process_custom_annotations(self, annotation_type, processor): + super(MobileSessionLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'MobileSessionLogInfo(session_id={!r})'.format( + self._session_id_value, + ) + +MobileSessionLogInfo_validator = bv.Struct(MobileSessionLogInfo) + +class NamespaceRelativePathLogInfo(bb.Struct): + """ + Namespace relative path details. + + :ivar ns_id: Namespace ID. Might be missing due to historical data gap. + :ivar relative_path: A path relative to the specified namespace ID. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_ns_id_value', + '_ns_id_present', + '_relative_path_value', + '_relative_path_present', + ] + + _has_required_fields = False + + def __init__(self, + ns_id=None, + relative_path=None): + self._ns_id_value = None + self._ns_id_present = False + self._relative_path_value = None + self._relative_path_present = False + if ns_id is not None: + self.ns_id = ns_id + if relative_path is not None: + self.relative_path = relative_path + + @property + def ns_id(self): + """ + Namespace ID. Might be missing due to historical data gap. + + :rtype: str + """ + if self._ns_id_present: + return self._ns_id_value + else: + return None + + @ns_id.setter + def ns_id(self, val): + if val is None: + del self.ns_id + return + val = self._ns_id_validator.validate(val) + self._ns_id_value = val + self._ns_id_present = True + + @ns_id.deleter + def ns_id(self): + self._ns_id_value = None + self._ns_id_present = False + + @property + def relative_path(self): + """ + A path relative to the specified namespace ID. Might be missing due to + historical data gap. + + :rtype: str + """ + if self._relative_path_present: + return self._relative_path_value + else: + return None + + @relative_path.setter + def relative_path(self, val): + if val is None: + del self.relative_path + return + val = self._relative_path_validator.validate(val) + self._relative_path_value = val + self._relative_path_present = True + + @relative_path.deleter + def relative_path(self): + self._relative_path_value = None + self._relative_path_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(NamespaceRelativePathLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'NamespaceRelativePathLogInfo(ns_id={!r}, relative_path={!r})'.format( + self._ns_id_value, + self._relative_path_value, + ) + +NamespaceRelativePathLogInfo_validator = bv.Struct(NamespaceRelativePathLogInfo) + +class NetworkControlChangePolicyDetails(bb.Struct): + """ + Enabled/disabled network control. + + :ivar new_value: New network control policy. + :ivar previous_value: Previous network control policy. Might be missing due + to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New network control policy. + + :rtype: NetworkControlPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous network control policy. Might be missing due to historical data + gap. + + :rtype: NetworkControlPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(NetworkControlChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'NetworkControlChangePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +NetworkControlChangePolicyDetails_validator = bv.Struct(NetworkControlChangePolicyDetails) + +class NetworkControlChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(NetworkControlChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'NetworkControlChangePolicyType(description={!r})'.format( + self._description_value, + ) + +NetworkControlChangePolicyType_validator = bv.Struct(NetworkControlChangePolicyType) + +class NetworkControlPolicy(bb.Union): + """ + Network control policy + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(NetworkControlPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'NetworkControlPolicy(%r, %r)' % (self._tag, self._value) + +NetworkControlPolicy_validator = bv.Union(NetworkControlPolicy) + +class UserLogInfo(bb.Struct): + """ + User's logged information. + + :ivar account_id: User unique ID. Might be missing due to historical data + gap. + :ivar display_name: User display name. Might be missing due to historical + data gap. + :ivar email: User email address. Might be missing due to historical data + gap. + """ + + __slots__ = [ + '_account_id_value', + '_account_id_present', + '_display_name_value', + '_display_name_present', + '_email_value', + '_email_present', + ] + + _has_required_fields = False + + def __init__(self, + account_id=None, + display_name=None, + email=None): + self._account_id_value = None + self._account_id_present = False + self._display_name_value = None + self._display_name_present = False + self._email_value = None + self._email_present = False + if account_id is not None: + self.account_id = account_id + if display_name is not None: + self.display_name = display_name + if email is not None: + self.email = email + + @property + def account_id(self): + """ + User unique ID. Might be missing due to historical data gap. + + :rtype: str + """ + if self._account_id_present: + return self._account_id_value + else: + return None + + @account_id.setter + def account_id(self, val): + if val is None: + del self.account_id + return + val = self._account_id_validator.validate(val) + self._account_id_value = val + self._account_id_present = True + + @account_id.deleter + def account_id(self): + self._account_id_value = None + self._account_id_present = False + + @property + def display_name(self): + """ + User display name. Might be missing due to historical data gap. + + :rtype: str + """ + if self._display_name_present: + return self._display_name_value + else: + return None + + @display_name.setter + def display_name(self, val): + if val is None: + del self.display_name + return + val = self._display_name_validator.validate(val) + self._display_name_value = val + self._display_name_present = True + + @display_name.deleter + def display_name(self): + self._display_name_value = None + self._display_name_present = False + + @property + def email(self): + """ + User email address. Might be missing due to historical data gap. + + :rtype: str + """ + if self._email_present: + return self._email_value + else: + return None + + @email.setter + def email(self, val): + if val is None: + del self.email + return + val = self._email_validator.validate(val) + self._email_value = val + self._email_present = True + + @email.deleter + def email(self): + self._email_value = None + self._email_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UserLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UserLogInfo(account_id={!r}, display_name={!r}, email={!r})'.format( + self._account_id_value, + self._display_name_value, + self._email_value, + ) + +UserLogInfo_validator = bv.StructTree(UserLogInfo) + +class NonTeamMemberLogInfo(UserLogInfo): + """ + Non team member's logged information. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self, + account_id=None, + display_name=None, + email=None): + super(NonTeamMemberLogInfo, self).__init__(account_id, + display_name, + email) + + def _process_custom_annotations(self, annotation_type, processor): + super(NonTeamMemberLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'NonTeamMemberLogInfo(account_id={!r}, display_name={!r}, email={!r})'.format( + self._account_id_value, + self._display_name_value, + self._email_value, + ) + +NonTeamMemberLogInfo_validator = bv.Struct(NonTeamMemberLogInfo) + +class NoteAclInviteOnlyDetails(bb.Struct): + """ + Changed Paper doc to invite-only. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(NoteAclInviteOnlyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'NoteAclInviteOnlyDetails()' + +NoteAclInviteOnlyDetails_validator = bv.Struct(NoteAclInviteOnlyDetails) + +class NoteAclInviteOnlyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(NoteAclInviteOnlyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'NoteAclInviteOnlyType(description={!r})'.format( + self._description_value, + ) + +NoteAclInviteOnlyType_validator = bv.Struct(NoteAclInviteOnlyType) + +class NoteAclLinkDetails(bb.Struct): + """ + Changed Paper doc to link-accessible. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(NoteAclLinkDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'NoteAclLinkDetails()' + +NoteAclLinkDetails_validator = bv.Struct(NoteAclLinkDetails) + +class NoteAclLinkType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(NoteAclLinkType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'NoteAclLinkType(description={!r})'.format( + self._description_value, + ) + +NoteAclLinkType_validator = bv.Struct(NoteAclLinkType) + +class NoteAclTeamLinkDetails(bb.Struct): + """ + Changed Paper doc to link-accessible for team. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(NoteAclTeamLinkDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'NoteAclTeamLinkDetails()' + +NoteAclTeamLinkDetails_validator = bv.Struct(NoteAclTeamLinkDetails) + +class NoteAclTeamLinkType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(NoteAclTeamLinkType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'NoteAclTeamLinkType(description={!r})'.format( + self._description_value, + ) + +NoteAclTeamLinkType_validator = bv.Struct(NoteAclTeamLinkType) + +class NoteShareReceiveDetails(bb.Struct): + """ + Shared received Paper doc. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(NoteShareReceiveDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'NoteShareReceiveDetails()' + +NoteShareReceiveDetails_validator = bv.Struct(NoteShareReceiveDetails) + +class NoteShareReceiveType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(NoteShareReceiveType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'NoteShareReceiveType(description={!r})'.format( + self._description_value, + ) + +NoteShareReceiveType_validator = bv.Struct(NoteShareReceiveType) + +class NoteSharedDetails(bb.Struct): + """ + Shared Paper doc. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(NoteSharedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'NoteSharedDetails()' + +NoteSharedDetails_validator = bv.Struct(NoteSharedDetails) + +class NoteSharedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(NoteSharedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'NoteSharedType(description={!r})'.format( + self._description_value, + ) + +NoteSharedType_validator = bv.Struct(NoteSharedType) + +class OpenNoteSharedDetails(bb.Struct): + """ + Opened shared Paper doc. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(OpenNoteSharedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'OpenNoteSharedDetails()' + +OpenNoteSharedDetails_validator = bv.Struct(OpenNoteSharedDetails) + +class OpenNoteSharedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(OpenNoteSharedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'OpenNoteSharedType(description={!r})'.format( + self._description_value, + ) + +OpenNoteSharedType_validator = bv.Struct(OpenNoteSharedType) + +class OriginLogInfo(bb.Struct): + """ + The origin from which the actor performed the action. + + :ivar geo_location: Geographic location details. + :ivar access_method: The method that was used to perform the action. + """ + + __slots__ = [ + '_geo_location_value', + '_geo_location_present', + '_access_method_value', + '_access_method_present', + ] + + _has_required_fields = True + + def __init__(self, + access_method=None, + geo_location=None): + self._geo_location_value = None + self._geo_location_present = False + self._access_method_value = None + self._access_method_present = False + if geo_location is not None: + self.geo_location = geo_location + if access_method is not None: + self.access_method = access_method + + @property + def geo_location(self): + """ + Geographic location details. + + :rtype: GeoLocationLogInfo + """ + if self._geo_location_present: + return self._geo_location_value + else: + return None + + @geo_location.setter + def geo_location(self, val): + if val is None: + del self.geo_location + return + self._geo_location_validator.validate_type_only(val) + self._geo_location_value = val + self._geo_location_present = True + + @geo_location.deleter + def geo_location(self): + self._geo_location_value = None + self._geo_location_present = False + + @property + def access_method(self): + """ + The method that was used to perform the action. + + :rtype: AccessMethodLogInfo + """ + if self._access_method_present: + return self._access_method_value + else: + raise AttributeError("missing required field 'access_method'") + + @access_method.setter + def access_method(self, val): + self._access_method_validator.validate_type_only(val) + self._access_method_value = val + self._access_method_present = True + + @access_method.deleter + def access_method(self): + self._access_method_value = None + self._access_method_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(OriginLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'OriginLogInfo(access_method={!r}, geo_location={!r})'.format( + self._access_method_value, + self._geo_location_value, + ) + +OriginLogInfo_validator = bv.Struct(OriginLogInfo) + +class PaperAccessType(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + viewer = None + # Attribute is overwritten below the class definition + commenter = None + # Attribute is overwritten below the class definition + editor = None + # Attribute is overwritten below the class definition + other = None + + def is_viewer(self): + """ + Check if the union tag is ``viewer``. + + :rtype: bool + """ + return self._tag == 'viewer' + + def is_commenter(self): + """ + Check if the union tag is ``commenter``. + + :rtype: bool + """ + return self._tag == 'commenter' + + def is_editor(self): + """ + Check if the union tag is ``editor``. + + :rtype: bool + """ + return self._tag == 'editor' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperAccessType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperAccessType(%r, %r)' % (self._tag, self._value) + +PaperAccessType_validator = bv.Union(PaperAccessType) + +class PaperAdminExportStartDetails(bb.Struct): + """ + Exported all team Paper docs. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperAdminExportStartDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperAdminExportStartDetails()' + +PaperAdminExportStartDetails_validator = bv.Struct(PaperAdminExportStartDetails) + +class PaperAdminExportStartType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperAdminExportStartType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperAdminExportStartType(description={!r})'.format( + self._description_value, + ) + +PaperAdminExportStartType_validator = bv.Struct(PaperAdminExportStartType) + +class PaperChangeDeploymentPolicyDetails(bb.Struct): + """ + Changed whether Dropbox Paper, when enabled, is deployed to all members or + to specific members. + + :ivar new_value: New Dropbox Paper deployment policy. + :ivar previous_value: Previous Dropbox Paper deployment policy. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New Dropbox Paper deployment policy. + + :rtype: team_policies.PaperDeploymentPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous Dropbox Paper deployment policy. Might be missing due to + historical data gap. + + :rtype: team_policies.PaperDeploymentPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperChangeDeploymentPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperChangeDeploymentPolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +PaperChangeDeploymentPolicyDetails_validator = bv.Struct(PaperChangeDeploymentPolicyDetails) + +class PaperChangeDeploymentPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperChangeDeploymentPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperChangeDeploymentPolicyType(description={!r})'.format( + self._description_value, + ) + +PaperChangeDeploymentPolicyType_validator = bv.Struct(PaperChangeDeploymentPolicyType) + +class PaperChangeMemberLinkPolicyDetails(bb.Struct): + """ + Changed whether non-members can view Paper docs with link. + + :ivar new_value: New paper external link accessibility policy. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None): + self._new_value_value = None + self._new_value_present = False + if new_value is not None: + self.new_value = new_value + + @property + def new_value(self): + """ + New paper external link accessibility policy. + + :rtype: PaperMemberPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperChangeMemberLinkPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperChangeMemberLinkPolicyDetails(new_value={!r})'.format( + self._new_value_value, + ) + +PaperChangeMemberLinkPolicyDetails_validator = bv.Struct(PaperChangeMemberLinkPolicyDetails) + +class PaperChangeMemberLinkPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperChangeMemberLinkPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperChangeMemberLinkPolicyType(description={!r})'.format( + self._description_value, + ) + +PaperChangeMemberLinkPolicyType_validator = bv.Struct(PaperChangeMemberLinkPolicyType) + +class PaperChangeMemberPolicyDetails(bb.Struct): + """ + Changed whether members can share Paper docs outside team, and if docs are + accessible only by team members or anyone by default. + + :ivar new_value: New paper external accessibility policy. + :ivar previous_value: Previous paper external accessibility policy. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New paper external accessibility policy. + + :rtype: PaperMemberPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous paper external accessibility policy. Might be missing due to + historical data gap. + + :rtype: PaperMemberPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperChangeMemberPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperChangeMemberPolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +PaperChangeMemberPolicyDetails_validator = bv.Struct(PaperChangeMemberPolicyDetails) + +class PaperChangeMemberPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperChangeMemberPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperChangeMemberPolicyType(description={!r})'.format( + self._description_value, + ) + +PaperChangeMemberPolicyType_validator = bv.Struct(PaperChangeMemberPolicyType) + +class PaperChangePolicyDetails(bb.Struct): + """ + Enabled/disabled Dropbox Paper for team. + + :ivar new_value: New Dropbox Paper policy. + :ivar previous_value: Previous Dropbox Paper policy. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New Dropbox Paper policy. + + :rtype: team_policies.PaperEnabledPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous Dropbox Paper policy. Might be missing due to historical data + gap. + + :rtype: team_policies.PaperEnabledPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperChangePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +PaperChangePolicyDetails_validator = bv.Struct(PaperChangePolicyDetails) + +class PaperChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperChangePolicyType(description={!r})'.format( + self._description_value, + ) + +PaperChangePolicyType_validator = bv.Struct(PaperChangePolicyType) + +class PaperContentAddMemberDetails(bb.Struct): + """ + Added team member to Paper doc/folder. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentAddMemberDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentAddMemberDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperContentAddMemberDetails_validator = bv.Struct(PaperContentAddMemberDetails) + +class PaperContentAddMemberType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentAddMemberType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentAddMemberType(description={!r})'.format( + self._description_value, + ) + +PaperContentAddMemberType_validator = bv.Struct(PaperContentAddMemberType) + +class PaperContentAddToFolderDetails(bb.Struct): + """ + Added Paper doc/folder to folder. + + :ivar event_uuid: Event unique identifier. + :ivar target_asset_index: Target asset position in the Assets list. + :ivar parent_asset_index: Parent asset position in the Assets list. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_target_asset_index_value', + '_target_asset_index_present', + '_parent_asset_index_value', + '_parent_asset_index_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + target_asset_index=None, + parent_asset_index=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._target_asset_index_value = None + self._target_asset_index_present = False + self._parent_asset_index_value = None + self._parent_asset_index_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if target_asset_index is not None: + self.target_asset_index = target_asset_index + if parent_asset_index is not None: + self.parent_asset_index = parent_asset_index + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def target_asset_index(self): + """ + Target asset position in the Assets list. + + :rtype: int + """ + if self._target_asset_index_present: + return self._target_asset_index_value + else: + raise AttributeError("missing required field 'target_asset_index'") + + @target_asset_index.setter + def target_asset_index(self, val): + val = self._target_asset_index_validator.validate(val) + self._target_asset_index_value = val + self._target_asset_index_present = True + + @target_asset_index.deleter + def target_asset_index(self): + self._target_asset_index_value = None + self._target_asset_index_present = False + + @property + def parent_asset_index(self): + """ + Parent asset position in the Assets list. + + :rtype: int + """ + if self._parent_asset_index_present: + return self._parent_asset_index_value + else: + raise AttributeError("missing required field 'parent_asset_index'") + + @parent_asset_index.setter + def parent_asset_index(self, val): + val = self._parent_asset_index_validator.validate(val) + self._parent_asset_index_value = val + self._parent_asset_index_present = True + + @parent_asset_index.deleter + def parent_asset_index(self): + self._parent_asset_index_value = None + self._parent_asset_index_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentAddToFolderDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentAddToFolderDetails(event_uuid={!r}, target_asset_index={!r}, parent_asset_index={!r})'.format( + self._event_uuid_value, + self._target_asset_index_value, + self._parent_asset_index_value, + ) + +PaperContentAddToFolderDetails_validator = bv.Struct(PaperContentAddToFolderDetails) + +class PaperContentAddToFolderType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentAddToFolderType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentAddToFolderType(description={!r})'.format( + self._description_value, + ) + +PaperContentAddToFolderType_validator = bv.Struct(PaperContentAddToFolderType) + +class PaperContentArchiveDetails(bb.Struct): + """ + Archived Paper doc/folder. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentArchiveDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentArchiveDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperContentArchiveDetails_validator = bv.Struct(PaperContentArchiveDetails) + +class PaperContentArchiveType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentArchiveType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentArchiveType(description={!r})'.format( + self._description_value, + ) + +PaperContentArchiveType_validator = bv.Struct(PaperContentArchiveType) + +class PaperContentCreateDetails(bb.Struct): + """ + Created Paper doc/folder. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentCreateDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentCreateDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperContentCreateDetails_validator = bv.Struct(PaperContentCreateDetails) + +class PaperContentCreateType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentCreateType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentCreateType(description={!r})'.format( + self._description_value, + ) + +PaperContentCreateType_validator = bv.Struct(PaperContentCreateType) + +class PaperContentPermanentlyDeleteDetails(bb.Struct): + """ + Permanently deleted Paper doc/folder. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentPermanentlyDeleteDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentPermanentlyDeleteDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperContentPermanentlyDeleteDetails_validator = bv.Struct(PaperContentPermanentlyDeleteDetails) + +class PaperContentPermanentlyDeleteType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentPermanentlyDeleteType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentPermanentlyDeleteType(description={!r})'.format( + self._description_value, + ) + +PaperContentPermanentlyDeleteType_validator = bv.Struct(PaperContentPermanentlyDeleteType) + +class PaperContentRemoveFromFolderDetails(bb.Struct): + """ + Removed Paper doc/folder from folder. + + :ivar event_uuid: Event unique identifier. + :ivar target_asset_index: Target asset position in the Assets list. + :ivar parent_asset_index: Parent asset position in the Assets list. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_target_asset_index_value', + '_target_asset_index_present', + '_parent_asset_index_value', + '_parent_asset_index_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + target_asset_index=None, + parent_asset_index=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._target_asset_index_value = None + self._target_asset_index_present = False + self._parent_asset_index_value = None + self._parent_asset_index_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if target_asset_index is not None: + self.target_asset_index = target_asset_index + if parent_asset_index is not None: + self.parent_asset_index = parent_asset_index + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def target_asset_index(self): + """ + Target asset position in the Assets list. + + :rtype: int + """ + if self._target_asset_index_present: + return self._target_asset_index_value + else: + raise AttributeError("missing required field 'target_asset_index'") + + @target_asset_index.setter + def target_asset_index(self, val): + val = self._target_asset_index_validator.validate(val) + self._target_asset_index_value = val + self._target_asset_index_present = True + + @target_asset_index.deleter + def target_asset_index(self): + self._target_asset_index_value = None + self._target_asset_index_present = False + + @property + def parent_asset_index(self): + """ + Parent asset position in the Assets list. + + :rtype: int + """ + if self._parent_asset_index_present: + return self._parent_asset_index_value + else: + raise AttributeError("missing required field 'parent_asset_index'") + + @parent_asset_index.setter + def parent_asset_index(self, val): + val = self._parent_asset_index_validator.validate(val) + self._parent_asset_index_value = val + self._parent_asset_index_present = True + + @parent_asset_index.deleter + def parent_asset_index(self): + self._parent_asset_index_value = None + self._parent_asset_index_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentRemoveFromFolderDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentRemoveFromFolderDetails(event_uuid={!r}, target_asset_index={!r}, parent_asset_index={!r})'.format( + self._event_uuid_value, + self._target_asset_index_value, + self._parent_asset_index_value, + ) + +PaperContentRemoveFromFolderDetails_validator = bv.Struct(PaperContentRemoveFromFolderDetails) + +class PaperContentRemoveFromFolderType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentRemoveFromFolderType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentRemoveFromFolderType(description={!r})'.format( + self._description_value, + ) + +PaperContentRemoveFromFolderType_validator = bv.Struct(PaperContentRemoveFromFolderType) + +class PaperContentRemoveMemberDetails(bb.Struct): + """ + Removed team member from Paper doc/folder. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentRemoveMemberDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentRemoveMemberDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperContentRemoveMemberDetails_validator = bv.Struct(PaperContentRemoveMemberDetails) + +class PaperContentRemoveMemberType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentRemoveMemberType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentRemoveMemberType(description={!r})'.format( + self._description_value, + ) + +PaperContentRemoveMemberType_validator = bv.Struct(PaperContentRemoveMemberType) + +class PaperContentRenameDetails(bb.Struct): + """ + Renamed Paper doc/folder. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentRenameDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentRenameDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperContentRenameDetails_validator = bv.Struct(PaperContentRenameDetails) + +class PaperContentRenameType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentRenameType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentRenameType(description={!r})'.format( + self._description_value, + ) + +PaperContentRenameType_validator = bv.Struct(PaperContentRenameType) + +class PaperContentRestoreDetails(bb.Struct): + """ + Restored archived Paper doc/folder. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentRestoreDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentRestoreDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperContentRestoreDetails_validator = bv.Struct(PaperContentRestoreDetails) + +class PaperContentRestoreType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperContentRestoreType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperContentRestoreType(description={!r})'.format( + self._description_value, + ) + +PaperContentRestoreType_validator = bv.Struct(PaperContentRestoreType) + +class PaperDocAddCommentDetails(bb.Struct): + """ + Added Paper doc comment. + + :ivar event_uuid: Event unique identifier. + :ivar comment_text: Comment text. Might be missing due to historical data + gap. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_comment_text_value', + '_comment_text_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + comment_text=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._comment_text_value = None + self._comment_text_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if comment_text is not None: + self.comment_text = comment_text + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def comment_text(self): + """ + Comment text. Might be missing due to historical data gap. + + :rtype: str + """ + if self._comment_text_present: + return self._comment_text_value + else: + return None + + @comment_text.setter + def comment_text(self, val): + if val is None: + del self.comment_text + return + val = self._comment_text_validator.validate(val) + self._comment_text_value = val + self._comment_text_present = True + + @comment_text.deleter + def comment_text(self): + self._comment_text_value = None + self._comment_text_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocAddCommentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocAddCommentDetails(event_uuid={!r}, comment_text={!r})'.format( + self._event_uuid_value, + self._comment_text_value, + ) + +PaperDocAddCommentDetails_validator = bv.Struct(PaperDocAddCommentDetails) + +class PaperDocAddCommentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocAddCommentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocAddCommentType(description={!r})'.format( + self._description_value, + ) + +PaperDocAddCommentType_validator = bv.Struct(PaperDocAddCommentType) + +class PaperDocChangeMemberRoleDetails(bb.Struct): + """ + Changed team member permissions for Paper doc. + + :ivar event_uuid: Event unique identifier. + :ivar access_type: Paper doc access type. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_access_type_value', + '_access_type_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + access_type=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._access_type_value = None + self._access_type_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if access_type is not None: + self.access_type = access_type + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def access_type(self): + """ + Paper doc access type. + + :rtype: PaperAccessType + """ + if self._access_type_present: + return self._access_type_value + else: + raise AttributeError("missing required field 'access_type'") + + @access_type.setter + def access_type(self, val): + self._access_type_validator.validate_type_only(val) + self._access_type_value = val + self._access_type_present = True + + @access_type.deleter + def access_type(self): + self._access_type_value = None + self._access_type_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocChangeMemberRoleDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocChangeMemberRoleDetails(event_uuid={!r}, access_type={!r})'.format( + self._event_uuid_value, + self._access_type_value, + ) + +PaperDocChangeMemberRoleDetails_validator = bv.Struct(PaperDocChangeMemberRoleDetails) + +class PaperDocChangeMemberRoleType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocChangeMemberRoleType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocChangeMemberRoleType(description={!r})'.format( + self._description_value, + ) + +PaperDocChangeMemberRoleType_validator = bv.Struct(PaperDocChangeMemberRoleType) + +class PaperDocChangeSharingPolicyDetails(bb.Struct): + """ + Changed sharing setting for Paper doc. + + :ivar event_uuid: Event unique identifier. + :ivar public_sharing_policy: Sharing policy with external users. Might be + missing due to historical data gap. + :ivar team_sharing_policy: Sharing policy with team. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_public_sharing_policy_value', + '_public_sharing_policy_present', + '_team_sharing_policy_value', + '_team_sharing_policy_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + public_sharing_policy=None, + team_sharing_policy=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._public_sharing_policy_value = None + self._public_sharing_policy_present = False + self._team_sharing_policy_value = None + self._team_sharing_policy_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if public_sharing_policy is not None: + self.public_sharing_policy = public_sharing_policy + if team_sharing_policy is not None: + self.team_sharing_policy = team_sharing_policy + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def public_sharing_policy(self): + """ + Sharing policy with external users. Might be missing due to historical + data gap. + + :rtype: str + """ + if self._public_sharing_policy_present: + return self._public_sharing_policy_value + else: + return None + + @public_sharing_policy.setter + def public_sharing_policy(self, val): + if val is None: + del self.public_sharing_policy + return + val = self._public_sharing_policy_validator.validate(val) + self._public_sharing_policy_value = val + self._public_sharing_policy_present = True + + @public_sharing_policy.deleter + def public_sharing_policy(self): + self._public_sharing_policy_value = None + self._public_sharing_policy_present = False + + @property + def team_sharing_policy(self): + """ + Sharing policy with team. Might be missing due to historical data gap. + + :rtype: str + """ + if self._team_sharing_policy_present: + return self._team_sharing_policy_value + else: + return None + + @team_sharing_policy.setter + def team_sharing_policy(self, val): + if val is None: + del self.team_sharing_policy + return + val = self._team_sharing_policy_validator.validate(val) + self._team_sharing_policy_value = val + self._team_sharing_policy_present = True + + @team_sharing_policy.deleter + def team_sharing_policy(self): + self._team_sharing_policy_value = None + self._team_sharing_policy_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocChangeSharingPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocChangeSharingPolicyDetails(event_uuid={!r}, public_sharing_policy={!r}, team_sharing_policy={!r})'.format( + self._event_uuid_value, + self._public_sharing_policy_value, + self._team_sharing_policy_value, + ) + +PaperDocChangeSharingPolicyDetails_validator = bv.Struct(PaperDocChangeSharingPolicyDetails) + +class PaperDocChangeSharingPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocChangeSharingPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocChangeSharingPolicyType(description={!r})'.format( + self._description_value, + ) + +PaperDocChangeSharingPolicyType_validator = bv.Struct(PaperDocChangeSharingPolicyType) + +class PaperDocChangeSubscriptionDetails(bb.Struct): + """ + Followed/unfollowed Paper doc. + + :ivar event_uuid: Event unique identifier. + :ivar new_subscription_level: New doc subscription level. + :ivar previous_subscription_level: Previous doc subscription level. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_new_subscription_level_value', + '_new_subscription_level_present', + '_previous_subscription_level_value', + '_previous_subscription_level_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + new_subscription_level=None, + previous_subscription_level=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._new_subscription_level_value = None + self._new_subscription_level_present = False + self._previous_subscription_level_value = None + self._previous_subscription_level_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if new_subscription_level is not None: + self.new_subscription_level = new_subscription_level + if previous_subscription_level is not None: + self.previous_subscription_level = previous_subscription_level + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def new_subscription_level(self): + """ + New doc subscription level. + + :rtype: str + """ + if self._new_subscription_level_present: + return self._new_subscription_level_value + else: + raise AttributeError("missing required field 'new_subscription_level'") + + @new_subscription_level.setter + def new_subscription_level(self, val): + val = self._new_subscription_level_validator.validate(val) + self._new_subscription_level_value = val + self._new_subscription_level_present = True + + @new_subscription_level.deleter + def new_subscription_level(self): + self._new_subscription_level_value = None + self._new_subscription_level_present = False + + @property + def previous_subscription_level(self): + """ + Previous doc subscription level. Might be missing due to historical data + gap. + + :rtype: str + """ + if self._previous_subscription_level_present: + return self._previous_subscription_level_value + else: + return None + + @previous_subscription_level.setter + def previous_subscription_level(self, val): + if val is None: + del self.previous_subscription_level + return + val = self._previous_subscription_level_validator.validate(val) + self._previous_subscription_level_value = val + self._previous_subscription_level_present = True + + @previous_subscription_level.deleter + def previous_subscription_level(self): + self._previous_subscription_level_value = None + self._previous_subscription_level_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocChangeSubscriptionDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocChangeSubscriptionDetails(event_uuid={!r}, new_subscription_level={!r}, previous_subscription_level={!r})'.format( + self._event_uuid_value, + self._new_subscription_level_value, + self._previous_subscription_level_value, + ) + +PaperDocChangeSubscriptionDetails_validator = bv.Struct(PaperDocChangeSubscriptionDetails) + +class PaperDocChangeSubscriptionType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocChangeSubscriptionType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocChangeSubscriptionType(description={!r})'.format( + self._description_value, + ) + +PaperDocChangeSubscriptionType_validator = bv.Struct(PaperDocChangeSubscriptionType) + +class PaperDocDeleteCommentDetails(bb.Struct): + """ + Deleted Paper doc comment. + + :ivar event_uuid: Event unique identifier. + :ivar comment_text: Comment text. Might be missing due to historical data + gap. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_comment_text_value', + '_comment_text_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + comment_text=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._comment_text_value = None + self._comment_text_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if comment_text is not None: + self.comment_text = comment_text + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def comment_text(self): + """ + Comment text. Might be missing due to historical data gap. + + :rtype: str + """ + if self._comment_text_present: + return self._comment_text_value + else: + return None + + @comment_text.setter + def comment_text(self, val): + if val is None: + del self.comment_text + return + val = self._comment_text_validator.validate(val) + self._comment_text_value = val + self._comment_text_present = True + + @comment_text.deleter + def comment_text(self): + self._comment_text_value = None + self._comment_text_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocDeleteCommentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocDeleteCommentDetails(event_uuid={!r}, comment_text={!r})'.format( + self._event_uuid_value, + self._comment_text_value, + ) + +PaperDocDeleteCommentDetails_validator = bv.Struct(PaperDocDeleteCommentDetails) + +class PaperDocDeleteCommentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocDeleteCommentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocDeleteCommentType(description={!r})'.format( + self._description_value, + ) + +PaperDocDeleteCommentType_validator = bv.Struct(PaperDocDeleteCommentType) + +class PaperDocDeletedDetails(bb.Struct): + """ + Archived Paper doc. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocDeletedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocDeletedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperDocDeletedDetails_validator = bv.Struct(PaperDocDeletedDetails) + +class PaperDocDeletedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocDeletedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocDeletedType(description={!r})'.format( + self._description_value, + ) + +PaperDocDeletedType_validator = bv.Struct(PaperDocDeletedType) + +class PaperDocDownloadDetails(bb.Struct): + """ + Downloaded Paper doc in specific format. + + :ivar event_uuid: Event unique identifier. + :ivar export_file_format: Export file format. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_export_file_format_value', + '_export_file_format_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + export_file_format=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._export_file_format_value = None + self._export_file_format_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if export_file_format is not None: + self.export_file_format = export_file_format + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def export_file_format(self): + """ + Export file format. + + :rtype: PaperDownloadFormat + """ + if self._export_file_format_present: + return self._export_file_format_value + else: + raise AttributeError("missing required field 'export_file_format'") + + @export_file_format.setter + def export_file_format(self, val): + self._export_file_format_validator.validate_type_only(val) + self._export_file_format_value = val + self._export_file_format_present = True + + @export_file_format.deleter + def export_file_format(self): + self._export_file_format_value = None + self._export_file_format_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocDownloadDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocDownloadDetails(event_uuid={!r}, export_file_format={!r})'.format( + self._event_uuid_value, + self._export_file_format_value, + ) + +PaperDocDownloadDetails_validator = bv.Struct(PaperDocDownloadDetails) + +class PaperDocDownloadType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocDownloadType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocDownloadType(description={!r})'.format( + self._description_value, + ) + +PaperDocDownloadType_validator = bv.Struct(PaperDocDownloadType) + +class PaperDocEditCommentDetails(bb.Struct): + """ + Edited Paper doc comment. + + :ivar event_uuid: Event unique identifier. + :ivar comment_text: Comment text. Might be missing due to historical data + gap. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_comment_text_value', + '_comment_text_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + comment_text=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._comment_text_value = None + self._comment_text_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if comment_text is not None: + self.comment_text = comment_text + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def comment_text(self): + """ + Comment text. Might be missing due to historical data gap. + + :rtype: str + """ + if self._comment_text_present: + return self._comment_text_value + else: + return None + + @comment_text.setter + def comment_text(self, val): + if val is None: + del self.comment_text + return + val = self._comment_text_validator.validate(val) + self._comment_text_value = val + self._comment_text_present = True + + @comment_text.deleter + def comment_text(self): + self._comment_text_value = None + self._comment_text_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocEditCommentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocEditCommentDetails(event_uuid={!r}, comment_text={!r})'.format( + self._event_uuid_value, + self._comment_text_value, + ) + +PaperDocEditCommentDetails_validator = bv.Struct(PaperDocEditCommentDetails) + +class PaperDocEditCommentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocEditCommentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocEditCommentType(description={!r})'.format( + self._description_value, + ) + +PaperDocEditCommentType_validator = bv.Struct(PaperDocEditCommentType) + +class PaperDocEditDetails(bb.Struct): + """ + Edited Paper doc. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocEditDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocEditDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperDocEditDetails_validator = bv.Struct(PaperDocEditDetails) + +class PaperDocEditType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocEditType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocEditType(description={!r})'.format( + self._description_value, + ) + +PaperDocEditType_validator = bv.Struct(PaperDocEditType) + +class PaperDocFollowedDetails(bb.Struct): + """ + Followed Paper doc. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocFollowedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocFollowedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperDocFollowedDetails_validator = bv.Struct(PaperDocFollowedDetails) + +class PaperDocFollowedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocFollowedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocFollowedType(description={!r})'.format( + self._description_value, + ) + +PaperDocFollowedType_validator = bv.Struct(PaperDocFollowedType) + +class PaperDocMentionDetails(bb.Struct): + """ + Mentioned team member in Paper doc. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocMentionDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocMentionDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperDocMentionDetails_validator = bv.Struct(PaperDocMentionDetails) + +class PaperDocMentionType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocMentionType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocMentionType(description={!r})'.format( + self._description_value, + ) + +PaperDocMentionType_validator = bv.Struct(PaperDocMentionType) + +class PaperDocOwnershipChangedDetails(bb.Struct): + """ + Transferred ownership of Paper doc. + + :ivar event_uuid: Event unique identifier. + :ivar old_owner_user_id: Previous owner. + :ivar new_owner_user_id: New owner. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_old_owner_user_id_value', + '_old_owner_user_id_present', + '_new_owner_user_id_value', + '_new_owner_user_id_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + new_owner_user_id=None, + old_owner_user_id=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._old_owner_user_id_value = None + self._old_owner_user_id_present = False + self._new_owner_user_id_value = None + self._new_owner_user_id_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if old_owner_user_id is not None: + self.old_owner_user_id = old_owner_user_id + if new_owner_user_id is not None: + self.new_owner_user_id = new_owner_user_id + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def old_owner_user_id(self): + """ + Previous owner. + + :rtype: str + """ + if self._old_owner_user_id_present: + return self._old_owner_user_id_value + else: + return None + + @old_owner_user_id.setter + def old_owner_user_id(self, val): + if val is None: + del self.old_owner_user_id + return + val = self._old_owner_user_id_validator.validate(val) + self._old_owner_user_id_value = val + self._old_owner_user_id_present = True + + @old_owner_user_id.deleter + def old_owner_user_id(self): + self._old_owner_user_id_value = None + self._old_owner_user_id_present = False + + @property + def new_owner_user_id(self): + """ + New owner. + + :rtype: str + """ + if self._new_owner_user_id_present: + return self._new_owner_user_id_value + else: + raise AttributeError("missing required field 'new_owner_user_id'") + + @new_owner_user_id.setter + def new_owner_user_id(self, val): + val = self._new_owner_user_id_validator.validate(val) + self._new_owner_user_id_value = val + self._new_owner_user_id_present = True + + @new_owner_user_id.deleter + def new_owner_user_id(self): + self._new_owner_user_id_value = None + self._new_owner_user_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocOwnershipChangedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocOwnershipChangedDetails(event_uuid={!r}, new_owner_user_id={!r}, old_owner_user_id={!r})'.format( + self._event_uuid_value, + self._new_owner_user_id_value, + self._old_owner_user_id_value, + ) + +PaperDocOwnershipChangedDetails_validator = bv.Struct(PaperDocOwnershipChangedDetails) + +class PaperDocOwnershipChangedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocOwnershipChangedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocOwnershipChangedType(description={!r})'.format( + self._description_value, + ) + +PaperDocOwnershipChangedType_validator = bv.Struct(PaperDocOwnershipChangedType) + +class PaperDocRequestAccessDetails(bb.Struct): + """ + Requested access to Paper doc. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocRequestAccessDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocRequestAccessDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperDocRequestAccessDetails_validator = bv.Struct(PaperDocRequestAccessDetails) + +class PaperDocRequestAccessType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocRequestAccessType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocRequestAccessType(description={!r})'.format( + self._description_value, + ) + +PaperDocRequestAccessType_validator = bv.Struct(PaperDocRequestAccessType) + +class PaperDocResolveCommentDetails(bb.Struct): + """ + Resolved Paper doc comment. + + :ivar event_uuid: Event unique identifier. + :ivar comment_text: Comment text. Might be missing due to historical data + gap. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_comment_text_value', + '_comment_text_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + comment_text=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._comment_text_value = None + self._comment_text_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if comment_text is not None: + self.comment_text = comment_text + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def comment_text(self): + """ + Comment text. Might be missing due to historical data gap. + + :rtype: str + """ + if self._comment_text_present: + return self._comment_text_value + else: + return None + + @comment_text.setter + def comment_text(self, val): + if val is None: + del self.comment_text + return + val = self._comment_text_validator.validate(val) + self._comment_text_value = val + self._comment_text_present = True + + @comment_text.deleter + def comment_text(self): + self._comment_text_value = None + self._comment_text_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocResolveCommentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocResolveCommentDetails(event_uuid={!r}, comment_text={!r})'.format( + self._event_uuid_value, + self._comment_text_value, + ) + +PaperDocResolveCommentDetails_validator = bv.Struct(PaperDocResolveCommentDetails) + +class PaperDocResolveCommentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocResolveCommentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocResolveCommentType(description={!r})'.format( + self._description_value, + ) + +PaperDocResolveCommentType_validator = bv.Struct(PaperDocResolveCommentType) + +class PaperDocRevertDetails(bb.Struct): + """ + Restored Paper doc to previous version. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocRevertDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocRevertDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperDocRevertDetails_validator = bv.Struct(PaperDocRevertDetails) + +class PaperDocRevertType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocRevertType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocRevertType(description={!r})'.format( + self._description_value, + ) + +PaperDocRevertType_validator = bv.Struct(PaperDocRevertType) + +class PaperDocSlackShareDetails(bb.Struct): + """ + Shared Paper doc via Slack. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocSlackShareDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocSlackShareDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperDocSlackShareDetails_validator = bv.Struct(PaperDocSlackShareDetails) + +class PaperDocSlackShareType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocSlackShareType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocSlackShareType(description={!r})'.format( + self._description_value, + ) + +PaperDocSlackShareType_validator = bv.Struct(PaperDocSlackShareType) + +class PaperDocTeamInviteDetails(bb.Struct): + """ + Shared Paper doc with team member. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocTeamInviteDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocTeamInviteDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperDocTeamInviteDetails_validator = bv.Struct(PaperDocTeamInviteDetails) + +class PaperDocTeamInviteType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocTeamInviteType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocTeamInviteType(description={!r})'.format( + self._description_value, + ) + +PaperDocTeamInviteType_validator = bv.Struct(PaperDocTeamInviteType) + +class PaperDocTrashedDetails(bb.Struct): + """ + Deleted Paper doc. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocTrashedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocTrashedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperDocTrashedDetails_validator = bv.Struct(PaperDocTrashedDetails) + +class PaperDocTrashedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocTrashedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocTrashedType(description={!r})'.format( + self._description_value, + ) + +PaperDocTrashedType_validator = bv.Struct(PaperDocTrashedType) + +class PaperDocUnresolveCommentDetails(bb.Struct): + """ + Unresolved Paper doc comment. + + :ivar event_uuid: Event unique identifier. + :ivar comment_text: Comment text. Might be missing due to historical data + gap. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_comment_text_value', + '_comment_text_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + comment_text=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._comment_text_value = None + self._comment_text_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if comment_text is not None: + self.comment_text = comment_text + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def comment_text(self): + """ + Comment text. Might be missing due to historical data gap. + + :rtype: str + """ + if self._comment_text_present: + return self._comment_text_value + else: + return None + + @comment_text.setter + def comment_text(self, val): + if val is None: + del self.comment_text + return + val = self._comment_text_validator.validate(val) + self._comment_text_value = val + self._comment_text_present = True + + @comment_text.deleter + def comment_text(self): + self._comment_text_value = None + self._comment_text_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocUnresolveCommentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocUnresolveCommentDetails(event_uuid={!r}, comment_text={!r})'.format( + self._event_uuid_value, + self._comment_text_value, + ) + +PaperDocUnresolveCommentDetails_validator = bv.Struct(PaperDocUnresolveCommentDetails) + +class PaperDocUnresolveCommentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocUnresolveCommentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocUnresolveCommentType(description={!r})'.format( + self._description_value, + ) + +PaperDocUnresolveCommentType_validator = bv.Struct(PaperDocUnresolveCommentType) + +class PaperDocUntrashedDetails(bb.Struct): + """ + Restored Paper doc. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocUntrashedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocUntrashedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperDocUntrashedDetails_validator = bv.Struct(PaperDocUntrashedDetails) + +class PaperDocUntrashedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocUntrashedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocUntrashedType(description={!r})'.format( + self._description_value, + ) + +PaperDocUntrashedType_validator = bv.Struct(PaperDocUntrashedType) + +class PaperDocViewDetails(bb.Struct): + """ + Viewed Paper doc. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocViewDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocViewDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperDocViewDetails_validator = bv.Struct(PaperDocViewDetails) + +class PaperDocViewType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocViewType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocViewType(description={!r})'.format( + self._description_value, + ) + +PaperDocViewType_validator = bv.Struct(PaperDocViewType) + +class PaperDocumentLogInfo(bb.Struct): + """ + Paper document's logged information. + + :ivar doc_id: Papers document Id. + :ivar doc_title: Paper document title. + """ + + __slots__ = [ + '_doc_id_value', + '_doc_id_present', + '_doc_title_value', + '_doc_title_present', + ] + + _has_required_fields = True + + def __init__(self, + doc_id=None, + doc_title=None): + self._doc_id_value = None + self._doc_id_present = False + self._doc_title_value = None + self._doc_title_present = False + if doc_id is not None: + self.doc_id = doc_id + if doc_title is not None: + self.doc_title = doc_title + + @property + def doc_id(self): + """ + Papers document Id. + + :rtype: str + """ + if self._doc_id_present: + return self._doc_id_value + else: + raise AttributeError("missing required field 'doc_id'") + + @doc_id.setter + def doc_id(self, val): + val = self._doc_id_validator.validate(val) + self._doc_id_value = val + self._doc_id_present = True + + @doc_id.deleter + def doc_id(self): + self._doc_id_value = None + self._doc_id_present = False + + @property + def doc_title(self): + """ + Paper document title. + + :rtype: str + """ + if self._doc_title_present: + return self._doc_title_value + else: + raise AttributeError("missing required field 'doc_title'") + + @doc_title.setter + def doc_title(self, val): + val = self._doc_title_validator.validate(val) + self._doc_title_value = val + self._doc_title_present = True + + @doc_title.deleter + def doc_title(self): + self._doc_title_value = None + self._doc_title_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDocumentLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDocumentLogInfo(doc_id={!r}, doc_title={!r})'.format( + self._doc_id_value, + self._doc_title_value, + ) + +PaperDocumentLogInfo_validator = bv.Struct(PaperDocumentLogInfo) + +class PaperDownloadFormat(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + docx = None + # Attribute is overwritten below the class definition + html = None + # Attribute is overwritten below the class definition + markdown = None + # Attribute is overwritten below the class definition + pdf = None + # Attribute is overwritten below the class definition + other = None + + def is_docx(self): + """ + Check if the union tag is ``docx``. + + :rtype: bool + """ + return self._tag == 'docx' + + def is_html(self): + """ + Check if the union tag is ``html``. + + :rtype: bool + """ + return self._tag == 'html' + + def is_markdown(self): + """ + Check if the union tag is ``markdown``. + + :rtype: bool + """ + return self._tag == 'markdown' + + def is_pdf(self): + """ + Check if the union tag is ``pdf``. + + :rtype: bool + """ + return self._tag == 'pdf' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDownloadFormat, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDownloadFormat(%r, %r)' % (self._tag, self._value) + +PaperDownloadFormat_validator = bv.Union(PaperDownloadFormat) + +class PaperEnabledUsersGroupAdditionDetails(bb.Struct): + """ + Added users to Paper-enabled users list. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperEnabledUsersGroupAdditionDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperEnabledUsersGroupAdditionDetails()' + +PaperEnabledUsersGroupAdditionDetails_validator = bv.Struct(PaperEnabledUsersGroupAdditionDetails) + +class PaperEnabledUsersGroupAdditionType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperEnabledUsersGroupAdditionType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperEnabledUsersGroupAdditionType(description={!r})'.format( + self._description_value, + ) + +PaperEnabledUsersGroupAdditionType_validator = bv.Struct(PaperEnabledUsersGroupAdditionType) + +class PaperEnabledUsersGroupRemovalDetails(bb.Struct): + """ + Removed users from Paper-enabled users list. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperEnabledUsersGroupRemovalDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperEnabledUsersGroupRemovalDetails()' + +PaperEnabledUsersGroupRemovalDetails_validator = bv.Struct(PaperEnabledUsersGroupRemovalDetails) + +class PaperEnabledUsersGroupRemovalType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperEnabledUsersGroupRemovalType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperEnabledUsersGroupRemovalType(description={!r})'.format( + self._description_value, + ) + +PaperEnabledUsersGroupRemovalType_validator = bv.Struct(PaperEnabledUsersGroupRemovalType) + +class PaperExternalViewAllowDetails(bb.Struct): + """ + Changed Paper external sharing setting to anyone. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperExternalViewAllowDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperExternalViewAllowDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperExternalViewAllowDetails_validator = bv.Struct(PaperExternalViewAllowDetails) + +class PaperExternalViewAllowType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperExternalViewAllowType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperExternalViewAllowType(description={!r})'.format( + self._description_value, + ) + +PaperExternalViewAllowType_validator = bv.Struct(PaperExternalViewAllowType) + +class PaperExternalViewDefaultTeamDetails(bb.Struct): + """ + Changed Paper external sharing setting to default team. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperExternalViewDefaultTeamDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperExternalViewDefaultTeamDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperExternalViewDefaultTeamDetails_validator = bv.Struct(PaperExternalViewDefaultTeamDetails) + +class PaperExternalViewDefaultTeamType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperExternalViewDefaultTeamType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperExternalViewDefaultTeamType(description={!r})'.format( + self._description_value, + ) + +PaperExternalViewDefaultTeamType_validator = bv.Struct(PaperExternalViewDefaultTeamType) + +class PaperExternalViewForbidDetails(bb.Struct): + """ + Changed Paper external sharing setting to team-only. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperExternalViewForbidDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperExternalViewForbidDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperExternalViewForbidDetails_validator = bv.Struct(PaperExternalViewForbidDetails) + +class PaperExternalViewForbidType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperExternalViewForbidType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperExternalViewForbidType(description={!r})'.format( + self._description_value, + ) + +PaperExternalViewForbidType_validator = bv.Struct(PaperExternalViewForbidType) + +class PaperFolderChangeSubscriptionDetails(bb.Struct): + """ + Followed/unfollowed Paper folder. + + :ivar event_uuid: Event unique identifier. + :ivar new_subscription_level: New folder subscription level. + :ivar previous_subscription_level: Previous folder subscription level. Might + be missing due to historical data gap. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_new_subscription_level_value', + '_new_subscription_level_present', + '_previous_subscription_level_value', + '_previous_subscription_level_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + new_subscription_level=None, + previous_subscription_level=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._new_subscription_level_value = None + self._new_subscription_level_present = False + self._previous_subscription_level_value = None + self._previous_subscription_level_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if new_subscription_level is not None: + self.new_subscription_level = new_subscription_level + if previous_subscription_level is not None: + self.previous_subscription_level = previous_subscription_level + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def new_subscription_level(self): + """ + New folder subscription level. + + :rtype: str + """ + if self._new_subscription_level_present: + return self._new_subscription_level_value + else: + raise AttributeError("missing required field 'new_subscription_level'") + + @new_subscription_level.setter + def new_subscription_level(self, val): + val = self._new_subscription_level_validator.validate(val) + self._new_subscription_level_value = val + self._new_subscription_level_present = True + + @new_subscription_level.deleter + def new_subscription_level(self): + self._new_subscription_level_value = None + self._new_subscription_level_present = False + + @property + def previous_subscription_level(self): + """ + Previous folder subscription level. Might be missing due to historical + data gap. + + :rtype: str + """ + if self._previous_subscription_level_present: + return self._previous_subscription_level_value + else: + return None + + @previous_subscription_level.setter + def previous_subscription_level(self, val): + if val is None: + del self.previous_subscription_level + return + val = self._previous_subscription_level_validator.validate(val) + self._previous_subscription_level_value = val + self._previous_subscription_level_present = True + + @previous_subscription_level.deleter + def previous_subscription_level(self): + self._previous_subscription_level_value = None + self._previous_subscription_level_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperFolderChangeSubscriptionDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperFolderChangeSubscriptionDetails(event_uuid={!r}, new_subscription_level={!r}, previous_subscription_level={!r})'.format( + self._event_uuid_value, + self._new_subscription_level_value, + self._previous_subscription_level_value, + ) + +PaperFolderChangeSubscriptionDetails_validator = bv.Struct(PaperFolderChangeSubscriptionDetails) + +class PaperFolderChangeSubscriptionType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperFolderChangeSubscriptionType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperFolderChangeSubscriptionType(description={!r})'.format( + self._description_value, + ) + +PaperFolderChangeSubscriptionType_validator = bv.Struct(PaperFolderChangeSubscriptionType) + +class PaperFolderDeletedDetails(bb.Struct): + """ + Archived Paper folder. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperFolderDeletedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperFolderDeletedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperFolderDeletedDetails_validator = bv.Struct(PaperFolderDeletedDetails) + +class PaperFolderDeletedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperFolderDeletedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperFolderDeletedType(description={!r})'.format( + self._description_value, + ) + +PaperFolderDeletedType_validator = bv.Struct(PaperFolderDeletedType) + +class PaperFolderFollowedDetails(bb.Struct): + """ + Followed Paper folder. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperFolderFollowedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperFolderFollowedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperFolderFollowedDetails_validator = bv.Struct(PaperFolderFollowedDetails) + +class PaperFolderFollowedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperFolderFollowedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperFolderFollowedType(description={!r})'.format( + self._description_value, + ) + +PaperFolderFollowedType_validator = bv.Struct(PaperFolderFollowedType) + +class PaperFolderLogInfo(bb.Struct): + """ + Paper folder's logged information. + + :ivar folder_id: Papers folder Id. + :ivar folder_name: Paper folder name. + """ + + __slots__ = [ + '_folder_id_value', + '_folder_id_present', + '_folder_name_value', + '_folder_name_present', + ] + + _has_required_fields = True + + def __init__(self, + folder_id=None, + folder_name=None): + self._folder_id_value = None + self._folder_id_present = False + self._folder_name_value = None + self._folder_name_present = False + if folder_id is not None: + self.folder_id = folder_id + if folder_name is not None: + self.folder_name = folder_name + + @property + def folder_id(self): + """ + Papers folder Id. + + :rtype: str + """ + if self._folder_id_present: + return self._folder_id_value + else: + raise AttributeError("missing required field 'folder_id'") + + @folder_id.setter + def folder_id(self, val): + val = self._folder_id_validator.validate(val) + self._folder_id_value = val + self._folder_id_present = True + + @folder_id.deleter + def folder_id(self): + self._folder_id_value = None + self._folder_id_present = False + + @property + def folder_name(self): + """ + Paper folder name. + + :rtype: str + """ + if self._folder_name_present: + return self._folder_name_value + else: + raise AttributeError("missing required field 'folder_name'") + + @folder_name.setter + def folder_name(self, val): + val = self._folder_name_validator.validate(val) + self._folder_name_value = val + self._folder_name_present = True + + @folder_name.deleter + def folder_name(self): + self._folder_name_value = None + self._folder_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperFolderLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperFolderLogInfo(folder_id={!r}, folder_name={!r})'.format( + self._folder_id_value, + self._folder_name_value, + ) + +PaperFolderLogInfo_validator = bv.Struct(PaperFolderLogInfo) + +class PaperFolderTeamInviteDetails(bb.Struct): + """ + Shared Paper folder with member. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperFolderTeamInviteDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperFolderTeamInviteDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +PaperFolderTeamInviteDetails_validator = bv.Struct(PaperFolderTeamInviteDetails) + +class PaperFolderTeamInviteType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperFolderTeamInviteType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperFolderTeamInviteType(description={!r})'.format( + self._description_value, + ) + +PaperFolderTeamInviteType_validator = bv.Struct(PaperFolderTeamInviteType) + +class PaperMemberPolicy(bb.Union): + """ + Policy for controlling if team members can share Paper documents externally. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + anyone_with_link = None + # Attribute is overwritten below the class definition + only_team = None + # Attribute is overwritten below the class definition + team_and_explicitly_shared = None + # Attribute is overwritten below the class definition + other = None + + def is_anyone_with_link(self): + """ + Check if the union tag is ``anyone_with_link``. + + :rtype: bool + """ + return self._tag == 'anyone_with_link' + + def is_only_team(self): + """ + Check if the union tag is ``only_team``. + + :rtype: bool + """ + return self._tag == 'only_team' + + def is_team_and_explicitly_shared(self): + """ + Check if the union tag is ``team_and_explicitly_shared``. + + :rtype: bool + """ + return self._tag == 'team_and_explicitly_shared' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperMemberPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperMemberPolicy(%r, %r)' % (self._tag, self._value) + +PaperMemberPolicy_validator = bv.Union(PaperMemberPolicy) + +class ParticipantLogInfo(bb.Union): + """ + A user or group + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar UserLogInfo user: A user with a Dropbox account. + :ivar GroupLogInfo group: Group details. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def user(cls, val): + """ + Create an instance of this class set to the ``user`` tag with value + ``val``. + + :param UserLogInfo val: + :rtype: ParticipantLogInfo + """ + return cls('user', val) + + @classmethod + def group(cls, val): + """ + Create an instance of this class set to the ``group`` tag with value + ``val``. + + :param GroupLogInfo val: + :rtype: ParticipantLogInfo + """ + return cls('group', val) + + def is_user(self): + """ + Check if the union tag is ``user``. + + :rtype: bool + """ + return self._tag == 'user' + + def is_group(self): + """ + Check if the union tag is ``group``. + + :rtype: bool + """ + return self._tag == 'group' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_user(self): + """ + A user with a Dropbox account. + + Only call this if :meth:`is_user` is true. + + :rtype: UserLogInfo + """ + if not self.is_user(): + raise AttributeError("tag 'user' not set") + return self._value + + def get_group(self): + """ + Group details. + + Only call this if :meth:`is_group` is true. + + :rtype: GroupLogInfo + """ + if not self.is_group(): + raise AttributeError("tag 'group' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(ParticipantLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ParticipantLogInfo(%r, %r)' % (self._tag, self._value) + +ParticipantLogInfo_validator = bv.Union(ParticipantLogInfo) + +class PassPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + allow = None + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + other = None + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_allow(self): + """ + Check if the union tag is ``allow``. + + :rtype: bool + """ + return self._tag == 'allow' + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(PassPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PassPolicy(%r, %r)' % (self._tag, self._value) + +PassPolicy_validator = bv.Union(PassPolicy) + +class PasswordChangeDetails(bb.Struct): + """ + Changed password. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(PasswordChangeDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PasswordChangeDetails()' + +PasswordChangeDetails_validator = bv.Struct(PasswordChangeDetails) + +class PasswordChangeType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PasswordChangeType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PasswordChangeType(description={!r})'.format( + self._description_value, + ) + +PasswordChangeType_validator = bv.Struct(PasswordChangeType) + +class PasswordResetAllDetails(bb.Struct): + """ + Reset all team member passwords. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(PasswordResetAllDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PasswordResetAllDetails()' + +PasswordResetAllDetails_validator = bv.Struct(PasswordResetAllDetails) + +class PasswordResetAllType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PasswordResetAllType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PasswordResetAllType(description={!r})'.format( + self._description_value, + ) + +PasswordResetAllType_validator = bv.Struct(PasswordResetAllType) + +class PasswordResetDetails(bb.Struct): + """ + Reset password. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(PasswordResetDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PasswordResetDetails()' + +PasswordResetDetails_validator = bv.Struct(PasswordResetDetails) + +class PasswordResetType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PasswordResetType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PasswordResetType(description={!r})'.format( + self._description_value, + ) + +PasswordResetType_validator = bv.Struct(PasswordResetType) + +class PathLogInfo(bb.Struct): + """ + Path's details. + + :ivar contextual: Fully qualified path relative to event's context. Might be + missing due to historical data gap. + :ivar namespace_relative: Path relative to the namespace containing the + content. + """ + + __slots__ = [ + '_contextual_value', + '_contextual_present', + '_namespace_relative_value', + '_namespace_relative_present', + ] + + _has_required_fields = True + + def __init__(self, + namespace_relative=None, + contextual=None): + self._contextual_value = None + self._contextual_present = False + self._namespace_relative_value = None + self._namespace_relative_present = False + if contextual is not None: + self.contextual = contextual + if namespace_relative is not None: + self.namespace_relative = namespace_relative + + @property + def contextual(self): + """ + Fully qualified path relative to event's context. Might be missing due + to historical data gap. + + :rtype: str + """ + if self._contextual_present: + return self._contextual_value + else: + return None + + @contextual.setter + def contextual(self, val): + if val is None: + del self.contextual + return + val = self._contextual_validator.validate(val) + self._contextual_value = val + self._contextual_present = True + + @contextual.deleter + def contextual(self): + self._contextual_value = None + self._contextual_present = False + + @property + def namespace_relative(self): + """ + Path relative to the namespace containing the content. + + :rtype: NamespaceRelativePathLogInfo + """ + if self._namespace_relative_present: + return self._namespace_relative_value + else: + raise AttributeError("missing required field 'namespace_relative'") + + @namespace_relative.setter + def namespace_relative(self, val): + self._namespace_relative_validator.validate_type_only(val) + self._namespace_relative_value = val + self._namespace_relative_present = True + + @namespace_relative.deleter + def namespace_relative(self): + self._namespace_relative_value = None + self._namespace_relative_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PathLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PathLogInfo(namespace_relative={!r}, contextual={!r})'.format( + self._namespace_relative_value, + self._contextual_value, + ) + +PathLogInfo_validator = bv.Struct(PathLogInfo) + +class PermanentDeleteChangePolicyDetails(bb.Struct): + """ + Enabled/disabled ability of team members to permanently delete content. + + :ivar new_value: New permanent delete content policy. + :ivar previous_value: Previous permanent delete content policy. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New permanent delete content policy. + + :rtype: ContentPermanentDeletePolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous permanent delete content policy. Might be missing due to + historical data gap. + + :rtype: ContentPermanentDeletePolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PermanentDeleteChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PermanentDeleteChangePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +PermanentDeleteChangePolicyDetails_validator = bv.Struct(PermanentDeleteChangePolicyDetails) + +class PermanentDeleteChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(PermanentDeleteChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PermanentDeleteChangePolicyType(description={!r})'.format( + self._description_value, + ) + +PermanentDeleteChangePolicyType_validator = bv.Struct(PermanentDeleteChangePolicyType) + +class PlacementRestriction(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + europe_only = None + # Attribute is overwritten below the class definition + none = None + # Attribute is overwritten below the class definition + other = None + + def is_europe_only(self): + """ + Check if the union tag is ``europe_only``. + + :rtype: bool + """ + return self._tag == 'europe_only' + + def is_none(self): + """ + Check if the union tag is ``none``. + + :rtype: bool + """ + return self._tag == 'none' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(PlacementRestriction, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PlacementRestriction(%r, %r)' % (self._tag, self._value) + +PlacementRestriction_validator = bv.Union(PlacementRestriction) + +class QuickActionType(bb.Union): + """ + Quick action type. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + delete_shared_link = None + # Attribute is overwritten below the class definition + other = None + + def is_delete_shared_link(self): + """ + Check if the union tag is ``delete_shared_link``. + + :rtype: bool + """ + return self._tag == 'delete_shared_link' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(QuickActionType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'QuickActionType(%r, %r)' % (self._tag, self._value) + +QuickActionType_validator = bv.Union(QuickActionType) + +class RelocateAssetReferencesLogInfo(bb.Struct): + """ + Provides the indices of the source asset and the destination asset for a + relocate action. + + :ivar src_asset_index: Source asset position in the Assets list. + :ivar dest_asset_index: Destination asset position in the Assets list. + """ + + __slots__ = [ + '_src_asset_index_value', + '_src_asset_index_present', + '_dest_asset_index_value', + '_dest_asset_index_present', + ] + + _has_required_fields = True + + def __init__(self, + src_asset_index=None, + dest_asset_index=None): + self._src_asset_index_value = None + self._src_asset_index_present = False + self._dest_asset_index_value = None + self._dest_asset_index_present = False + if src_asset_index is not None: + self.src_asset_index = src_asset_index + if dest_asset_index is not None: + self.dest_asset_index = dest_asset_index + + @property + def src_asset_index(self): + """ + Source asset position in the Assets list. + + :rtype: int + """ + if self._src_asset_index_present: + return self._src_asset_index_value + else: + raise AttributeError("missing required field 'src_asset_index'") + + @src_asset_index.setter + def src_asset_index(self, val): + val = self._src_asset_index_validator.validate(val) + self._src_asset_index_value = val + self._src_asset_index_present = True + + @src_asset_index.deleter + def src_asset_index(self): + self._src_asset_index_value = None + self._src_asset_index_present = False + + @property + def dest_asset_index(self): + """ + Destination asset position in the Assets list. + + :rtype: int + """ + if self._dest_asset_index_present: + return self._dest_asset_index_value + else: + raise AttributeError("missing required field 'dest_asset_index'") + + @dest_asset_index.setter + def dest_asset_index(self, val): + val = self._dest_asset_index_validator.validate(val) + self._dest_asset_index_value = val + self._dest_asset_index_present = True + + @dest_asset_index.deleter + def dest_asset_index(self): + self._dest_asset_index_value = None + self._dest_asset_index_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(RelocateAssetReferencesLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RelocateAssetReferencesLogInfo(src_asset_index={!r}, dest_asset_index={!r})'.format( + self._src_asset_index_value, + self._dest_asset_index_value, + ) + +RelocateAssetReferencesLogInfo_validator = bv.Struct(RelocateAssetReferencesLogInfo) + +class ResellerLogInfo(bb.Struct): + """ + Reseller information. + + :ivar reseller_name: Reseller name. + :ivar reseller_email: Reseller email. + """ + + __slots__ = [ + '_reseller_name_value', + '_reseller_name_present', + '_reseller_email_value', + '_reseller_email_present', + ] + + _has_required_fields = True + + def __init__(self, + reseller_name=None, + reseller_email=None): + self._reseller_name_value = None + self._reseller_name_present = False + self._reseller_email_value = None + self._reseller_email_present = False + if reseller_name is not None: + self.reseller_name = reseller_name + if reseller_email is not None: + self.reseller_email = reseller_email + + @property + def reseller_name(self): + """ + Reseller name. + + :rtype: str + """ + if self._reseller_name_present: + return self._reseller_name_value + else: + raise AttributeError("missing required field 'reseller_name'") + + @reseller_name.setter + def reseller_name(self, val): + val = self._reseller_name_validator.validate(val) + self._reseller_name_value = val + self._reseller_name_present = True + + @reseller_name.deleter + def reseller_name(self): + self._reseller_name_value = None + self._reseller_name_present = False + + @property + def reseller_email(self): + """ + Reseller email. + + :rtype: str + """ + if self._reseller_email_present: + return self._reseller_email_value + else: + raise AttributeError("missing required field 'reseller_email'") + + @reseller_email.setter + def reseller_email(self, val): + val = self._reseller_email_validator.validate(val) + self._reseller_email_value = val + self._reseller_email_present = True + + @reseller_email.deleter + def reseller_email(self): + self._reseller_email_value = None + self._reseller_email_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ResellerLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ResellerLogInfo(reseller_name={!r}, reseller_email={!r})'.format( + self._reseller_name_value, + self._reseller_email_value, + ) + +ResellerLogInfo_validator = bv.Struct(ResellerLogInfo) + +class ResellerSupportSessionEndDetails(bb.Struct): + """ + Ended reseller support session. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(ResellerSupportSessionEndDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ResellerSupportSessionEndDetails()' + +ResellerSupportSessionEndDetails_validator = bv.Struct(ResellerSupportSessionEndDetails) + +class ResellerSupportSessionEndType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ResellerSupportSessionEndType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ResellerSupportSessionEndType(description={!r})'.format( + self._description_value, + ) + +ResellerSupportSessionEndType_validator = bv.Struct(ResellerSupportSessionEndType) + +class ResellerSupportSessionStartDetails(bb.Struct): + """ + Started reseller support session. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(ResellerSupportSessionStartDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ResellerSupportSessionStartDetails()' + +ResellerSupportSessionStartDetails_validator = bv.Struct(ResellerSupportSessionStartDetails) + +class ResellerSupportSessionStartType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ResellerSupportSessionStartType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ResellerSupportSessionStartType(description={!r})'.format( + self._description_value, + ) + +ResellerSupportSessionStartType_validator = bv.Struct(ResellerSupportSessionStartType) + +class SecondaryMailsPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SecondaryMailsPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SecondaryMailsPolicy(%r, %r)' % (self._tag, self._value) + +SecondaryMailsPolicy_validator = bv.Union(SecondaryMailsPolicy) + +class SecondaryMailsPolicyChangedDetails(bb.Struct): + """ + Secondary mails policy changed. + + :ivar previous_value: Previous secondary mails policy. + :ivar new_value: New secondary mails policy. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + previous_value=None, + new_value=None): + self._previous_value_value = None + self._previous_value_present = False + self._new_value_value = None + self._new_value_present = False + if previous_value is not None: + self.previous_value = previous_value + if new_value is not None: + self.new_value = new_value + + @property + def previous_value(self): + """ + Previous secondary mails policy. + + :rtype: SecondaryMailsPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + @property + def new_value(self): + """ + New secondary mails policy. + + :rtype: SecondaryMailsPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SecondaryMailsPolicyChangedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SecondaryMailsPolicyChangedDetails(previous_value={!r}, new_value={!r})'.format( + self._previous_value_value, + self._new_value_value, + ) + +SecondaryMailsPolicyChangedDetails_validator = bv.Struct(SecondaryMailsPolicyChangedDetails) + +class SecondaryMailsPolicyChangedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SecondaryMailsPolicyChangedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SecondaryMailsPolicyChangedType(description={!r})'.format( + self._description_value, + ) + +SecondaryMailsPolicyChangedType_validator = bv.Struct(SecondaryMailsPolicyChangedType) + +class SfAddGroupDetails(bb.Struct): + """ + Added team to shared folder. + + :ivar target_asset_index: Target asset position in the Assets list. + :ivar original_folder_name: Original shared folder name. + :ivar sharing_permission: Sharing permission. Might be missing due to + historical data gap. + :ivar team_name: Team name. + """ + + __slots__ = [ + '_target_asset_index_value', + '_target_asset_index_present', + '_original_folder_name_value', + '_original_folder_name_present', + '_sharing_permission_value', + '_sharing_permission_present', + '_team_name_value', + '_team_name_present', + ] + + _has_required_fields = True + + def __init__(self, + target_asset_index=None, + original_folder_name=None, + team_name=None, + sharing_permission=None): + self._target_asset_index_value = None + self._target_asset_index_present = False + self._original_folder_name_value = None + self._original_folder_name_present = False + self._sharing_permission_value = None + self._sharing_permission_present = False + self._team_name_value = None + self._team_name_present = False + if target_asset_index is not None: + self.target_asset_index = target_asset_index + if original_folder_name is not None: + self.original_folder_name = original_folder_name + if sharing_permission is not None: + self.sharing_permission = sharing_permission + if team_name is not None: + self.team_name = team_name + + @property + def target_asset_index(self): + """ + Target asset position in the Assets list. + + :rtype: int + """ + if self._target_asset_index_present: + return self._target_asset_index_value + else: + raise AttributeError("missing required field 'target_asset_index'") + + @target_asset_index.setter + def target_asset_index(self, val): + val = self._target_asset_index_validator.validate(val) + self._target_asset_index_value = val + self._target_asset_index_present = True + + @target_asset_index.deleter + def target_asset_index(self): + self._target_asset_index_value = None + self._target_asset_index_present = False + + @property + def original_folder_name(self): + """ + Original shared folder name. + + :rtype: str + """ + if self._original_folder_name_present: + return self._original_folder_name_value + else: + raise AttributeError("missing required field 'original_folder_name'") + + @original_folder_name.setter + def original_folder_name(self, val): + val = self._original_folder_name_validator.validate(val) + self._original_folder_name_value = val + self._original_folder_name_present = True + + @original_folder_name.deleter + def original_folder_name(self): + self._original_folder_name_value = None + self._original_folder_name_present = False + + @property + def sharing_permission(self): + """ + Sharing permission. Might be missing due to historical data gap. + + :rtype: str + """ + if self._sharing_permission_present: + return self._sharing_permission_value + else: + return None + + @sharing_permission.setter + def sharing_permission(self, val): + if val is None: + del self.sharing_permission + return + val = self._sharing_permission_validator.validate(val) + self._sharing_permission_value = val + self._sharing_permission_present = True + + @sharing_permission.deleter + def sharing_permission(self): + self._sharing_permission_value = None + self._sharing_permission_present = False + + @property + def team_name(self): + """ + Team name. + + :rtype: str + """ + if self._team_name_present: + return self._team_name_value + else: + raise AttributeError("missing required field 'team_name'") + + @team_name.setter + def team_name(self, val): + val = self._team_name_validator.validate(val) + self._team_name_value = val + self._team_name_present = True + + @team_name.deleter + def team_name(self): + self._team_name_value = None + self._team_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfAddGroupDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfAddGroupDetails(target_asset_index={!r}, original_folder_name={!r}, team_name={!r}, sharing_permission={!r})'.format( + self._target_asset_index_value, + self._original_folder_name_value, + self._team_name_value, + self._sharing_permission_value, + ) + +SfAddGroupDetails_validator = bv.Struct(SfAddGroupDetails) + +class SfAddGroupType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfAddGroupType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfAddGroupType(description={!r})'.format( + self._description_value, + ) + +SfAddGroupType_validator = bv.Struct(SfAddGroupType) + +class SfAllowNonMembersToViewSharedLinksDetails(bb.Struct): + """ + Allowed non-collaborators to view links to files in shared folder. + + :ivar target_asset_index: Target asset position in the Assets list. + :ivar original_folder_name: Original shared folder name. + :ivar shared_folder_type: Shared folder type. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_target_asset_index_value', + '_target_asset_index_present', + '_original_folder_name_value', + '_original_folder_name_present', + '_shared_folder_type_value', + '_shared_folder_type_present', + ] + + _has_required_fields = True + + def __init__(self, + target_asset_index=None, + original_folder_name=None, + shared_folder_type=None): + self._target_asset_index_value = None + self._target_asset_index_present = False + self._original_folder_name_value = None + self._original_folder_name_present = False + self._shared_folder_type_value = None + self._shared_folder_type_present = False + if target_asset_index is not None: + self.target_asset_index = target_asset_index + if original_folder_name is not None: + self.original_folder_name = original_folder_name + if shared_folder_type is not None: + self.shared_folder_type = shared_folder_type + + @property + def target_asset_index(self): + """ + Target asset position in the Assets list. + + :rtype: int + """ + if self._target_asset_index_present: + return self._target_asset_index_value + else: + raise AttributeError("missing required field 'target_asset_index'") + + @target_asset_index.setter + def target_asset_index(self, val): + val = self._target_asset_index_validator.validate(val) + self._target_asset_index_value = val + self._target_asset_index_present = True + + @target_asset_index.deleter + def target_asset_index(self): + self._target_asset_index_value = None + self._target_asset_index_present = False + + @property + def original_folder_name(self): + """ + Original shared folder name. + + :rtype: str + """ + if self._original_folder_name_present: + return self._original_folder_name_value + else: + raise AttributeError("missing required field 'original_folder_name'") + + @original_folder_name.setter + def original_folder_name(self, val): + val = self._original_folder_name_validator.validate(val) + self._original_folder_name_value = val + self._original_folder_name_present = True + + @original_folder_name.deleter + def original_folder_name(self): + self._original_folder_name_value = None + self._original_folder_name_present = False + + @property + def shared_folder_type(self): + """ + Shared folder type. Might be missing due to historical data gap. + + :rtype: str + """ + if self._shared_folder_type_present: + return self._shared_folder_type_value + else: + return None + + @shared_folder_type.setter + def shared_folder_type(self, val): + if val is None: + del self.shared_folder_type + return + val = self._shared_folder_type_validator.validate(val) + self._shared_folder_type_value = val + self._shared_folder_type_present = True + + @shared_folder_type.deleter + def shared_folder_type(self): + self._shared_folder_type_value = None + self._shared_folder_type_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfAllowNonMembersToViewSharedLinksDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfAllowNonMembersToViewSharedLinksDetails(target_asset_index={!r}, original_folder_name={!r}, shared_folder_type={!r})'.format( + self._target_asset_index_value, + self._original_folder_name_value, + self._shared_folder_type_value, + ) + +SfAllowNonMembersToViewSharedLinksDetails_validator = bv.Struct(SfAllowNonMembersToViewSharedLinksDetails) + +class SfAllowNonMembersToViewSharedLinksType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfAllowNonMembersToViewSharedLinksType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfAllowNonMembersToViewSharedLinksType(description={!r})'.format( + self._description_value, + ) + +SfAllowNonMembersToViewSharedLinksType_validator = bv.Struct(SfAllowNonMembersToViewSharedLinksType) + +class SfExternalInviteWarnDetails(bb.Struct): + """ + Set team members to see warning before sharing folders outside team. + + :ivar target_asset_index: Target asset position in the Assets list. + :ivar original_folder_name: Original shared folder name. + :ivar new_sharing_permission: New sharing permission. Might be missing due + to historical data gap. + :ivar previous_sharing_permission: Previous sharing permission. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_target_asset_index_value', + '_target_asset_index_present', + '_original_folder_name_value', + '_original_folder_name_present', + '_new_sharing_permission_value', + '_new_sharing_permission_present', + '_previous_sharing_permission_value', + '_previous_sharing_permission_present', + ] + + _has_required_fields = True + + def __init__(self, + target_asset_index=None, + original_folder_name=None, + new_sharing_permission=None, + previous_sharing_permission=None): + self._target_asset_index_value = None + self._target_asset_index_present = False + self._original_folder_name_value = None + self._original_folder_name_present = False + self._new_sharing_permission_value = None + self._new_sharing_permission_present = False + self._previous_sharing_permission_value = None + self._previous_sharing_permission_present = False + if target_asset_index is not None: + self.target_asset_index = target_asset_index + if original_folder_name is not None: + self.original_folder_name = original_folder_name + if new_sharing_permission is not None: + self.new_sharing_permission = new_sharing_permission + if previous_sharing_permission is not None: + self.previous_sharing_permission = previous_sharing_permission + + @property + def target_asset_index(self): + """ + Target asset position in the Assets list. + + :rtype: int + """ + if self._target_asset_index_present: + return self._target_asset_index_value + else: + raise AttributeError("missing required field 'target_asset_index'") + + @target_asset_index.setter + def target_asset_index(self, val): + val = self._target_asset_index_validator.validate(val) + self._target_asset_index_value = val + self._target_asset_index_present = True + + @target_asset_index.deleter + def target_asset_index(self): + self._target_asset_index_value = None + self._target_asset_index_present = False + + @property + def original_folder_name(self): + """ + Original shared folder name. + + :rtype: str + """ + if self._original_folder_name_present: + return self._original_folder_name_value + else: + raise AttributeError("missing required field 'original_folder_name'") + + @original_folder_name.setter + def original_folder_name(self, val): + val = self._original_folder_name_validator.validate(val) + self._original_folder_name_value = val + self._original_folder_name_present = True + + @original_folder_name.deleter + def original_folder_name(self): + self._original_folder_name_value = None + self._original_folder_name_present = False + + @property + def new_sharing_permission(self): + """ + New sharing permission. Might be missing due to historical data gap. + + :rtype: str + """ + if self._new_sharing_permission_present: + return self._new_sharing_permission_value + else: + return None + + @new_sharing_permission.setter + def new_sharing_permission(self, val): + if val is None: + del self.new_sharing_permission + return + val = self._new_sharing_permission_validator.validate(val) + self._new_sharing_permission_value = val + self._new_sharing_permission_present = True + + @new_sharing_permission.deleter + def new_sharing_permission(self): + self._new_sharing_permission_value = None + self._new_sharing_permission_present = False + + @property + def previous_sharing_permission(self): + """ + Previous sharing permission. Might be missing due to historical data + gap. + + :rtype: str + """ + if self._previous_sharing_permission_present: + return self._previous_sharing_permission_value + else: + return None + + @previous_sharing_permission.setter + def previous_sharing_permission(self, val): + if val is None: + del self.previous_sharing_permission + return + val = self._previous_sharing_permission_validator.validate(val) + self._previous_sharing_permission_value = val + self._previous_sharing_permission_present = True + + @previous_sharing_permission.deleter + def previous_sharing_permission(self): + self._previous_sharing_permission_value = None + self._previous_sharing_permission_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfExternalInviteWarnDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfExternalInviteWarnDetails(target_asset_index={!r}, original_folder_name={!r}, new_sharing_permission={!r}, previous_sharing_permission={!r})'.format( + self._target_asset_index_value, + self._original_folder_name_value, + self._new_sharing_permission_value, + self._previous_sharing_permission_value, + ) + +SfExternalInviteWarnDetails_validator = bv.Struct(SfExternalInviteWarnDetails) + +class SfExternalInviteWarnType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfExternalInviteWarnType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfExternalInviteWarnType(description={!r})'.format( + self._description_value, + ) + +SfExternalInviteWarnType_validator = bv.Struct(SfExternalInviteWarnType) + +class SfFbInviteChangeRoleDetails(bb.Struct): + """ + Changed Facebook user's role in shared folder. + + :ivar target_asset_index: Target asset position in the Assets list. + :ivar original_folder_name: Original shared folder name. + :ivar previous_sharing_permission: Previous sharing permission. Might be + missing due to historical data gap. + :ivar new_sharing_permission: New sharing permission. Might be missing due + to historical data gap. + """ + + __slots__ = [ + '_target_asset_index_value', + '_target_asset_index_present', + '_original_folder_name_value', + '_original_folder_name_present', + '_previous_sharing_permission_value', + '_previous_sharing_permission_present', + '_new_sharing_permission_value', + '_new_sharing_permission_present', + ] + + _has_required_fields = True + + def __init__(self, + target_asset_index=None, + original_folder_name=None, + previous_sharing_permission=None, + new_sharing_permission=None): + self._target_asset_index_value = None + self._target_asset_index_present = False + self._original_folder_name_value = None + self._original_folder_name_present = False + self._previous_sharing_permission_value = None + self._previous_sharing_permission_present = False + self._new_sharing_permission_value = None + self._new_sharing_permission_present = False + if target_asset_index is not None: + self.target_asset_index = target_asset_index + if original_folder_name is not None: + self.original_folder_name = original_folder_name + if previous_sharing_permission is not None: + self.previous_sharing_permission = previous_sharing_permission + if new_sharing_permission is not None: + self.new_sharing_permission = new_sharing_permission + + @property + def target_asset_index(self): + """ + Target asset position in the Assets list. + + :rtype: int + """ + if self._target_asset_index_present: + return self._target_asset_index_value + else: + raise AttributeError("missing required field 'target_asset_index'") + + @target_asset_index.setter + def target_asset_index(self, val): + val = self._target_asset_index_validator.validate(val) + self._target_asset_index_value = val + self._target_asset_index_present = True + + @target_asset_index.deleter + def target_asset_index(self): + self._target_asset_index_value = None + self._target_asset_index_present = False + + @property + def original_folder_name(self): + """ + Original shared folder name. + + :rtype: str + """ + if self._original_folder_name_present: + return self._original_folder_name_value + else: + raise AttributeError("missing required field 'original_folder_name'") + + @original_folder_name.setter + def original_folder_name(self, val): + val = self._original_folder_name_validator.validate(val) + self._original_folder_name_value = val + self._original_folder_name_present = True + + @original_folder_name.deleter + def original_folder_name(self): + self._original_folder_name_value = None + self._original_folder_name_present = False + + @property + def previous_sharing_permission(self): + """ + Previous sharing permission. Might be missing due to historical data + gap. + + :rtype: str + """ + if self._previous_sharing_permission_present: + return self._previous_sharing_permission_value + else: + return None + + @previous_sharing_permission.setter + def previous_sharing_permission(self, val): + if val is None: + del self.previous_sharing_permission + return + val = self._previous_sharing_permission_validator.validate(val) + self._previous_sharing_permission_value = val + self._previous_sharing_permission_present = True + + @previous_sharing_permission.deleter + def previous_sharing_permission(self): + self._previous_sharing_permission_value = None + self._previous_sharing_permission_present = False + + @property + def new_sharing_permission(self): + """ + New sharing permission. Might be missing due to historical data gap. + + :rtype: str + """ + if self._new_sharing_permission_present: + return self._new_sharing_permission_value + else: + return None + + @new_sharing_permission.setter + def new_sharing_permission(self, val): + if val is None: + del self.new_sharing_permission + return + val = self._new_sharing_permission_validator.validate(val) + self._new_sharing_permission_value = val + self._new_sharing_permission_present = True + + @new_sharing_permission.deleter + def new_sharing_permission(self): + self._new_sharing_permission_value = None + self._new_sharing_permission_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfFbInviteChangeRoleDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfFbInviteChangeRoleDetails(target_asset_index={!r}, original_folder_name={!r}, previous_sharing_permission={!r}, new_sharing_permission={!r})'.format( + self._target_asset_index_value, + self._original_folder_name_value, + self._previous_sharing_permission_value, + self._new_sharing_permission_value, + ) + +SfFbInviteChangeRoleDetails_validator = bv.Struct(SfFbInviteChangeRoleDetails) + +class SfFbInviteChangeRoleType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfFbInviteChangeRoleType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfFbInviteChangeRoleType(description={!r})'.format( + self._description_value, + ) + +SfFbInviteChangeRoleType_validator = bv.Struct(SfFbInviteChangeRoleType) + +class SfFbInviteDetails(bb.Struct): + """ + Invited Facebook users to shared folder. + + :ivar target_asset_index: Target asset position in the Assets list. + :ivar original_folder_name: Original shared folder name. + :ivar sharing_permission: Sharing permission. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_target_asset_index_value', + '_target_asset_index_present', + '_original_folder_name_value', + '_original_folder_name_present', + '_sharing_permission_value', + '_sharing_permission_present', + ] + + _has_required_fields = True + + def __init__(self, + target_asset_index=None, + original_folder_name=None, + sharing_permission=None): + self._target_asset_index_value = None + self._target_asset_index_present = False + self._original_folder_name_value = None + self._original_folder_name_present = False + self._sharing_permission_value = None + self._sharing_permission_present = False + if target_asset_index is not None: + self.target_asset_index = target_asset_index + if original_folder_name is not None: + self.original_folder_name = original_folder_name + if sharing_permission is not None: + self.sharing_permission = sharing_permission + + @property + def target_asset_index(self): + """ + Target asset position in the Assets list. + + :rtype: int + """ + if self._target_asset_index_present: + return self._target_asset_index_value + else: + raise AttributeError("missing required field 'target_asset_index'") + + @target_asset_index.setter + def target_asset_index(self, val): + val = self._target_asset_index_validator.validate(val) + self._target_asset_index_value = val + self._target_asset_index_present = True + + @target_asset_index.deleter + def target_asset_index(self): + self._target_asset_index_value = None + self._target_asset_index_present = False + + @property + def original_folder_name(self): + """ + Original shared folder name. + + :rtype: str + """ + if self._original_folder_name_present: + return self._original_folder_name_value + else: + raise AttributeError("missing required field 'original_folder_name'") + + @original_folder_name.setter + def original_folder_name(self, val): + val = self._original_folder_name_validator.validate(val) + self._original_folder_name_value = val + self._original_folder_name_present = True + + @original_folder_name.deleter + def original_folder_name(self): + self._original_folder_name_value = None + self._original_folder_name_present = False + + @property + def sharing_permission(self): + """ + Sharing permission. Might be missing due to historical data gap. + + :rtype: str + """ + if self._sharing_permission_present: + return self._sharing_permission_value + else: + return None + + @sharing_permission.setter + def sharing_permission(self, val): + if val is None: + del self.sharing_permission + return + val = self._sharing_permission_validator.validate(val) + self._sharing_permission_value = val + self._sharing_permission_present = True + + @sharing_permission.deleter + def sharing_permission(self): + self._sharing_permission_value = None + self._sharing_permission_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfFbInviteDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfFbInviteDetails(target_asset_index={!r}, original_folder_name={!r}, sharing_permission={!r})'.format( + self._target_asset_index_value, + self._original_folder_name_value, + self._sharing_permission_value, + ) + +SfFbInviteDetails_validator = bv.Struct(SfFbInviteDetails) + +class SfFbInviteType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfFbInviteType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfFbInviteType(description={!r})'.format( + self._description_value, + ) + +SfFbInviteType_validator = bv.Struct(SfFbInviteType) + +class SfFbUninviteDetails(bb.Struct): + """ + Uninvited Facebook user from shared folder. + + :ivar target_asset_index: Target asset position in the Assets list. + :ivar original_folder_name: Original shared folder name. + """ + + __slots__ = [ + '_target_asset_index_value', + '_target_asset_index_present', + '_original_folder_name_value', + '_original_folder_name_present', + ] + + _has_required_fields = True + + def __init__(self, + target_asset_index=None, + original_folder_name=None): + self._target_asset_index_value = None + self._target_asset_index_present = False + self._original_folder_name_value = None + self._original_folder_name_present = False + if target_asset_index is not None: + self.target_asset_index = target_asset_index + if original_folder_name is not None: + self.original_folder_name = original_folder_name + + @property + def target_asset_index(self): + """ + Target asset position in the Assets list. + + :rtype: int + """ + if self._target_asset_index_present: + return self._target_asset_index_value + else: + raise AttributeError("missing required field 'target_asset_index'") + + @target_asset_index.setter + def target_asset_index(self, val): + val = self._target_asset_index_validator.validate(val) + self._target_asset_index_value = val + self._target_asset_index_present = True + + @target_asset_index.deleter + def target_asset_index(self): + self._target_asset_index_value = None + self._target_asset_index_present = False + + @property + def original_folder_name(self): + """ + Original shared folder name. + + :rtype: str + """ + if self._original_folder_name_present: + return self._original_folder_name_value + else: + raise AttributeError("missing required field 'original_folder_name'") + + @original_folder_name.setter + def original_folder_name(self, val): + val = self._original_folder_name_validator.validate(val) + self._original_folder_name_value = val + self._original_folder_name_present = True + + @original_folder_name.deleter + def original_folder_name(self): + self._original_folder_name_value = None + self._original_folder_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfFbUninviteDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfFbUninviteDetails(target_asset_index={!r}, original_folder_name={!r})'.format( + self._target_asset_index_value, + self._original_folder_name_value, + ) + +SfFbUninviteDetails_validator = bv.Struct(SfFbUninviteDetails) + +class SfFbUninviteType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfFbUninviteType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfFbUninviteType(description={!r})'.format( + self._description_value, + ) + +SfFbUninviteType_validator = bv.Struct(SfFbUninviteType) + +class SfInviteGroupDetails(bb.Struct): + """ + Invited group to shared folder. + + :ivar target_asset_index: Target asset position in the Assets list. + """ + + __slots__ = [ + '_target_asset_index_value', + '_target_asset_index_present', + ] + + _has_required_fields = True + + def __init__(self, + target_asset_index=None): + self._target_asset_index_value = None + self._target_asset_index_present = False + if target_asset_index is not None: + self.target_asset_index = target_asset_index + + @property + def target_asset_index(self): + """ + Target asset position in the Assets list. + + :rtype: int + """ + if self._target_asset_index_present: + return self._target_asset_index_value + else: + raise AttributeError("missing required field 'target_asset_index'") + + @target_asset_index.setter + def target_asset_index(self, val): + val = self._target_asset_index_validator.validate(val) + self._target_asset_index_value = val + self._target_asset_index_present = True + + @target_asset_index.deleter + def target_asset_index(self): + self._target_asset_index_value = None + self._target_asset_index_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfInviteGroupDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfInviteGroupDetails(target_asset_index={!r})'.format( + self._target_asset_index_value, + ) + +SfInviteGroupDetails_validator = bv.Struct(SfInviteGroupDetails) + +class SfInviteGroupType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfInviteGroupType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfInviteGroupType(description={!r})'.format( + self._description_value, + ) + +SfInviteGroupType_validator = bv.Struct(SfInviteGroupType) + +class SfTeamGrantAccessDetails(bb.Struct): + """ + Granted access to shared folder. + + :ivar target_asset_index: Target asset position in the Assets list. + :ivar original_folder_name: Original shared folder name. + """ + + __slots__ = [ + '_target_asset_index_value', + '_target_asset_index_present', + '_original_folder_name_value', + '_original_folder_name_present', + ] + + _has_required_fields = True + + def __init__(self, + target_asset_index=None, + original_folder_name=None): + self._target_asset_index_value = None + self._target_asset_index_present = False + self._original_folder_name_value = None + self._original_folder_name_present = False + if target_asset_index is not None: + self.target_asset_index = target_asset_index + if original_folder_name is not None: + self.original_folder_name = original_folder_name + + @property + def target_asset_index(self): + """ + Target asset position in the Assets list. + + :rtype: int + """ + if self._target_asset_index_present: + return self._target_asset_index_value + else: + raise AttributeError("missing required field 'target_asset_index'") + + @target_asset_index.setter + def target_asset_index(self, val): + val = self._target_asset_index_validator.validate(val) + self._target_asset_index_value = val + self._target_asset_index_present = True + + @target_asset_index.deleter + def target_asset_index(self): + self._target_asset_index_value = None + self._target_asset_index_present = False + + @property + def original_folder_name(self): + """ + Original shared folder name. + + :rtype: str + """ + if self._original_folder_name_present: + return self._original_folder_name_value + else: + raise AttributeError("missing required field 'original_folder_name'") + + @original_folder_name.setter + def original_folder_name(self, val): + val = self._original_folder_name_validator.validate(val) + self._original_folder_name_value = val + self._original_folder_name_present = True + + @original_folder_name.deleter + def original_folder_name(self): + self._original_folder_name_value = None + self._original_folder_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfTeamGrantAccessDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfTeamGrantAccessDetails(target_asset_index={!r}, original_folder_name={!r})'.format( + self._target_asset_index_value, + self._original_folder_name_value, + ) + +SfTeamGrantAccessDetails_validator = bv.Struct(SfTeamGrantAccessDetails) + +class SfTeamGrantAccessType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfTeamGrantAccessType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfTeamGrantAccessType(description={!r})'.format( + self._description_value, + ) + +SfTeamGrantAccessType_validator = bv.Struct(SfTeamGrantAccessType) + +class SfTeamInviteChangeRoleDetails(bb.Struct): + """ + Changed team member's role in shared folder. + + :ivar target_asset_index: Target asset position in the Assets list. + :ivar original_folder_name: Original shared folder name. + :ivar new_sharing_permission: New sharing permission. Might be missing due + to historical data gap. + :ivar previous_sharing_permission: Previous sharing permission. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_target_asset_index_value', + '_target_asset_index_present', + '_original_folder_name_value', + '_original_folder_name_present', + '_new_sharing_permission_value', + '_new_sharing_permission_present', + '_previous_sharing_permission_value', + '_previous_sharing_permission_present', + ] + + _has_required_fields = True + + def __init__(self, + target_asset_index=None, + original_folder_name=None, + new_sharing_permission=None, + previous_sharing_permission=None): + self._target_asset_index_value = None + self._target_asset_index_present = False + self._original_folder_name_value = None + self._original_folder_name_present = False + self._new_sharing_permission_value = None + self._new_sharing_permission_present = False + self._previous_sharing_permission_value = None + self._previous_sharing_permission_present = False + if target_asset_index is not None: + self.target_asset_index = target_asset_index + if original_folder_name is not None: + self.original_folder_name = original_folder_name + if new_sharing_permission is not None: + self.new_sharing_permission = new_sharing_permission + if previous_sharing_permission is not None: + self.previous_sharing_permission = previous_sharing_permission + + @property + def target_asset_index(self): + """ + Target asset position in the Assets list. + + :rtype: int + """ + if self._target_asset_index_present: + return self._target_asset_index_value + else: + raise AttributeError("missing required field 'target_asset_index'") + + @target_asset_index.setter + def target_asset_index(self, val): + val = self._target_asset_index_validator.validate(val) + self._target_asset_index_value = val + self._target_asset_index_present = True + + @target_asset_index.deleter + def target_asset_index(self): + self._target_asset_index_value = None + self._target_asset_index_present = False + + @property + def original_folder_name(self): + """ + Original shared folder name. + + :rtype: str + """ + if self._original_folder_name_present: + return self._original_folder_name_value + else: + raise AttributeError("missing required field 'original_folder_name'") + + @original_folder_name.setter + def original_folder_name(self, val): + val = self._original_folder_name_validator.validate(val) + self._original_folder_name_value = val + self._original_folder_name_present = True + + @original_folder_name.deleter + def original_folder_name(self): + self._original_folder_name_value = None + self._original_folder_name_present = False + + @property + def new_sharing_permission(self): + """ + New sharing permission. Might be missing due to historical data gap. + + :rtype: str + """ + if self._new_sharing_permission_present: + return self._new_sharing_permission_value + else: + return None + + @new_sharing_permission.setter + def new_sharing_permission(self, val): + if val is None: + del self.new_sharing_permission + return + val = self._new_sharing_permission_validator.validate(val) + self._new_sharing_permission_value = val + self._new_sharing_permission_present = True + + @new_sharing_permission.deleter + def new_sharing_permission(self): + self._new_sharing_permission_value = None + self._new_sharing_permission_present = False + + @property + def previous_sharing_permission(self): + """ + Previous sharing permission. Might be missing due to historical data + gap. + + :rtype: str + """ + if self._previous_sharing_permission_present: + return self._previous_sharing_permission_value + else: + return None + + @previous_sharing_permission.setter + def previous_sharing_permission(self, val): + if val is None: + del self.previous_sharing_permission + return + val = self._previous_sharing_permission_validator.validate(val) + self._previous_sharing_permission_value = val + self._previous_sharing_permission_present = True + + @previous_sharing_permission.deleter + def previous_sharing_permission(self): + self._previous_sharing_permission_value = None + self._previous_sharing_permission_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfTeamInviteChangeRoleDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfTeamInviteChangeRoleDetails(target_asset_index={!r}, original_folder_name={!r}, new_sharing_permission={!r}, previous_sharing_permission={!r})'.format( + self._target_asset_index_value, + self._original_folder_name_value, + self._new_sharing_permission_value, + self._previous_sharing_permission_value, + ) + +SfTeamInviteChangeRoleDetails_validator = bv.Struct(SfTeamInviteChangeRoleDetails) + +class SfTeamInviteChangeRoleType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfTeamInviteChangeRoleType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfTeamInviteChangeRoleType(description={!r})'.format( + self._description_value, + ) + +SfTeamInviteChangeRoleType_validator = bv.Struct(SfTeamInviteChangeRoleType) + +class SfTeamInviteDetails(bb.Struct): + """ + Invited team members to shared folder. + + :ivar target_asset_index: Target asset position in the Assets list. + :ivar original_folder_name: Original shared folder name. + :ivar sharing_permission: Sharing permission. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_target_asset_index_value', + '_target_asset_index_present', + '_original_folder_name_value', + '_original_folder_name_present', + '_sharing_permission_value', + '_sharing_permission_present', + ] + + _has_required_fields = True + + def __init__(self, + target_asset_index=None, + original_folder_name=None, + sharing_permission=None): + self._target_asset_index_value = None + self._target_asset_index_present = False + self._original_folder_name_value = None + self._original_folder_name_present = False + self._sharing_permission_value = None + self._sharing_permission_present = False + if target_asset_index is not None: + self.target_asset_index = target_asset_index + if original_folder_name is not None: + self.original_folder_name = original_folder_name + if sharing_permission is not None: + self.sharing_permission = sharing_permission + + @property + def target_asset_index(self): + """ + Target asset position in the Assets list. + + :rtype: int + """ + if self._target_asset_index_present: + return self._target_asset_index_value + else: + raise AttributeError("missing required field 'target_asset_index'") + + @target_asset_index.setter + def target_asset_index(self, val): + val = self._target_asset_index_validator.validate(val) + self._target_asset_index_value = val + self._target_asset_index_present = True + + @target_asset_index.deleter + def target_asset_index(self): + self._target_asset_index_value = None + self._target_asset_index_present = False + + @property + def original_folder_name(self): + """ + Original shared folder name. + + :rtype: str + """ + if self._original_folder_name_present: + return self._original_folder_name_value + else: + raise AttributeError("missing required field 'original_folder_name'") + + @original_folder_name.setter + def original_folder_name(self, val): + val = self._original_folder_name_validator.validate(val) + self._original_folder_name_value = val + self._original_folder_name_present = True + + @original_folder_name.deleter + def original_folder_name(self): + self._original_folder_name_value = None + self._original_folder_name_present = False + + @property + def sharing_permission(self): + """ + Sharing permission. Might be missing due to historical data gap. + + :rtype: str + """ + if self._sharing_permission_present: + return self._sharing_permission_value + else: + return None + + @sharing_permission.setter + def sharing_permission(self, val): + if val is None: + del self.sharing_permission + return + val = self._sharing_permission_validator.validate(val) + self._sharing_permission_value = val + self._sharing_permission_present = True + + @sharing_permission.deleter + def sharing_permission(self): + self._sharing_permission_value = None + self._sharing_permission_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfTeamInviteDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfTeamInviteDetails(target_asset_index={!r}, original_folder_name={!r}, sharing_permission={!r})'.format( + self._target_asset_index_value, + self._original_folder_name_value, + self._sharing_permission_value, + ) + +SfTeamInviteDetails_validator = bv.Struct(SfTeamInviteDetails) + +class SfTeamInviteType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfTeamInviteType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfTeamInviteType(description={!r})'.format( + self._description_value, + ) + +SfTeamInviteType_validator = bv.Struct(SfTeamInviteType) + +class SfTeamJoinDetails(bb.Struct): + """ + Joined team member's shared folder. + + :ivar target_asset_index: Target asset position in the Assets list. + :ivar original_folder_name: Original shared folder name. + """ + + __slots__ = [ + '_target_asset_index_value', + '_target_asset_index_present', + '_original_folder_name_value', + '_original_folder_name_present', + ] + + _has_required_fields = True + + def __init__(self, + target_asset_index=None, + original_folder_name=None): + self._target_asset_index_value = None + self._target_asset_index_present = False + self._original_folder_name_value = None + self._original_folder_name_present = False + if target_asset_index is not None: + self.target_asset_index = target_asset_index + if original_folder_name is not None: + self.original_folder_name = original_folder_name + + @property + def target_asset_index(self): + """ + Target asset position in the Assets list. + + :rtype: int + """ + if self._target_asset_index_present: + return self._target_asset_index_value + else: + raise AttributeError("missing required field 'target_asset_index'") + + @target_asset_index.setter + def target_asset_index(self, val): + val = self._target_asset_index_validator.validate(val) + self._target_asset_index_value = val + self._target_asset_index_present = True + + @target_asset_index.deleter + def target_asset_index(self): + self._target_asset_index_value = None + self._target_asset_index_present = False + + @property + def original_folder_name(self): + """ + Original shared folder name. + + :rtype: str + """ + if self._original_folder_name_present: + return self._original_folder_name_value + else: + raise AttributeError("missing required field 'original_folder_name'") + + @original_folder_name.setter + def original_folder_name(self, val): + val = self._original_folder_name_validator.validate(val) + self._original_folder_name_value = val + self._original_folder_name_present = True + + @original_folder_name.deleter + def original_folder_name(self): + self._original_folder_name_value = None + self._original_folder_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfTeamJoinDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfTeamJoinDetails(target_asset_index={!r}, original_folder_name={!r})'.format( + self._target_asset_index_value, + self._original_folder_name_value, + ) + +SfTeamJoinDetails_validator = bv.Struct(SfTeamJoinDetails) + +class SfTeamJoinFromOobLinkDetails(bb.Struct): + """ + Joined team member's shared folder from link. + + :ivar target_asset_index: Target asset position in the Assets list. + :ivar original_folder_name: Original shared folder name. + :ivar token_key: Shared link token key. + :ivar sharing_permission: Sharing permission. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_target_asset_index_value', + '_target_asset_index_present', + '_original_folder_name_value', + '_original_folder_name_present', + '_token_key_value', + '_token_key_present', + '_sharing_permission_value', + '_sharing_permission_present', + ] + + _has_required_fields = True + + def __init__(self, + target_asset_index=None, + original_folder_name=None, + token_key=None, + sharing_permission=None): + self._target_asset_index_value = None + self._target_asset_index_present = False + self._original_folder_name_value = None + self._original_folder_name_present = False + self._token_key_value = None + self._token_key_present = False + self._sharing_permission_value = None + self._sharing_permission_present = False + if target_asset_index is not None: + self.target_asset_index = target_asset_index + if original_folder_name is not None: + self.original_folder_name = original_folder_name + if token_key is not None: + self.token_key = token_key + if sharing_permission is not None: + self.sharing_permission = sharing_permission + + @property + def target_asset_index(self): + """ + Target asset position in the Assets list. + + :rtype: int + """ + if self._target_asset_index_present: + return self._target_asset_index_value + else: + raise AttributeError("missing required field 'target_asset_index'") + + @target_asset_index.setter + def target_asset_index(self, val): + val = self._target_asset_index_validator.validate(val) + self._target_asset_index_value = val + self._target_asset_index_present = True + + @target_asset_index.deleter + def target_asset_index(self): + self._target_asset_index_value = None + self._target_asset_index_present = False + + @property + def original_folder_name(self): + """ + Original shared folder name. + + :rtype: str + """ + if self._original_folder_name_present: + return self._original_folder_name_value + else: + raise AttributeError("missing required field 'original_folder_name'") + + @original_folder_name.setter + def original_folder_name(self, val): + val = self._original_folder_name_validator.validate(val) + self._original_folder_name_value = val + self._original_folder_name_present = True + + @original_folder_name.deleter + def original_folder_name(self): + self._original_folder_name_value = None + self._original_folder_name_present = False + + @property + def token_key(self): + """ + Shared link token key. + + :rtype: str + """ + if self._token_key_present: + return self._token_key_value + else: + return None + + @token_key.setter + def token_key(self, val): + if val is None: + del self.token_key + return + val = self._token_key_validator.validate(val) + self._token_key_value = val + self._token_key_present = True + + @token_key.deleter + def token_key(self): + self._token_key_value = None + self._token_key_present = False + + @property + def sharing_permission(self): + """ + Sharing permission. Might be missing due to historical data gap. + + :rtype: str + """ + if self._sharing_permission_present: + return self._sharing_permission_value + else: + return None + + @sharing_permission.setter + def sharing_permission(self, val): + if val is None: + del self.sharing_permission + return + val = self._sharing_permission_validator.validate(val) + self._sharing_permission_value = val + self._sharing_permission_present = True + + @sharing_permission.deleter + def sharing_permission(self): + self._sharing_permission_value = None + self._sharing_permission_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfTeamJoinFromOobLinkDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfTeamJoinFromOobLinkDetails(target_asset_index={!r}, original_folder_name={!r}, token_key={!r}, sharing_permission={!r})'.format( + self._target_asset_index_value, + self._original_folder_name_value, + self._token_key_value, + self._sharing_permission_value, + ) + +SfTeamJoinFromOobLinkDetails_validator = bv.Struct(SfTeamJoinFromOobLinkDetails) + +class SfTeamJoinFromOobLinkType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfTeamJoinFromOobLinkType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfTeamJoinFromOobLinkType(description={!r})'.format( + self._description_value, + ) + +SfTeamJoinFromOobLinkType_validator = bv.Struct(SfTeamJoinFromOobLinkType) + +class SfTeamJoinType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfTeamJoinType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfTeamJoinType(description={!r})'.format( + self._description_value, + ) + +SfTeamJoinType_validator = bv.Struct(SfTeamJoinType) + +class SfTeamUninviteDetails(bb.Struct): + """ + Unshared folder with team member. + + :ivar target_asset_index: Target asset position in the Assets list. + :ivar original_folder_name: Original shared folder name. + """ + + __slots__ = [ + '_target_asset_index_value', + '_target_asset_index_present', + '_original_folder_name_value', + '_original_folder_name_present', + ] + + _has_required_fields = True + + def __init__(self, + target_asset_index=None, + original_folder_name=None): + self._target_asset_index_value = None + self._target_asset_index_present = False + self._original_folder_name_value = None + self._original_folder_name_present = False + if target_asset_index is not None: + self.target_asset_index = target_asset_index + if original_folder_name is not None: + self.original_folder_name = original_folder_name + + @property + def target_asset_index(self): + """ + Target asset position in the Assets list. + + :rtype: int + """ + if self._target_asset_index_present: + return self._target_asset_index_value + else: + raise AttributeError("missing required field 'target_asset_index'") + + @target_asset_index.setter + def target_asset_index(self, val): + val = self._target_asset_index_validator.validate(val) + self._target_asset_index_value = val + self._target_asset_index_present = True + + @target_asset_index.deleter + def target_asset_index(self): + self._target_asset_index_value = None + self._target_asset_index_present = False + + @property + def original_folder_name(self): + """ + Original shared folder name. + + :rtype: str + """ + if self._original_folder_name_present: + return self._original_folder_name_value + else: + raise AttributeError("missing required field 'original_folder_name'") + + @original_folder_name.setter + def original_folder_name(self, val): + val = self._original_folder_name_validator.validate(val) + self._original_folder_name_value = val + self._original_folder_name_present = True + + @original_folder_name.deleter + def original_folder_name(self): + self._original_folder_name_value = None + self._original_folder_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfTeamUninviteDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfTeamUninviteDetails(target_asset_index={!r}, original_folder_name={!r})'.format( + self._target_asset_index_value, + self._original_folder_name_value, + ) + +SfTeamUninviteDetails_validator = bv.Struct(SfTeamUninviteDetails) + +class SfTeamUninviteType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SfTeamUninviteType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SfTeamUninviteType(description={!r})'.format( + self._description_value, + ) + +SfTeamUninviteType_validator = bv.Struct(SfTeamUninviteType) + +class SharedContentAddInviteesDetails(bb.Struct): + """ + Invited user to Dropbox and added them to shared file/folder. + + :ivar shared_content_access_level: Shared content access level. + :ivar invitees: A list of invitees. + """ + + __slots__ = [ + '_shared_content_access_level_value', + '_shared_content_access_level_present', + '_invitees_value', + '_invitees_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_content_access_level=None, + invitees=None): + self._shared_content_access_level_value = None + self._shared_content_access_level_present = False + self._invitees_value = None + self._invitees_present = False + if shared_content_access_level is not None: + self.shared_content_access_level = shared_content_access_level + if invitees is not None: + self.invitees = invitees + + @property + def shared_content_access_level(self): + """ + Shared content access level. + + :rtype: sharing.AccessLevel + """ + if self._shared_content_access_level_present: + return self._shared_content_access_level_value + else: + raise AttributeError("missing required field 'shared_content_access_level'") + + @shared_content_access_level.setter + def shared_content_access_level(self, val): + self._shared_content_access_level_validator.validate_type_only(val) + self._shared_content_access_level_value = val + self._shared_content_access_level_present = True + + @shared_content_access_level.deleter + def shared_content_access_level(self): + self._shared_content_access_level_value = None + self._shared_content_access_level_present = False + + @property + def invitees(self): + """ + A list of invitees. + + :rtype: list of [str] + """ + if self._invitees_present: + return self._invitees_value + else: + raise AttributeError("missing required field 'invitees'") + + @invitees.setter + def invitees(self, val): + val = self._invitees_validator.validate(val) + self._invitees_value = val + self._invitees_present = True + + @invitees.deleter + def invitees(self): + self._invitees_value = None + self._invitees_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentAddInviteesDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentAddInviteesDetails(shared_content_access_level={!r}, invitees={!r})'.format( + self._shared_content_access_level_value, + self._invitees_value, + ) + +SharedContentAddInviteesDetails_validator = bv.Struct(SharedContentAddInviteesDetails) + +class SharedContentAddInviteesType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentAddInviteesType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentAddInviteesType(description={!r})'.format( + self._description_value, + ) + +SharedContentAddInviteesType_validator = bv.Struct(SharedContentAddInviteesType) + +class SharedContentAddLinkExpiryDetails(bb.Struct): + """ + Added expiration date to link for shared file/folder. + + :ivar new_value: New shared content link expiration date. Might be missing + due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = False + + def __init__(self, + new_value=None): + self._new_value_value = None + self._new_value_present = False + if new_value is not None: + self.new_value = new_value + + @property + def new_value(self): + """ + New shared content link expiration date. Might be missing due to + historical data gap. + + :rtype: datetime.datetime + """ + if self._new_value_present: + return self._new_value_value + else: + return None + + @new_value.setter + def new_value(self, val): + if val is None: + del self.new_value + return + val = self._new_value_validator.validate(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentAddLinkExpiryDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentAddLinkExpiryDetails(new_value={!r})'.format( + self._new_value_value, + ) + +SharedContentAddLinkExpiryDetails_validator = bv.Struct(SharedContentAddLinkExpiryDetails) + +class SharedContentAddLinkExpiryType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentAddLinkExpiryType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentAddLinkExpiryType(description={!r})'.format( + self._description_value, + ) + +SharedContentAddLinkExpiryType_validator = bv.Struct(SharedContentAddLinkExpiryType) + +class SharedContentAddLinkPasswordDetails(bb.Struct): + """ + Added password to link for shared file/folder. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentAddLinkPasswordDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentAddLinkPasswordDetails()' + +SharedContentAddLinkPasswordDetails_validator = bv.Struct(SharedContentAddLinkPasswordDetails) + +class SharedContentAddLinkPasswordType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentAddLinkPasswordType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentAddLinkPasswordType(description={!r})'.format( + self._description_value, + ) + +SharedContentAddLinkPasswordType_validator = bv.Struct(SharedContentAddLinkPasswordType) + +class SharedContentAddMemberDetails(bb.Struct): + """ + Added users and/or groups to shared file/folder. + + :ivar shared_content_access_level: Shared content access level. + """ + + __slots__ = [ + '_shared_content_access_level_value', + '_shared_content_access_level_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_content_access_level=None): + self._shared_content_access_level_value = None + self._shared_content_access_level_present = False + if shared_content_access_level is not None: + self.shared_content_access_level = shared_content_access_level + + @property + def shared_content_access_level(self): + """ + Shared content access level. + + :rtype: sharing.AccessLevel + """ + if self._shared_content_access_level_present: + return self._shared_content_access_level_value + else: + raise AttributeError("missing required field 'shared_content_access_level'") + + @shared_content_access_level.setter + def shared_content_access_level(self, val): + self._shared_content_access_level_validator.validate_type_only(val) + self._shared_content_access_level_value = val + self._shared_content_access_level_present = True + + @shared_content_access_level.deleter + def shared_content_access_level(self): + self._shared_content_access_level_value = None + self._shared_content_access_level_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentAddMemberDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentAddMemberDetails(shared_content_access_level={!r})'.format( + self._shared_content_access_level_value, + ) + +SharedContentAddMemberDetails_validator = bv.Struct(SharedContentAddMemberDetails) + +class SharedContentAddMemberType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentAddMemberType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentAddMemberType(description={!r})'.format( + self._description_value, + ) + +SharedContentAddMemberType_validator = bv.Struct(SharedContentAddMemberType) + +class SharedContentChangeDownloadsPolicyDetails(bb.Struct): + """ + Changed whether members can download shared file/folder. + + :ivar new_value: New downloads policy. + :ivar previous_value: Previous downloads policy. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New downloads policy. + + :rtype: DownloadPolicyType + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous downloads policy. Might be missing due to historical data gap. + + :rtype: DownloadPolicyType + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentChangeDownloadsPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentChangeDownloadsPolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +SharedContentChangeDownloadsPolicyDetails_validator = bv.Struct(SharedContentChangeDownloadsPolicyDetails) + +class SharedContentChangeDownloadsPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentChangeDownloadsPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentChangeDownloadsPolicyType(description={!r})'.format( + self._description_value, + ) + +SharedContentChangeDownloadsPolicyType_validator = bv.Struct(SharedContentChangeDownloadsPolicyType) + +class SharedContentChangeInviteeRoleDetails(bb.Struct): + """ + Changed access type of invitee to shared file/folder before invite was + accepted. + + :ivar previous_access_level: Previous access level. Might be missing due to + historical data gap. + :ivar new_access_level: New access level. + :ivar invitee: The invitee whose role was changed. + """ + + __slots__ = [ + '_previous_access_level_value', + '_previous_access_level_present', + '_new_access_level_value', + '_new_access_level_present', + '_invitee_value', + '_invitee_present', + ] + + _has_required_fields = True + + def __init__(self, + new_access_level=None, + invitee=None, + previous_access_level=None): + self._previous_access_level_value = None + self._previous_access_level_present = False + self._new_access_level_value = None + self._new_access_level_present = False + self._invitee_value = None + self._invitee_present = False + if previous_access_level is not None: + self.previous_access_level = previous_access_level + if new_access_level is not None: + self.new_access_level = new_access_level + if invitee is not None: + self.invitee = invitee + + @property + def previous_access_level(self): + """ + Previous access level. Might be missing due to historical data gap. + + :rtype: sharing.AccessLevel + """ + if self._previous_access_level_present: + return self._previous_access_level_value + else: + return None + + @previous_access_level.setter + def previous_access_level(self, val): + if val is None: + del self.previous_access_level + return + self._previous_access_level_validator.validate_type_only(val) + self._previous_access_level_value = val + self._previous_access_level_present = True + + @previous_access_level.deleter + def previous_access_level(self): + self._previous_access_level_value = None + self._previous_access_level_present = False + + @property + def new_access_level(self): + """ + New access level. + + :rtype: sharing.AccessLevel + """ + if self._new_access_level_present: + return self._new_access_level_value + else: + raise AttributeError("missing required field 'new_access_level'") + + @new_access_level.setter + def new_access_level(self, val): + self._new_access_level_validator.validate_type_only(val) + self._new_access_level_value = val + self._new_access_level_present = True + + @new_access_level.deleter + def new_access_level(self): + self._new_access_level_value = None + self._new_access_level_present = False + + @property + def invitee(self): + """ + The invitee whose role was changed. + + :rtype: str + """ + if self._invitee_present: + return self._invitee_value + else: + raise AttributeError("missing required field 'invitee'") + + @invitee.setter + def invitee(self, val): + val = self._invitee_validator.validate(val) + self._invitee_value = val + self._invitee_present = True + + @invitee.deleter + def invitee(self): + self._invitee_value = None + self._invitee_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentChangeInviteeRoleDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentChangeInviteeRoleDetails(new_access_level={!r}, invitee={!r}, previous_access_level={!r})'.format( + self._new_access_level_value, + self._invitee_value, + self._previous_access_level_value, + ) + +SharedContentChangeInviteeRoleDetails_validator = bv.Struct(SharedContentChangeInviteeRoleDetails) + +class SharedContentChangeInviteeRoleType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentChangeInviteeRoleType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentChangeInviteeRoleType(description={!r})'.format( + self._description_value, + ) + +SharedContentChangeInviteeRoleType_validator = bv.Struct(SharedContentChangeInviteeRoleType) + +class SharedContentChangeLinkAudienceDetails(bb.Struct): + """ + Changed link audience of shared file/folder. + + :ivar new_value: New link audience value. + :ivar previous_value: Previous link audience value. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New link audience value. + + :rtype: sharing.LinkAudience + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous link audience value. + + :rtype: sharing.LinkAudience + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentChangeLinkAudienceDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentChangeLinkAudienceDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +SharedContentChangeLinkAudienceDetails_validator = bv.Struct(SharedContentChangeLinkAudienceDetails) + +class SharedContentChangeLinkAudienceType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentChangeLinkAudienceType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentChangeLinkAudienceType(description={!r})'.format( + self._description_value, + ) + +SharedContentChangeLinkAudienceType_validator = bv.Struct(SharedContentChangeLinkAudienceType) + +class SharedContentChangeLinkExpiryDetails(bb.Struct): + """ + Changed link expiration of shared file/folder. + + :ivar new_value: New shared content link expiration date. Might be missing + due to historical data gap. + :ivar previous_value: Previous shared content link expiration date. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = False + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New shared content link expiration date. Might be missing due to + historical data gap. + + :rtype: datetime.datetime + """ + if self._new_value_present: + return self._new_value_value + else: + return None + + @new_value.setter + def new_value(self, val): + if val is None: + del self.new_value + return + val = self._new_value_validator.validate(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous shared content link expiration date. Might be missing due to + historical data gap. + + :rtype: datetime.datetime + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + val = self._previous_value_validator.validate(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentChangeLinkExpiryDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentChangeLinkExpiryDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +SharedContentChangeLinkExpiryDetails_validator = bv.Struct(SharedContentChangeLinkExpiryDetails) + +class SharedContentChangeLinkExpiryType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentChangeLinkExpiryType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentChangeLinkExpiryType(description={!r})'.format( + self._description_value, + ) + +SharedContentChangeLinkExpiryType_validator = bv.Struct(SharedContentChangeLinkExpiryType) + +class SharedContentChangeLinkPasswordDetails(bb.Struct): + """ + Changed link password of shared file/folder. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentChangeLinkPasswordDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentChangeLinkPasswordDetails()' + +SharedContentChangeLinkPasswordDetails_validator = bv.Struct(SharedContentChangeLinkPasswordDetails) + +class SharedContentChangeLinkPasswordType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentChangeLinkPasswordType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentChangeLinkPasswordType(description={!r})'.format( + self._description_value, + ) + +SharedContentChangeLinkPasswordType_validator = bv.Struct(SharedContentChangeLinkPasswordType) + +class SharedContentChangeMemberRoleDetails(bb.Struct): + """ + Changed access type of shared file/folder member. + + :ivar previous_access_level: Previous access level. Might be missing due to + historical data gap. + :ivar new_access_level: New access level. + """ + + __slots__ = [ + '_previous_access_level_value', + '_previous_access_level_present', + '_new_access_level_value', + '_new_access_level_present', + ] + + _has_required_fields = True + + def __init__(self, + new_access_level=None, + previous_access_level=None): + self._previous_access_level_value = None + self._previous_access_level_present = False + self._new_access_level_value = None + self._new_access_level_present = False + if previous_access_level is not None: + self.previous_access_level = previous_access_level + if new_access_level is not None: + self.new_access_level = new_access_level + + @property + def previous_access_level(self): + """ + Previous access level. Might be missing due to historical data gap. + + :rtype: sharing.AccessLevel + """ + if self._previous_access_level_present: + return self._previous_access_level_value + else: + return None + + @previous_access_level.setter + def previous_access_level(self, val): + if val is None: + del self.previous_access_level + return + self._previous_access_level_validator.validate_type_only(val) + self._previous_access_level_value = val + self._previous_access_level_present = True + + @previous_access_level.deleter + def previous_access_level(self): + self._previous_access_level_value = None + self._previous_access_level_present = False + + @property + def new_access_level(self): + """ + New access level. + + :rtype: sharing.AccessLevel + """ + if self._new_access_level_present: + return self._new_access_level_value + else: + raise AttributeError("missing required field 'new_access_level'") + + @new_access_level.setter + def new_access_level(self, val): + self._new_access_level_validator.validate_type_only(val) + self._new_access_level_value = val + self._new_access_level_present = True + + @new_access_level.deleter + def new_access_level(self): + self._new_access_level_value = None + self._new_access_level_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentChangeMemberRoleDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentChangeMemberRoleDetails(new_access_level={!r}, previous_access_level={!r})'.format( + self._new_access_level_value, + self._previous_access_level_value, + ) + +SharedContentChangeMemberRoleDetails_validator = bv.Struct(SharedContentChangeMemberRoleDetails) + +class SharedContentChangeMemberRoleType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentChangeMemberRoleType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentChangeMemberRoleType(description={!r})'.format( + self._description_value, + ) + +SharedContentChangeMemberRoleType_validator = bv.Struct(SharedContentChangeMemberRoleType) + +class SharedContentChangeViewerInfoPolicyDetails(bb.Struct): + """ + Changed whether members can see who viewed shared file/folder. + + :ivar new_value: New viewer info policy. + :ivar previous_value: Previous view info policy. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New viewer info policy. + + :rtype: sharing.ViewerInfoPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous view info policy. Might be missing due to historical data gap. + + :rtype: sharing.ViewerInfoPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentChangeViewerInfoPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentChangeViewerInfoPolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +SharedContentChangeViewerInfoPolicyDetails_validator = bv.Struct(SharedContentChangeViewerInfoPolicyDetails) + +class SharedContentChangeViewerInfoPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentChangeViewerInfoPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentChangeViewerInfoPolicyType(description={!r})'.format( + self._description_value, + ) + +SharedContentChangeViewerInfoPolicyType_validator = bv.Struct(SharedContentChangeViewerInfoPolicyType) + +class SharedContentClaimInvitationDetails(bb.Struct): + """ + Acquired membership of shared file/folder by accepting invite. + + :ivar shared_content_link: Shared content link. + """ + + __slots__ = [ + '_shared_content_link_value', + '_shared_content_link_present', + ] + + _has_required_fields = False + + def __init__(self, + shared_content_link=None): + self._shared_content_link_value = None + self._shared_content_link_present = False + if shared_content_link is not None: + self.shared_content_link = shared_content_link + + @property + def shared_content_link(self): + """ + Shared content link. + + :rtype: str + """ + if self._shared_content_link_present: + return self._shared_content_link_value + else: + return None + + @shared_content_link.setter + def shared_content_link(self, val): + if val is None: + del self.shared_content_link + return + val = self._shared_content_link_validator.validate(val) + self._shared_content_link_value = val + self._shared_content_link_present = True + + @shared_content_link.deleter + def shared_content_link(self): + self._shared_content_link_value = None + self._shared_content_link_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentClaimInvitationDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentClaimInvitationDetails(shared_content_link={!r})'.format( + self._shared_content_link_value, + ) + +SharedContentClaimInvitationDetails_validator = bv.Struct(SharedContentClaimInvitationDetails) + +class SharedContentClaimInvitationType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentClaimInvitationType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentClaimInvitationType(description={!r})'.format( + self._description_value, + ) + +SharedContentClaimInvitationType_validator = bv.Struct(SharedContentClaimInvitationType) + +class SharedContentCopyDetails(bb.Struct): + """ + Copied shared file/folder to own Dropbox. + + :ivar shared_content_link: Shared content link. + :ivar shared_content_owner: The shared content owner. + :ivar shared_content_access_level: Shared content access level. + :ivar destination_path: The path where the member saved the content. + """ + + __slots__ = [ + '_shared_content_link_value', + '_shared_content_link_present', + '_shared_content_owner_value', + '_shared_content_owner_present', + '_shared_content_access_level_value', + '_shared_content_access_level_present', + '_destination_path_value', + '_destination_path_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_content_link=None, + shared_content_access_level=None, + destination_path=None, + shared_content_owner=None): + self._shared_content_link_value = None + self._shared_content_link_present = False + self._shared_content_owner_value = None + self._shared_content_owner_present = False + self._shared_content_access_level_value = None + self._shared_content_access_level_present = False + self._destination_path_value = None + self._destination_path_present = False + if shared_content_link is not None: + self.shared_content_link = shared_content_link + if shared_content_owner is not None: + self.shared_content_owner = shared_content_owner + if shared_content_access_level is not None: + self.shared_content_access_level = shared_content_access_level + if destination_path is not None: + self.destination_path = destination_path + + @property + def shared_content_link(self): + """ + Shared content link. + + :rtype: str + """ + if self._shared_content_link_present: + return self._shared_content_link_value + else: + raise AttributeError("missing required field 'shared_content_link'") + + @shared_content_link.setter + def shared_content_link(self, val): + val = self._shared_content_link_validator.validate(val) + self._shared_content_link_value = val + self._shared_content_link_present = True + + @shared_content_link.deleter + def shared_content_link(self): + self._shared_content_link_value = None + self._shared_content_link_present = False + + @property + def shared_content_owner(self): + """ + The shared content owner. + + :rtype: UserLogInfo + """ + if self._shared_content_owner_present: + return self._shared_content_owner_value + else: + return None + + @shared_content_owner.setter + def shared_content_owner(self, val): + if val is None: + del self.shared_content_owner + return + self._shared_content_owner_validator.validate_type_only(val) + self._shared_content_owner_value = val + self._shared_content_owner_present = True + + @shared_content_owner.deleter + def shared_content_owner(self): + self._shared_content_owner_value = None + self._shared_content_owner_present = False + + @property + def shared_content_access_level(self): + """ + Shared content access level. + + :rtype: sharing.AccessLevel + """ + if self._shared_content_access_level_present: + return self._shared_content_access_level_value + else: + raise AttributeError("missing required field 'shared_content_access_level'") + + @shared_content_access_level.setter + def shared_content_access_level(self, val): + self._shared_content_access_level_validator.validate_type_only(val) + self._shared_content_access_level_value = val + self._shared_content_access_level_present = True + + @shared_content_access_level.deleter + def shared_content_access_level(self): + self._shared_content_access_level_value = None + self._shared_content_access_level_present = False + + @property + def destination_path(self): + """ + The path where the member saved the content. + + :rtype: str + """ + if self._destination_path_present: + return self._destination_path_value + else: + raise AttributeError("missing required field 'destination_path'") + + @destination_path.setter + def destination_path(self, val): + val = self._destination_path_validator.validate(val) + self._destination_path_value = val + self._destination_path_present = True + + @destination_path.deleter + def destination_path(self): + self._destination_path_value = None + self._destination_path_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentCopyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentCopyDetails(shared_content_link={!r}, shared_content_access_level={!r}, destination_path={!r}, shared_content_owner={!r})'.format( + self._shared_content_link_value, + self._shared_content_access_level_value, + self._destination_path_value, + self._shared_content_owner_value, + ) + +SharedContentCopyDetails_validator = bv.Struct(SharedContentCopyDetails) + +class SharedContentCopyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentCopyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentCopyType(description={!r})'.format( + self._description_value, + ) + +SharedContentCopyType_validator = bv.Struct(SharedContentCopyType) + +class SharedContentDownloadDetails(bb.Struct): + """ + Downloaded shared file/folder. + + :ivar shared_content_link: Shared content link. + :ivar shared_content_owner: The shared content owner. + :ivar shared_content_access_level: Shared content access level. + """ + + __slots__ = [ + '_shared_content_link_value', + '_shared_content_link_present', + '_shared_content_owner_value', + '_shared_content_owner_present', + '_shared_content_access_level_value', + '_shared_content_access_level_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_content_link=None, + shared_content_access_level=None, + shared_content_owner=None): + self._shared_content_link_value = None + self._shared_content_link_present = False + self._shared_content_owner_value = None + self._shared_content_owner_present = False + self._shared_content_access_level_value = None + self._shared_content_access_level_present = False + if shared_content_link is not None: + self.shared_content_link = shared_content_link + if shared_content_owner is not None: + self.shared_content_owner = shared_content_owner + if shared_content_access_level is not None: + self.shared_content_access_level = shared_content_access_level + + @property + def shared_content_link(self): + """ + Shared content link. + + :rtype: str + """ + if self._shared_content_link_present: + return self._shared_content_link_value + else: + raise AttributeError("missing required field 'shared_content_link'") + + @shared_content_link.setter + def shared_content_link(self, val): + val = self._shared_content_link_validator.validate(val) + self._shared_content_link_value = val + self._shared_content_link_present = True + + @shared_content_link.deleter + def shared_content_link(self): + self._shared_content_link_value = None + self._shared_content_link_present = False + + @property + def shared_content_owner(self): + """ + The shared content owner. + + :rtype: UserLogInfo + """ + if self._shared_content_owner_present: + return self._shared_content_owner_value + else: + return None + + @shared_content_owner.setter + def shared_content_owner(self, val): + if val is None: + del self.shared_content_owner + return + self._shared_content_owner_validator.validate_type_only(val) + self._shared_content_owner_value = val + self._shared_content_owner_present = True + + @shared_content_owner.deleter + def shared_content_owner(self): + self._shared_content_owner_value = None + self._shared_content_owner_present = False + + @property + def shared_content_access_level(self): + """ + Shared content access level. + + :rtype: sharing.AccessLevel + """ + if self._shared_content_access_level_present: + return self._shared_content_access_level_value + else: + raise AttributeError("missing required field 'shared_content_access_level'") + + @shared_content_access_level.setter + def shared_content_access_level(self, val): + self._shared_content_access_level_validator.validate_type_only(val) + self._shared_content_access_level_value = val + self._shared_content_access_level_present = True + + @shared_content_access_level.deleter + def shared_content_access_level(self): + self._shared_content_access_level_value = None + self._shared_content_access_level_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentDownloadDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentDownloadDetails(shared_content_link={!r}, shared_content_access_level={!r}, shared_content_owner={!r})'.format( + self._shared_content_link_value, + self._shared_content_access_level_value, + self._shared_content_owner_value, + ) + +SharedContentDownloadDetails_validator = bv.Struct(SharedContentDownloadDetails) + +class SharedContentDownloadType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentDownloadType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentDownloadType(description={!r})'.format( + self._description_value, + ) + +SharedContentDownloadType_validator = bv.Struct(SharedContentDownloadType) + +class SharedContentRelinquishMembershipDetails(bb.Struct): + """ + Left shared file/folder. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentRelinquishMembershipDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentRelinquishMembershipDetails()' + +SharedContentRelinquishMembershipDetails_validator = bv.Struct(SharedContentRelinquishMembershipDetails) + +class SharedContentRelinquishMembershipType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentRelinquishMembershipType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentRelinquishMembershipType(description={!r})'.format( + self._description_value, + ) + +SharedContentRelinquishMembershipType_validator = bv.Struct(SharedContentRelinquishMembershipType) + +class SharedContentRemoveInviteesDetails(bb.Struct): + """ + Removed invitee from shared file/folder before invite was accepted. + + :ivar invitees: A list of invitees. + """ + + __slots__ = [ + '_invitees_value', + '_invitees_present', + ] + + _has_required_fields = True + + def __init__(self, + invitees=None): + self._invitees_value = None + self._invitees_present = False + if invitees is not None: + self.invitees = invitees + + @property + def invitees(self): + """ + A list of invitees. + + :rtype: list of [str] + """ + if self._invitees_present: + return self._invitees_value + else: + raise AttributeError("missing required field 'invitees'") + + @invitees.setter + def invitees(self, val): + val = self._invitees_validator.validate(val) + self._invitees_value = val + self._invitees_present = True + + @invitees.deleter + def invitees(self): + self._invitees_value = None + self._invitees_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentRemoveInviteesDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentRemoveInviteesDetails(invitees={!r})'.format( + self._invitees_value, + ) + +SharedContentRemoveInviteesDetails_validator = bv.Struct(SharedContentRemoveInviteesDetails) + +class SharedContentRemoveInviteesType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentRemoveInviteesType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentRemoveInviteesType(description={!r})'.format( + self._description_value, + ) + +SharedContentRemoveInviteesType_validator = bv.Struct(SharedContentRemoveInviteesType) + +class SharedContentRemoveLinkExpiryDetails(bb.Struct): + """ + Removed link expiration date of shared file/folder. + + :ivar previous_value: Previous shared content link expiration date. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = False + + def __init__(self, + previous_value=None): + self._previous_value_value = None + self._previous_value_present = False + if previous_value is not None: + self.previous_value = previous_value + + @property + def previous_value(self): + """ + Previous shared content link expiration date. Might be missing due to + historical data gap. + + :rtype: datetime.datetime + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + val = self._previous_value_validator.validate(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentRemoveLinkExpiryDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentRemoveLinkExpiryDetails(previous_value={!r})'.format( + self._previous_value_value, + ) + +SharedContentRemoveLinkExpiryDetails_validator = bv.Struct(SharedContentRemoveLinkExpiryDetails) + +class SharedContentRemoveLinkExpiryType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentRemoveLinkExpiryType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentRemoveLinkExpiryType(description={!r})'.format( + self._description_value, + ) + +SharedContentRemoveLinkExpiryType_validator = bv.Struct(SharedContentRemoveLinkExpiryType) + +class SharedContentRemoveLinkPasswordDetails(bb.Struct): + """ + Removed link password of shared file/folder. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentRemoveLinkPasswordDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentRemoveLinkPasswordDetails()' + +SharedContentRemoveLinkPasswordDetails_validator = bv.Struct(SharedContentRemoveLinkPasswordDetails) + +class SharedContentRemoveLinkPasswordType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentRemoveLinkPasswordType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentRemoveLinkPasswordType(description={!r})'.format( + self._description_value, + ) + +SharedContentRemoveLinkPasswordType_validator = bv.Struct(SharedContentRemoveLinkPasswordType) + +class SharedContentRemoveMemberDetails(bb.Struct): + """ + Removed user/group from shared file/folder. + + :ivar shared_content_access_level: Shared content access level. + """ + + __slots__ = [ + '_shared_content_access_level_value', + '_shared_content_access_level_present', + ] + + _has_required_fields = False + + def __init__(self, + shared_content_access_level=None): + self._shared_content_access_level_value = None + self._shared_content_access_level_present = False + if shared_content_access_level is not None: + self.shared_content_access_level = shared_content_access_level + + @property + def shared_content_access_level(self): + """ + Shared content access level. + + :rtype: sharing.AccessLevel + """ + if self._shared_content_access_level_present: + return self._shared_content_access_level_value + else: + return None + + @shared_content_access_level.setter + def shared_content_access_level(self, val): + if val is None: + del self.shared_content_access_level + return + self._shared_content_access_level_validator.validate_type_only(val) + self._shared_content_access_level_value = val + self._shared_content_access_level_present = True + + @shared_content_access_level.deleter + def shared_content_access_level(self): + self._shared_content_access_level_value = None + self._shared_content_access_level_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentRemoveMemberDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentRemoveMemberDetails(shared_content_access_level={!r})'.format( + self._shared_content_access_level_value, + ) + +SharedContentRemoveMemberDetails_validator = bv.Struct(SharedContentRemoveMemberDetails) + +class SharedContentRemoveMemberType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentRemoveMemberType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentRemoveMemberType(description={!r})'.format( + self._description_value, + ) + +SharedContentRemoveMemberType_validator = bv.Struct(SharedContentRemoveMemberType) + +class SharedContentRequestAccessDetails(bb.Struct): + """ + Requested access to shared file/folder. + + :ivar shared_content_link: Shared content link. + """ + + __slots__ = [ + '_shared_content_link_value', + '_shared_content_link_present', + ] + + _has_required_fields = False + + def __init__(self, + shared_content_link=None): + self._shared_content_link_value = None + self._shared_content_link_present = False + if shared_content_link is not None: + self.shared_content_link = shared_content_link + + @property + def shared_content_link(self): + """ + Shared content link. + + :rtype: str + """ + if self._shared_content_link_present: + return self._shared_content_link_value + else: + return None + + @shared_content_link.setter + def shared_content_link(self, val): + if val is None: + del self.shared_content_link + return + val = self._shared_content_link_validator.validate(val) + self._shared_content_link_value = val + self._shared_content_link_present = True + + @shared_content_link.deleter + def shared_content_link(self): + self._shared_content_link_value = None + self._shared_content_link_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentRequestAccessDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentRequestAccessDetails(shared_content_link={!r})'.format( + self._shared_content_link_value, + ) + +SharedContentRequestAccessDetails_validator = bv.Struct(SharedContentRequestAccessDetails) + +class SharedContentRequestAccessType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentRequestAccessType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentRequestAccessType(description={!r})'.format( + self._description_value, + ) + +SharedContentRequestAccessType_validator = bv.Struct(SharedContentRequestAccessType) + +class SharedContentUnshareDetails(bb.Struct): + """ + Unshared file/folder by clearing membership and turning off link. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentUnshareDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentUnshareDetails()' + +SharedContentUnshareDetails_validator = bv.Struct(SharedContentUnshareDetails) + +class SharedContentUnshareType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentUnshareType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentUnshareType(description={!r})'.format( + self._description_value, + ) + +SharedContentUnshareType_validator = bv.Struct(SharedContentUnshareType) + +class SharedContentViewDetails(bb.Struct): + """ + Previewed shared file/folder. + + :ivar shared_content_link: Shared content link. + :ivar shared_content_owner: The shared content owner. + :ivar shared_content_access_level: Shared content access level. + """ + + __slots__ = [ + '_shared_content_link_value', + '_shared_content_link_present', + '_shared_content_owner_value', + '_shared_content_owner_present', + '_shared_content_access_level_value', + '_shared_content_access_level_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_content_link=None, + shared_content_access_level=None, + shared_content_owner=None): + self._shared_content_link_value = None + self._shared_content_link_present = False + self._shared_content_owner_value = None + self._shared_content_owner_present = False + self._shared_content_access_level_value = None + self._shared_content_access_level_present = False + if shared_content_link is not None: + self.shared_content_link = shared_content_link + if shared_content_owner is not None: + self.shared_content_owner = shared_content_owner + if shared_content_access_level is not None: + self.shared_content_access_level = shared_content_access_level + + @property + def shared_content_link(self): + """ + Shared content link. + + :rtype: str + """ + if self._shared_content_link_present: + return self._shared_content_link_value + else: + raise AttributeError("missing required field 'shared_content_link'") + + @shared_content_link.setter + def shared_content_link(self, val): + val = self._shared_content_link_validator.validate(val) + self._shared_content_link_value = val + self._shared_content_link_present = True + + @shared_content_link.deleter + def shared_content_link(self): + self._shared_content_link_value = None + self._shared_content_link_present = False + + @property + def shared_content_owner(self): + """ + The shared content owner. + + :rtype: UserLogInfo + """ + if self._shared_content_owner_present: + return self._shared_content_owner_value + else: + return None + + @shared_content_owner.setter + def shared_content_owner(self, val): + if val is None: + del self.shared_content_owner + return + self._shared_content_owner_validator.validate_type_only(val) + self._shared_content_owner_value = val + self._shared_content_owner_present = True + + @shared_content_owner.deleter + def shared_content_owner(self): + self._shared_content_owner_value = None + self._shared_content_owner_present = False + + @property + def shared_content_access_level(self): + """ + Shared content access level. + + :rtype: sharing.AccessLevel + """ + if self._shared_content_access_level_present: + return self._shared_content_access_level_value + else: + raise AttributeError("missing required field 'shared_content_access_level'") + + @shared_content_access_level.setter + def shared_content_access_level(self, val): + self._shared_content_access_level_validator.validate_type_only(val) + self._shared_content_access_level_value = val + self._shared_content_access_level_present = True + + @shared_content_access_level.deleter + def shared_content_access_level(self): + self._shared_content_access_level_value = None + self._shared_content_access_level_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentViewDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentViewDetails(shared_content_link={!r}, shared_content_access_level={!r}, shared_content_owner={!r})'.format( + self._shared_content_link_value, + self._shared_content_access_level_value, + self._shared_content_owner_value, + ) + +SharedContentViewDetails_validator = bv.Struct(SharedContentViewDetails) + +class SharedContentViewType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedContentViewType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedContentViewType(description={!r})'.format( + self._description_value, + ) + +SharedContentViewType_validator = bv.Struct(SharedContentViewType) + +class SharedFolderChangeLinkPolicyDetails(bb.Struct): + """ + Changed who can access shared folder via link. + + :ivar new_value: New shared folder link policy. + :ivar previous_value: Previous shared folder link policy. Might be missing + due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New shared folder link policy. + + :rtype: sharing.SharedLinkPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous shared folder link policy. Might be missing due to historical + data gap. + + :rtype: sharing.SharedLinkPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderChangeLinkPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderChangeLinkPolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +SharedFolderChangeLinkPolicyDetails_validator = bv.Struct(SharedFolderChangeLinkPolicyDetails) + +class SharedFolderChangeLinkPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderChangeLinkPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderChangeLinkPolicyType(description={!r})'.format( + self._description_value, + ) + +SharedFolderChangeLinkPolicyType_validator = bv.Struct(SharedFolderChangeLinkPolicyType) + +class SharedFolderChangeMembersInheritancePolicyDetails(bb.Struct): + """ + Changed whether shared folder inherits members from parent folder. + + :ivar new_value: New member inheritance policy. + :ivar previous_value: Previous member inheritance policy. Might be missing + due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New member inheritance policy. + + :rtype: SharedFolderMembersInheritancePolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous member inheritance policy. Might be missing due to historical + data gap. + + :rtype: SharedFolderMembersInheritancePolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderChangeMembersInheritancePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderChangeMembersInheritancePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +SharedFolderChangeMembersInheritancePolicyDetails_validator = bv.Struct(SharedFolderChangeMembersInheritancePolicyDetails) + +class SharedFolderChangeMembersInheritancePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderChangeMembersInheritancePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderChangeMembersInheritancePolicyType(description={!r})'.format( + self._description_value, + ) + +SharedFolderChangeMembersInheritancePolicyType_validator = bv.Struct(SharedFolderChangeMembersInheritancePolicyType) + +class SharedFolderChangeMembersManagementPolicyDetails(bb.Struct): + """ + Changed who can add/remove members of shared folder. + + :ivar new_value: New members management policy. + :ivar previous_value: Previous members management policy. Might be missing + due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New members management policy. + + :rtype: sharing.AclUpdatePolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous members management policy. Might be missing due to historical + data gap. + + :rtype: sharing.AclUpdatePolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderChangeMembersManagementPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderChangeMembersManagementPolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +SharedFolderChangeMembersManagementPolicyDetails_validator = bv.Struct(SharedFolderChangeMembersManagementPolicyDetails) + +class SharedFolderChangeMembersManagementPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderChangeMembersManagementPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderChangeMembersManagementPolicyType(description={!r})'.format( + self._description_value, + ) + +SharedFolderChangeMembersManagementPolicyType_validator = bv.Struct(SharedFolderChangeMembersManagementPolicyType) + +class SharedFolderChangeMembersPolicyDetails(bb.Struct): + """ + Changed who can become member of shared folder. + + :ivar new_value: New external invite policy. + :ivar previous_value: Previous external invite policy. Might be missing due + to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New external invite policy. + + :rtype: sharing.MemberPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous external invite policy. Might be missing due to historical data + gap. + + :rtype: sharing.MemberPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderChangeMembersPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderChangeMembersPolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +SharedFolderChangeMembersPolicyDetails_validator = bv.Struct(SharedFolderChangeMembersPolicyDetails) + +class SharedFolderChangeMembersPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderChangeMembersPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderChangeMembersPolicyType(description={!r})'.format( + self._description_value, + ) + +SharedFolderChangeMembersPolicyType_validator = bv.Struct(SharedFolderChangeMembersPolicyType) + +class SharedFolderCreateDetails(bb.Struct): + """ + Created shared folder. + + :ivar target_ns_id: Target namespace ID. Might be missing due to historical + data gap. + """ + + __slots__ = [ + '_target_ns_id_value', + '_target_ns_id_present', + ] + + _has_required_fields = False + + def __init__(self, + target_ns_id=None): + self._target_ns_id_value = None + self._target_ns_id_present = False + if target_ns_id is not None: + self.target_ns_id = target_ns_id + + @property + def target_ns_id(self): + """ + Target namespace ID. Might be missing due to historical data gap. + + :rtype: str + """ + if self._target_ns_id_present: + return self._target_ns_id_value + else: + return None + + @target_ns_id.setter + def target_ns_id(self, val): + if val is None: + del self.target_ns_id + return + val = self._target_ns_id_validator.validate(val) + self._target_ns_id_value = val + self._target_ns_id_present = True + + @target_ns_id.deleter + def target_ns_id(self): + self._target_ns_id_value = None + self._target_ns_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderCreateDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderCreateDetails(target_ns_id={!r})'.format( + self._target_ns_id_value, + ) + +SharedFolderCreateDetails_validator = bv.Struct(SharedFolderCreateDetails) + +class SharedFolderCreateType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderCreateType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderCreateType(description={!r})'.format( + self._description_value, + ) + +SharedFolderCreateType_validator = bv.Struct(SharedFolderCreateType) + +class SharedFolderDeclineInvitationDetails(bb.Struct): + """ + Declined team member's invite to shared folder. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderDeclineInvitationDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderDeclineInvitationDetails()' + +SharedFolderDeclineInvitationDetails_validator = bv.Struct(SharedFolderDeclineInvitationDetails) + +class SharedFolderDeclineInvitationType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderDeclineInvitationType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderDeclineInvitationType(description={!r})'.format( + self._description_value, + ) + +SharedFolderDeclineInvitationType_validator = bv.Struct(SharedFolderDeclineInvitationType) + +class SharedFolderMembersInheritancePolicy(bb.Union): + """ + Specifies if a shared folder inherits its members from the parent folder. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + inherit_members = None + # Attribute is overwritten below the class definition + dont_inherit_members = None + # Attribute is overwritten below the class definition + other = None + + def is_inherit_members(self): + """ + Check if the union tag is ``inherit_members``. + + :rtype: bool + """ + return self._tag == 'inherit_members' + + def is_dont_inherit_members(self): + """ + Check if the union tag is ``dont_inherit_members``. + + :rtype: bool + """ + return self._tag == 'dont_inherit_members' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderMembersInheritancePolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderMembersInheritancePolicy(%r, %r)' % (self._tag, self._value) + +SharedFolderMembersInheritancePolicy_validator = bv.Union(SharedFolderMembersInheritancePolicy) + +class SharedFolderMountDetails(bb.Struct): + """ + Added shared folder to own Dropbox. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderMountDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderMountDetails()' + +SharedFolderMountDetails_validator = bv.Struct(SharedFolderMountDetails) + +class SharedFolderMountType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderMountType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderMountType(description={!r})'.format( + self._description_value, + ) + +SharedFolderMountType_validator = bv.Struct(SharedFolderMountType) + +class SharedFolderNestDetails(bb.Struct): + """ + Changed parent of shared folder. + + :ivar previous_parent_ns_id: Previous parent namespace ID. Might be missing + due to historical data gap. + :ivar new_parent_ns_id: New parent namespace ID. Might be missing due to + historical data gap. + :ivar previous_ns_path: Previous namespace path. Might be missing due to + historical data gap. + :ivar new_ns_path: New namespace path. Might be missing due to historical + data gap. + """ + + __slots__ = [ + '_previous_parent_ns_id_value', + '_previous_parent_ns_id_present', + '_new_parent_ns_id_value', + '_new_parent_ns_id_present', + '_previous_ns_path_value', + '_previous_ns_path_present', + '_new_ns_path_value', + '_new_ns_path_present', + ] + + _has_required_fields = False + + def __init__(self, + previous_parent_ns_id=None, + new_parent_ns_id=None, + previous_ns_path=None, + new_ns_path=None): + self._previous_parent_ns_id_value = None + self._previous_parent_ns_id_present = False + self._new_parent_ns_id_value = None + self._new_parent_ns_id_present = False + self._previous_ns_path_value = None + self._previous_ns_path_present = False + self._new_ns_path_value = None + self._new_ns_path_present = False + if previous_parent_ns_id is not None: + self.previous_parent_ns_id = previous_parent_ns_id + if new_parent_ns_id is not None: + self.new_parent_ns_id = new_parent_ns_id + if previous_ns_path is not None: + self.previous_ns_path = previous_ns_path + if new_ns_path is not None: + self.new_ns_path = new_ns_path + + @property + def previous_parent_ns_id(self): + """ + Previous parent namespace ID. Might be missing due to historical data + gap. + + :rtype: str + """ + if self._previous_parent_ns_id_present: + return self._previous_parent_ns_id_value + else: + return None + + @previous_parent_ns_id.setter + def previous_parent_ns_id(self, val): + if val is None: + del self.previous_parent_ns_id + return + val = self._previous_parent_ns_id_validator.validate(val) + self._previous_parent_ns_id_value = val + self._previous_parent_ns_id_present = True + + @previous_parent_ns_id.deleter + def previous_parent_ns_id(self): + self._previous_parent_ns_id_value = None + self._previous_parent_ns_id_present = False + + @property + def new_parent_ns_id(self): + """ + New parent namespace ID. Might be missing due to historical data gap. + + :rtype: str + """ + if self._new_parent_ns_id_present: + return self._new_parent_ns_id_value + else: + return None + + @new_parent_ns_id.setter + def new_parent_ns_id(self, val): + if val is None: + del self.new_parent_ns_id + return + val = self._new_parent_ns_id_validator.validate(val) + self._new_parent_ns_id_value = val + self._new_parent_ns_id_present = True + + @new_parent_ns_id.deleter + def new_parent_ns_id(self): + self._new_parent_ns_id_value = None + self._new_parent_ns_id_present = False + + @property + def previous_ns_path(self): + """ + Previous namespace path. Might be missing due to historical data gap. + + :rtype: str + """ + if self._previous_ns_path_present: + return self._previous_ns_path_value + else: + return None + + @previous_ns_path.setter + def previous_ns_path(self, val): + if val is None: + del self.previous_ns_path + return + val = self._previous_ns_path_validator.validate(val) + self._previous_ns_path_value = val + self._previous_ns_path_present = True + + @previous_ns_path.deleter + def previous_ns_path(self): + self._previous_ns_path_value = None + self._previous_ns_path_present = False + + @property + def new_ns_path(self): + """ + New namespace path. Might be missing due to historical data gap. + + :rtype: str + """ + if self._new_ns_path_present: + return self._new_ns_path_value + else: + return None + + @new_ns_path.setter + def new_ns_path(self, val): + if val is None: + del self.new_ns_path + return + val = self._new_ns_path_validator.validate(val) + self._new_ns_path_value = val + self._new_ns_path_present = True + + @new_ns_path.deleter + def new_ns_path(self): + self._new_ns_path_value = None + self._new_ns_path_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderNestDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderNestDetails(previous_parent_ns_id={!r}, new_parent_ns_id={!r}, previous_ns_path={!r}, new_ns_path={!r})'.format( + self._previous_parent_ns_id_value, + self._new_parent_ns_id_value, + self._previous_ns_path_value, + self._new_ns_path_value, + ) + +SharedFolderNestDetails_validator = bv.Struct(SharedFolderNestDetails) + +class SharedFolderNestType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderNestType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderNestType(description={!r})'.format( + self._description_value, + ) + +SharedFolderNestType_validator = bv.Struct(SharedFolderNestType) + +class SharedFolderTransferOwnershipDetails(bb.Struct): + """ + Transferred ownership of shared folder to another member. + + :ivar previous_owner_email: The email address of the previous shared folder + owner. + :ivar new_owner_email: The email address of the new shared folder owner. + """ + + __slots__ = [ + '_previous_owner_email_value', + '_previous_owner_email_present', + '_new_owner_email_value', + '_new_owner_email_present', + ] + + _has_required_fields = True + + def __init__(self, + new_owner_email=None, + previous_owner_email=None): + self._previous_owner_email_value = None + self._previous_owner_email_present = False + self._new_owner_email_value = None + self._new_owner_email_present = False + if previous_owner_email is not None: + self.previous_owner_email = previous_owner_email + if new_owner_email is not None: + self.new_owner_email = new_owner_email + + @property + def previous_owner_email(self): + """ + The email address of the previous shared folder owner. + + :rtype: str + """ + if self._previous_owner_email_present: + return self._previous_owner_email_value + else: + return None + + @previous_owner_email.setter + def previous_owner_email(self, val): + if val is None: + del self.previous_owner_email + return + val = self._previous_owner_email_validator.validate(val) + self._previous_owner_email_value = val + self._previous_owner_email_present = True + + @previous_owner_email.deleter + def previous_owner_email(self): + self._previous_owner_email_value = None + self._previous_owner_email_present = False + + @property + def new_owner_email(self): + """ + The email address of the new shared folder owner. + + :rtype: str + """ + if self._new_owner_email_present: + return self._new_owner_email_value + else: + raise AttributeError("missing required field 'new_owner_email'") + + @new_owner_email.setter + def new_owner_email(self, val): + val = self._new_owner_email_validator.validate(val) + self._new_owner_email_value = val + self._new_owner_email_present = True + + @new_owner_email.deleter + def new_owner_email(self): + self._new_owner_email_value = None + self._new_owner_email_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderTransferOwnershipDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderTransferOwnershipDetails(new_owner_email={!r}, previous_owner_email={!r})'.format( + self._new_owner_email_value, + self._previous_owner_email_value, + ) + +SharedFolderTransferOwnershipDetails_validator = bv.Struct(SharedFolderTransferOwnershipDetails) + +class SharedFolderTransferOwnershipType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderTransferOwnershipType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderTransferOwnershipType(description={!r})'.format( + self._description_value, + ) + +SharedFolderTransferOwnershipType_validator = bv.Struct(SharedFolderTransferOwnershipType) + +class SharedFolderUnmountDetails(bb.Struct): + """ + Deleted shared folder from Dropbox. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderUnmountDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderUnmountDetails()' + +SharedFolderUnmountDetails_validator = bv.Struct(SharedFolderUnmountDetails) + +class SharedFolderUnmountType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderUnmountType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderUnmountType(description={!r})'.format( + self._description_value, + ) + +SharedFolderUnmountType_validator = bv.Struct(SharedFolderUnmountType) + +class SharedLinkAccessLevel(bb.Union): + """ + Shared link access level. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + none = None + # Attribute is overwritten below the class definition + reader = None + # Attribute is overwritten below the class definition + writer = None + # Attribute is overwritten below the class definition + other = None + + def is_none(self): + """ + Check if the union tag is ``none``. + + :rtype: bool + """ + return self._tag == 'none' + + def is_reader(self): + """ + Check if the union tag is ``reader``. + + :rtype: bool + """ + return self._tag == 'reader' + + def is_writer(self): + """ + Check if the union tag is ``writer``. + + :rtype: bool + """ + return self._tag == 'writer' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkAccessLevel, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkAccessLevel(%r, %r)' % (self._tag, self._value) + +SharedLinkAccessLevel_validator = bv.Union(SharedLinkAccessLevel) + +class SharedLinkAddExpiryDetails(bb.Struct): + """ + Added shared link expiration date. + + :ivar new_value: New shared link expiration date. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None): + self._new_value_value = None + self._new_value_present = False + if new_value is not None: + self.new_value = new_value + + @property + def new_value(self): + """ + New shared link expiration date. + + :rtype: datetime.datetime + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + val = self._new_value_validator.validate(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkAddExpiryDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkAddExpiryDetails(new_value={!r})'.format( + self._new_value_value, + ) + +SharedLinkAddExpiryDetails_validator = bv.Struct(SharedLinkAddExpiryDetails) + +class SharedLinkAddExpiryType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkAddExpiryType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkAddExpiryType(description={!r})'.format( + self._description_value, + ) + +SharedLinkAddExpiryType_validator = bv.Struct(SharedLinkAddExpiryType) + +class SharedLinkChangeExpiryDetails(bb.Struct): + """ + Changed shared link expiration date. + + :ivar new_value: New shared link expiration date. Might be missing due to + historical data gap. + :ivar previous_value: Previous shared link expiration date. Might be missing + due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = False + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New shared link expiration date. Might be missing due to historical data + gap. + + :rtype: datetime.datetime + """ + if self._new_value_present: + return self._new_value_value + else: + return None + + @new_value.setter + def new_value(self, val): + if val is None: + del self.new_value + return + val = self._new_value_validator.validate(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous shared link expiration date. Might be missing due to historical + data gap. + + :rtype: datetime.datetime + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + val = self._previous_value_validator.validate(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkChangeExpiryDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkChangeExpiryDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +SharedLinkChangeExpiryDetails_validator = bv.Struct(SharedLinkChangeExpiryDetails) + +class SharedLinkChangeExpiryType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkChangeExpiryType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkChangeExpiryType(description={!r})'.format( + self._description_value, + ) + +SharedLinkChangeExpiryType_validator = bv.Struct(SharedLinkChangeExpiryType) + +class SharedLinkChangeVisibilityDetails(bb.Struct): + """ + Changed visibility of shared link. + + :ivar new_value: New shared link visibility. + :ivar previous_value: Previous shared link visibility. Might be missing due + to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New shared link visibility. + + :rtype: SharedLinkVisibility + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous shared link visibility. Might be missing due to historical data + gap. + + :rtype: SharedLinkVisibility + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkChangeVisibilityDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkChangeVisibilityDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +SharedLinkChangeVisibilityDetails_validator = bv.Struct(SharedLinkChangeVisibilityDetails) + +class SharedLinkChangeVisibilityType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkChangeVisibilityType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkChangeVisibilityType(description={!r})'.format( + self._description_value, + ) + +SharedLinkChangeVisibilityType_validator = bv.Struct(SharedLinkChangeVisibilityType) + +class SharedLinkCopyDetails(bb.Struct): + """ + Added file/folder to Dropbox from shared link. + + :ivar shared_link_owner: Shared link owner details. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_shared_link_owner_value', + '_shared_link_owner_present', + ] + + _has_required_fields = False + + def __init__(self, + shared_link_owner=None): + self._shared_link_owner_value = None + self._shared_link_owner_present = False + if shared_link_owner is not None: + self.shared_link_owner = shared_link_owner + + @property + def shared_link_owner(self): + """ + Shared link owner details. Might be missing due to historical data gap. + + :rtype: UserLogInfo + """ + if self._shared_link_owner_present: + return self._shared_link_owner_value + else: + return None + + @shared_link_owner.setter + def shared_link_owner(self, val): + if val is None: + del self.shared_link_owner + return + self._shared_link_owner_validator.validate_type_only(val) + self._shared_link_owner_value = val + self._shared_link_owner_present = True + + @shared_link_owner.deleter + def shared_link_owner(self): + self._shared_link_owner_value = None + self._shared_link_owner_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkCopyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkCopyDetails(shared_link_owner={!r})'.format( + self._shared_link_owner_value, + ) + +SharedLinkCopyDetails_validator = bv.Struct(SharedLinkCopyDetails) + +class SharedLinkCopyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkCopyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkCopyType(description={!r})'.format( + self._description_value, + ) + +SharedLinkCopyType_validator = bv.Struct(SharedLinkCopyType) + +class SharedLinkCreateDetails(bb.Struct): + """ + Created shared link. + + :ivar shared_link_access_level: Defines who can access the shared link. + Might be missing due to historical data gap. + """ + + __slots__ = [ + '_shared_link_access_level_value', + '_shared_link_access_level_present', + ] + + _has_required_fields = False + + def __init__(self, + shared_link_access_level=None): + self._shared_link_access_level_value = None + self._shared_link_access_level_present = False + if shared_link_access_level is not None: + self.shared_link_access_level = shared_link_access_level + + @property + def shared_link_access_level(self): + """ + Defines who can access the shared link. Might be missing due to + historical data gap. + + :rtype: SharedLinkAccessLevel + """ + if self._shared_link_access_level_present: + return self._shared_link_access_level_value + else: + return None + + @shared_link_access_level.setter + def shared_link_access_level(self, val): + if val is None: + del self.shared_link_access_level + return + self._shared_link_access_level_validator.validate_type_only(val) + self._shared_link_access_level_value = val + self._shared_link_access_level_present = True + + @shared_link_access_level.deleter + def shared_link_access_level(self): + self._shared_link_access_level_value = None + self._shared_link_access_level_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkCreateDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkCreateDetails(shared_link_access_level={!r})'.format( + self._shared_link_access_level_value, + ) + +SharedLinkCreateDetails_validator = bv.Struct(SharedLinkCreateDetails) + +class SharedLinkCreateType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkCreateType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkCreateType(description={!r})'.format( + self._description_value, + ) + +SharedLinkCreateType_validator = bv.Struct(SharedLinkCreateType) + +class SharedLinkDisableDetails(bb.Struct): + """ + Removed shared link. + + :ivar shared_link_owner: Shared link owner details. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_shared_link_owner_value', + '_shared_link_owner_present', + ] + + _has_required_fields = False + + def __init__(self, + shared_link_owner=None): + self._shared_link_owner_value = None + self._shared_link_owner_present = False + if shared_link_owner is not None: + self.shared_link_owner = shared_link_owner + + @property + def shared_link_owner(self): + """ + Shared link owner details. Might be missing due to historical data gap. + + :rtype: UserLogInfo + """ + if self._shared_link_owner_present: + return self._shared_link_owner_value + else: + return None + + @shared_link_owner.setter + def shared_link_owner(self, val): + if val is None: + del self.shared_link_owner + return + self._shared_link_owner_validator.validate_type_only(val) + self._shared_link_owner_value = val + self._shared_link_owner_present = True + + @shared_link_owner.deleter + def shared_link_owner(self): + self._shared_link_owner_value = None + self._shared_link_owner_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkDisableDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkDisableDetails(shared_link_owner={!r})'.format( + self._shared_link_owner_value, + ) + +SharedLinkDisableDetails_validator = bv.Struct(SharedLinkDisableDetails) + +class SharedLinkDisableType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkDisableType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkDisableType(description={!r})'.format( + self._description_value, + ) + +SharedLinkDisableType_validator = bv.Struct(SharedLinkDisableType) + +class SharedLinkDownloadDetails(bb.Struct): + """ + Downloaded file/folder from shared link. + + :ivar shared_link_owner: Shared link owner details. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_shared_link_owner_value', + '_shared_link_owner_present', + ] + + _has_required_fields = False + + def __init__(self, + shared_link_owner=None): + self._shared_link_owner_value = None + self._shared_link_owner_present = False + if shared_link_owner is not None: + self.shared_link_owner = shared_link_owner + + @property + def shared_link_owner(self): + """ + Shared link owner details. Might be missing due to historical data gap. + + :rtype: UserLogInfo + """ + if self._shared_link_owner_present: + return self._shared_link_owner_value + else: + return None + + @shared_link_owner.setter + def shared_link_owner(self, val): + if val is None: + del self.shared_link_owner + return + self._shared_link_owner_validator.validate_type_only(val) + self._shared_link_owner_value = val + self._shared_link_owner_present = True + + @shared_link_owner.deleter + def shared_link_owner(self): + self._shared_link_owner_value = None + self._shared_link_owner_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkDownloadDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkDownloadDetails(shared_link_owner={!r})'.format( + self._shared_link_owner_value, + ) + +SharedLinkDownloadDetails_validator = bv.Struct(SharedLinkDownloadDetails) + +class SharedLinkDownloadType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkDownloadType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkDownloadType(description={!r})'.format( + self._description_value, + ) + +SharedLinkDownloadType_validator = bv.Struct(SharedLinkDownloadType) + +class SharedLinkRemoveExpiryDetails(bb.Struct): + """ + Removed shared link expiration date. + + :ivar previous_value: Previous shared link expiration date. Might be missing + due to historical data gap. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = False + + def __init__(self, + previous_value=None): + self._previous_value_value = None + self._previous_value_present = False + if previous_value is not None: + self.previous_value = previous_value + + @property + def previous_value(self): + """ + Previous shared link expiration date. Might be missing due to historical + data gap. + + :rtype: datetime.datetime + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + val = self._previous_value_validator.validate(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkRemoveExpiryDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkRemoveExpiryDetails(previous_value={!r})'.format( + self._previous_value_value, + ) + +SharedLinkRemoveExpiryDetails_validator = bv.Struct(SharedLinkRemoveExpiryDetails) + +class SharedLinkRemoveExpiryType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkRemoveExpiryType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkRemoveExpiryType(description={!r})'.format( + self._description_value, + ) + +SharedLinkRemoveExpiryType_validator = bv.Struct(SharedLinkRemoveExpiryType) + +class SharedLinkShareDetails(bb.Struct): + """ + Added members as audience of shared link. + + :ivar shared_link_owner: Shared link owner details. Might be missing due to + historical data gap. + :ivar external_users: Users without a Dropbox account that were added as + shared link audience. + """ + + __slots__ = [ + '_shared_link_owner_value', + '_shared_link_owner_present', + '_external_users_value', + '_external_users_present', + ] + + _has_required_fields = False + + def __init__(self, + shared_link_owner=None, + external_users=None): + self._shared_link_owner_value = None + self._shared_link_owner_present = False + self._external_users_value = None + self._external_users_present = False + if shared_link_owner is not None: + self.shared_link_owner = shared_link_owner + if external_users is not None: + self.external_users = external_users + + @property + def shared_link_owner(self): + """ + Shared link owner details. Might be missing due to historical data gap. + + :rtype: UserLogInfo + """ + if self._shared_link_owner_present: + return self._shared_link_owner_value + else: + return None + + @shared_link_owner.setter + def shared_link_owner(self, val): + if val is None: + del self.shared_link_owner + return + self._shared_link_owner_validator.validate_type_only(val) + self._shared_link_owner_value = val + self._shared_link_owner_present = True + + @shared_link_owner.deleter + def shared_link_owner(self): + self._shared_link_owner_value = None + self._shared_link_owner_present = False + + @property + def external_users(self): + """ + Users without a Dropbox account that were added as shared link audience. + + :rtype: list of [ExternalUserLogInfo] + """ + if self._external_users_present: + return self._external_users_value + else: + return None + + @external_users.setter + def external_users(self, val): + if val is None: + del self.external_users + return + val = self._external_users_validator.validate(val) + self._external_users_value = val + self._external_users_present = True + + @external_users.deleter + def external_users(self): + self._external_users_value = None + self._external_users_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkShareDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkShareDetails(shared_link_owner={!r}, external_users={!r})'.format( + self._shared_link_owner_value, + self._external_users_value, + ) + +SharedLinkShareDetails_validator = bv.Struct(SharedLinkShareDetails) + +class SharedLinkShareType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkShareType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkShareType(description={!r})'.format( + self._description_value, + ) + +SharedLinkShareType_validator = bv.Struct(SharedLinkShareType) + +class SharedLinkViewDetails(bb.Struct): + """ + Opened shared link. + + :ivar shared_link_owner: Shared link owner details. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_shared_link_owner_value', + '_shared_link_owner_present', + ] + + _has_required_fields = False + + def __init__(self, + shared_link_owner=None): + self._shared_link_owner_value = None + self._shared_link_owner_present = False + if shared_link_owner is not None: + self.shared_link_owner = shared_link_owner + + @property + def shared_link_owner(self): + """ + Shared link owner details. Might be missing due to historical data gap. + + :rtype: UserLogInfo + """ + if self._shared_link_owner_present: + return self._shared_link_owner_value + else: + return None + + @shared_link_owner.setter + def shared_link_owner(self, val): + if val is None: + del self.shared_link_owner + return + self._shared_link_owner_validator.validate_type_only(val) + self._shared_link_owner_value = val + self._shared_link_owner_present = True + + @shared_link_owner.deleter + def shared_link_owner(self): + self._shared_link_owner_value = None + self._shared_link_owner_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkViewDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkViewDetails(shared_link_owner={!r})'.format( + self._shared_link_owner_value, + ) + +SharedLinkViewDetails_validator = bv.Struct(SharedLinkViewDetails) + +class SharedLinkViewType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkViewType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkViewType(description={!r})'.format( + self._description_value, + ) + +SharedLinkViewType_validator = bv.Struct(SharedLinkViewType) + +class SharedLinkVisibility(bb.Union): + """ + Defines who has access to a shared link. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + password = None + # Attribute is overwritten below the class definition + public = None + # Attribute is overwritten below the class definition + team_only = None + # Attribute is overwritten below the class definition + other = None + + def is_password(self): + """ + Check if the union tag is ``password``. + + :rtype: bool + """ + return self._tag == 'password' + + def is_public(self): + """ + Check if the union tag is ``public``. + + :rtype: bool + """ + return self._tag == 'public' + + def is_team_only(self): + """ + Check if the union tag is ``team_only``. + + :rtype: bool + """ + return self._tag == 'team_only' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkVisibility, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkVisibility(%r, %r)' % (self._tag, self._value) + +SharedLinkVisibility_validator = bv.Union(SharedLinkVisibility) + +class SharedNoteOpenedDetails(bb.Struct): + """ + Opened shared Paper doc. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedNoteOpenedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedNoteOpenedDetails()' + +SharedNoteOpenedDetails_validator = bv.Struct(SharedNoteOpenedDetails) + +class SharedNoteOpenedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedNoteOpenedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedNoteOpenedType(description={!r})'.format( + self._description_value, + ) + +SharedNoteOpenedType_validator = bv.Struct(SharedNoteOpenedType) + +class SharingChangeFolderJoinPolicyDetails(bb.Struct): + """ + Changed whether team members can join shared folders owned outside team. + + :ivar new_value: New external join policy. + :ivar previous_value: Previous external join policy. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New external join policy. + + :rtype: SharingFolderJoinPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous external join policy. Might be missing due to historical data + gap. + + :rtype: SharingFolderJoinPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharingChangeFolderJoinPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharingChangeFolderJoinPolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +SharingChangeFolderJoinPolicyDetails_validator = bv.Struct(SharingChangeFolderJoinPolicyDetails) + +class SharingChangeFolderJoinPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharingChangeFolderJoinPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharingChangeFolderJoinPolicyType(description={!r})'.format( + self._description_value, + ) + +SharingChangeFolderJoinPolicyType_validator = bv.Struct(SharingChangeFolderJoinPolicyType) + +class SharingChangeLinkPolicyDetails(bb.Struct): + """ + Changed whether members can share links outside team, and if links are + accessible only by team members or anyone by default. + + :ivar new_value: New external link accessibility policy. + :ivar previous_value: Previous external link accessibility policy. Might be + missing due to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New external link accessibility policy. + + :rtype: SharingLinkPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous external link accessibility policy. Might be missing due to + historical data gap. + + :rtype: SharingLinkPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharingChangeLinkPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharingChangeLinkPolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +SharingChangeLinkPolicyDetails_validator = bv.Struct(SharingChangeLinkPolicyDetails) + +class SharingChangeLinkPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharingChangeLinkPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharingChangeLinkPolicyType(description={!r})'.format( + self._description_value, + ) + +SharingChangeLinkPolicyType_validator = bv.Struct(SharingChangeLinkPolicyType) + +class SharingChangeMemberPolicyDetails(bb.Struct): + """ + Changed whether members can share files/folders outside team. + + :ivar new_value: New external invite policy. + :ivar previous_value: Previous external invite policy. Might be missing due + to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New external invite policy. + + :rtype: SharingMemberPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous external invite policy. Might be missing due to historical data + gap. + + :rtype: SharingMemberPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharingChangeMemberPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharingChangeMemberPolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +SharingChangeMemberPolicyDetails_validator = bv.Struct(SharingChangeMemberPolicyDetails) + +class SharingChangeMemberPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SharingChangeMemberPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharingChangeMemberPolicyType(description={!r})'.format( + self._description_value, + ) + +SharingChangeMemberPolicyType_validator = bv.Struct(SharingChangeMemberPolicyType) + +class SharingFolderJoinPolicy(bb.Union): + """ + Policy for controlling if team members can join shared folders owned by non + team members. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + from_anyone = None + # Attribute is overwritten below the class definition + from_team_only = None + # Attribute is overwritten below the class definition + other = None + + def is_from_anyone(self): + """ + Check if the union tag is ``from_anyone``. + + :rtype: bool + """ + return self._tag == 'from_anyone' + + def is_from_team_only(self): + """ + Check if the union tag is ``from_team_only``. + + :rtype: bool + """ + return self._tag == 'from_team_only' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharingFolderJoinPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharingFolderJoinPolicy(%r, %r)' % (self._tag, self._value) + +SharingFolderJoinPolicy_validator = bv.Union(SharingFolderJoinPolicy) + +class SharingLinkPolicy(bb.Union): + """ + Policy for controlling if team members can share links externally + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + default_private = None + # Attribute is overwritten below the class definition + default_public = None + # Attribute is overwritten below the class definition + only_private = None + # Attribute is overwritten below the class definition + other = None + + def is_default_private(self): + """ + Check if the union tag is ``default_private``. + + :rtype: bool + """ + return self._tag == 'default_private' + + def is_default_public(self): + """ + Check if the union tag is ``default_public``. + + :rtype: bool + """ + return self._tag == 'default_public' + + def is_only_private(self): + """ + Check if the union tag is ``only_private``. + + :rtype: bool + """ + return self._tag == 'only_private' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharingLinkPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharingLinkPolicy(%r, %r)' % (self._tag, self._value) + +SharingLinkPolicy_validator = bv.Union(SharingLinkPolicy) + +class SharingMemberPolicy(bb.Union): + """ + External sharing policy + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + allow = None + # Attribute is overwritten below the class definition + forbid = None + # Attribute is overwritten below the class definition + other = None + + def is_allow(self): + """ + Check if the union tag is ``allow``. + + :rtype: bool + """ + return self._tag == 'allow' + + def is_forbid(self): + """ + Check if the union tag is ``forbid``. + + :rtype: bool + """ + return self._tag == 'forbid' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharingMemberPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharingMemberPolicy(%r, %r)' % (self._tag, self._value) + +SharingMemberPolicy_validator = bv.Union(SharingMemberPolicy) + +class ShmodelGroupShareDetails(bb.Struct): + """ + Shared link with group. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(ShmodelGroupShareDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShmodelGroupShareDetails()' + +ShmodelGroupShareDetails_validator = bv.Struct(ShmodelGroupShareDetails) + +class ShmodelGroupShareType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShmodelGroupShareType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShmodelGroupShareType(description={!r})'.format( + self._description_value, + ) + +ShmodelGroupShareType_validator = bv.Struct(ShmodelGroupShareType) + +class ShowcaseAccessGrantedDetails(bb.Struct): + """ + Granted access to showcase. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseAccessGrantedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseAccessGrantedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcaseAccessGrantedDetails_validator = bv.Struct(ShowcaseAccessGrantedDetails) + +class ShowcaseAccessGrantedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseAccessGrantedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseAccessGrantedType(description={!r})'.format( + self._description_value, + ) + +ShowcaseAccessGrantedType_validator = bv.Struct(ShowcaseAccessGrantedType) + +class ShowcaseAddMemberDetails(bb.Struct): + """ + Added member to showcase. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseAddMemberDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseAddMemberDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcaseAddMemberDetails_validator = bv.Struct(ShowcaseAddMemberDetails) + +class ShowcaseAddMemberType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseAddMemberType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseAddMemberType(description={!r})'.format( + self._description_value, + ) + +ShowcaseAddMemberType_validator = bv.Struct(ShowcaseAddMemberType) + +class ShowcaseArchivedDetails(bb.Struct): + """ + Archived showcase. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseArchivedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseArchivedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcaseArchivedDetails_validator = bv.Struct(ShowcaseArchivedDetails) + +class ShowcaseArchivedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseArchivedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseArchivedType(description={!r})'.format( + self._description_value, + ) + +ShowcaseArchivedType_validator = bv.Struct(ShowcaseArchivedType) + +class ShowcaseChangeDownloadPolicyDetails(bb.Struct): + """ + Enabled/disabled downloading files from Dropbox Showcase for team. + + :ivar new_value: New Dropbox Showcase download policy. + :ivar previous_value: Previous Dropbox Showcase download policy. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New Dropbox Showcase download policy. + + :rtype: ShowcaseDownloadPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous Dropbox Showcase download policy. + + :rtype: ShowcaseDownloadPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseChangeDownloadPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseChangeDownloadPolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +ShowcaseChangeDownloadPolicyDetails_validator = bv.Struct(ShowcaseChangeDownloadPolicyDetails) + +class ShowcaseChangeDownloadPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseChangeDownloadPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseChangeDownloadPolicyType(description={!r})'.format( + self._description_value, + ) + +ShowcaseChangeDownloadPolicyType_validator = bv.Struct(ShowcaseChangeDownloadPolicyType) + +class ShowcaseChangeEnabledPolicyDetails(bb.Struct): + """ + Enabled/disabled Dropbox Showcase for team. + + :ivar new_value: New Dropbox Showcase policy. + :ivar previous_value: Previous Dropbox Showcase policy. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New Dropbox Showcase policy. + + :rtype: ShowcaseEnabledPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous Dropbox Showcase policy. + + :rtype: ShowcaseEnabledPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseChangeEnabledPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseChangeEnabledPolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +ShowcaseChangeEnabledPolicyDetails_validator = bv.Struct(ShowcaseChangeEnabledPolicyDetails) + +class ShowcaseChangeEnabledPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseChangeEnabledPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseChangeEnabledPolicyType(description={!r})'.format( + self._description_value, + ) + +ShowcaseChangeEnabledPolicyType_validator = bv.Struct(ShowcaseChangeEnabledPolicyType) + +class ShowcaseChangeExternalSharingPolicyDetails(bb.Struct): + """ + Enabled/disabled sharing Dropbox Showcase externally for team. + + :ivar new_value: New Dropbox Showcase external sharing policy. + :ivar previous_value: Previous Dropbox Showcase external sharing policy. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New Dropbox Showcase external sharing policy. + + :rtype: ShowcaseExternalSharingPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous Dropbox Showcase external sharing policy. + + :rtype: ShowcaseExternalSharingPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseChangeExternalSharingPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseChangeExternalSharingPolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +ShowcaseChangeExternalSharingPolicyDetails_validator = bv.Struct(ShowcaseChangeExternalSharingPolicyDetails) + +class ShowcaseChangeExternalSharingPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseChangeExternalSharingPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseChangeExternalSharingPolicyType(description={!r})'.format( + self._description_value, + ) + +ShowcaseChangeExternalSharingPolicyType_validator = bv.Struct(ShowcaseChangeExternalSharingPolicyType) + +class ShowcaseCreatedDetails(bb.Struct): + """ + Created showcase. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseCreatedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseCreatedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcaseCreatedDetails_validator = bv.Struct(ShowcaseCreatedDetails) + +class ShowcaseCreatedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseCreatedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseCreatedType(description={!r})'.format( + self._description_value, + ) + +ShowcaseCreatedType_validator = bv.Struct(ShowcaseCreatedType) + +class ShowcaseDeleteCommentDetails(bb.Struct): + """ + Deleted showcase comment. + + :ivar event_uuid: Event unique identifier. + :ivar comment_text: Comment text. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_comment_text_value', + '_comment_text_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + comment_text=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._comment_text_value = None + self._comment_text_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if comment_text is not None: + self.comment_text = comment_text + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def comment_text(self): + """ + Comment text. + + :rtype: str + """ + if self._comment_text_present: + return self._comment_text_value + else: + return None + + @comment_text.setter + def comment_text(self, val): + if val is None: + del self.comment_text + return + val = self._comment_text_validator.validate(val) + self._comment_text_value = val + self._comment_text_present = True + + @comment_text.deleter + def comment_text(self): + self._comment_text_value = None + self._comment_text_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseDeleteCommentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseDeleteCommentDetails(event_uuid={!r}, comment_text={!r})'.format( + self._event_uuid_value, + self._comment_text_value, + ) + +ShowcaseDeleteCommentDetails_validator = bv.Struct(ShowcaseDeleteCommentDetails) + +class ShowcaseDeleteCommentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseDeleteCommentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseDeleteCommentType(description={!r})'.format( + self._description_value, + ) + +ShowcaseDeleteCommentType_validator = bv.Struct(ShowcaseDeleteCommentType) + +class ShowcaseDocumentLogInfo(bb.Struct): + """ + Showcase document's logged information. + + :ivar showcase_id: Showcase document Id. + :ivar showcase_title: Showcase document title. + """ + + __slots__ = [ + '_showcase_id_value', + '_showcase_id_present', + '_showcase_title_value', + '_showcase_title_present', + ] + + _has_required_fields = True + + def __init__(self, + showcase_id=None, + showcase_title=None): + self._showcase_id_value = None + self._showcase_id_present = False + self._showcase_title_value = None + self._showcase_title_present = False + if showcase_id is not None: + self.showcase_id = showcase_id + if showcase_title is not None: + self.showcase_title = showcase_title + + @property + def showcase_id(self): + """ + Showcase document Id. + + :rtype: str + """ + if self._showcase_id_present: + return self._showcase_id_value + else: + raise AttributeError("missing required field 'showcase_id'") + + @showcase_id.setter + def showcase_id(self, val): + val = self._showcase_id_validator.validate(val) + self._showcase_id_value = val + self._showcase_id_present = True + + @showcase_id.deleter + def showcase_id(self): + self._showcase_id_value = None + self._showcase_id_present = False + + @property + def showcase_title(self): + """ + Showcase document title. + + :rtype: str + """ + if self._showcase_title_present: + return self._showcase_title_value + else: + raise AttributeError("missing required field 'showcase_title'") + + @showcase_title.setter + def showcase_title(self, val): + val = self._showcase_title_validator.validate(val) + self._showcase_title_value = val + self._showcase_title_present = True + + @showcase_title.deleter + def showcase_title(self): + self._showcase_title_value = None + self._showcase_title_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseDocumentLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseDocumentLogInfo(showcase_id={!r}, showcase_title={!r})'.format( + self._showcase_id_value, + self._showcase_title_value, + ) + +ShowcaseDocumentLogInfo_validator = bv.Struct(ShowcaseDocumentLogInfo) + +class ShowcaseDownloadPolicy(bb.Union): + """ + Policy for controlling if files can be downloaded from Showcases by team + members + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseDownloadPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseDownloadPolicy(%r, %r)' % (self._tag, self._value) + +ShowcaseDownloadPolicy_validator = bv.Union(ShowcaseDownloadPolicy) + +class ShowcaseEditCommentDetails(bb.Struct): + """ + Edited showcase comment. + + :ivar event_uuid: Event unique identifier. + :ivar comment_text: Comment text. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_comment_text_value', + '_comment_text_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + comment_text=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._comment_text_value = None + self._comment_text_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if comment_text is not None: + self.comment_text = comment_text + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def comment_text(self): + """ + Comment text. + + :rtype: str + """ + if self._comment_text_present: + return self._comment_text_value + else: + return None + + @comment_text.setter + def comment_text(self, val): + if val is None: + del self.comment_text + return + val = self._comment_text_validator.validate(val) + self._comment_text_value = val + self._comment_text_present = True + + @comment_text.deleter + def comment_text(self): + self._comment_text_value = None + self._comment_text_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseEditCommentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseEditCommentDetails(event_uuid={!r}, comment_text={!r})'.format( + self._event_uuid_value, + self._comment_text_value, + ) + +ShowcaseEditCommentDetails_validator = bv.Struct(ShowcaseEditCommentDetails) + +class ShowcaseEditCommentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseEditCommentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseEditCommentType(description={!r})'.format( + self._description_value, + ) + +ShowcaseEditCommentType_validator = bv.Struct(ShowcaseEditCommentType) + +class ShowcaseEditedDetails(bb.Struct): + """ + Edited showcase. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseEditedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseEditedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcaseEditedDetails_validator = bv.Struct(ShowcaseEditedDetails) + +class ShowcaseEditedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseEditedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseEditedType(description={!r})'.format( + self._description_value, + ) + +ShowcaseEditedType_validator = bv.Struct(ShowcaseEditedType) + +class ShowcaseEnabledPolicy(bb.Union): + """ + Policy for controlling whether Showcase is enabled. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseEnabledPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseEnabledPolicy(%r, %r)' % (self._tag, self._value) + +ShowcaseEnabledPolicy_validator = bv.Union(ShowcaseEnabledPolicy) + +class ShowcaseExternalSharingPolicy(bb.Union): + """ + Policy for controlling if team members can share Showcases externally. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseExternalSharingPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseExternalSharingPolicy(%r, %r)' % (self._tag, self._value) + +ShowcaseExternalSharingPolicy_validator = bv.Union(ShowcaseExternalSharingPolicy) + +class ShowcaseFileAddedDetails(bb.Struct): + """ + Added file to showcase. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseFileAddedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseFileAddedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcaseFileAddedDetails_validator = bv.Struct(ShowcaseFileAddedDetails) + +class ShowcaseFileAddedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseFileAddedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseFileAddedType(description={!r})'.format( + self._description_value, + ) + +ShowcaseFileAddedType_validator = bv.Struct(ShowcaseFileAddedType) + +class ShowcaseFileDownloadDetails(bb.Struct): + """ + Downloaded file from showcase. + + :ivar event_uuid: Event unique identifier. + :ivar download_type: Showcase download type. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_download_type_value', + '_download_type_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + download_type=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._download_type_value = None + self._download_type_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if download_type is not None: + self.download_type = download_type + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def download_type(self): + """ + Showcase download type. + + :rtype: str + """ + if self._download_type_present: + return self._download_type_value + else: + raise AttributeError("missing required field 'download_type'") + + @download_type.setter + def download_type(self, val): + val = self._download_type_validator.validate(val) + self._download_type_value = val + self._download_type_present = True + + @download_type.deleter + def download_type(self): + self._download_type_value = None + self._download_type_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseFileDownloadDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseFileDownloadDetails(event_uuid={!r}, download_type={!r})'.format( + self._event_uuid_value, + self._download_type_value, + ) + +ShowcaseFileDownloadDetails_validator = bv.Struct(ShowcaseFileDownloadDetails) + +class ShowcaseFileDownloadType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseFileDownloadType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseFileDownloadType(description={!r})'.format( + self._description_value, + ) + +ShowcaseFileDownloadType_validator = bv.Struct(ShowcaseFileDownloadType) + +class ShowcaseFileRemovedDetails(bb.Struct): + """ + Removed file from showcase. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseFileRemovedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseFileRemovedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcaseFileRemovedDetails_validator = bv.Struct(ShowcaseFileRemovedDetails) + +class ShowcaseFileRemovedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseFileRemovedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseFileRemovedType(description={!r})'.format( + self._description_value, + ) + +ShowcaseFileRemovedType_validator = bv.Struct(ShowcaseFileRemovedType) + +class ShowcaseFileViewDetails(bb.Struct): + """ + Viewed file in showcase. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseFileViewDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseFileViewDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcaseFileViewDetails_validator = bv.Struct(ShowcaseFileViewDetails) + +class ShowcaseFileViewType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseFileViewType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseFileViewType(description={!r})'.format( + self._description_value, + ) + +ShowcaseFileViewType_validator = bv.Struct(ShowcaseFileViewType) + +class ShowcasePermanentlyDeletedDetails(bb.Struct): + """ + Permanently deleted showcase. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcasePermanentlyDeletedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcasePermanentlyDeletedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcasePermanentlyDeletedDetails_validator = bv.Struct(ShowcasePermanentlyDeletedDetails) + +class ShowcasePermanentlyDeletedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcasePermanentlyDeletedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcasePermanentlyDeletedType(description={!r})'.format( + self._description_value, + ) + +ShowcasePermanentlyDeletedType_validator = bv.Struct(ShowcasePermanentlyDeletedType) + +class ShowcasePostCommentDetails(bb.Struct): + """ + Added showcase comment. + + :ivar event_uuid: Event unique identifier. + :ivar comment_text: Comment text. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_comment_text_value', + '_comment_text_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + comment_text=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._comment_text_value = None + self._comment_text_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if comment_text is not None: + self.comment_text = comment_text + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def comment_text(self): + """ + Comment text. + + :rtype: str + """ + if self._comment_text_present: + return self._comment_text_value + else: + return None + + @comment_text.setter + def comment_text(self, val): + if val is None: + del self.comment_text + return + val = self._comment_text_validator.validate(val) + self._comment_text_value = val + self._comment_text_present = True + + @comment_text.deleter + def comment_text(self): + self._comment_text_value = None + self._comment_text_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcasePostCommentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcasePostCommentDetails(event_uuid={!r}, comment_text={!r})'.format( + self._event_uuid_value, + self._comment_text_value, + ) + +ShowcasePostCommentDetails_validator = bv.Struct(ShowcasePostCommentDetails) + +class ShowcasePostCommentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcasePostCommentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcasePostCommentType(description={!r})'.format( + self._description_value, + ) + +ShowcasePostCommentType_validator = bv.Struct(ShowcasePostCommentType) + +class ShowcaseRemoveMemberDetails(bb.Struct): + """ + Removed member from showcase. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseRemoveMemberDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseRemoveMemberDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcaseRemoveMemberDetails_validator = bv.Struct(ShowcaseRemoveMemberDetails) + +class ShowcaseRemoveMemberType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseRemoveMemberType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseRemoveMemberType(description={!r})'.format( + self._description_value, + ) + +ShowcaseRemoveMemberType_validator = bv.Struct(ShowcaseRemoveMemberType) + +class ShowcaseRenamedDetails(bb.Struct): + """ + Renamed showcase. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseRenamedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseRenamedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcaseRenamedDetails_validator = bv.Struct(ShowcaseRenamedDetails) + +class ShowcaseRenamedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseRenamedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseRenamedType(description={!r})'.format( + self._description_value, + ) + +ShowcaseRenamedType_validator = bv.Struct(ShowcaseRenamedType) + +class ShowcaseRequestAccessDetails(bb.Struct): + """ + Requested access to showcase. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseRequestAccessDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseRequestAccessDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcaseRequestAccessDetails_validator = bv.Struct(ShowcaseRequestAccessDetails) + +class ShowcaseRequestAccessType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseRequestAccessType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseRequestAccessType(description={!r})'.format( + self._description_value, + ) + +ShowcaseRequestAccessType_validator = bv.Struct(ShowcaseRequestAccessType) + +class ShowcaseResolveCommentDetails(bb.Struct): + """ + Resolved showcase comment. + + :ivar event_uuid: Event unique identifier. + :ivar comment_text: Comment text. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_comment_text_value', + '_comment_text_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + comment_text=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._comment_text_value = None + self._comment_text_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if comment_text is not None: + self.comment_text = comment_text + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def comment_text(self): + """ + Comment text. + + :rtype: str + """ + if self._comment_text_present: + return self._comment_text_value + else: + return None + + @comment_text.setter + def comment_text(self, val): + if val is None: + del self.comment_text + return + val = self._comment_text_validator.validate(val) + self._comment_text_value = val + self._comment_text_present = True + + @comment_text.deleter + def comment_text(self): + self._comment_text_value = None + self._comment_text_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseResolveCommentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseResolveCommentDetails(event_uuid={!r}, comment_text={!r})'.format( + self._event_uuid_value, + self._comment_text_value, + ) + +ShowcaseResolveCommentDetails_validator = bv.Struct(ShowcaseResolveCommentDetails) + +class ShowcaseResolveCommentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseResolveCommentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseResolveCommentType(description={!r})'.format( + self._description_value, + ) + +ShowcaseResolveCommentType_validator = bv.Struct(ShowcaseResolveCommentType) + +class ShowcaseRestoredDetails(bb.Struct): + """ + Unarchived showcase. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseRestoredDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseRestoredDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcaseRestoredDetails_validator = bv.Struct(ShowcaseRestoredDetails) + +class ShowcaseRestoredType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseRestoredType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseRestoredType(description={!r})'.format( + self._description_value, + ) + +ShowcaseRestoredType_validator = bv.Struct(ShowcaseRestoredType) + +class ShowcaseTrashedDeprecatedDetails(bb.Struct): + """ + Deleted showcase (old version). + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseTrashedDeprecatedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseTrashedDeprecatedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcaseTrashedDeprecatedDetails_validator = bv.Struct(ShowcaseTrashedDeprecatedDetails) + +class ShowcaseTrashedDeprecatedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseTrashedDeprecatedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseTrashedDeprecatedType(description={!r})'.format( + self._description_value, + ) + +ShowcaseTrashedDeprecatedType_validator = bv.Struct(ShowcaseTrashedDeprecatedType) + +class ShowcaseTrashedDetails(bb.Struct): + """ + Deleted showcase. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseTrashedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseTrashedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcaseTrashedDetails_validator = bv.Struct(ShowcaseTrashedDetails) + +class ShowcaseTrashedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseTrashedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseTrashedType(description={!r})'.format( + self._description_value, + ) + +ShowcaseTrashedType_validator = bv.Struct(ShowcaseTrashedType) + +class ShowcaseUnresolveCommentDetails(bb.Struct): + """ + Unresolved showcase comment. + + :ivar event_uuid: Event unique identifier. + :ivar comment_text: Comment text. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + '_comment_text_value', + '_comment_text_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None, + comment_text=None): + self._event_uuid_value = None + self._event_uuid_present = False + self._comment_text_value = None + self._comment_text_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + if comment_text is not None: + self.comment_text = comment_text + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + @property + def comment_text(self): + """ + Comment text. + + :rtype: str + """ + if self._comment_text_present: + return self._comment_text_value + else: + return None + + @comment_text.setter + def comment_text(self, val): + if val is None: + del self.comment_text + return + val = self._comment_text_validator.validate(val) + self._comment_text_value = val + self._comment_text_present = True + + @comment_text.deleter + def comment_text(self): + self._comment_text_value = None + self._comment_text_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseUnresolveCommentDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseUnresolveCommentDetails(event_uuid={!r}, comment_text={!r})'.format( + self._event_uuid_value, + self._comment_text_value, + ) + +ShowcaseUnresolveCommentDetails_validator = bv.Struct(ShowcaseUnresolveCommentDetails) + +class ShowcaseUnresolveCommentType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseUnresolveCommentType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseUnresolveCommentType(description={!r})'.format( + self._description_value, + ) + +ShowcaseUnresolveCommentType_validator = bv.Struct(ShowcaseUnresolveCommentType) + +class ShowcaseUntrashedDeprecatedDetails(bb.Struct): + """ + Restored showcase (old version). + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseUntrashedDeprecatedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseUntrashedDeprecatedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcaseUntrashedDeprecatedDetails_validator = bv.Struct(ShowcaseUntrashedDeprecatedDetails) + +class ShowcaseUntrashedDeprecatedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseUntrashedDeprecatedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseUntrashedDeprecatedType(description={!r})'.format( + self._description_value, + ) + +ShowcaseUntrashedDeprecatedType_validator = bv.Struct(ShowcaseUntrashedDeprecatedType) + +class ShowcaseUntrashedDetails(bb.Struct): + """ + Restored showcase. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseUntrashedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseUntrashedDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcaseUntrashedDetails_validator = bv.Struct(ShowcaseUntrashedDetails) + +class ShowcaseUntrashedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseUntrashedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseUntrashedType(description={!r})'.format( + self._description_value, + ) + +ShowcaseUntrashedType_validator = bv.Struct(ShowcaseUntrashedType) + +class ShowcaseViewDetails(bb.Struct): + """ + Viewed showcase. + + :ivar event_uuid: Event unique identifier. + """ + + __slots__ = [ + '_event_uuid_value', + '_event_uuid_present', + ] + + _has_required_fields = True + + def __init__(self, + event_uuid=None): + self._event_uuid_value = None + self._event_uuid_present = False + if event_uuid is not None: + self.event_uuid = event_uuid + + @property + def event_uuid(self): + """ + Event unique identifier. + + :rtype: str + """ + if self._event_uuid_present: + return self._event_uuid_value + else: + raise AttributeError("missing required field 'event_uuid'") + + @event_uuid.setter + def event_uuid(self, val): + val = self._event_uuid_validator.validate(val) + self._event_uuid_value = val + self._event_uuid_present = True + + @event_uuid.deleter + def event_uuid(self): + self._event_uuid_value = None + self._event_uuid_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseViewDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseViewDetails(event_uuid={!r})'.format( + self._event_uuid_value, + ) + +ShowcaseViewDetails_validator = bv.Struct(ShowcaseViewDetails) + +class ShowcaseViewType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseViewType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseViewType(description={!r})'.format( + self._description_value, + ) + +ShowcaseViewType_validator = bv.Struct(ShowcaseViewType) + +class SignInAsSessionEndDetails(bb.Struct): + """ + Ended admin sign-in-as session. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(SignInAsSessionEndDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SignInAsSessionEndDetails()' + +SignInAsSessionEndDetails_validator = bv.Struct(SignInAsSessionEndDetails) + +class SignInAsSessionEndType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SignInAsSessionEndType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SignInAsSessionEndType(description={!r})'.format( + self._description_value, + ) + +SignInAsSessionEndType_validator = bv.Struct(SignInAsSessionEndType) + +class SignInAsSessionStartDetails(bb.Struct): + """ + Started admin sign-in-as session. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(SignInAsSessionStartDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SignInAsSessionStartDetails()' + +SignInAsSessionStartDetails_validator = bv.Struct(SignInAsSessionStartDetails) + +class SignInAsSessionStartType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SignInAsSessionStartType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SignInAsSessionStartType(description={!r})'.format( + self._description_value, + ) + +SignInAsSessionStartType_validator = bv.Struct(SignInAsSessionStartType) + +class SmartSyncChangePolicyDetails(bb.Struct): + """ + Changed default Smart Sync setting for team members. + + :ivar new_value: New smart sync policy. + :ivar previous_value: Previous smart sync policy. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = False + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New smart sync policy. + + :rtype: team_policies.SmartSyncPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + return None + + @new_value.setter + def new_value(self, val): + if val is None: + del self.new_value + return + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous smart sync policy. + + :rtype: team_policies.SmartSyncPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SmartSyncChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SmartSyncChangePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +SmartSyncChangePolicyDetails_validator = bv.Struct(SmartSyncChangePolicyDetails) + +class SmartSyncChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SmartSyncChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SmartSyncChangePolicyType(description={!r})'.format( + self._description_value, + ) + +SmartSyncChangePolicyType_validator = bv.Struct(SmartSyncChangePolicyType) + +class SmartSyncCreateAdminPrivilegeReportDetails(bb.Struct): + """ + Created Smart Sync non-admin devices report. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(SmartSyncCreateAdminPrivilegeReportDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SmartSyncCreateAdminPrivilegeReportDetails()' + +SmartSyncCreateAdminPrivilegeReportDetails_validator = bv.Struct(SmartSyncCreateAdminPrivilegeReportDetails) + +class SmartSyncCreateAdminPrivilegeReportType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SmartSyncCreateAdminPrivilegeReportType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SmartSyncCreateAdminPrivilegeReportType(description={!r})'.format( + self._description_value, + ) + +SmartSyncCreateAdminPrivilegeReportType_validator = bv.Struct(SmartSyncCreateAdminPrivilegeReportType) + +class SmartSyncNotOptOutDetails(bb.Struct): + """ + Opted team into Smart Sync. + + :ivar previous_value: Previous Smart Sync opt out policy. + :ivar new_value: New Smart Sync opt out policy. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + previous_value=None, + new_value=None): + self._previous_value_value = None + self._previous_value_present = False + self._new_value_value = None + self._new_value_present = False + if previous_value is not None: + self.previous_value = previous_value + if new_value is not None: + self.new_value = new_value + + @property + def previous_value(self): + """ + Previous Smart Sync opt out policy. + + :rtype: SmartSyncOptOutPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + @property + def new_value(self): + """ + New Smart Sync opt out policy. + + :rtype: SmartSyncOptOutPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SmartSyncNotOptOutDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SmartSyncNotOptOutDetails(previous_value={!r}, new_value={!r})'.format( + self._previous_value_value, + self._new_value_value, + ) + +SmartSyncNotOptOutDetails_validator = bv.Struct(SmartSyncNotOptOutDetails) + +class SmartSyncNotOptOutType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SmartSyncNotOptOutType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SmartSyncNotOptOutType(description={!r})'.format( + self._description_value, + ) + +SmartSyncNotOptOutType_validator = bv.Struct(SmartSyncNotOptOutType) + +class SmartSyncOptOutDetails(bb.Struct): + """ + Opted team out of Smart Sync. + + :ivar previous_value: Previous Smart Sync opt out policy. + :ivar new_value: New Smart Sync opt out policy. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + previous_value=None, + new_value=None): + self._previous_value_value = None + self._previous_value_present = False + self._new_value_value = None + self._new_value_present = False + if previous_value is not None: + self.previous_value = previous_value + if new_value is not None: + self.new_value = new_value + + @property + def previous_value(self): + """ + Previous Smart Sync opt out policy. + + :rtype: SmartSyncOptOutPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + @property + def new_value(self): + """ + New Smart Sync opt out policy. + + :rtype: SmartSyncOptOutPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SmartSyncOptOutDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SmartSyncOptOutDetails(previous_value={!r}, new_value={!r})'.format( + self._previous_value_value, + self._new_value_value, + ) + +SmartSyncOptOutDetails_validator = bv.Struct(SmartSyncOptOutDetails) + +class SmartSyncOptOutPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + default = None + # Attribute is overwritten below the class definition + opted_out = None + # Attribute is overwritten below the class definition + other = None + + def is_default(self): + """ + Check if the union tag is ``default``. + + :rtype: bool + """ + return self._tag == 'default' + + def is_opted_out(self): + """ + Check if the union tag is ``opted_out``. + + :rtype: bool + """ + return self._tag == 'opted_out' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SmartSyncOptOutPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SmartSyncOptOutPolicy(%r, %r)' % (self._tag, self._value) + +SmartSyncOptOutPolicy_validator = bv.Union(SmartSyncOptOutPolicy) + +class SmartSyncOptOutType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SmartSyncOptOutType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SmartSyncOptOutType(description={!r})'.format( + self._description_value, + ) + +SmartSyncOptOutType_validator = bv.Struct(SmartSyncOptOutType) + +class SpaceCapsType(bb.Union): + """ + Space limit alert policy + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + hard = None + # Attribute is overwritten below the class definition + off = None + # Attribute is overwritten below the class definition + soft = None + # Attribute is overwritten below the class definition + other = None + + def is_hard(self): + """ + Check if the union tag is ``hard``. + + :rtype: bool + """ + return self._tag == 'hard' + + def is_off(self): + """ + Check if the union tag is ``off``. + + :rtype: bool + """ + return self._tag == 'off' + + def is_soft(self): + """ + Check if the union tag is ``soft``. + + :rtype: bool + """ + return self._tag == 'soft' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SpaceCapsType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SpaceCapsType(%r, %r)' % (self._tag, self._value) + +SpaceCapsType_validator = bv.Union(SpaceCapsType) + +class SpaceLimitsStatus(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + within_quota = None + # Attribute is overwritten below the class definition + near_quota = None + # Attribute is overwritten below the class definition + over_quota = None + # Attribute is overwritten below the class definition + other = None + + def is_within_quota(self): + """ + Check if the union tag is ``within_quota``. + + :rtype: bool + """ + return self._tag == 'within_quota' + + def is_near_quota(self): + """ + Check if the union tag is ``near_quota``. + + :rtype: bool + """ + return self._tag == 'near_quota' + + def is_over_quota(self): + """ + Check if the union tag is ``over_quota``. + + :rtype: bool + """ + return self._tag == 'over_quota' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SpaceLimitsStatus, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SpaceLimitsStatus(%r, %r)' % (self._tag, self._value) + +SpaceLimitsStatus_validator = bv.Union(SpaceLimitsStatus) + +class SsoAddCertDetails(bb.Struct): + """ + Added X.509 certificate for SSO. + + :ivar certificate_details: SSO certificate details. + """ + + __slots__ = [ + '_certificate_details_value', + '_certificate_details_present', + ] + + _has_required_fields = True + + def __init__(self, + certificate_details=None): + self._certificate_details_value = None + self._certificate_details_present = False + if certificate_details is not None: + self.certificate_details = certificate_details + + @property + def certificate_details(self): + """ + SSO certificate details. + + :rtype: Certificate + """ + if self._certificate_details_present: + return self._certificate_details_value + else: + raise AttributeError("missing required field 'certificate_details'") + + @certificate_details.setter + def certificate_details(self, val): + self._certificate_details_validator.validate_type_only(val) + self._certificate_details_value = val + self._certificate_details_present = True + + @certificate_details.deleter + def certificate_details(self): + self._certificate_details_value = None + self._certificate_details_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoAddCertDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoAddCertDetails(certificate_details={!r})'.format( + self._certificate_details_value, + ) + +SsoAddCertDetails_validator = bv.Struct(SsoAddCertDetails) + +class SsoAddCertType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoAddCertType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoAddCertType(description={!r})'.format( + self._description_value, + ) + +SsoAddCertType_validator = bv.Struct(SsoAddCertType) + +class SsoAddLoginUrlDetails(bb.Struct): + """ + Added sign-in URL for SSO. + + :ivar new_value: New single sign-on login URL. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None): + self._new_value_value = None + self._new_value_present = False + if new_value is not None: + self.new_value = new_value + + @property + def new_value(self): + """ + New single sign-on login URL. + + :rtype: str + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + val = self._new_value_validator.validate(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoAddLoginUrlDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoAddLoginUrlDetails(new_value={!r})'.format( + self._new_value_value, + ) + +SsoAddLoginUrlDetails_validator = bv.Struct(SsoAddLoginUrlDetails) + +class SsoAddLoginUrlType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoAddLoginUrlType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoAddLoginUrlType(description={!r})'.format( + self._description_value, + ) + +SsoAddLoginUrlType_validator = bv.Struct(SsoAddLoginUrlType) + +class SsoAddLogoutUrlDetails(bb.Struct): + """ + Added sign-out URL for SSO. + + :ivar new_value: New single sign-on logout URL. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = False + + def __init__(self, + new_value=None): + self._new_value_value = None + self._new_value_present = False + if new_value is not None: + self.new_value = new_value + + @property + def new_value(self): + """ + New single sign-on logout URL. Might be missing due to historical data + gap. + + :rtype: str + """ + if self._new_value_present: + return self._new_value_value + else: + return None + + @new_value.setter + def new_value(self, val): + if val is None: + del self.new_value + return + val = self._new_value_validator.validate(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoAddLogoutUrlDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoAddLogoutUrlDetails(new_value={!r})'.format( + self._new_value_value, + ) + +SsoAddLogoutUrlDetails_validator = bv.Struct(SsoAddLogoutUrlDetails) + +class SsoAddLogoutUrlType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoAddLogoutUrlType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoAddLogoutUrlType(description={!r})'.format( + self._description_value, + ) + +SsoAddLogoutUrlType_validator = bv.Struct(SsoAddLogoutUrlType) + +class SsoChangeCertDetails(bb.Struct): + """ + Changed X.509 certificate for SSO. + + :ivar previous_certificate_details: Previous SSO certificate details. Might + be missing due to historical data gap. + :ivar new_certificate_details: New SSO certificate details. + """ + + __slots__ = [ + '_previous_certificate_details_value', + '_previous_certificate_details_present', + '_new_certificate_details_value', + '_new_certificate_details_present', + ] + + _has_required_fields = True + + def __init__(self, + new_certificate_details=None, + previous_certificate_details=None): + self._previous_certificate_details_value = None + self._previous_certificate_details_present = False + self._new_certificate_details_value = None + self._new_certificate_details_present = False + if previous_certificate_details is not None: + self.previous_certificate_details = previous_certificate_details + if new_certificate_details is not None: + self.new_certificate_details = new_certificate_details + + @property + def previous_certificate_details(self): + """ + Previous SSO certificate details. Might be missing due to historical + data gap. + + :rtype: Certificate + """ + if self._previous_certificate_details_present: + return self._previous_certificate_details_value + else: + return None + + @previous_certificate_details.setter + def previous_certificate_details(self, val): + if val is None: + del self.previous_certificate_details + return + self._previous_certificate_details_validator.validate_type_only(val) + self._previous_certificate_details_value = val + self._previous_certificate_details_present = True + + @previous_certificate_details.deleter + def previous_certificate_details(self): + self._previous_certificate_details_value = None + self._previous_certificate_details_present = False + + @property + def new_certificate_details(self): + """ + New SSO certificate details. + + :rtype: Certificate + """ + if self._new_certificate_details_present: + return self._new_certificate_details_value + else: + raise AttributeError("missing required field 'new_certificate_details'") + + @new_certificate_details.setter + def new_certificate_details(self, val): + self._new_certificate_details_validator.validate_type_only(val) + self._new_certificate_details_value = val + self._new_certificate_details_present = True + + @new_certificate_details.deleter + def new_certificate_details(self): + self._new_certificate_details_value = None + self._new_certificate_details_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoChangeCertDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoChangeCertDetails(new_certificate_details={!r}, previous_certificate_details={!r})'.format( + self._new_certificate_details_value, + self._previous_certificate_details_value, + ) + +SsoChangeCertDetails_validator = bv.Struct(SsoChangeCertDetails) + +class SsoChangeCertType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoChangeCertType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoChangeCertType(description={!r})'.format( + self._description_value, + ) + +SsoChangeCertType_validator = bv.Struct(SsoChangeCertType) + +class SsoChangeLoginUrlDetails(bb.Struct): + """ + Changed sign-in URL for SSO. + + :ivar previous_value: Previous single sign-on login URL. + :ivar new_value: New single sign-on login URL. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + previous_value=None, + new_value=None): + self._previous_value_value = None + self._previous_value_present = False + self._new_value_value = None + self._new_value_present = False + if previous_value is not None: + self.previous_value = previous_value + if new_value is not None: + self.new_value = new_value + + @property + def previous_value(self): + """ + Previous single sign-on login URL. + + :rtype: str + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + val = self._previous_value_validator.validate(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + @property + def new_value(self): + """ + New single sign-on login URL. + + :rtype: str + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + val = self._new_value_validator.validate(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoChangeLoginUrlDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoChangeLoginUrlDetails(previous_value={!r}, new_value={!r})'.format( + self._previous_value_value, + self._new_value_value, + ) + +SsoChangeLoginUrlDetails_validator = bv.Struct(SsoChangeLoginUrlDetails) + +class SsoChangeLoginUrlType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoChangeLoginUrlType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoChangeLoginUrlType(description={!r})'.format( + self._description_value, + ) + +SsoChangeLoginUrlType_validator = bv.Struct(SsoChangeLoginUrlType) + +class SsoChangeLogoutUrlDetails(bb.Struct): + """ + Changed sign-out URL for SSO. + + :ivar previous_value: Previous single sign-on logout URL. Might be missing + due to historical data gap. + :ivar new_value: New single sign-on logout URL. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = False + + def __init__(self, + previous_value=None, + new_value=None): + self._previous_value_value = None + self._previous_value_present = False + self._new_value_value = None + self._new_value_present = False + if previous_value is not None: + self.previous_value = previous_value + if new_value is not None: + self.new_value = new_value + + @property + def previous_value(self): + """ + Previous single sign-on logout URL. Might be missing due to historical + data gap. + + :rtype: str + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + val = self._previous_value_validator.validate(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + @property + def new_value(self): + """ + New single sign-on logout URL. Might be missing due to historical data + gap. + + :rtype: str + """ + if self._new_value_present: + return self._new_value_value + else: + return None + + @new_value.setter + def new_value(self, val): + if val is None: + del self.new_value + return + val = self._new_value_validator.validate(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoChangeLogoutUrlDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoChangeLogoutUrlDetails(previous_value={!r}, new_value={!r})'.format( + self._previous_value_value, + self._new_value_value, + ) + +SsoChangeLogoutUrlDetails_validator = bv.Struct(SsoChangeLogoutUrlDetails) + +class SsoChangeLogoutUrlType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoChangeLogoutUrlType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoChangeLogoutUrlType(description={!r})'.format( + self._description_value, + ) + +SsoChangeLogoutUrlType_validator = bv.Struct(SsoChangeLogoutUrlType) + +class SsoChangePolicyDetails(bb.Struct): + """ + Changed single sign-on setting for team. + + :ivar new_value: New single sign-on policy. + :ivar previous_value: Previous single sign-on policy. Might be missing due + to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New single sign-on policy. + + :rtype: team_policies.SsoPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous single sign-on policy. Might be missing due to historical data + gap. + + :rtype: team_policies.SsoPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoChangePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +SsoChangePolicyDetails_validator = bv.Struct(SsoChangePolicyDetails) + +class SsoChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoChangePolicyType(description={!r})'.format( + self._description_value, + ) + +SsoChangePolicyType_validator = bv.Struct(SsoChangePolicyType) + +class SsoChangeSamlIdentityModeDetails(bb.Struct): + """ + Changed SAML identity mode for SSO. + + :ivar previous_value: Previous single sign-on identity mode. + :ivar new_value: New single sign-on identity mode. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + previous_value=None, + new_value=None): + self._previous_value_value = None + self._previous_value_present = False + self._new_value_value = None + self._new_value_present = False + if previous_value is not None: + self.previous_value = previous_value + if new_value is not None: + self.new_value = new_value + + @property + def previous_value(self): + """ + Previous single sign-on identity mode. + + :rtype: int + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + val = self._previous_value_validator.validate(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + @property + def new_value(self): + """ + New single sign-on identity mode. + + :rtype: int + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + val = self._new_value_validator.validate(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoChangeSamlIdentityModeDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoChangeSamlIdentityModeDetails(previous_value={!r}, new_value={!r})'.format( + self._previous_value_value, + self._new_value_value, + ) + +SsoChangeSamlIdentityModeDetails_validator = bv.Struct(SsoChangeSamlIdentityModeDetails) + +class SsoChangeSamlIdentityModeType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoChangeSamlIdentityModeType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoChangeSamlIdentityModeType(description={!r})'.format( + self._description_value, + ) + +SsoChangeSamlIdentityModeType_validator = bv.Struct(SsoChangeSamlIdentityModeType) + +class SsoErrorDetails(bb.Struct): + """ + Failed to sign in via SSO. + + :ivar error_details: Error details. + """ + + __slots__ = [ + '_error_details_value', + '_error_details_present', + ] + + _has_required_fields = True + + def __init__(self, + error_details=None): + self._error_details_value = None + self._error_details_present = False + if error_details is not None: + self.error_details = error_details + + @property + def error_details(self): + """ + Error details. + + :rtype: FailureDetailsLogInfo + """ + if self._error_details_present: + return self._error_details_value + else: + raise AttributeError("missing required field 'error_details'") + + @error_details.setter + def error_details(self, val): + self._error_details_validator.validate_type_only(val) + self._error_details_value = val + self._error_details_present = True + + @error_details.deleter + def error_details(self): + self._error_details_value = None + self._error_details_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoErrorDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoErrorDetails(error_details={!r})'.format( + self._error_details_value, + ) + +SsoErrorDetails_validator = bv.Struct(SsoErrorDetails) + +class SsoErrorType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoErrorType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoErrorType(description={!r})'.format( + self._description_value, + ) + +SsoErrorType_validator = bv.Struct(SsoErrorType) + +class SsoRemoveCertDetails(bb.Struct): + """ + Removed X.509 certificate for SSO. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoRemoveCertDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoRemoveCertDetails()' + +SsoRemoveCertDetails_validator = bv.Struct(SsoRemoveCertDetails) + +class SsoRemoveCertType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoRemoveCertType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoRemoveCertType(description={!r})'.format( + self._description_value, + ) + +SsoRemoveCertType_validator = bv.Struct(SsoRemoveCertType) + +class SsoRemoveLoginUrlDetails(bb.Struct): + """ + Removed sign-in URL for SSO. + + :ivar previous_value: Previous single sign-on login URL. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + previous_value=None): + self._previous_value_value = None + self._previous_value_present = False + if previous_value is not None: + self.previous_value = previous_value + + @property + def previous_value(self): + """ + Previous single sign-on login URL. + + :rtype: str + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + val = self._previous_value_validator.validate(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoRemoveLoginUrlDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoRemoveLoginUrlDetails(previous_value={!r})'.format( + self._previous_value_value, + ) + +SsoRemoveLoginUrlDetails_validator = bv.Struct(SsoRemoveLoginUrlDetails) + +class SsoRemoveLoginUrlType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoRemoveLoginUrlType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoRemoveLoginUrlType(description={!r})'.format( + self._description_value, + ) + +SsoRemoveLoginUrlType_validator = bv.Struct(SsoRemoveLoginUrlType) + +class SsoRemoveLogoutUrlDetails(bb.Struct): + """ + Removed sign-out URL for SSO. + + :ivar previous_value: Previous single sign-on logout URL. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + previous_value=None): + self._previous_value_value = None + self._previous_value_present = False + if previous_value is not None: + self.previous_value = previous_value + + @property + def previous_value(self): + """ + Previous single sign-on logout URL. + + :rtype: str + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + val = self._previous_value_validator.validate(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoRemoveLogoutUrlDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoRemoveLogoutUrlDetails(previous_value={!r})'.format( + self._previous_value_value, + ) + +SsoRemoveLogoutUrlDetails_validator = bv.Struct(SsoRemoveLogoutUrlDetails) + +class SsoRemoveLogoutUrlType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoRemoveLogoutUrlType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoRemoveLogoutUrlType(description={!r})'.format( + self._description_value, + ) + +SsoRemoveLogoutUrlType_validator = bv.Struct(SsoRemoveLogoutUrlType) + +class TeamActivityCreateReportDetails(bb.Struct): + """ + Created team activity report. + + :ivar start_date: Report start date. + :ivar end_date: Report end date. + """ + + __slots__ = [ + '_start_date_value', + '_start_date_present', + '_end_date_value', + '_end_date_present', + ] + + _has_required_fields = True + + def __init__(self, + start_date=None, + end_date=None): + self._start_date_value = None + self._start_date_present = False + self._end_date_value = None + self._end_date_present = False + if start_date is not None: + self.start_date = start_date + if end_date is not None: + self.end_date = end_date + + @property + def start_date(self): + """ + Report start date. + + :rtype: datetime.datetime + """ + if self._start_date_present: + return self._start_date_value + else: + raise AttributeError("missing required field 'start_date'") + + @start_date.setter + def start_date(self, val): + val = self._start_date_validator.validate(val) + self._start_date_value = val + self._start_date_present = True + + @start_date.deleter + def start_date(self): + self._start_date_value = None + self._start_date_present = False + + @property + def end_date(self): + """ + Report end date. + + :rtype: datetime.datetime + """ + if self._end_date_present: + return self._end_date_value + else: + raise AttributeError("missing required field 'end_date'") + + @end_date.setter + def end_date(self, val): + val = self._end_date_validator.validate(val) + self._end_date_value = val + self._end_date_present = True + + @end_date.deleter + def end_date(self): + self._end_date_value = None + self._end_date_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamActivityCreateReportDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamActivityCreateReportDetails(start_date={!r}, end_date={!r})'.format( + self._start_date_value, + self._end_date_value, + ) + +TeamActivityCreateReportDetails_validator = bv.Struct(TeamActivityCreateReportDetails) + +class TeamActivityCreateReportType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamActivityCreateReportType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamActivityCreateReportType(description={!r})'.format( + self._description_value, + ) + +TeamActivityCreateReportType_validator = bv.Struct(TeamActivityCreateReportType) + +class TeamEvent(bb.Struct): + """ + An audit log event. + + :ivar timestamp: The Dropbox timestamp representing when the action was + taken. + :ivar event_category: The category that this type of action belongs to. + :ivar actor: The entity who actually performed the action. Might be missing + due to historical data gap. + :ivar origin: The origin from which the actor performed the action including + information about host, ip address, location, session, etc. If the + action was performed programmatically via the API the origin represents + the API client. + :ivar involve_non_team_member: True if the action involved a non team member + either as the actor or as one of the affected users. Might be missing + due to historical data gap. + :ivar context: The user or team on whose behalf the actor performed the + action. Might be missing due to historical data gap. + :ivar participants: Zero or more users and/or groups that are affected by + the action. Note that this list doesn't include any actors or users in + context. + :ivar assets: Zero or more content assets involved in the action. Currently + these include Dropbox files and folders but in the future we might add + other asset types such as Paper documents, folders, projects, etc. + :ivar event_type: The particular type of action taken. + :ivar details: The variable event schema applicable to this type of action, + instantiated with respect to this particular action. + """ + + __slots__ = [ + '_timestamp_value', + '_timestamp_present', + '_event_category_value', + '_event_category_present', + '_actor_value', + '_actor_present', + '_origin_value', + '_origin_present', + '_involve_non_team_member_value', + '_involve_non_team_member_present', + '_context_value', + '_context_present', + '_participants_value', + '_participants_present', + '_assets_value', + '_assets_present', + '_event_type_value', + '_event_type_present', + '_details_value', + '_details_present', + ] + + _has_required_fields = True + + def __init__(self, + timestamp=None, + event_category=None, + event_type=None, + details=None, + actor=None, + origin=None, + involve_non_team_member=None, + context=None, + participants=None, + assets=None): + self._timestamp_value = None + self._timestamp_present = False + self._event_category_value = None + self._event_category_present = False + self._actor_value = None + self._actor_present = False + self._origin_value = None + self._origin_present = False + self._involve_non_team_member_value = None + self._involve_non_team_member_present = False + self._context_value = None + self._context_present = False + self._participants_value = None + self._participants_present = False + self._assets_value = None + self._assets_present = False + self._event_type_value = None + self._event_type_present = False + self._details_value = None + self._details_present = False + if timestamp is not None: + self.timestamp = timestamp + if event_category is not None: + self.event_category = event_category + if actor is not None: + self.actor = actor + if origin is not None: + self.origin = origin + if involve_non_team_member is not None: + self.involve_non_team_member = involve_non_team_member + if context is not None: + self.context = context + if participants is not None: + self.participants = participants + if assets is not None: + self.assets = assets + if event_type is not None: + self.event_type = event_type + if details is not None: + self.details = details + + @property + def timestamp(self): + """ + The Dropbox timestamp representing when the action was taken. + + :rtype: datetime.datetime + """ + if self._timestamp_present: + return self._timestamp_value + else: + raise AttributeError("missing required field 'timestamp'") + + @timestamp.setter + def timestamp(self, val): + val = self._timestamp_validator.validate(val) + self._timestamp_value = val + self._timestamp_present = True + + @timestamp.deleter + def timestamp(self): + self._timestamp_value = None + self._timestamp_present = False + + @property + def event_category(self): + """ + The category that this type of action belongs to. + + :rtype: EventCategory + """ + if self._event_category_present: + return self._event_category_value + else: + raise AttributeError("missing required field 'event_category'") + + @event_category.setter + def event_category(self, val): + self._event_category_validator.validate_type_only(val) + self._event_category_value = val + self._event_category_present = True + + @event_category.deleter + def event_category(self): + self._event_category_value = None + self._event_category_present = False + + @property + def actor(self): + """ + The entity who actually performed the action. Might be missing due to + historical data gap. + + :rtype: ActorLogInfo + """ + if self._actor_present: + return self._actor_value + else: + return None + + @actor.setter + def actor(self, val): + if val is None: + del self.actor + return + self._actor_validator.validate_type_only(val) + self._actor_value = val + self._actor_present = True + + @actor.deleter + def actor(self): + self._actor_value = None + self._actor_present = False + + @property + def origin(self): + """ + The origin from which the actor performed the action including + information about host, ip address, location, session, etc. If the + action was performed programmatically via the API the origin represents + the API client. + + :rtype: OriginLogInfo + """ + if self._origin_present: + return self._origin_value + else: + return None + + @origin.setter + def origin(self, val): + if val is None: + del self.origin + return + self._origin_validator.validate_type_only(val) + self._origin_value = val + self._origin_present = True + + @origin.deleter + def origin(self): + self._origin_value = None + self._origin_present = False + + @property + def involve_non_team_member(self): + """ + True if the action involved a non team member either as the actor or as + one of the affected users. Might be missing due to historical data gap. + + :rtype: bool + """ + if self._involve_non_team_member_present: + return self._involve_non_team_member_value + else: + return None + + @involve_non_team_member.setter + def involve_non_team_member(self, val): + if val is None: + del self.involve_non_team_member + return + val = self._involve_non_team_member_validator.validate(val) + self._involve_non_team_member_value = val + self._involve_non_team_member_present = True + + @involve_non_team_member.deleter + def involve_non_team_member(self): + self._involve_non_team_member_value = None + self._involve_non_team_member_present = False + + @property + def context(self): + """ + The user or team on whose behalf the actor performed the action. Might + be missing due to historical data gap. + + :rtype: ContextLogInfo + """ + if self._context_present: + return self._context_value + else: + return None + + @context.setter + def context(self, val): + if val is None: + del self.context + return + self._context_validator.validate_type_only(val) + self._context_value = val + self._context_present = True + + @context.deleter + def context(self): + self._context_value = None + self._context_present = False + + @property + def participants(self): + """ + Zero or more users and/or groups that are affected by the action. Note + that this list doesn't include any actors or users in context. + + :rtype: list of [ParticipantLogInfo] + """ + if self._participants_present: + return self._participants_value + else: + return None + + @participants.setter + def participants(self, val): + if val is None: + del self.participants + return + val = self._participants_validator.validate(val) + self._participants_value = val + self._participants_present = True + + @participants.deleter + def participants(self): + self._participants_value = None + self._participants_present = False + + @property + def assets(self): + """ + Zero or more content assets involved in the action. Currently these + include Dropbox files and folders but in the future we might add other + asset types such as Paper documents, folders, projects, etc. + + :rtype: list of [AssetLogInfo] + """ + if self._assets_present: + return self._assets_value + else: + return None + + @assets.setter + def assets(self, val): + if val is None: + del self.assets + return + val = self._assets_validator.validate(val) + self._assets_value = val + self._assets_present = True + + @assets.deleter + def assets(self): + self._assets_value = None + self._assets_present = False + + @property + def event_type(self): + """ + The particular type of action taken. + + :rtype: EventType + """ + if self._event_type_present: + return self._event_type_value + else: + raise AttributeError("missing required field 'event_type'") + + @event_type.setter + def event_type(self, val): + self._event_type_validator.validate_type_only(val) + self._event_type_value = val + self._event_type_present = True + + @event_type.deleter + def event_type(self): + self._event_type_value = None + self._event_type_present = False + + @property + def details(self): + """ + The variable event schema applicable to this type of action, + instantiated with respect to this particular action. + + :rtype: EventDetails + """ + if self._details_present: + return self._details_value + else: + raise AttributeError("missing required field 'details'") + + @details.setter + def details(self, val): + self._details_validator.validate_type_only(val) + self._details_value = val + self._details_present = True + + @details.deleter + def details(self): + self._details_value = None + self._details_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamEvent, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamEvent(timestamp={!r}, event_category={!r}, event_type={!r}, details={!r}, actor={!r}, origin={!r}, involve_non_team_member={!r}, context={!r}, participants={!r}, assets={!r})'.format( + self._timestamp_value, + self._event_category_value, + self._event_type_value, + self._details_value, + self._actor_value, + self._origin_value, + self._involve_non_team_member_value, + self._context_value, + self._participants_value, + self._assets_value, + ) + +TeamEvent_validator = bv.Struct(TeamEvent) + +class TeamFolderChangeStatusDetails(bb.Struct): + """ + Changed archival status of team folder. + + :ivar new_value: New team folder status. + :ivar previous_value: Previous team folder status. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New team folder status. + + :rtype: team.TeamFolderStatus + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous team folder status. Might be missing due to historical data + gap. + + :rtype: team.TeamFolderStatus + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderChangeStatusDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderChangeStatusDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +TeamFolderChangeStatusDetails_validator = bv.Struct(TeamFolderChangeStatusDetails) + +class TeamFolderChangeStatusType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderChangeStatusType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderChangeStatusType(description={!r})'.format( + self._description_value, + ) + +TeamFolderChangeStatusType_validator = bv.Struct(TeamFolderChangeStatusType) + +class TeamFolderCreateDetails(bb.Struct): + """ + Created team folder in active status. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderCreateDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderCreateDetails()' + +TeamFolderCreateDetails_validator = bv.Struct(TeamFolderCreateDetails) + +class TeamFolderCreateType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderCreateType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderCreateType(description={!r})'.format( + self._description_value, + ) + +TeamFolderCreateType_validator = bv.Struct(TeamFolderCreateType) + +class TeamFolderDowngradeDetails(bb.Struct): + """ + Downgraded team folder to regular shared folder. + + :ivar target_asset_index: Target asset position in the Assets list. + """ + + __slots__ = [ + '_target_asset_index_value', + '_target_asset_index_present', + ] + + _has_required_fields = True + + def __init__(self, + target_asset_index=None): + self._target_asset_index_value = None + self._target_asset_index_present = False + if target_asset_index is not None: + self.target_asset_index = target_asset_index + + @property + def target_asset_index(self): + """ + Target asset position in the Assets list. + + :rtype: int + """ + if self._target_asset_index_present: + return self._target_asset_index_value + else: + raise AttributeError("missing required field 'target_asset_index'") + + @target_asset_index.setter + def target_asset_index(self, val): + val = self._target_asset_index_validator.validate(val) + self._target_asset_index_value = val + self._target_asset_index_present = True + + @target_asset_index.deleter + def target_asset_index(self): + self._target_asset_index_value = None + self._target_asset_index_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderDowngradeDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderDowngradeDetails(target_asset_index={!r})'.format( + self._target_asset_index_value, + ) + +TeamFolderDowngradeDetails_validator = bv.Struct(TeamFolderDowngradeDetails) + +class TeamFolderDowngradeType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderDowngradeType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderDowngradeType(description={!r})'.format( + self._description_value, + ) + +TeamFolderDowngradeType_validator = bv.Struct(TeamFolderDowngradeType) + +class TeamFolderPermanentlyDeleteDetails(bb.Struct): + """ + Permanently deleted archived team folder. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderPermanentlyDeleteDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderPermanentlyDeleteDetails()' + +TeamFolderPermanentlyDeleteDetails_validator = bv.Struct(TeamFolderPermanentlyDeleteDetails) + +class TeamFolderPermanentlyDeleteType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderPermanentlyDeleteType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderPermanentlyDeleteType(description={!r})'.format( + self._description_value, + ) + +TeamFolderPermanentlyDeleteType_validator = bv.Struct(TeamFolderPermanentlyDeleteType) + +class TeamFolderRenameDetails(bb.Struct): + """ + Renamed active/archived team folder. + + :ivar previous_folder_name: Previous folder name. + :ivar new_folder_name: New folder name. + """ + + __slots__ = [ + '_previous_folder_name_value', + '_previous_folder_name_present', + '_new_folder_name_value', + '_new_folder_name_present', + ] + + _has_required_fields = True + + def __init__(self, + previous_folder_name=None, + new_folder_name=None): + self._previous_folder_name_value = None + self._previous_folder_name_present = False + self._new_folder_name_value = None + self._new_folder_name_present = False + if previous_folder_name is not None: + self.previous_folder_name = previous_folder_name + if new_folder_name is not None: + self.new_folder_name = new_folder_name + + @property + def previous_folder_name(self): + """ + Previous folder name. + + :rtype: str + """ + if self._previous_folder_name_present: + return self._previous_folder_name_value + else: + raise AttributeError("missing required field 'previous_folder_name'") + + @previous_folder_name.setter + def previous_folder_name(self, val): + val = self._previous_folder_name_validator.validate(val) + self._previous_folder_name_value = val + self._previous_folder_name_present = True + + @previous_folder_name.deleter + def previous_folder_name(self): + self._previous_folder_name_value = None + self._previous_folder_name_present = False + + @property + def new_folder_name(self): + """ + New folder name. + + :rtype: str + """ + if self._new_folder_name_present: + return self._new_folder_name_value + else: + raise AttributeError("missing required field 'new_folder_name'") + + @new_folder_name.setter + def new_folder_name(self, val): + val = self._new_folder_name_validator.validate(val) + self._new_folder_name_value = val + self._new_folder_name_present = True + + @new_folder_name.deleter + def new_folder_name(self): + self._new_folder_name_value = None + self._new_folder_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderRenameDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderRenameDetails(previous_folder_name={!r}, new_folder_name={!r})'.format( + self._previous_folder_name_value, + self._new_folder_name_value, + ) + +TeamFolderRenameDetails_validator = bv.Struct(TeamFolderRenameDetails) + +class TeamFolderRenameType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamFolderRenameType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamFolderRenameType(description={!r})'.format( + self._description_value, + ) + +TeamFolderRenameType_validator = bv.Struct(TeamFolderRenameType) + +class TeamLinkedAppLogInfo(AppLogInfo): + """ + Team linked app + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self, + app_id=None, + display_name=None): + super(TeamLinkedAppLogInfo, self).__init__(app_id, + display_name) + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamLinkedAppLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamLinkedAppLogInfo(app_id={!r}, display_name={!r})'.format( + self._app_id_value, + self._display_name_value, + ) + +TeamLinkedAppLogInfo_validator = bv.Struct(TeamLinkedAppLogInfo) + +class TeamMemberLogInfo(UserLogInfo): + """ + Team member's logged information. + + :ivar team_member_id: Team member ID. Might be missing due to historical + data gap. + :ivar member_external_id: Team member external ID. + """ + + __slots__ = [ + '_team_member_id_value', + '_team_member_id_present', + '_member_external_id_value', + '_member_external_id_present', + ] + + _has_required_fields = False + + def __init__(self, + account_id=None, + display_name=None, + email=None, + team_member_id=None, + member_external_id=None): + super(TeamMemberLogInfo, self).__init__(account_id, + display_name, + email) + self._team_member_id_value = None + self._team_member_id_present = False + self._member_external_id_value = None + self._member_external_id_present = False + if team_member_id is not None: + self.team_member_id = team_member_id + if member_external_id is not None: + self.member_external_id = member_external_id + + @property + def team_member_id(self): + """ + Team member ID. Might be missing due to historical data gap. + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + return None + + @team_member_id.setter + def team_member_id(self, val): + if val is None: + del self.team_member_id + return + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + @property + def member_external_id(self): + """ + Team member external ID. + + :rtype: str + """ + if self._member_external_id_present: + return self._member_external_id_value + else: + return None + + @member_external_id.setter + def member_external_id(self, val): + if val is None: + del self.member_external_id + return + val = self._member_external_id_validator.validate(val) + self._member_external_id_value = val + self._member_external_id_present = True + + @member_external_id.deleter + def member_external_id(self): + self._member_external_id_value = None + self._member_external_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamMemberLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamMemberLogInfo(account_id={!r}, display_name={!r}, email={!r}, team_member_id={!r}, member_external_id={!r})'.format( + self._account_id_value, + self._display_name_value, + self._email_value, + self._team_member_id_value, + self._member_external_id_value, + ) + +TeamMemberLogInfo_validator = bv.Struct(TeamMemberLogInfo) + +class TeamMembershipType(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + free = None + # Attribute is overwritten below the class definition + full = None + # Attribute is overwritten below the class definition + other = None + + def is_free(self): + """ + Check if the union tag is ``free``. + + :rtype: bool + """ + return self._tag == 'free' + + def is_full(self): + """ + Check if the union tag is ``full``. + + :rtype: bool + """ + return self._tag == 'full' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamMembershipType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamMembershipType(%r, %r)' % (self._tag, self._value) + +TeamMembershipType_validator = bv.Union(TeamMembershipType) + +class TeamMergeFromDetails(bb.Struct): + """ + Merged another team into this team. + + :ivar team_name: The name of the team that was merged into this team. + """ + + __slots__ = [ + '_team_name_value', + '_team_name_present', + ] + + _has_required_fields = True + + def __init__(self, + team_name=None): + self._team_name_value = None + self._team_name_present = False + if team_name is not None: + self.team_name = team_name + + @property + def team_name(self): + """ + The name of the team that was merged into this team. + + :rtype: str + """ + if self._team_name_present: + return self._team_name_value + else: + raise AttributeError("missing required field 'team_name'") + + @team_name.setter + def team_name(self, val): + val = self._team_name_validator.validate(val) + self._team_name_value = val + self._team_name_present = True + + @team_name.deleter + def team_name(self): + self._team_name_value = None + self._team_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamMergeFromDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamMergeFromDetails(team_name={!r})'.format( + self._team_name_value, + ) + +TeamMergeFromDetails_validator = bv.Struct(TeamMergeFromDetails) + +class TeamMergeFromType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamMergeFromType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamMergeFromType(description={!r})'.format( + self._description_value, + ) + +TeamMergeFromType_validator = bv.Struct(TeamMergeFromType) + +class TeamMergeToDetails(bb.Struct): + """ + Merged this team into another team. + + :ivar team_name: The name of the team that this team was merged into. + """ + + __slots__ = [ + '_team_name_value', + '_team_name_present', + ] + + _has_required_fields = True + + def __init__(self, + team_name=None): + self._team_name_value = None + self._team_name_present = False + if team_name is not None: + self.team_name = team_name + + @property + def team_name(self): + """ + The name of the team that this team was merged into. + + :rtype: str + """ + if self._team_name_present: + return self._team_name_value + else: + raise AttributeError("missing required field 'team_name'") + + @team_name.setter + def team_name(self, val): + val = self._team_name_validator.validate(val) + self._team_name_value = val + self._team_name_present = True + + @team_name.deleter + def team_name(self): + self._team_name_value = None + self._team_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamMergeToDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamMergeToDetails(team_name={!r})'.format( + self._team_name_value, + ) + +TeamMergeToDetails_validator = bv.Struct(TeamMergeToDetails) + +class TeamMergeToType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamMergeToType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamMergeToType(description={!r})'.format( + self._description_value, + ) + +TeamMergeToType_validator = bv.Struct(TeamMergeToType) + +class TeamName(bb.Struct): + """ + Team name details + + :ivar team_display_name: Team's display name. + :ivar team_legal_name: Team's legal name. + """ + + __slots__ = [ + '_team_display_name_value', + '_team_display_name_present', + '_team_legal_name_value', + '_team_legal_name_present', + ] + + _has_required_fields = True + + def __init__(self, + team_display_name=None, + team_legal_name=None): + self._team_display_name_value = None + self._team_display_name_present = False + self._team_legal_name_value = None + self._team_legal_name_present = False + if team_display_name is not None: + self.team_display_name = team_display_name + if team_legal_name is not None: + self.team_legal_name = team_legal_name + + @property + def team_display_name(self): + """ + Team's display name. + + :rtype: str + """ + if self._team_display_name_present: + return self._team_display_name_value + else: + raise AttributeError("missing required field 'team_display_name'") + + @team_display_name.setter + def team_display_name(self, val): + val = self._team_display_name_validator.validate(val) + self._team_display_name_value = val + self._team_display_name_present = True + + @team_display_name.deleter + def team_display_name(self): + self._team_display_name_value = None + self._team_display_name_present = False + + @property + def team_legal_name(self): + """ + Team's legal name. + + :rtype: str + """ + if self._team_legal_name_present: + return self._team_legal_name_value + else: + raise AttributeError("missing required field 'team_legal_name'") + + @team_legal_name.setter + def team_legal_name(self, val): + val = self._team_legal_name_validator.validate(val) + self._team_legal_name_value = val + self._team_legal_name_present = True + + @team_legal_name.deleter + def team_legal_name(self): + self._team_legal_name_value = None + self._team_legal_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamName, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamName(team_display_name={!r}, team_legal_name={!r})'.format( + self._team_display_name_value, + self._team_legal_name_value, + ) + +TeamName_validator = bv.Struct(TeamName) + +class TeamProfileAddLogoDetails(bb.Struct): + """ + Added team logo to display on shared link headers. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamProfileAddLogoDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamProfileAddLogoDetails()' + +TeamProfileAddLogoDetails_validator = bv.Struct(TeamProfileAddLogoDetails) + +class TeamProfileAddLogoType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamProfileAddLogoType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamProfileAddLogoType(description={!r})'.format( + self._description_value, + ) + +TeamProfileAddLogoType_validator = bv.Struct(TeamProfileAddLogoType) + +class TeamProfileChangeDefaultLanguageDetails(bb.Struct): + """ + Changed default language for team. + + :ivar new_value: New team's default language. + :ivar previous_value: Previous team's default language. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New team's default language. + + :rtype: str + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + val = self._new_value_validator.validate(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous team's default language. + + :rtype: str + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + val = self._previous_value_validator.validate(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamProfileChangeDefaultLanguageDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamProfileChangeDefaultLanguageDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +TeamProfileChangeDefaultLanguageDetails_validator = bv.Struct(TeamProfileChangeDefaultLanguageDetails) + +class TeamProfileChangeDefaultLanguageType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamProfileChangeDefaultLanguageType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamProfileChangeDefaultLanguageType(description={!r})'.format( + self._description_value, + ) + +TeamProfileChangeDefaultLanguageType_validator = bv.Struct(TeamProfileChangeDefaultLanguageType) + +class TeamProfileChangeLogoDetails(bb.Struct): + """ + Changed team logo displayed on shared link headers. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamProfileChangeLogoDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamProfileChangeLogoDetails()' + +TeamProfileChangeLogoDetails_validator = bv.Struct(TeamProfileChangeLogoDetails) + +class TeamProfileChangeLogoType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamProfileChangeLogoType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamProfileChangeLogoType(description={!r})'.format( + self._description_value, + ) + +TeamProfileChangeLogoType_validator = bv.Struct(TeamProfileChangeLogoType) + +class TeamProfileChangeNameDetails(bb.Struct): + """ + Changed team name. + + :ivar previous_value: Previous teams name. Might be missing due to + historical data gap. + :ivar new_value: New team name. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._previous_value_value = None + self._previous_value_present = False + self._new_value_value = None + self._new_value_present = False + if previous_value is not None: + self.previous_value = previous_value + if new_value is not None: + self.new_value = new_value + + @property + def previous_value(self): + """ + Previous teams name. Might be missing due to historical data gap. + + :rtype: TeamName + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + @property + def new_value(self): + """ + New team name. + + :rtype: TeamName + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamProfileChangeNameDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamProfileChangeNameDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +TeamProfileChangeNameDetails_validator = bv.Struct(TeamProfileChangeNameDetails) + +class TeamProfileChangeNameType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamProfileChangeNameType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamProfileChangeNameType(description={!r})'.format( + self._description_value, + ) + +TeamProfileChangeNameType_validator = bv.Struct(TeamProfileChangeNameType) + +class TeamProfileRemoveLogoDetails(bb.Struct): + """ + Removed team logo displayed on shared link headers. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamProfileRemoveLogoDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamProfileRemoveLogoDetails()' + +TeamProfileRemoveLogoDetails_validator = bv.Struct(TeamProfileRemoveLogoDetails) + +class TeamProfileRemoveLogoType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamProfileRemoveLogoType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamProfileRemoveLogoType(description={!r})'.format( + self._description_value, + ) + +TeamProfileRemoveLogoType_validator = bv.Struct(TeamProfileRemoveLogoType) + +class TeamSelectiveSyncPolicy(bb.Union): + """ + Policy for controlling whether team selective sync is enabled for team. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamSelectiveSyncPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamSelectiveSyncPolicy(%r, %r)' % (self._tag, self._value) + +TeamSelectiveSyncPolicy_validator = bv.Union(TeamSelectiveSyncPolicy) + +class TeamSelectiveSyncPolicyChangedDetails(bb.Struct): + """ + Enabled/disabled Team Selective Sync for team. + + :ivar new_value: New Team Selective Sync policy. + :ivar previous_value: Previous Team Selective Sync policy. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New Team Selective Sync policy. + + :rtype: TeamSelectiveSyncPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous Team Selective Sync policy. + + :rtype: TeamSelectiveSyncPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamSelectiveSyncPolicyChangedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamSelectiveSyncPolicyChangedDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +TeamSelectiveSyncPolicyChangedDetails_validator = bv.Struct(TeamSelectiveSyncPolicyChangedDetails) + +class TeamSelectiveSyncPolicyChangedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamSelectiveSyncPolicyChangedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamSelectiveSyncPolicyChangedType(description={!r})'.format( + self._description_value, + ) + +TeamSelectiveSyncPolicyChangedType_validator = bv.Struct(TeamSelectiveSyncPolicyChangedType) + +class TeamSelectiveSyncSettingsChangedDetails(bb.Struct): + """ + Changed sync default. + + :ivar previous_value: Previous value. + :ivar new_value: New value. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + previous_value=None, + new_value=None): + self._previous_value_value = None + self._previous_value_present = False + self._new_value_value = None + self._new_value_present = False + if previous_value is not None: + self.previous_value = previous_value + if new_value is not None: + self.new_value = new_value + + @property + def previous_value(self): + """ + Previous value. + + :rtype: files.SyncSetting + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + @property + def new_value(self): + """ + New value. + + :rtype: files.SyncSetting + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamSelectiveSyncSettingsChangedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamSelectiveSyncSettingsChangedDetails(previous_value={!r}, new_value={!r})'.format( + self._previous_value_value, + self._new_value_value, + ) + +TeamSelectiveSyncSettingsChangedDetails_validator = bv.Struct(TeamSelectiveSyncSettingsChangedDetails) + +class TeamSelectiveSyncSettingsChangedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamSelectiveSyncSettingsChangedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamSelectiveSyncSettingsChangedType(description={!r})'.format( + self._description_value, + ) + +TeamSelectiveSyncSettingsChangedType_validator = bv.Struct(TeamSelectiveSyncSettingsChangedType) + +class TfaAddBackupPhoneDetails(bb.Struct): + """ + Added backup phone for two-step verification. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(TfaAddBackupPhoneDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TfaAddBackupPhoneDetails()' + +TfaAddBackupPhoneDetails_validator = bv.Struct(TfaAddBackupPhoneDetails) + +class TfaAddBackupPhoneType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TfaAddBackupPhoneType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TfaAddBackupPhoneType(description={!r})'.format( + self._description_value, + ) + +TfaAddBackupPhoneType_validator = bv.Struct(TfaAddBackupPhoneType) + +class TfaAddSecurityKeyDetails(bb.Struct): + """ + Added security key for two-step verification. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(TfaAddSecurityKeyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TfaAddSecurityKeyDetails()' + +TfaAddSecurityKeyDetails_validator = bv.Struct(TfaAddSecurityKeyDetails) + +class TfaAddSecurityKeyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TfaAddSecurityKeyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TfaAddSecurityKeyType(description={!r})'.format( + self._description_value, + ) + +TfaAddSecurityKeyType_validator = bv.Struct(TfaAddSecurityKeyType) + +class TfaChangeBackupPhoneDetails(bb.Struct): + """ + Changed backup phone for two-step verification. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(TfaChangeBackupPhoneDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TfaChangeBackupPhoneDetails()' + +TfaChangeBackupPhoneDetails_validator = bv.Struct(TfaChangeBackupPhoneDetails) + +class TfaChangeBackupPhoneType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TfaChangeBackupPhoneType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TfaChangeBackupPhoneType(description={!r})'.format( + self._description_value, + ) + +TfaChangeBackupPhoneType_validator = bv.Struct(TfaChangeBackupPhoneType) + +class TfaChangePolicyDetails(bb.Struct): + """ + Changed two-step verification setting for team. + + :ivar new_value: New change policy. + :ivar previous_value: Previous change policy. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New change policy. + + :rtype: team_policies.TwoStepVerificationPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous change policy. Might be missing due to historical data gap. + + :rtype: team_policies.TwoStepVerificationPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TfaChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TfaChangePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +TfaChangePolicyDetails_validator = bv.Struct(TfaChangePolicyDetails) + +class TfaChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TfaChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TfaChangePolicyType(description={!r})'.format( + self._description_value, + ) + +TfaChangePolicyType_validator = bv.Struct(TfaChangePolicyType) + +class TfaChangeStatusDetails(bb.Struct): + """ + Enabled/disabled/changed two-step verification setting. + + :ivar new_value: The new two factor authentication configuration. + :ivar previous_value: The previous two factor authentication configuration. + Might be missing due to historical data gap. + :ivar used_rescue_code: Used two factor authentication rescue code. This + flag is relevant when the two factor authentication configuration is + disabled. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + '_used_rescue_code_value', + '_used_rescue_code_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None, + used_rescue_code=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + self._used_rescue_code_value = None + self._used_rescue_code_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + if used_rescue_code is not None: + self.used_rescue_code = used_rescue_code + + @property + def new_value(self): + """ + The new two factor authentication configuration. + + :rtype: TfaConfiguration + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + The previous two factor authentication configuration. Might be missing + due to historical data gap. + + :rtype: TfaConfiguration + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + @property + def used_rescue_code(self): + """ + Used two factor authentication rescue code. This flag is relevant when + the two factor authentication configuration is disabled. + + :rtype: bool + """ + if self._used_rescue_code_present: + return self._used_rescue_code_value + else: + return None + + @used_rescue_code.setter + def used_rescue_code(self, val): + if val is None: + del self.used_rescue_code + return + val = self._used_rescue_code_validator.validate(val) + self._used_rescue_code_value = val + self._used_rescue_code_present = True + + @used_rescue_code.deleter + def used_rescue_code(self): + self._used_rescue_code_value = None + self._used_rescue_code_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TfaChangeStatusDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TfaChangeStatusDetails(new_value={!r}, previous_value={!r}, used_rescue_code={!r})'.format( + self._new_value_value, + self._previous_value_value, + self._used_rescue_code_value, + ) + +TfaChangeStatusDetails_validator = bv.Struct(TfaChangeStatusDetails) + +class TfaChangeStatusType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TfaChangeStatusType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TfaChangeStatusType(description={!r})'.format( + self._description_value, + ) + +TfaChangeStatusType_validator = bv.Struct(TfaChangeStatusType) + +class TfaConfiguration(bb.Union): + """ + Two factor authentication configuration. Note: the enabled option is + deprecated. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + sms = None + # Attribute is overwritten below the class definition + authenticator = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_sms(self): + """ + Check if the union tag is ``sms``. + + :rtype: bool + """ + return self._tag == 'sms' + + def is_authenticator(self): + """ + Check if the union tag is ``authenticator``. + + :rtype: bool + """ + return self._tag == 'authenticator' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(TfaConfiguration, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TfaConfiguration(%r, %r)' % (self._tag, self._value) + +TfaConfiguration_validator = bv.Union(TfaConfiguration) + +class TfaRemoveBackupPhoneDetails(bb.Struct): + """ + Removed backup phone for two-step verification. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(TfaRemoveBackupPhoneDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TfaRemoveBackupPhoneDetails()' + +TfaRemoveBackupPhoneDetails_validator = bv.Struct(TfaRemoveBackupPhoneDetails) + +class TfaRemoveBackupPhoneType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TfaRemoveBackupPhoneType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TfaRemoveBackupPhoneType(description={!r})'.format( + self._description_value, + ) + +TfaRemoveBackupPhoneType_validator = bv.Struct(TfaRemoveBackupPhoneType) + +class TfaRemoveSecurityKeyDetails(bb.Struct): + """ + Removed security key for two-step verification. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(TfaRemoveSecurityKeyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TfaRemoveSecurityKeyDetails()' + +TfaRemoveSecurityKeyDetails_validator = bv.Struct(TfaRemoveSecurityKeyDetails) + +class TfaRemoveSecurityKeyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TfaRemoveSecurityKeyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TfaRemoveSecurityKeyType(description={!r})'.format( + self._description_value, + ) + +TfaRemoveSecurityKeyType_validator = bv.Struct(TfaRemoveSecurityKeyType) + +class TfaResetDetails(bb.Struct): + """ + Reset two-step verification for team member. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self): + pass + + def _process_custom_annotations(self, annotation_type, processor): + super(TfaResetDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TfaResetDetails()' + +TfaResetDetails_validator = bv.Struct(TfaResetDetails) + +class TfaResetType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TfaResetType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TfaResetType(description={!r})'.format( + self._description_value, + ) + +TfaResetType_validator = bv.Struct(TfaResetType) + +class TimeUnit(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + milliseconds = None + # Attribute is overwritten below the class definition + seconds = None + # Attribute is overwritten below the class definition + minutes = None + # Attribute is overwritten below the class definition + hours = None + # Attribute is overwritten below the class definition + days = None + # Attribute is overwritten below the class definition + weeks = None + # Attribute is overwritten below the class definition + months = None + # Attribute is overwritten below the class definition + years = None + # Attribute is overwritten below the class definition + other = None + + def is_milliseconds(self): + """ + Check if the union tag is ``milliseconds``. + + :rtype: bool + """ + return self._tag == 'milliseconds' + + def is_seconds(self): + """ + Check if the union tag is ``seconds``. + + :rtype: bool + """ + return self._tag == 'seconds' + + def is_minutes(self): + """ + Check if the union tag is ``minutes``. + + :rtype: bool + """ + return self._tag == 'minutes' + + def is_hours(self): + """ + Check if the union tag is ``hours``. + + :rtype: bool + """ + return self._tag == 'hours' + + def is_days(self): + """ + Check if the union tag is ``days``. + + :rtype: bool + """ + return self._tag == 'days' + + def is_weeks(self): + """ + Check if the union tag is ``weeks``. + + :rtype: bool + """ + return self._tag == 'weeks' + + def is_months(self): + """ + Check if the union tag is ``months``. + + :rtype: bool + """ + return self._tag == 'months' + + def is_years(self): + """ + Check if the union tag is ``years``. + + :rtype: bool + """ + return self._tag == 'years' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(TimeUnit, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TimeUnit(%r, %r)' % (self._tag, self._value) + +TimeUnit_validator = bv.Union(TimeUnit) + +class TrustedNonTeamMemberLogInfo(UserLogInfo): + """ + User that is not a member of the team but considered trusted. + + :ivar trusted_non_team_member_type: Indicates the type of the trusted non + team member user. + """ + + __slots__ = [ + '_trusted_non_team_member_type_value', + '_trusted_non_team_member_type_present', + ] + + _has_required_fields = True + + def __init__(self, + trusted_non_team_member_type=None, + account_id=None, + display_name=None, + email=None): + super(TrustedNonTeamMemberLogInfo, self).__init__(account_id, + display_name, + email) + self._trusted_non_team_member_type_value = None + self._trusted_non_team_member_type_present = False + if trusted_non_team_member_type is not None: + self.trusted_non_team_member_type = trusted_non_team_member_type + + @property + def trusted_non_team_member_type(self): + """ + Indicates the type of the trusted non team member user. + + :rtype: TrustedNonTeamMemberType + """ + if self._trusted_non_team_member_type_present: + return self._trusted_non_team_member_type_value + else: + raise AttributeError("missing required field 'trusted_non_team_member_type'") + + @trusted_non_team_member_type.setter + def trusted_non_team_member_type(self, val): + self._trusted_non_team_member_type_validator.validate_type_only(val) + self._trusted_non_team_member_type_value = val + self._trusted_non_team_member_type_present = True + + @trusted_non_team_member_type.deleter + def trusted_non_team_member_type(self): + self._trusted_non_team_member_type_value = None + self._trusted_non_team_member_type_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TrustedNonTeamMemberLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TrustedNonTeamMemberLogInfo(trusted_non_team_member_type={!r}, account_id={!r}, display_name={!r}, email={!r})'.format( + self._trusted_non_team_member_type_value, + self._account_id_value, + self._display_name_value, + self._email_value, + ) + +TrustedNonTeamMemberLogInfo_validator = bv.Struct(TrustedNonTeamMemberLogInfo) + +class TrustedNonTeamMemberType(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + multi_instance_admin = None + # Attribute is overwritten below the class definition + other = None + + def is_multi_instance_admin(self): + """ + Check if the union tag is ``multi_instance_admin``. + + :rtype: bool + """ + return self._tag == 'multi_instance_admin' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(TrustedNonTeamMemberType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TrustedNonTeamMemberType(%r, %r)' % (self._tag, self._value) + +TrustedNonTeamMemberType_validator = bv.Union(TrustedNonTeamMemberType) + +class TwoAccountChangePolicyDetails(bb.Struct): + """ + Enabled/disabled option for members to link personal Dropbox account and + team account to same computer. + + :ivar new_value: New two account policy. + :ivar previous_value: Previous two account policy. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = True + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New two account policy. + + :rtype: TwoAccountPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous two account policy. Might be missing due to historical data + gap. + + :rtype: TwoAccountPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TwoAccountChangePolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TwoAccountChangePolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +TwoAccountChangePolicyDetails_validator = bv.Struct(TwoAccountChangePolicyDetails) + +class TwoAccountChangePolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TwoAccountChangePolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TwoAccountChangePolicyType(description={!r})'.format( + self._description_value, + ) + +TwoAccountChangePolicyType_validator = bv.Struct(TwoAccountChangePolicyType) + +class TwoAccountPolicy(bb.Union): + """ + Policy for pairing personal account to work account + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(TwoAccountPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TwoAccountPolicy(%r, %r)' % (self._tag, self._value) + +TwoAccountPolicy_validator = bv.Union(TwoAccountPolicy) + +class UserLinkedAppLogInfo(AppLogInfo): + """ + User linked app + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self, + app_id=None, + display_name=None): + super(UserLinkedAppLogInfo, self).__init__(app_id, + display_name) + + def _process_custom_annotations(self, annotation_type, processor): + super(UserLinkedAppLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UserLinkedAppLogInfo(app_id={!r}, display_name={!r})'.format( + self._app_id_value, + self._display_name_value, + ) + +UserLinkedAppLogInfo_validator = bv.Struct(UserLinkedAppLogInfo) + +class UserNameLogInfo(bb.Struct): + """ + User's name logged information + + :ivar given_name: Given name. + :ivar surname: Surname. + :ivar locale: Locale. Might be missing due to historical data gap. + """ + + __slots__ = [ + '_given_name_value', + '_given_name_present', + '_surname_value', + '_surname_present', + '_locale_value', + '_locale_present', + ] + + _has_required_fields = True + + def __init__(self, + given_name=None, + surname=None, + locale=None): + self._given_name_value = None + self._given_name_present = False + self._surname_value = None + self._surname_present = False + self._locale_value = None + self._locale_present = False + if given_name is not None: + self.given_name = given_name + if surname is not None: + self.surname = surname + if locale is not None: + self.locale = locale + + @property + def given_name(self): + """ + Given name. + + :rtype: str + """ + if self._given_name_present: + return self._given_name_value + else: + raise AttributeError("missing required field 'given_name'") + + @given_name.setter + def given_name(self, val): + val = self._given_name_validator.validate(val) + self._given_name_value = val + self._given_name_present = True + + @given_name.deleter + def given_name(self): + self._given_name_value = None + self._given_name_present = False + + @property + def surname(self): + """ + Surname. + + :rtype: str + """ + if self._surname_present: + return self._surname_value + else: + raise AttributeError("missing required field 'surname'") + + @surname.setter + def surname(self, val): + val = self._surname_validator.validate(val) + self._surname_value = val + self._surname_present = True + + @surname.deleter + def surname(self): + self._surname_value = None + self._surname_present = False + + @property + def locale(self): + """ + Locale. Might be missing due to historical data gap. + + :rtype: str + """ + if self._locale_present: + return self._locale_value + else: + return None + + @locale.setter + def locale(self, val): + if val is None: + del self.locale + return + val = self._locale_validator.validate(val) + self._locale_value = val + self._locale_present = True + + @locale.deleter + def locale(self): + self._locale_value = None + self._locale_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(UserNameLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UserNameLogInfo(given_name={!r}, surname={!r}, locale={!r})'.format( + self._given_name_value, + self._surname_value, + self._locale_value, + ) + +UserNameLogInfo_validator = bv.Struct(UserNameLogInfo) + +class UserOrTeamLinkedAppLogInfo(AppLogInfo): + """ + User or team linked app. Used when linked type is missing due to historical + data gap. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self, + app_id=None, + display_name=None): + super(UserOrTeamLinkedAppLogInfo, self).__init__(app_id, + display_name) + + def _process_custom_annotations(self, annotation_type, processor): + super(UserOrTeamLinkedAppLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'UserOrTeamLinkedAppLogInfo(app_id={!r}, display_name={!r})'.format( + self._app_id_value, + self._display_name_value, + ) + +UserOrTeamLinkedAppLogInfo_validator = bv.Struct(UserOrTeamLinkedAppLogInfo) + +class ViewerInfoPolicyChangedDetails(bb.Struct): + """ + Changed team policy for viewer info. + + :ivar previous_value: Previous Viewer Info policy. + :ivar new_value: New Viewer Info policy. + """ + + __slots__ = [ + '_previous_value_value', + '_previous_value_present', + '_new_value_value', + '_new_value_present', + ] + + _has_required_fields = True + + def __init__(self, + previous_value=None, + new_value=None): + self._previous_value_value = None + self._previous_value_present = False + self._new_value_value = None + self._new_value_present = False + if previous_value is not None: + self.previous_value = previous_value + if new_value is not None: + self.new_value = new_value + + @property + def previous_value(self): + """ + Previous Viewer Info policy. + + :rtype: PassPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + raise AttributeError("missing required field 'previous_value'") + + @previous_value.setter + def previous_value(self, val): + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + @property + def new_value(self): + """ + New Viewer Info policy. + + :rtype: PassPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + raise AttributeError("missing required field 'new_value'") + + @new_value.setter + def new_value(self, val): + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ViewerInfoPolicyChangedDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ViewerInfoPolicyChangedDetails(previous_value={!r}, new_value={!r})'.format( + self._previous_value_value, + self._new_value_value, + ) + +ViewerInfoPolicyChangedDetails_validator = bv.Struct(ViewerInfoPolicyChangedDetails) + +class ViewerInfoPolicyChangedType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(ViewerInfoPolicyChangedType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ViewerInfoPolicyChangedType(description={!r})'.format( + self._description_value, + ) + +ViewerInfoPolicyChangedType_validator = bv.Struct(ViewerInfoPolicyChangedType) + +class WebDeviceSessionLogInfo(DeviceSessionLogInfo): + """ + Information on active web sessions + + :ivar session_info: Web session unique id. Might be missing due to + historical data gap. + :ivar user_agent: Information on the hosting device. + :ivar os: Information on the hosting operating system. + :ivar browser: Information on the browser used for this web session. + """ + + __slots__ = [ + '_session_info_value', + '_session_info_present', + '_user_agent_value', + '_user_agent_present', + '_os_value', + '_os_present', + '_browser_value', + '_browser_present', + ] + + _has_required_fields = True + + def __init__(self, + user_agent=None, + os=None, + browser=None, + ip_address=None, + created=None, + updated=None, + session_info=None): + super(WebDeviceSessionLogInfo, self).__init__(ip_address, + created, + updated) + self._session_info_value = None + self._session_info_present = False + self._user_agent_value = None + self._user_agent_present = False + self._os_value = None + self._os_present = False + self._browser_value = None + self._browser_present = False + if session_info is not None: + self.session_info = session_info + if user_agent is not None: + self.user_agent = user_agent + if os is not None: + self.os = os + if browser is not None: + self.browser = browser + + @property + def session_info(self): + """ + Web session unique id. Might be missing due to historical data gap. + + :rtype: WebSessionLogInfo + """ + if self._session_info_present: + return self._session_info_value + else: + return None + + @session_info.setter + def session_info(self, val): + if val is None: + del self.session_info + return + self._session_info_validator.validate_type_only(val) + self._session_info_value = val + self._session_info_present = True + + @session_info.deleter + def session_info(self): + self._session_info_value = None + self._session_info_present = False + + @property + def user_agent(self): + """ + Information on the hosting device. + + :rtype: str + """ + if self._user_agent_present: + return self._user_agent_value + else: + raise AttributeError("missing required field 'user_agent'") + + @user_agent.setter + def user_agent(self, val): + val = self._user_agent_validator.validate(val) + self._user_agent_value = val + self._user_agent_present = True + + @user_agent.deleter + def user_agent(self): + self._user_agent_value = None + self._user_agent_present = False + + @property + def os(self): + """ + Information on the hosting operating system. + + :rtype: str + """ + if self._os_present: + return self._os_value + else: + raise AttributeError("missing required field 'os'") + + @os.setter + def os(self, val): + val = self._os_validator.validate(val) + self._os_value = val + self._os_present = True + + @os.deleter + def os(self): + self._os_value = None + self._os_present = False + + @property + def browser(self): + """ + Information on the browser used for this web session. + + :rtype: str + """ + if self._browser_present: + return self._browser_value + else: + raise AttributeError("missing required field 'browser'") + + @browser.setter + def browser(self, val): + val = self._browser_validator.validate(val) + self._browser_value = val + self._browser_present = True + + @browser.deleter + def browser(self): + self._browser_value = None + self._browser_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(WebDeviceSessionLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'WebDeviceSessionLogInfo(user_agent={!r}, os={!r}, browser={!r}, ip_address={!r}, created={!r}, updated={!r}, session_info={!r})'.format( + self._user_agent_value, + self._os_value, + self._browser_value, + self._ip_address_value, + self._created_value, + self._updated_value, + self._session_info_value, + ) + +WebDeviceSessionLogInfo_validator = bv.Struct(WebDeviceSessionLogInfo) + +class WebSessionLogInfo(SessionLogInfo): + """ + Web session. + """ + + __slots__ = [ + ] + + _has_required_fields = False + + def __init__(self, + session_id=None): + super(WebSessionLogInfo, self).__init__(session_id) + + def _process_custom_annotations(self, annotation_type, processor): + super(WebSessionLogInfo, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'WebSessionLogInfo(session_id={!r})'.format( + self._session_id_value, + ) + +WebSessionLogInfo_validator = bv.Struct(WebSessionLogInfo) + +class WebSessionsChangeFixedLengthPolicyDetails(bb.Struct): + """ + Changed how long members can stay signed in to Dropbox.com. + + :ivar new_value: New session length policy. Might be missing due to + historical data gap. + :ivar previous_value: Previous session length policy. Might be missing due + to historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = False + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New session length policy. Might be missing due to historical data gap. + + :rtype: WebSessionsFixedLengthPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + return None + + @new_value.setter + def new_value(self, val): + if val is None: + del self.new_value + return + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous session length policy. Might be missing due to historical data + gap. + + :rtype: WebSessionsFixedLengthPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(WebSessionsChangeFixedLengthPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'WebSessionsChangeFixedLengthPolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +WebSessionsChangeFixedLengthPolicyDetails_validator = bv.Struct(WebSessionsChangeFixedLengthPolicyDetails) + +class WebSessionsChangeFixedLengthPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(WebSessionsChangeFixedLengthPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'WebSessionsChangeFixedLengthPolicyType(description={!r})'.format( + self._description_value, + ) + +WebSessionsChangeFixedLengthPolicyType_validator = bv.Struct(WebSessionsChangeFixedLengthPolicyType) + +class WebSessionsChangeIdleLengthPolicyDetails(bb.Struct): + """ + Changed how long team members can be idle while signed in to Dropbox.com. + + :ivar new_value: New idle length policy. Might be missing due to historical + data gap. + :ivar previous_value: Previous idle length policy. Might be missing due to + historical data gap. + """ + + __slots__ = [ + '_new_value_value', + '_new_value_present', + '_previous_value_value', + '_previous_value_present', + ] + + _has_required_fields = False + + def __init__(self, + new_value=None, + previous_value=None): + self._new_value_value = None + self._new_value_present = False + self._previous_value_value = None + self._previous_value_present = False + if new_value is not None: + self.new_value = new_value + if previous_value is not None: + self.previous_value = previous_value + + @property + def new_value(self): + """ + New idle length policy. Might be missing due to historical data gap. + + :rtype: WebSessionsIdleLengthPolicy + """ + if self._new_value_present: + return self._new_value_value + else: + return None + + @new_value.setter + def new_value(self, val): + if val is None: + del self.new_value + return + self._new_value_validator.validate_type_only(val) + self._new_value_value = val + self._new_value_present = True + + @new_value.deleter + def new_value(self): + self._new_value_value = None + self._new_value_present = False + + @property + def previous_value(self): + """ + Previous idle length policy. Might be missing due to historical data + gap. + + :rtype: WebSessionsIdleLengthPolicy + """ + if self._previous_value_present: + return self._previous_value_value + else: + return None + + @previous_value.setter + def previous_value(self, val): + if val is None: + del self.previous_value + return + self._previous_value_validator.validate_type_only(val) + self._previous_value_value = val + self._previous_value_present = True + + @previous_value.deleter + def previous_value(self): + self._previous_value_value = None + self._previous_value_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(WebSessionsChangeIdleLengthPolicyDetails, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'WebSessionsChangeIdleLengthPolicyDetails(new_value={!r}, previous_value={!r})'.format( + self._new_value_value, + self._previous_value_value, + ) + +WebSessionsChangeIdleLengthPolicyDetails_validator = bv.Struct(WebSessionsChangeIdleLengthPolicyDetails) + +class WebSessionsChangeIdleLengthPolicyType(bb.Struct): + + __slots__ = [ + '_description_value', + '_description_present', + ] + + _has_required_fields = True + + def __init__(self, + description=None): + self._description_value = None + self._description_present = False + if description is not None: + self.description = description + + @property + def description(self): + """ + :rtype: str + """ + if self._description_present: + return self._description_value + else: + raise AttributeError("missing required field 'description'") + + @description.setter + def description(self, val): + val = self._description_validator.validate(val) + self._description_value = val + self._description_present = True + + @description.deleter + def description(self): + self._description_value = None + self._description_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(WebSessionsChangeIdleLengthPolicyType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'WebSessionsChangeIdleLengthPolicyType(description={!r})'.format( + self._description_value, + ) + +WebSessionsChangeIdleLengthPolicyType_validator = bv.Struct(WebSessionsChangeIdleLengthPolicyType) + +class WebSessionsFixedLengthPolicy(bb.Union): + """ + Web sessions fixed length policy. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar DurationLogInfo defined: Defined fixed session length. + :ivar undefined: Undefined fixed session length. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + undefined = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def defined(cls, val): + """ + Create an instance of this class set to the ``defined`` tag with value + ``val``. + + :param DurationLogInfo val: + :rtype: WebSessionsFixedLengthPolicy + """ + return cls('defined', val) + + def is_defined(self): + """ + Check if the union tag is ``defined``. + + :rtype: bool + """ + return self._tag == 'defined' + + def is_undefined(self): + """ + Check if the union tag is ``undefined``. + + :rtype: bool + """ + return self._tag == 'undefined' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_defined(self): + """ + Defined fixed session length. + + Only call this if :meth:`is_defined` is true. + + :rtype: DurationLogInfo + """ + if not self.is_defined(): + raise AttributeError("tag 'defined' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(WebSessionsFixedLengthPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'WebSessionsFixedLengthPolicy(%r, %r)' % (self._tag, self._value) + +WebSessionsFixedLengthPolicy_validator = bv.Union(WebSessionsFixedLengthPolicy) + +class WebSessionsIdleLengthPolicy(bb.Union): + """ + Web sessions idle length policy. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar DurationLogInfo defined: Defined idle session length. + :ivar undefined: Undefined idle session length. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + undefined = None + # Attribute is overwritten below the class definition + other = None + + @classmethod + def defined(cls, val): + """ + Create an instance of this class set to the ``defined`` tag with value + ``val``. + + :param DurationLogInfo val: + :rtype: WebSessionsIdleLengthPolicy + """ + return cls('defined', val) + + def is_defined(self): + """ + Check if the union tag is ``defined``. + + :rtype: bool + """ + return self._tag == 'defined' + + def is_undefined(self): + """ + Check if the union tag is ``undefined``. + + :rtype: bool + """ + return self._tag == 'undefined' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_defined(self): + """ + Defined idle session length. + + Only call this if :meth:`is_defined` is true. + + :rtype: DurationLogInfo + """ + if not self.is_defined(): + raise AttributeError("tag 'defined' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(WebSessionsIdleLengthPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'WebSessionsIdleLengthPolicy(%r, %r)' % (self._tag, self._value) + +WebSessionsIdleLengthPolicy_validator = bv.Union(WebSessionsIdleLengthPolicy) + +AppId_validator = bv.String() +EmailAddress_validator = bv.String(max_length=255) +FilePath_validator = bv.String() +IpAddress_validator = bv.String() +NamespaceId_validator = bv.String() +RequestId_validator = bv.String() +TeamEventList_validator = bv.List(TeamEvent_validator) +AccessMethodLogInfo._end_user_validator = SessionLogInfo_validator +AccessMethodLogInfo._sign_in_as_validator = WebSessionLogInfo_validator +AccessMethodLogInfo._content_manager_validator = WebSessionLogInfo_validator +AccessMethodLogInfo._admin_console_validator = WebSessionLogInfo_validator +AccessMethodLogInfo._api_validator = ApiSessionLogInfo_validator +AccessMethodLogInfo._other_validator = bv.Void() +AccessMethodLogInfo._tagmap = { + 'end_user': AccessMethodLogInfo._end_user_validator, + 'sign_in_as': AccessMethodLogInfo._sign_in_as_validator, + 'content_manager': AccessMethodLogInfo._content_manager_validator, + 'admin_console': AccessMethodLogInfo._admin_console_validator, + 'api': AccessMethodLogInfo._api_validator, + 'other': AccessMethodLogInfo._other_validator, +} + +AccessMethodLogInfo.other = AccessMethodLogInfo('other') + +AccountCaptureAvailability._unavailable_validator = bv.Void() +AccountCaptureAvailability._available_validator = bv.Void() +AccountCaptureAvailability._other_validator = bv.Void() +AccountCaptureAvailability._tagmap = { + 'unavailable': AccountCaptureAvailability._unavailable_validator, + 'available': AccountCaptureAvailability._available_validator, + 'other': AccountCaptureAvailability._other_validator, +} + +AccountCaptureAvailability.unavailable = AccountCaptureAvailability('unavailable') +AccountCaptureAvailability.available = AccountCaptureAvailability('available') +AccountCaptureAvailability.other = AccountCaptureAvailability('other') + +AccountCaptureChangeAvailabilityDetails._new_value_validator = AccountCaptureAvailability_validator +AccountCaptureChangeAvailabilityDetails._previous_value_validator = bv.Nullable(AccountCaptureAvailability_validator) +AccountCaptureChangeAvailabilityDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +AccountCaptureChangeAvailabilityDetails._all_fields_ = [ + ('new_value', AccountCaptureChangeAvailabilityDetails._new_value_validator), + ('previous_value', AccountCaptureChangeAvailabilityDetails._previous_value_validator), +] + +AccountCaptureChangeAvailabilityType._description_validator = bv.String() +AccountCaptureChangeAvailabilityType._all_field_names_ = set(['description']) +AccountCaptureChangeAvailabilityType._all_fields_ = [('description', AccountCaptureChangeAvailabilityType._description_validator)] + +AccountCaptureChangePolicyDetails._new_value_validator = AccountCapturePolicy_validator +AccountCaptureChangePolicyDetails._previous_value_validator = bv.Nullable(AccountCapturePolicy_validator) +AccountCaptureChangePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +AccountCaptureChangePolicyDetails._all_fields_ = [ + ('new_value', AccountCaptureChangePolicyDetails._new_value_validator), + ('previous_value', AccountCaptureChangePolicyDetails._previous_value_validator), +] + +AccountCaptureChangePolicyType._description_validator = bv.String() +AccountCaptureChangePolicyType._all_field_names_ = set(['description']) +AccountCaptureChangePolicyType._all_fields_ = [('description', AccountCaptureChangePolicyType._description_validator)] + +AccountCaptureMigrateAccountDetails._domain_name_validator = bv.String() +AccountCaptureMigrateAccountDetails._all_field_names_ = set(['domain_name']) +AccountCaptureMigrateAccountDetails._all_fields_ = [('domain_name', AccountCaptureMigrateAccountDetails._domain_name_validator)] + +AccountCaptureMigrateAccountType._description_validator = bv.String() +AccountCaptureMigrateAccountType._all_field_names_ = set(['description']) +AccountCaptureMigrateAccountType._all_fields_ = [('description', AccountCaptureMigrateAccountType._description_validator)] + +AccountCaptureNotificationEmailsSentDetails._domain_name_validator = bv.String() +AccountCaptureNotificationEmailsSentDetails._all_field_names_ = set(['domain_name']) +AccountCaptureNotificationEmailsSentDetails._all_fields_ = [('domain_name', AccountCaptureNotificationEmailsSentDetails._domain_name_validator)] + +AccountCaptureNotificationEmailsSentType._description_validator = bv.String() +AccountCaptureNotificationEmailsSentType._all_field_names_ = set(['description']) +AccountCaptureNotificationEmailsSentType._all_fields_ = [('description', AccountCaptureNotificationEmailsSentType._description_validator)] + +AccountCapturePolicy._disabled_validator = bv.Void() +AccountCapturePolicy._invited_users_validator = bv.Void() +AccountCapturePolicy._all_users_validator = bv.Void() +AccountCapturePolicy._other_validator = bv.Void() +AccountCapturePolicy._tagmap = { + 'disabled': AccountCapturePolicy._disabled_validator, + 'invited_users': AccountCapturePolicy._invited_users_validator, + 'all_users': AccountCapturePolicy._all_users_validator, + 'other': AccountCapturePolicy._other_validator, +} + +AccountCapturePolicy.disabled = AccountCapturePolicy('disabled') +AccountCapturePolicy.invited_users = AccountCapturePolicy('invited_users') +AccountCapturePolicy.all_users = AccountCapturePolicy('all_users') +AccountCapturePolicy.other = AccountCapturePolicy('other') + +AccountCaptureRelinquishAccountDetails._domain_name_validator = bv.String() +AccountCaptureRelinquishAccountDetails._all_field_names_ = set(['domain_name']) +AccountCaptureRelinquishAccountDetails._all_fields_ = [('domain_name', AccountCaptureRelinquishAccountDetails._domain_name_validator)] + +AccountCaptureRelinquishAccountType._description_validator = bv.String() +AccountCaptureRelinquishAccountType._all_field_names_ = set(['description']) +AccountCaptureRelinquishAccountType._all_fields_ = [('description', AccountCaptureRelinquishAccountType._description_validator)] + +ActionDetails._team_join_details_validator = JoinTeamDetails_validator +ActionDetails._remove_action_validator = MemberRemoveActionType_validator +ActionDetails._other_validator = bv.Void() +ActionDetails._tagmap = { + 'team_join_details': ActionDetails._team_join_details_validator, + 'remove_action': ActionDetails._remove_action_validator, + 'other': ActionDetails._other_validator, +} + +ActionDetails.other = ActionDetails('other') + +ActorLogInfo._user_validator = UserLogInfo_validator +ActorLogInfo._admin_validator = UserLogInfo_validator +ActorLogInfo._app_validator = AppLogInfo_validator +ActorLogInfo._reseller_validator = ResellerLogInfo_validator +ActorLogInfo._dropbox_validator = bv.Void() +ActorLogInfo._anonymous_validator = bv.Void() +ActorLogInfo._other_validator = bv.Void() +ActorLogInfo._tagmap = { + 'user': ActorLogInfo._user_validator, + 'admin': ActorLogInfo._admin_validator, + 'app': ActorLogInfo._app_validator, + 'reseller': ActorLogInfo._reseller_validator, + 'dropbox': ActorLogInfo._dropbox_validator, + 'anonymous': ActorLogInfo._anonymous_validator, + 'other': ActorLogInfo._other_validator, +} + +ActorLogInfo.dropbox = ActorLogInfo('dropbox') +ActorLogInfo.anonymous = ActorLogInfo('anonymous') +ActorLogInfo.other = ActorLogInfo('other') + +AdminRole._team_admin_validator = bv.Void() +AdminRole._user_management_admin_validator = bv.Void() +AdminRole._support_admin_validator = bv.Void() +AdminRole._limited_admin_validator = bv.Void() +AdminRole._member_only_validator = bv.Void() +AdminRole._other_validator = bv.Void() +AdminRole._tagmap = { + 'team_admin': AdminRole._team_admin_validator, + 'user_management_admin': AdminRole._user_management_admin_validator, + 'support_admin': AdminRole._support_admin_validator, + 'limited_admin': AdminRole._limited_admin_validator, + 'member_only': AdminRole._member_only_validator, + 'other': AdminRole._other_validator, +} + +AdminRole.team_admin = AdminRole('team_admin') +AdminRole.user_management_admin = AdminRole('user_management_admin') +AdminRole.support_admin = AdminRole('support_admin') +AdminRole.limited_admin = AdminRole('limited_admin') +AdminRole.member_only = AdminRole('member_only') +AdminRole.other = AdminRole('other') + +AllowDownloadDisabledDetails._all_field_names_ = set([]) +AllowDownloadDisabledDetails._all_fields_ = [] + +AllowDownloadDisabledType._description_validator = bv.String() +AllowDownloadDisabledType._all_field_names_ = set(['description']) +AllowDownloadDisabledType._all_fields_ = [('description', AllowDownloadDisabledType._description_validator)] + +AllowDownloadEnabledDetails._all_field_names_ = set([]) +AllowDownloadEnabledDetails._all_fields_ = [] + +AllowDownloadEnabledType._description_validator = bv.String() +AllowDownloadEnabledType._all_field_names_ = set(['description']) +AllowDownloadEnabledType._all_fields_ = [('description', AllowDownloadEnabledType._description_validator)] + +ApiSessionLogInfo._request_id_validator = RequestId_validator +ApiSessionLogInfo._all_field_names_ = set(['request_id']) +ApiSessionLogInfo._all_fields_ = [('request_id', ApiSessionLogInfo._request_id_validator)] + +AppLinkTeamDetails._app_info_validator = AppLogInfo_validator +AppLinkTeamDetails._all_field_names_ = set(['app_info']) +AppLinkTeamDetails._all_fields_ = [('app_info', AppLinkTeamDetails._app_info_validator)] + +AppLinkTeamType._description_validator = bv.String() +AppLinkTeamType._all_field_names_ = set(['description']) +AppLinkTeamType._all_fields_ = [('description', AppLinkTeamType._description_validator)] + +AppLinkUserDetails._app_info_validator = AppLogInfo_validator +AppLinkUserDetails._all_field_names_ = set(['app_info']) +AppLinkUserDetails._all_fields_ = [('app_info', AppLinkUserDetails._app_info_validator)] + +AppLinkUserType._description_validator = bv.String() +AppLinkUserType._all_field_names_ = set(['description']) +AppLinkUserType._all_fields_ = [('description', AppLinkUserType._description_validator)] + +AppLogInfo._app_id_validator = bv.Nullable(AppId_validator) +AppLogInfo._display_name_validator = bv.Nullable(bv.String()) +AppLogInfo._field_names_ = set([ + 'app_id', + 'display_name', +]) +AppLogInfo._all_field_names_ = AppLogInfo._field_names_ +AppLogInfo._fields_ = [ + ('app_id', AppLogInfo._app_id_validator), + ('display_name', AppLogInfo._display_name_validator), +] +AppLogInfo._all_fields_ = AppLogInfo._fields_ + +AppLogInfo._tag_to_subtype_ = { + (u'user_or_team_linked_app',): UserOrTeamLinkedAppLogInfo_validator, + (u'user_linked_app',): UserLinkedAppLogInfo_validator, + (u'team_linked_app',): TeamLinkedAppLogInfo_validator, +} +AppLogInfo._pytype_to_tag_and_subtype_ = { + UserOrTeamLinkedAppLogInfo: ((u'user_or_team_linked_app',), UserOrTeamLinkedAppLogInfo_validator), + UserLinkedAppLogInfo: ((u'user_linked_app',), UserLinkedAppLogInfo_validator), + TeamLinkedAppLogInfo: ((u'team_linked_app',), TeamLinkedAppLogInfo_validator), +} +AppLogInfo._is_catch_all_ = True + +AppUnlinkTeamDetails._app_info_validator = AppLogInfo_validator +AppUnlinkTeamDetails._all_field_names_ = set(['app_info']) +AppUnlinkTeamDetails._all_fields_ = [('app_info', AppUnlinkTeamDetails._app_info_validator)] + +AppUnlinkTeamType._description_validator = bv.String() +AppUnlinkTeamType._all_field_names_ = set(['description']) +AppUnlinkTeamType._all_fields_ = [('description', AppUnlinkTeamType._description_validator)] + +AppUnlinkUserDetails._app_info_validator = AppLogInfo_validator +AppUnlinkUserDetails._all_field_names_ = set(['app_info']) +AppUnlinkUserDetails._all_fields_ = [('app_info', AppUnlinkUserDetails._app_info_validator)] + +AppUnlinkUserType._description_validator = bv.String() +AppUnlinkUserType._all_field_names_ = set(['description']) +AppUnlinkUserType._all_fields_ = [('description', AppUnlinkUserType._description_validator)] + +AssetLogInfo._file_validator = FileLogInfo_validator +AssetLogInfo._folder_validator = FolderLogInfo_validator +AssetLogInfo._paper_document_validator = PaperDocumentLogInfo_validator +AssetLogInfo._paper_folder_validator = PaperFolderLogInfo_validator +AssetLogInfo._showcase_document_validator = ShowcaseDocumentLogInfo_validator +AssetLogInfo._other_validator = bv.Void() +AssetLogInfo._tagmap = { + 'file': AssetLogInfo._file_validator, + 'folder': AssetLogInfo._folder_validator, + 'paper_document': AssetLogInfo._paper_document_validator, + 'paper_folder': AssetLogInfo._paper_folder_validator, + 'showcase_document': AssetLogInfo._showcase_document_validator, + 'other': AssetLogInfo._other_validator, +} + +AssetLogInfo.other = AssetLogInfo('other') + +CameraUploadsPolicy._disabled_validator = bv.Void() +CameraUploadsPolicy._enabled_validator = bv.Void() +CameraUploadsPolicy._other_validator = bv.Void() +CameraUploadsPolicy._tagmap = { + 'disabled': CameraUploadsPolicy._disabled_validator, + 'enabled': CameraUploadsPolicy._enabled_validator, + 'other': CameraUploadsPolicy._other_validator, +} + +CameraUploadsPolicy.disabled = CameraUploadsPolicy('disabled') +CameraUploadsPolicy.enabled = CameraUploadsPolicy('enabled') +CameraUploadsPolicy.other = CameraUploadsPolicy('other') + +CameraUploadsPolicyChangedDetails._new_value_validator = CameraUploadsPolicy_validator +CameraUploadsPolicyChangedDetails._previous_value_validator = CameraUploadsPolicy_validator +CameraUploadsPolicyChangedDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +CameraUploadsPolicyChangedDetails._all_fields_ = [ + ('new_value', CameraUploadsPolicyChangedDetails._new_value_validator), + ('previous_value', CameraUploadsPolicyChangedDetails._previous_value_validator), +] + +CameraUploadsPolicyChangedType._description_validator = bv.String() +CameraUploadsPolicyChangedType._all_field_names_ = set(['description']) +CameraUploadsPolicyChangedType._all_fields_ = [('description', CameraUploadsPolicyChangedType._description_validator)] + +Certificate._subject_validator = bv.String() +Certificate._issuer_validator = bv.String() +Certificate._issue_date_validator = bv.String() +Certificate._expiration_date_validator = bv.String() +Certificate._serial_number_validator = bv.String() +Certificate._sha1_fingerprint_validator = bv.String() +Certificate._common_name_validator = bv.Nullable(bv.String()) +Certificate._all_field_names_ = set([ + 'subject', + 'issuer', + 'issue_date', + 'expiration_date', + 'serial_number', + 'sha1_fingerprint', + 'common_name', +]) +Certificate._all_fields_ = [ + ('subject', Certificate._subject_validator), + ('issuer', Certificate._issuer_validator), + ('issue_date', Certificate._issue_date_validator), + ('expiration_date', Certificate._expiration_date_validator), + ('serial_number', Certificate._serial_number_validator), + ('sha1_fingerprint', Certificate._sha1_fingerprint_validator), + ('common_name', Certificate._common_name_validator), +] + +CollectionShareDetails._album_name_validator = bv.String() +CollectionShareDetails._all_field_names_ = set(['album_name']) +CollectionShareDetails._all_fields_ = [('album_name', CollectionShareDetails._album_name_validator)] + +CollectionShareType._description_validator = bv.String() +CollectionShareType._all_field_names_ = set(['description']) +CollectionShareType._all_fields_ = [('description', CollectionShareType._description_validator)] + +ContentPermanentDeletePolicy._disabled_validator = bv.Void() +ContentPermanentDeletePolicy._enabled_validator = bv.Void() +ContentPermanentDeletePolicy._other_validator = bv.Void() +ContentPermanentDeletePolicy._tagmap = { + 'disabled': ContentPermanentDeletePolicy._disabled_validator, + 'enabled': ContentPermanentDeletePolicy._enabled_validator, + 'other': ContentPermanentDeletePolicy._other_validator, +} + +ContentPermanentDeletePolicy.disabled = ContentPermanentDeletePolicy('disabled') +ContentPermanentDeletePolicy.enabled = ContentPermanentDeletePolicy('enabled') +ContentPermanentDeletePolicy.other = ContentPermanentDeletePolicy('other') + +ContextLogInfo._team_member_validator = TeamMemberLogInfo_validator +ContextLogInfo._non_team_member_validator = NonTeamMemberLogInfo_validator +ContextLogInfo._anonymous_validator = bv.Void() +ContextLogInfo._team_validator = bv.Void() +ContextLogInfo._trusted_non_team_member_validator = TrustedNonTeamMemberLogInfo_validator +ContextLogInfo._other_validator = bv.Void() +ContextLogInfo._tagmap = { + 'team_member': ContextLogInfo._team_member_validator, + 'non_team_member': ContextLogInfo._non_team_member_validator, + 'anonymous': ContextLogInfo._anonymous_validator, + 'team': ContextLogInfo._team_validator, + 'trusted_non_team_member': ContextLogInfo._trusted_non_team_member_validator, + 'other': ContextLogInfo._other_validator, +} + +ContextLogInfo.anonymous = ContextLogInfo('anonymous') +ContextLogInfo.team = ContextLogInfo('team') +ContextLogInfo.other = ContextLogInfo('other') + +CreateFolderDetails._all_field_names_ = set([]) +CreateFolderDetails._all_fields_ = [] + +CreateFolderType._description_validator = bv.String() +CreateFolderType._all_field_names_ = set(['description']) +CreateFolderType._all_fields_ = [('description', CreateFolderType._description_validator)] + +DataPlacementRestrictionChangePolicyDetails._previous_value_validator = PlacementRestriction_validator +DataPlacementRestrictionChangePolicyDetails._new_value_validator = PlacementRestriction_validator +DataPlacementRestrictionChangePolicyDetails._all_field_names_ = set([ + 'previous_value', + 'new_value', +]) +DataPlacementRestrictionChangePolicyDetails._all_fields_ = [ + ('previous_value', DataPlacementRestrictionChangePolicyDetails._previous_value_validator), + ('new_value', DataPlacementRestrictionChangePolicyDetails._new_value_validator), +] + +DataPlacementRestrictionChangePolicyType._description_validator = bv.String() +DataPlacementRestrictionChangePolicyType._all_field_names_ = set(['description']) +DataPlacementRestrictionChangePolicyType._all_fields_ = [('description', DataPlacementRestrictionChangePolicyType._description_validator)] + +DataPlacementRestrictionSatisfyPolicyDetails._placement_restriction_validator = PlacementRestriction_validator +DataPlacementRestrictionSatisfyPolicyDetails._all_field_names_ = set(['placement_restriction']) +DataPlacementRestrictionSatisfyPolicyDetails._all_fields_ = [('placement_restriction', DataPlacementRestrictionSatisfyPolicyDetails._placement_restriction_validator)] + +DataPlacementRestrictionSatisfyPolicyType._description_validator = bv.String() +DataPlacementRestrictionSatisfyPolicyType._all_field_names_ = set(['description']) +DataPlacementRestrictionSatisfyPolicyType._all_fields_ = [('description', DataPlacementRestrictionSatisfyPolicyType._description_validator)] + +DeviceSessionLogInfo._ip_address_validator = bv.Nullable(IpAddress_validator) +DeviceSessionLogInfo._created_validator = bv.Nullable(common.DropboxTimestamp_validator) +DeviceSessionLogInfo._updated_validator = bv.Nullable(common.DropboxTimestamp_validator) +DeviceSessionLogInfo._field_names_ = set([ + 'ip_address', + 'created', + 'updated', +]) +DeviceSessionLogInfo._all_field_names_ = DeviceSessionLogInfo._field_names_ +DeviceSessionLogInfo._fields_ = [ + ('ip_address', DeviceSessionLogInfo._ip_address_validator), + ('created', DeviceSessionLogInfo._created_validator), + ('updated', DeviceSessionLogInfo._updated_validator), +] +DeviceSessionLogInfo._all_fields_ = DeviceSessionLogInfo._fields_ + +DeviceSessionLogInfo._tag_to_subtype_ = { + (u'desktop_device_session',): DesktopDeviceSessionLogInfo_validator, + (u'mobile_device_session',): MobileDeviceSessionLogInfo_validator, + (u'web_device_session',): WebDeviceSessionLogInfo_validator, + (u'legacy_device_session',): LegacyDeviceSessionLogInfo_validator, +} +DeviceSessionLogInfo._pytype_to_tag_and_subtype_ = { + DesktopDeviceSessionLogInfo: ((u'desktop_device_session',), DesktopDeviceSessionLogInfo_validator), + MobileDeviceSessionLogInfo: ((u'mobile_device_session',), MobileDeviceSessionLogInfo_validator), + WebDeviceSessionLogInfo: ((u'web_device_session',), WebDeviceSessionLogInfo_validator), + LegacyDeviceSessionLogInfo: ((u'legacy_device_session',), LegacyDeviceSessionLogInfo_validator), +} +DeviceSessionLogInfo._is_catch_all_ = True + +DesktopDeviceSessionLogInfo._session_info_validator = bv.Nullable(DesktopSessionLogInfo_validator) +DesktopDeviceSessionLogInfo._host_name_validator = bv.String() +DesktopDeviceSessionLogInfo._client_type_validator = team.DesktopPlatform_validator +DesktopDeviceSessionLogInfo._client_version_validator = bv.Nullable(bv.String()) +DesktopDeviceSessionLogInfo._platform_validator = bv.String() +DesktopDeviceSessionLogInfo._is_delete_on_unlink_supported_validator = bv.Boolean() +DesktopDeviceSessionLogInfo._field_names_ = set([ + 'session_info', + 'host_name', + 'client_type', + 'client_version', + 'platform', + 'is_delete_on_unlink_supported', +]) +DesktopDeviceSessionLogInfo._all_field_names_ = DeviceSessionLogInfo._all_field_names_.union(DesktopDeviceSessionLogInfo._field_names_) +DesktopDeviceSessionLogInfo._fields_ = [ + ('session_info', DesktopDeviceSessionLogInfo._session_info_validator), + ('host_name', DesktopDeviceSessionLogInfo._host_name_validator), + ('client_type', DesktopDeviceSessionLogInfo._client_type_validator), + ('client_version', DesktopDeviceSessionLogInfo._client_version_validator), + ('platform', DesktopDeviceSessionLogInfo._platform_validator), + ('is_delete_on_unlink_supported', DesktopDeviceSessionLogInfo._is_delete_on_unlink_supported_validator), +] +DesktopDeviceSessionLogInfo._all_fields_ = DeviceSessionLogInfo._all_fields_ + DesktopDeviceSessionLogInfo._fields_ + +SessionLogInfo._session_id_validator = bv.Nullable(common.SessionId_validator) +SessionLogInfo._field_names_ = set(['session_id']) +SessionLogInfo._all_field_names_ = SessionLogInfo._field_names_ +SessionLogInfo._fields_ = [('session_id', SessionLogInfo._session_id_validator)] +SessionLogInfo._all_fields_ = SessionLogInfo._fields_ + +SessionLogInfo._tag_to_subtype_ = { + (u'web',): WebSessionLogInfo_validator, + (u'desktop',): DesktopSessionLogInfo_validator, + (u'mobile',): MobileSessionLogInfo_validator, +} +SessionLogInfo._pytype_to_tag_and_subtype_ = { + WebSessionLogInfo: ((u'web',), WebSessionLogInfo_validator), + DesktopSessionLogInfo: ((u'desktop',), DesktopSessionLogInfo_validator), + MobileSessionLogInfo: ((u'mobile',), MobileSessionLogInfo_validator), +} +SessionLogInfo._is_catch_all_ = True + +DesktopSessionLogInfo._field_names_ = set([]) +DesktopSessionLogInfo._all_field_names_ = SessionLogInfo._all_field_names_.union(DesktopSessionLogInfo._field_names_) +DesktopSessionLogInfo._fields_ = [] +DesktopSessionLogInfo._all_fields_ = SessionLogInfo._all_fields_ + DesktopSessionLogInfo._fields_ + +DeviceApprovalsChangeDesktopPolicyDetails._new_value_validator = bv.Nullable(DeviceApprovalsPolicy_validator) +DeviceApprovalsChangeDesktopPolicyDetails._previous_value_validator = bv.Nullable(DeviceApprovalsPolicy_validator) +DeviceApprovalsChangeDesktopPolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +DeviceApprovalsChangeDesktopPolicyDetails._all_fields_ = [ + ('new_value', DeviceApprovalsChangeDesktopPolicyDetails._new_value_validator), + ('previous_value', DeviceApprovalsChangeDesktopPolicyDetails._previous_value_validator), +] + +DeviceApprovalsChangeDesktopPolicyType._description_validator = bv.String() +DeviceApprovalsChangeDesktopPolicyType._all_field_names_ = set(['description']) +DeviceApprovalsChangeDesktopPolicyType._all_fields_ = [('description', DeviceApprovalsChangeDesktopPolicyType._description_validator)] + +DeviceApprovalsChangeMobilePolicyDetails._new_value_validator = bv.Nullable(DeviceApprovalsPolicy_validator) +DeviceApprovalsChangeMobilePolicyDetails._previous_value_validator = bv.Nullable(DeviceApprovalsPolicy_validator) +DeviceApprovalsChangeMobilePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +DeviceApprovalsChangeMobilePolicyDetails._all_fields_ = [ + ('new_value', DeviceApprovalsChangeMobilePolicyDetails._new_value_validator), + ('previous_value', DeviceApprovalsChangeMobilePolicyDetails._previous_value_validator), +] + +DeviceApprovalsChangeMobilePolicyType._description_validator = bv.String() +DeviceApprovalsChangeMobilePolicyType._all_field_names_ = set(['description']) +DeviceApprovalsChangeMobilePolicyType._all_fields_ = [('description', DeviceApprovalsChangeMobilePolicyType._description_validator)] + +DeviceApprovalsChangeOverageActionDetails._new_value_validator = bv.Nullable(team_policies.RolloutMethod_validator) +DeviceApprovalsChangeOverageActionDetails._previous_value_validator = bv.Nullable(team_policies.RolloutMethod_validator) +DeviceApprovalsChangeOverageActionDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +DeviceApprovalsChangeOverageActionDetails._all_fields_ = [ + ('new_value', DeviceApprovalsChangeOverageActionDetails._new_value_validator), + ('previous_value', DeviceApprovalsChangeOverageActionDetails._previous_value_validator), +] + +DeviceApprovalsChangeOverageActionType._description_validator = bv.String() +DeviceApprovalsChangeOverageActionType._all_field_names_ = set(['description']) +DeviceApprovalsChangeOverageActionType._all_fields_ = [('description', DeviceApprovalsChangeOverageActionType._description_validator)] + +DeviceApprovalsChangeUnlinkActionDetails._new_value_validator = bv.Nullable(DeviceUnlinkPolicy_validator) +DeviceApprovalsChangeUnlinkActionDetails._previous_value_validator = bv.Nullable(DeviceUnlinkPolicy_validator) +DeviceApprovalsChangeUnlinkActionDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +DeviceApprovalsChangeUnlinkActionDetails._all_fields_ = [ + ('new_value', DeviceApprovalsChangeUnlinkActionDetails._new_value_validator), + ('previous_value', DeviceApprovalsChangeUnlinkActionDetails._previous_value_validator), +] + +DeviceApprovalsChangeUnlinkActionType._description_validator = bv.String() +DeviceApprovalsChangeUnlinkActionType._all_field_names_ = set(['description']) +DeviceApprovalsChangeUnlinkActionType._all_fields_ = [('description', DeviceApprovalsChangeUnlinkActionType._description_validator)] + +DeviceApprovalsPolicy._unlimited_validator = bv.Void() +DeviceApprovalsPolicy._limited_validator = bv.Void() +DeviceApprovalsPolicy._other_validator = bv.Void() +DeviceApprovalsPolicy._tagmap = { + 'unlimited': DeviceApprovalsPolicy._unlimited_validator, + 'limited': DeviceApprovalsPolicy._limited_validator, + 'other': DeviceApprovalsPolicy._other_validator, +} + +DeviceApprovalsPolicy.unlimited = DeviceApprovalsPolicy('unlimited') +DeviceApprovalsPolicy.limited = DeviceApprovalsPolicy('limited') +DeviceApprovalsPolicy.other = DeviceApprovalsPolicy('other') + +DeviceChangeIpDesktopDetails._device_session_info_validator = DeviceSessionLogInfo_validator +DeviceChangeIpDesktopDetails._all_field_names_ = set(['device_session_info']) +DeviceChangeIpDesktopDetails._all_fields_ = [('device_session_info', DeviceChangeIpDesktopDetails._device_session_info_validator)] + +DeviceChangeIpDesktopType._description_validator = bv.String() +DeviceChangeIpDesktopType._all_field_names_ = set(['description']) +DeviceChangeIpDesktopType._all_fields_ = [('description', DeviceChangeIpDesktopType._description_validator)] + +DeviceChangeIpMobileDetails._device_session_info_validator = bv.Nullable(DeviceSessionLogInfo_validator) +DeviceChangeIpMobileDetails._all_field_names_ = set(['device_session_info']) +DeviceChangeIpMobileDetails._all_fields_ = [('device_session_info', DeviceChangeIpMobileDetails._device_session_info_validator)] + +DeviceChangeIpMobileType._description_validator = bv.String() +DeviceChangeIpMobileType._all_field_names_ = set(['description']) +DeviceChangeIpMobileType._all_fields_ = [('description', DeviceChangeIpMobileType._description_validator)] + +DeviceChangeIpWebDetails._user_agent_validator = bv.String() +DeviceChangeIpWebDetails._all_field_names_ = set(['user_agent']) +DeviceChangeIpWebDetails._all_fields_ = [('user_agent', DeviceChangeIpWebDetails._user_agent_validator)] + +DeviceChangeIpWebType._description_validator = bv.String() +DeviceChangeIpWebType._all_field_names_ = set(['description']) +DeviceChangeIpWebType._all_fields_ = [('description', DeviceChangeIpWebType._description_validator)] + +DeviceDeleteOnUnlinkFailDetails._session_info_validator = bv.Nullable(SessionLogInfo_validator) +DeviceDeleteOnUnlinkFailDetails._display_name_validator = bv.Nullable(bv.String()) +DeviceDeleteOnUnlinkFailDetails._num_failures_validator = bv.Int64() +DeviceDeleteOnUnlinkFailDetails._all_field_names_ = set([ + 'session_info', + 'display_name', + 'num_failures', +]) +DeviceDeleteOnUnlinkFailDetails._all_fields_ = [ + ('session_info', DeviceDeleteOnUnlinkFailDetails._session_info_validator), + ('display_name', DeviceDeleteOnUnlinkFailDetails._display_name_validator), + ('num_failures', DeviceDeleteOnUnlinkFailDetails._num_failures_validator), +] + +DeviceDeleteOnUnlinkFailType._description_validator = bv.String() +DeviceDeleteOnUnlinkFailType._all_field_names_ = set(['description']) +DeviceDeleteOnUnlinkFailType._all_fields_ = [('description', DeviceDeleteOnUnlinkFailType._description_validator)] + +DeviceDeleteOnUnlinkSuccessDetails._session_info_validator = bv.Nullable(SessionLogInfo_validator) +DeviceDeleteOnUnlinkSuccessDetails._display_name_validator = bv.Nullable(bv.String()) +DeviceDeleteOnUnlinkSuccessDetails._all_field_names_ = set([ + 'session_info', + 'display_name', +]) +DeviceDeleteOnUnlinkSuccessDetails._all_fields_ = [ + ('session_info', DeviceDeleteOnUnlinkSuccessDetails._session_info_validator), + ('display_name', DeviceDeleteOnUnlinkSuccessDetails._display_name_validator), +] + +DeviceDeleteOnUnlinkSuccessType._description_validator = bv.String() +DeviceDeleteOnUnlinkSuccessType._all_field_names_ = set(['description']) +DeviceDeleteOnUnlinkSuccessType._all_fields_ = [('description', DeviceDeleteOnUnlinkSuccessType._description_validator)] + +DeviceLinkFailDetails._ip_address_validator = bv.Nullable(IpAddress_validator) +DeviceLinkFailDetails._device_type_validator = DeviceType_validator +DeviceLinkFailDetails._all_field_names_ = set([ + 'ip_address', + 'device_type', +]) +DeviceLinkFailDetails._all_fields_ = [ + ('ip_address', DeviceLinkFailDetails._ip_address_validator), + ('device_type', DeviceLinkFailDetails._device_type_validator), +] + +DeviceLinkFailType._description_validator = bv.String() +DeviceLinkFailType._all_field_names_ = set(['description']) +DeviceLinkFailType._all_fields_ = [('description', DeviceLinkFailType._description_validator)] + +DeviceLinkSuccessDetails._device_session_info_validator = bv.Nullable(DeviceSessionLogInfo_validator) +DeviceLinkSuccessDetails._all_field_names_ = set(['device_session_info']) +DeviceLinkSuccessDetails._all_fields_ = [('device_session_info', DeviceLinkSuccessDetails._device_session_info_validator)] + +DeviceLinkSuccessType._description_validator = bv.String() +DeviceLinkSuccessType._all_field_names_ = set(['description']) +DeviceLinkSuccessType._all_fields_ = [('description', DeviceLinkSuccessType._description_validator)] + +DeviceManagementDisabledDetails._all_field_names_ = set([]) +DeviceManagementDisabledDetails._all_fields_ = [] + +DeviceManagementDisabledType._description_validator = bv.String() +DeviceManagementDisabledType._all_field_names_ = set(['description']) +DeviceManagementDisabledType._all_fields_ = [('description', DeviceManagementDisabledType._description_validator)] + +DeviceManagementEnabledDetails._all_field_names_ = set([]) +DeviceManagementEnabledDetails._all_fields_ = [] + +DeviceManagementEnabledType._description_validator = bv.String() +DeviceManagementEnabledType._all_field_names_ = set(['description']) +DeviceManagementEnabledType._all_fields_ = [('description', DeviceManagementEnabledType._description_validator)] + +DeviceType._desktop_validator = bv.Void() +DeviceType._mobile_validator = bv.Void() +DeviceType._other_validator = bv.Void() +DeviceType._tagmap = { + 'desktop': DeviceType._desktop_validator, + 'mobile': DeviceType._mobile_validator, + 'other': DeviceType._other_validator, +} + +DeviceType.desktop = DeviceType('desktop') +DeviceType.mobile = DeviceType('mobile') +DeviceType.other = DeviceType('other') + +DeviceUnlinkDetails._session_info_validator = bv.Nullable(SessionLogInfo_validator) +DeviceUnlinkDetails._display_name_validator = bv.Nullable(bv.String()) +DeviceUnlinkDetails._delete_data_validator = bv.Boolean() +DeviceUnlinkDetails._all_field_names_ = set([ + 'session_info', + 'display_name', + 'delete_data', +]) +DeviceUnlinkDetails._all_fields_ = [ + ('session_info', DeviceUnlinkDetails._session_info_validator), + ('display_name', DeviceUnlinkDetails._display_name_validator), + ('delete_data', DeviceUnlinkDetails._delete_data_validator), +] + +DeviceUnlinkPolicy._remove_validator = bv.Void() +DeviceUnlinkPolicy._keep_validator = bv.Void() +DeviceUnlinkPolicy._other_validator = bv.Void() +DeviceUnlinkPolicy._tagmap = { + 'remove': DeviceUnlinkPolicy._remove_validator, + 'keep': DeviceUnlinkPolicy._keep_validator, + 'other': DeviceUnlinkPolicy._other_validator, +} + +DeviceUnlinkPolicy.remove = DeviceUnlinkPolicy('remove') +DeviceUnlinkPolicy.keep = DeviceUnlinkPolicy('keep') +DeviceUnlinkPolicy.other = DeviceUnlinkPolicy('other') + +DeviceUnlinkType._description_validator = bv.String() +DeviceUnlinkType._all_field_names_ = set(['description']) +DeviceUnlinkType._all_fields_ = [('description', DeviceUnlinkType._description_validator)] + +DirectoryRestrictionsAddMembersDetails._all_field_names_ = set([]) +DirectoryRestrictionsAddMembersDetails._all_fields_ = [] + +DirectoryRestrictionsAddMembersType._description_validator = bv.String() +DirectoryRestrictionsAddMembersType._all_field_names_ = set(['description']) +DirectoryRestrictionsAddMembersType._all_fields_ = [('description', DirectoryRestrictionsAddMembersType._description_validator)] + +DirectoryRestrictionsRemoveMembersDetails._all_field_names_ = set([]) +DirectoryRestrictionsRemoveMembersDetails._all_fields_ = [] + +DirectoryRestrictionsRemoveMembersType._description_validator = bv.String() +DirectoryRestrictionsRemoveMembersType._all_field_names_ = set(['description']) +DirectoryRestrictionsRemoveMembersType._all_fields_ = [('description', DirectoryRestrictionsRemoveMembersType._description_validator)] + +DisabledDomainInvitesDetails._all_field_names_ = set([]) +DisabledDomainInvitesDetails._all_fields_ = [] + +DisabledDomainInvitesType._description_validator = bv.String() +DisabledDomainInvitesType._all_field_names_ = set(['description']) +DisabledDomainInvitesType._all_fields_ = [('description', DisabledDomainInvitesType._description_validator)] + +DomainInvitesApproveRequestToJoinTeamDetails._all_field_names_ = set([]) +DomainInvitesApproveRequestToJoinTeamDetails._all_fields_ = [] + +DomainInvitesApproveRequestToJoinTeamType._description_validator = bv.String() +DomainInvitesApproveRequestToJoinTeamType._all_field_names_ = set(['description']) +DomainInvitesApproveRequestToJoinTeamType._all_fields_ = [('description', DomainInvitesApproveRequestToJoinTeamType._description_validator)] + +DomainInvitesDeclineRequestToJoinTeamDetails._all_field_names_ = set([]) +DomainInvitesDeclineRequestToJoinTeamDetails._all_fields_ = [] + +DomainInvitesDeclineRequestToJoinTeamType._description_validator = bv.String() +DomainInvitesDeclineRequestToJoinTeamType._all_field_names_ = set(['description']) +DomainInvitesDeclineRequestToJoinTeamType._all_fields_ = [('description', DomainInvitesDeclineRequestToJoinTeamType._description_validator)] + +DomainInvitesEmailExistingUsersDetails._domain_name_validator = bv.String() +DomainInvitesEmailExistingUsersDetails._num_recipients_validator = bv.UInt64() +DomainInvitesEmailExistingUsersDetails._all_field_names_ = set([ + 'domain_name', + 'num_recipients', +]) +DomainInvitesEmailExistingUsersDetails._all_fields_ = [ + ('domain_name', DomainInvitesEmailExistingUsersDetails._domain_name_validator), + ('num_recipients', DomainInvitesEmailExistingUsersDetails._num_recipients_validator), +] + +DomainInvitesEmailExistingUsersType._description_validator = bv.String() +DomainInvitesEmailExistingUsersType._all_field_names_ = set(['description']) +DomainInvitesEmailExistingUsersType._all_fields_ = [('description', DomainInvitesEmailExistingUsersType._description_validator)] + +DomainInvitesRequestToJoinTeamDetails._all_field_names_ = set([]) +DomainInvitesRequestToJoinTeamDetails._all_fields_ = [] + +DomainInvitesRequestToJoinTeamType._description_validator = bv.String() +DomainInvitesRequestToJoinTeamType._all_field_names_ = set(['description']) +DomainInvitesRequestToJoinTeamType._all_fields_ = [('description', DomainInvitesRequestToJoinTeamType._description_validator)] + +DomainInvitesSetInviteNewUserPrefToNoDetails._all_field_names_ = set([]) +DomainInvitesSetInviteNewUserPrefToNoDetails._all_fields_ = [] + +DomainInvitesSetInviteNewUserPrefToNoType._description_validator = bv.String() +DomainInvitesSetInviteNewUserPrefToNoType._all_field_names_ = set(['description']) +DomainInvitesSetInviteNewUserPrefToNoType._all_fields_ = [('description', DomainInvitesSetInviteNewUserPrefToNoType._description_validator)] + +DomainInvitesSetInviteNewUserPrefToYesDetails._all_field_names_ = set([]) +DomainInvitesSetInviteNewUserPrefToYesDetails._all_fields_ = [] + +DomainInvitesSetInviteNewUserPrefToYesType._description_validator = bv.String() +DomainInvitesSetInviteNewUserPrefToYesType._all_field_names_ = set(['description']) +DomainInvitesSetInviteNewUserPrefToYesType._all_fields_ = [('description', DomainInvitesSetInviteNewUserPrefToYesType._description_validator)] + +DomainVerificationAddDomainFailDetails._domain_name_validator = bv.String() +DomainVerificationAddDomainFailDetails._verification_method_validator = bv.Nullable(bv.String()) +DomainVerificationAddDomainFailDetails._all_field_names_ = set([ + 'domain_name', + 'verification_method', +]) +DomainVerificationAddDomainFailDetails._all_fields_ = [ + ('domain_name', DomainVerificationAddDomainFailDetails._domain_name_validator), + ('verification_method', DomainVerificationAddDomainFailDetails._verification_method_validator), +] + +DomainVerificationAddDomainFailType._description_validator = bv.String() +DomainVerificationAddDomainFailType._all_field_names_ = set(['description']) +DomainVerificationAddDomainFailType._all_fields_ = [('description', DomainVerificationAddDomainFailType._description_validator)] + +DomainVerificationAddDomainSuccessDetails._domain_names_validator = bv.List(bv.String()) +DomainVerificationAddDomainSuccessDetails._verification_method_validator = bv.Nullable(bv.String()) +DomainVerificationAddDomainSuccessDetails._all_field_names_ = set([ + 'domain_names', + 'verification_method', +]) +DomainVerificationAddDomainSuccessDetails._all_fields_ = [ + ('domain_names', DomainVerificationAddDomainSuccessDetails._domain_names_validator), + ('verification_method', DomainVerificationAddDomainSuccessDetails._verification_method_validator), +] + +DomainVerificationAddDomainSuccessType._description_validator = bv.String() +DomainVerificationAddDomainSuccessType._all_field_names_ = set(['description']) +DomainVerificationAddDomainSuccessType._all_fields_ = [('description', DomainVerificationAddDomainSuccessType._description_validator)] + +DomainVerificationRemoveDomainDetails._domain_names_validator = bv.List(bv.String()) +DomainVerificationRemoveDomainDetails._all_field_names_ = set(['domain_names']) +DomainVerificationRemoveDomainDetails._all_fields_ = [('domain_names', DomainVerificationRemoveDomainDetails._domain_names_validator)] + +DomainVerificationRemoveDomainType._description_validator = bv.String() +DomainVerificationRemoveDomainType._all_field_names_ = set(['description']) +DomainVerificationRemoveDomainType._all_fields_ = [('description', DomainVerificationRemoveDomainType._description_validator)] + +DownloadPolicyType._allow_validator = bv.Void() +DownloadPolicyType._disallow_validator = bv.Void() +DownloadPolicyType._other_validator = bv.Void() +DownloadPolicyType._tagmap = { + 'allow': DownloadPolicyType._allow_validator, + 'disallow': DownloadPolicyType._disallow_validator, + 'other': DownloadPolicyType._other_validator, +} + +DownloadPolicyType.allow = DownloadPolicyType('allow') +DownloadPolicyType.disallow = DownloadPolicyType('disallow') +DownloadPolicyType.other = DownloadPolicyType('other') + +DurationLogInfo._unit_validator = TimeUnit_validator +DurationLogInfo._amount_validator = bv.UInt64() +DurationLogInfo._all_field_names_ = set([ + 'unit', + 'amount', +]) +DurationLogInfo._all_fields_ = [ + ('unit', DurationLogInfo._unit_validator), + ('amount', DurationLogInfo._amount_validator), +] + +EmmAddExceptionDetails._all_field_names_ = set([]) +EmmAddExceptionDetails._all_fields_ = [] + +EmmAddExceptionType._description_validator = bv.String() +EmmAddExceptionType._all_field_names_ = set(['description']) +EmmAddExceptionType._all_fields_ = [('description', EmmAddExceptionType._description_validator)] + +EmmChangePolicyDetails._new_value_validator = team_policies.EmmState_validator +EmmChangePolicyDetails._previous_value_validator = bv.Nullable(team_policies.EmmState_validator) +EmmChangePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +EmmChangePolicyDetails._all_fields_ = [ + ('new_value', EmmChangePolicyDetails._new_value_validator), + ('previous_value', EmmChangePolicyDetails._previous_value_validator), +] + +EmmChangePolicyType._description_validator = bv.String() +EmmChangePolicyType._all_field_names_ = set(['description']) +EmmChangePolicyType._all_fields_ = [('description', EmmChangePolicyType._description_validator)] + +EmmCreateExceptionsReportDetails._all_field_names_ = set([]) +EmmCreateExceptionsReportDetails._all_fields_ = [] + +EmmCreateExceptionsReportType._description_validator = bv.String() +EmmCreateExceptionsReportType._all_field_names_ = set(['description']) +EmmCreateExceptionsReportType._all_fields_ = [('description', EmmCreateExceptionsReportType._description_validator)] + +EmmCreateUsageReportDetails._all_field_names_ = set([]) +EmmCreateUsageReportDetails._all_fields_ = [] + +EmmCreateUsageReportType._description_validator = bv.String() +EmmCreateUsageReportType._all_field_names_ = set(['description']) +EmmCreateUsageReportType._all_fields_ = [('description', EmmCreateUsageReportType._description_validator)] + +EmmErrorDetails._error_details_validator = FailureDetailsLogInfo_validator +EmmErrorDetails._all_field_names_ = set(['error_details']) +EmmErrorDetails._all_fields_ = [('error_details', EmmErrorDetails._error_details_validator)] + +EmmErrorType._description_validator = bv.String() +EmmErrorType._all_field_names_ = set(['description']) +EmmErrorType._all_fields_ = [('description', EmmErrorType._description_validator)] + +EmmRefreshAuthTokenDetails._all_field_names_ = set([]) +EmmRefreshAuthTokenDetails._all_fields_ = [] + +EmmRefreshAuthTokenType._description_validator = bv.String() +EmmRefreshAuthTokenType._all_field_names_ = set(['description']) +EmmRefreshAuthTokenType._all_fields_ = [('description', EmmRefreshAuthTokenType._description_validator)] + +EmmRemoveExceptionDetails._all_field_names_ = set([]) +EmmRemoveExceptionDetails._all_fields_ = [] + +EmmRemoveExceptionType._description_validator = bv.String() +EmmRemoveExceptionType._all_field_names_ = set(['description']) +EmmRemoveExceptionType._all_fields_ = [('description', EmmRemoveExceptionType._description_validator)] + +EnabledDomainInvitesDetails._all_field_names_ = set([]) +EnabledDomainInvitesDetails._all_fields_ = [] + +EnabledDomainInvitesType._description_validator = bv.String() +EnabledDomainInvitesType._all_field_names_ = set(['description']) +EnabledDomainInvitesType._all_fields_ = [('description', EnabledDomainInvitesType._description_validator)] + +EventCategory._apps_validator = bv.Void() +EventCategory._comments_validator = bv.Void() +EventCategory._devices_validator = bv.Void() +EventCategory._domains_validator = bv.Void() +EventCategory._file_operations_validator = bv.Void() +EventCategory._file_requests_validator = bv.Void() +EventCategory._groups_validator = bv.Void() +EventCategory._logins_validator = bv.Void() +EventCategory._members_validator = bv.Void() +EventCategory._paper_validator = bv.Void() +EventCategory._passwords_validator = bv.Void() +EventCategory._reports_validator = bv.Void() +EventCategory._sharing_validator = bv.Void() +EventCategory._showcase_validator = bv.Void() +EventCategory._sso_validator = bv.Void() +EventCategory._team_folders_validator = bv.Void() +EventCategory._team_policies_validator = bv.Void() +EventCategory._team_profile_validator = bv.Void() +EventCategory._tfa_validator = bv.Void() +EventCategory._other_validator = bv.Void() +EventCategory._tagmap = { + 'apps': EventCategory._apps_validator, + 'comments': EventCategory._comments_validator, + 'devices': EventCategory._devices_validator, + 'domains': EventCategory._domains_validator, + 'file_operations': EventCategory._file_operations_validator, + 'file_requests': EventCategory._file_requests_validator, + 'groups': EventCategory._groups_validator, + 'logins': EventCategory._logins_validator, + 'members': EventCategory._members_validator, + 'paper': EventCategory._paper_validator, + 'passwords': EventCategory._passwords_validator, + 'reports': EventCategory._reports_validator, + 'sharing': EventCategory._sharing_validator, + 'showcase': EventCategory._showcase_validator, + 'sso': EventCategory._sso_validator, + 'team_folders': EventCategory._team_folders_validator, + 'team_policies': EventCategory._team_policies_validator, + 'team_profile': EventCategory._team_profile_validator, + 'tfa': EventCategory._tfa_validator, + 'other': EventCategory._other_validator, +} + +EventCategory.apps = EventCategory('apps') +EventCategory.comments = EventCategory('comments') +EventCategory.devices = EventCategory('devices') +EventCategory.domains = EventCategory('domains') +EventCategory.file_operations = EventCategory('file_operations') +EventCategory.file_requests = EventCategory('file_requests') +EventCategory.groups = EventCategory('groups') +EventCategory.logins = EventCategory('logins') +EventCategory.members = EventCategory('members') +EventCategory.paper = EventCategory('paper') +EventCategory.passwords = EventCategory('passwords') +EventCategory.reports = EventCategory('reports') +EventCategory.sharing = EventCategory('sharing') +EventCategory.showcase = EventCategory('showcase') +EventCategory.sso = EventCategory('sso') +EventCategory.team_folders = EventCategory('team_folders') +EventCategory.team_policies = EventCategory('team_policies') +EventCategory.team_profile = EventCategory('team_profile') +EventCategory.tfa = EventCategory('tfa') +EventCategory.other = EventCategory('other') + +EventDetails._app_link_team_details_validator = AppLinkTeamDetails_validator +EventDetails._app_link_user_details_validator = AppLinkUserDetails_validator +EventDetails._app_unlink_team_details_validator = AppUnlinkTeamDetails_validator +EventDetails._app_unlink_user_details_validator = AppUnlinkUserDetails_validator +EventDetails._file_add_comment_details_validator = FileAddCommentDetails_validator +EventDetails._file_change_comment_subscription_details_validator = FileChangeCommentSubscriptionDetails_validator +EventDetails._file_delete_comment_details_validator = FileDeleteCommentDetails_validator +EventDetails._file_edit_comment_details_validator = FileEditCommentDetails_validator +EventDetails._file_like_comment_details_validator = FileLikeCommentDetails_validator +EventDetails._file_resolve_comment_details_validator = FileResolveCommentDetails_validator +EventDetails._file_unlike_comment_details_validator = FileUnlikeCommentDetails_validator +EventDetails._file_unresolve_comment_details_validator = FileUnresolveCommentDetails_validator +EventDetails._device_change_ip_desktop_details_validator = DeviceChangeIpDesktopDetails_validator +EventDetails._device_change_ip_mobile_details_validator = DeviceChangeIpMobileDetails_validator +EventDetails._device_change_ip_web_details_validator = DeviceChangeIpWebDetails_validator +EventDetails._device_delete_on_unlink_fail_details_validator = DeviceDeleteOnUnlinkFailDetails_validator +EventDetails._device_delete_on_unlink_success_details_validator = DeviceDeleteOnUnlinkSuccessDetails_validator +EventDetails._device_link_fail_details_validator = DeviceLinkFailDetails_validator +EventDetails._device_link_success_details_validator = DeviceLinkSuccessDetails_validator +EventDetails._device_management_disabled_details_validator = DeviceManagementDisabledDetails_validator +EventDetails._device_management_enabled_details_validator = DeviceManagementEnabledDetails_validator +EventDetails._device_unlink_details_validator = DeviceUnlinkDetails_validator +EventDetails._emm_refresh_auth_token_details_validator = EmmRefreshAuthTokenDetails_validator +EventDetails._account_capture_change_availability_details_validator = AccountCaptureChangeAvailabilityDetails_validator +EventDetails._account_capture_migrate_account_details_validator = AccountCaptureMigrateAccountDetails_validator +EventDetails._account_capture_notification_emails_sent_details_validator = AccountCaptureNotificationEmailsSentDetails_validator +EventDetails._account_capture_relinquish_account_details_validator = AccountCaptureRelinquishAccountDetails_validator +EventDetails._disabled_domain_invites_details_validator = DisabledDomainInvitesDetails_validator +EventDetails._domain_invites_approve_request_to_join_team_details_validator = DomainInvitesApproveRequestToJoinTeamDetails_validator +EventDetails._domain_invites_decline_request_to_join_team_details_validator = DomainInvitesDeclineRequestToJoinTeamDetails_validator +EventDetails._domain_invites_email_existing_users_details_validator = DomainInvitesEmailExistingUsersDetails_validator +EventDetails._domain_invites_request_to_join_team_details_validator = DomainInvitesRequestToJoinTeamDetails_validator +EventDetails._domain_invites_set_invite_new_user_pref_to_no_details_validator = DomainInvitesSetInviteNewUserPrefToNoDetails_validator +EventDetails._domain_invites_set_invite_new_user_pref_to_yes_details_validator = DomainInvitesSetInviteNewUserPrefToYesDetails_validator +EventDetails._domain_verification_add_domain_fail_details_validator = DomainVerificationAddDomainFailDetails_validator +EventDetails._domain_verification_add_domain_success_details_validator = DomainVerificationAddDomainSuccessDetails_validator +EventDetails._domain_verification_remove_domain_details_validator = DomainVerificationRemoveDomainDetails_validator +EventDetails._enabled_domain_invites_details_validator = EnabledDomainInvitesDetails_validator +EventDetails._create_folder_details_validator = CreateFolderDetails_validator +EventDetails._file_add_details_validator = FileAddDetails_validator +EventDetails._file_copy_details_validator = FileCopyDetails_validator +EventDetails._file_delete_details_validator = FileDeleteDetails_validator +EventDetails._file_download_details_validator = FileDownloadDetails_validator +EventDetails._file_edit_details_validator = FileEditDetails_validator +EventDetails._file_get_copy_reference_details_validator = FileGetCopyReferenceDetails_validator +EventDetails._file_move_details_validator = FileMoveDetails_validator +EventDetails._file_permanently_delete_details_validator = FilePermanentlyDeleteDetails_validator +EventDetails._file_preview_details_validator = FilePreviewDetails_validator +EventDetails._file_rename_details_validator = FileRenameDetails_validator +EventDetails._file_restore_details_validator = FileRestoreDetails_validator +EventDetails._file_revert_details_validator = FileRevertDetails_validator +EventDetails._file_rollback_changes_details_validator = FileRollbackChangesDetails_validator +EventDetails._file_save_copy_reference_details_validator = FileSaveCopyReferenceDetails_validator +EventDetails._file_request_change_details_validator = FileRequestChangeDetails_validator +EventDetails._file_request_close_details_validator = FileRequestCloseDetails_validator +EventDetails._file_request_create_details_validator = FileRequestCreateDetails_validator +EventDetails._file_request_receive_file_details_validator = FileRequestReceiveFileDetails_validator +EventDetails._group_add_external_id_details_validator = GroupAddExternalIdDetails_validator +EventDetails._group_add_member_details_validator = GroupAddMemberDetails_validator +EventDetails._group_change_external_id_details_validator = GroupChangeExternalIdDetails_validator +EventDetails._group_change_management_type_details_validator = GroupChangeManagementTypeDetails_validator +EventDetails._group_change_member_role_details_validator = GroupChangeMemberRoleDetails_validator +EventDetails._group_create_details_validator = GroupCreateDetails_validator +EventDetails._group_delete_details_validator = GroupDeleteDetails_validator +EventDetails._group_description_updated_details_validator = GroupDescriptionUpdatedDetails_validator +EventDetails._group_join_policy_updated_details_validator = GroupJoinPolicyUpdatedDetails_validator +EventDetails._group_moved_details_validator = GroupMovedDetails_validator +EventDetails._group_remove_external_id_details_validator = GroupRemoveExternalIdDetails_validator +EventDetails._group_remove_member_details_validator = GroupRemoveMemberDetails_validator +EventDetails._group_rename_details_validator = GroupRenameDetails_validator +EventDetails._emm_error_details_validator = EmmErrorDetails_validator +EventDetails._login_fail_details_validator = LoginFailDetails_validator +EventDetails._login_success_details_validator = LoginSuccessDetails_validator +EventDetails._logout_details_validator = LogoutDetails_validator +EventDetails._reseller_support_session_end_details_validator = ResellerSupportSessionEndDetails_validator +EventDetails._reseller_support_session_start_details_validator = ResellerSupportSessionStartDetails_validator +EventDetails._sign_in_as_session_end_details_validator = SignInAsSessionEndDetails_validator +EventDetails._sign_in_as_session_start_details_validator = SignInAsSessionStartDetails_validator +EventDetails._sso_error_details_validator = SsoErrorDetails_validator +EventDetails._member_add_name_details_validator = MemberAddNameDetails_validator +EventDetails._member_change_admin_role_details_validator = MemberChangeAdminRoleDetails_validator +EventDetails._member_change_email_details_validator = MemberChangeEmailDetails_validator +EventDetails._member_change_membership_type_details_validator = MemberChangeMembershipTypeDetails_validator +EventDetails._member_change_name_details_validator = MemberChangeNameDetails_validator +EventDetails._member_change_status_details_validator = MemberChangeStatusDetails_validator +EventDetails._member_delete_manual_contacts_details_validator = MemberDeleteManualContactsDetails_validator +EventDetails._member_permanently_delete_account_contents_details_validator = MemberPermanentlyDeleteAccountContentsDetails_validator +EventDetails._member_space_limits_add_custom_quota_details_validator = MemberSpaceLimitsAddCustomQuotaDetails_validator +EventDetails._member_space_limits_change_custom_quota_details_validator = MemberSpaceLimitsChangeCustomQuotaDetails_validator +EventDetails._member_space_limits_change_status_details_validator = MemberSpaceLimitsChangeStatusDetails_validator +EventDetails._member_space_limits_remove_custom_quota_details_validator = MemberSpaceLimitsRemoveCustomQuotaDetails_validator +EventDetails._member_suggest_details_validator = MemberSuggestDetails_validator +EventDetails._member_transfer_account_contents_details_validator = MemberTransferAccountContentsDetails_validator +EventDetails._secondary_mails_policy_changed_details_validator = SecondaryMailsPolicyChangedDetails_validator +EventDetails._paper_content_add_member_details_validator = PaperContentAddMemberDetails_validator +EventDetails._paper_content_add_to_folder_details_validator = PaperContentAddToFolderDetails_validator +EventDetails._paper_content_archive_details_validator = PaperContentArchiveDetails_validator +EventDetails._paper_content_create_details_validator = PaperContentCreateDetails_validator +EventDetails._paper_content_permanently_delete_details_validator = PaperContentPermanentlyDeleteDetails_validator +EventDetails._paper_content_remove_from_folder_details_validator = PaperContentRemoveFromFolderDetails_validator +EventDetails._paper_content_remove_member_details_validator = PaperContentRemoveMemberDetails_validator +EventDetails._paper_content_rename_details_validator = PaperContentRenameDetails_validator +EventDetails._paper_content_restore_details_validator = PaperContentRestoreDetails_validator +EventDetails._paper_doc_add_comment_details_validator = PaperDocAddCommentDetails_validator +EventDetails._paper_doc_change_member_role_details_validator = PaperDocChangeMemberRoleDetails_validator +EventDetails._paper_doc_change_sharing_policy_details_validator = PaperDocChangeSharingPolicyDetails_validator +EventDetails._paper_doc_change_subscription_details_validator = PaperDocChangeSubscriptionDetails_validator +EventDetails._paper_doc_deleted_details_validator = PaperDocDeletedDetails_validator +EventDetails._paper_doc_delete_comment_details_validator = PaperDocDeleteCommentDetails_validator +EventDetails._paper_doc_download_details_validator = PaperDocDownloadDetails_validator +EventDetails._paper_doc_edit_details_validator = PaperDocEditDetails_validator +EventDetails._paper_doc_edit_comment_details_validator = PaperDocEditCommentDetails_validator +EventDetails._paper_doc_followed_details_validator = PaperDocFollowedDetails_validator +EventDetails._paper_doc_mention_details_validator = PaperDocMentionDetails_validator +EventDetails._paper_doc_ownership_changed_details_validator = PaperDocOwnershipChangedDetails_validator +EventDetails._paper_doc_request_access_details_validator = PaperDocRequestAccessDetails_validator +EventDetails._paper_doc_resolve_comment_details_validator = PaperDocResolveCommentDetails_validator +EventDetails._paper_doc_revert_details_validator = PaperDocRevertDetails_validator +EventDetails._paper_doc_slack_share_details_validator = PaperDocSlackShareDetails_validator +EventDetails._paper_doc_team_invite_details_validator = PaperDocTeamInviteDetails_validator +EventDetails._paper_doc_trashed_details_validator = PaperDocTrashedDetails_validator +EventDetails._paper_doc_unresolve_comment_details_validator = PaperDocUnresolveCommentDetails_validator +EventDetails._paper_doc_untrashed_details_validator = PaperDocUntrashedDetails_validator +EventDetails._paper_doc_view_details_validator = PaperDocViewDetails_validator +EventDetails._paper_external_view_allow_details_validator = PaperExternalViewAllowDetails_validator +EventDetails._paper_external_view_default_team_details_validator = PaperExternalViewDefaultTeamDetails_validator +EventDetails._paper_external_view_forbid_details_validator = PaperExternalViewForbidDetails_validator +EventDetails._paper_folder_change_subscription_details_validator = PaperFolderChangeSubscriptionDetails_validator +EventDetails._paper_folder_deleted_details_validator = PaperFolderDeletedDetails_validator +EventDetails._paper_folder_followed_details_validator = PaperFolderFollowedDetails_validator +EventDetails._paper_folder_team_invite_details_validator = PaperFolderTeamInviteDetails_validator +EventDetails._password_change_details_validator = PasswordChangeDetails_validator +EventDetails._password_reset_details_validator = PasswordResetDetails_validator +EventDetails._password_reset_all_details_validator = PasswordResetAllDetails_validator +EventDetails._emm_create_exceptions_report_details_validator = EmmCreateExceptionsReportDetails_validator +EventDetails._emm_create_usage_report_details_validator = EmmCreateUsageReportDetails_validator +EventDetails._export_members_report_details_validator = ExportMembersReportDetails_validator +EventDetails._paper_admin_export_start_details_validator = PaperAdminExportStartDetails_validator +EventDetails._smart_sync_create_admin_privilege_report_details_validator = SmartSyncCreateAdminPrivilegeReportDetails_validator +EventDetails._team_activity_create_report_details_validator = TeamActivityCreateReportDetails_validator +EventDetails._collection_share_details_validator = CollectionShareDetails_validator +EventDetails._note_acl_invite_only_details_validator = NoteAclInviteOnlyDetails_validator +EventDetails._note_acl_link_details_validator = NoteAclLinkDetails_validator +EventDetails._note_acl_team_link_details_validator = NoteAclTeamLinkDetails_validator +EventDetails._note_shared_details_validator = NoteSharedDetails_validator +EventDetails._note_share_receive_details_validator = NoteShareReceiveDetails_validator +EventDetails._open_note_shared_details_validator = OpenNoteSharedDetails_validator +EventDetails._sf_add_group_details_validator = SfAddGroupDetails_validator +EventDetails._sf_allow_non_members_to_view_shared_links_details_validator = SfAllowNonMembersToViewSharedLinksDetails_validator +EventDetails._sf_external_invite_warn_details_validator = SfExternalInviteWarnDetails_validator +EventDetails._sf_fb_invite_details_validator = SfFbInviteDetails_validator +EventDetails._sf_fb_invite_change_role_details_validator = SfFbInviteChangeRoleDetails_validator +EventDetails._sf_fb_uninvite_details_validator = SfFbUninviteDetails_validator +EventDetails._sf_invite_group_details_validator = SfInviteGroupDetails_validator +EventDetails._sf_team_grant_access_details_validator = SfTeamGrantAccessDetails_validator +EventDetails._sf_team_invite_details_validator = SfTeamInviteDetails_validator +EventDetails._sf_team_invite_change_role_details_validator = SfTeamInviteChangeRoleDetails_validator +EventDetails._sf_team_join_details_validator = SfTeamJoinDetails_validator +EventDetails._sf_team_join_from_oob_link_details_validator = SfTeamJoinFromOobLinkDetails_validator +EventDetails._sf_team_uninvite_details_validator = SfTeamUninviteDetails_validator +EventDetails._shared_content_add_invitees_details_validator = SharedContentAddInviteesDetails_validator +EventDetails._shared_content_add_link_expiry_details_validator = SharedContentAddLinkExpiryDetails_validator +EventDetails._shared_content_add_link_password_details_validator = SharedContentAddLinkPasswordDetails_validator +EventDetails._shared_content_add_member_details_validator = SharedContentAddMemberDetails_validator +EventDetails._shared_content_change_downloads_policy_details_validator = SharedContentChangeDownloadsPolicyDetails_validator +EventDetails._shared_content_change_invitee_role_details_validator = SharedContentChangeInviteeRoleDetails_validator +EventDetails._shared_content_change_link_audience_details_validator = SharedContentChangeLinkAudienceDetails_validator +EventDetails._shared_content_change_link_expiry_details_validator = SharedContentChangeLinkExpiryDetails_validator +EventDetails._shared_content_change_link_password_details_validator = SharedContentChangeLinkPasswordDetails_validator +EventDetails._shared_content_change_member_role_details_validator = SharedContentChangeMemberRoleDetails_validator +EventDetails._shared_content_change_viewer_info_policy_details_validator = SharedContentChangeViewerInfoPolicyDetails_validator +EventDetails._shared_content_claim_invitation_details_validator = SharedContentClaimInvitationDetails_validator +EventDetails._shared_content_copy_details_validator = SharedContentCopyDetails_validator +EventDetails._shared_content_download_details_validator = SharedContentDownloadDetails_validator +EventDetails._shared_content_relinquish_membership_details_validator = SharedContentRelinquishMembershipDetails_validator +EventDetails._shared_content_remove_invitees_details_validator = SharedContentRemoveInviteesDetails_validator +EventDetails._shared_content_remove_link_expiry_details_validator = SharedContentRemoveLinkExpiryDetails_validator +EventDetails._shared_content_remove_link_password_details_validator = SharedContentRemoveLinkPasswordDetails_validator +EventDetails._shared_content_remove_member_details_validator = SharedContentRemoveMemberDetails_validator +EventDetails._shared_content_request_access_details_validator = SharedContentRequestAccessDetails_validator +EventDetails._shared_content_unshare_details_validator = SharedContentUnshareDetails_validator +EventDetails._shared_content_view_details_validator = SharedContentViewDetails_validator +EventDetails._shared_folder_change_link_policy_details_validator = SharedFolderChangeLinkPolicyDetails_validator +EventDetails._shared_folder_change_members_inheritance_policy_details_validator = SharedFolderChangeMembersInheritancePolicyDetails_validator +EventDetails._shared_folder_change_members_management_policy_details_validator = SharedFolderChangeMembersManagementPolicyDetails_validator +EventDetails._shared_folder_change_members_policy_details_validator = SharedFolderChangeMembersPolicyDetails_validator +EventDetails._shared_folder_create_details_validator = SharedFolderCreateDetails_validator +EventDetails._shared_folder_decline_invitation_details_validator = SharedFolderDeclineInvitationDetails_validator +EventDetails._shared_folder_mount_details_validator = SharedFolderMountDetails_validator +EventDetails._shared_folder_nest_details_validator = SharedFolderNestDetails_validator +EventDetails._shared_folder_transfer_ownership_details_validator = SharedFolderTransferOwnershipDetails_validator +EventDetails._shared_folder_unmount_details_validator = SharedFolderUnmountDetails_validator +EventDetails._shared_link_add_expiry_details_validator = SharedLinkAddExpiryDetails_validator +EventDetails._shared_link_change_expiry_details_validator = SharedLinkChangeExpiryDetails_validator +EventDetails._shared_link_change_visibility_details_validator = SharedLinkChangeVisibilityDetails_validator +EventDetails._shared_link_copy_details_validator = SharedLinkCopyDetails_validator +EventDetails._shared_link_create_details_validator = SharedLinkCreateDetails_validator +EventDetails._shared_link_disable_details_validator = SharedLinkDisableDetails_validator +EventDetails._shared_link_download_details_validator = SharedLinkDownloadDetails_validator +EventDetails._shared_link_remove_expiry_details_validator = SharedLinkRemoveExpiryDetails_validator +EventDetails._shared_link_share_details_validator = SharedLinkShareDetails_validator +EventDetails._shared_link_view_details_validator = SharedLinkViewDetails_validator +EventDetails._shared_note_opened_details_validator = SharedNoteOpenedDetails_validator +EventDetails._shmodel_group_share_details_validator = ShmodelGroupShareDetails_validator +EventDetails._showcase_access_granted_details_validator = ShowcaseAccessGrantedDetails_validator +EventDetails._showcase_add_member_details_validator = ShowcaseAddMemberDetails_validator +EventDetails._showcase_archived_details_validator = ShowcaseArchivedDetails_validator +EventDetails._showcase_created_details_validator = ShowcaseCreatedDetails_validator +EventDetails._showcase_delete_comment_details_validator = ShowcaseDeleteCommentDetails_validator +EventDetails._showcase_edited_details_validator = ShowcaseEditedDetails_validator +EventDetails._showcase_edit_comment_details_validator = ShowcaseEditCommentDetails_validator +EventDetails._showcase_file_added_details_validator = ShowcaseFileAddedDetails_validator +EventDetails._showcase_file_download_details_validator = ShowcaseFileDownloadDetails_validator +EventDetails._showcase_file_removed_details_validator = ShowcaseFileRemovedDetails_validator +EventDetails._showcase_file_view_details_validator = ShowcaseFileViewDetails_validator +EventDetails._showcase_permanently_deleted_details_validator = ShowcasePermanentlyDeletedDetails_validator +EventDetails._showcase_post_comment_details_validator = ShowcasePostCommentDetails_validator +EventDetails._showcase_remove_member_details_validator = ShowcaseRemoveMemberDetails_validator +EventDetails._showcase_renamed_details_validator = ShowcaseRenamedDetails_validator +EventDetails._showcase_request_access_details_validator = ShowcaseRequestAccessDetails_validator +EventDetails._showcase_resolve_comment_details_validator = ShowcaseResolveCommentDetails_validator +EventDetails._showcase_restored_details_validator = ShowcaseRestoredDetails_validator +EventDetails._showcase_trashed_details_validator = ShowcaseTrashedDetails_validator +EventDetails._showcase_trashed_deprecated_details_validator = ShowcaseTrashedDeprecatedDetails_validator +EventDetails._showcase_unresolve_comment_details_validator = ShowcaseUnresolveCommentDetails_validator +EventDetails._showcase_untrashed_details_validator = ShowcaseUntrashedDetails_validator +EventDetails._showcase_untrashed_deprecated_details_validator = ShowcaseUntrashedDeprecatedDetails_validator +EventDetails._showcase_view_details_validator = ShowcaseViewDetails_validator +EventDetails._sso_add_cert_details_validator = SsoAddCertDetails_validator +EventDetails._sso_add_login_url_details_validator = SsoAddLoginUrlDetails_validator +EventDetails._sso_add_logout_url_details_validator = SsoAddLogoutUrlDetails_validator +EventDetails._sso_change_cert_details_validator = SsoChangeCertDetails_validator +EventDetails._sso_change_login_url_details_validator = SsoChangeLoginUrlDetails_validator +EventDetails._sso_change_logout_url_details_validator = SsoChangeLogoutUrlDetails_validator +EventDetails._sso_change_saml_identity_mode_details_validator = SsoChangeSamlIdentityModeDetails_validator +EventDetails._sso_remove_cert_details_validator = SsoRemoveCertDetails_validator +EventDetails._sso_remove_login_url_details_validator = SsoRemoveLoginUrlDetails_validator +EventDetails._sso_remove_logout_url_details_validator = SsoRemoveLogoutUrlDetails_validator +EventDetails._team_folder_change_status_details_validator = TeamFolderChangeStatusDetails_validator +EventDetails._team_folder_create_details_validator = TeamFolderCreateDetails_validator +EventDetails._team_folder_downgrade_details_validator = TeamFolderDowngradeDetails_validator +EventDetails._team_folder_permanently_delete_details_validator = TeamFolderPermanentlyDeleteDetails_validator +EventDetails._team_folder_rename_details_validator = TeamFolderRenameDetails_validator +EventDetails._team_selective_sync_settings_changed_details_validator = TeamSelectiveSyncSettingsChangedDetails_validator +EventDetails._account_capture_change_policy_details_validator = AccountCaptureChangePolicyDetails_validator +EventDetails._allow_download_disabled_details_validator = AllowDownloadDisabledDetails_validator +EventDetails._allow_download_enabled_details_validator = AllowDownloadEnabledDetails_validator +EventDetails._camera_uploads_policy_changed_details_validator = CameraUploadsPolicyChangedDetails_validator +EventDetails._data_placement_restriction_change_policy_details_validator = DataPlacementRestrictionChangePolicyDetails_validator +EventDetails._data_placement_restriction_satisfy_policy_details_validator = DataPlacementRestrictionSatisfyPolicyDetails_validator +EventDetails._device_approvals_change_desktop_policy_details_validator = DeviceApprovalsChangeDesktopPolicyDetails_validator +EventDetails._device_approvals_change_mobile_policy_details_validator = DeviceApprovalsChangeMobilePolicyDetails_validator +EventDetails._device_approvals_change_overage_action_details_validator = DeviceApprovalsChangeOverageActionDetails_validator +EventDetails._device_approvals_change_unlink_action_details_validator = DeviceApprovalsChangeUnlinkActionDetails_validator +EventDetails._directory_restrictions_add_members_details_validator = DirectoryRestrictionsAddMembersDetails_validator +EventDetails._directory_restrictions_remove_members_details_validator = DirectoryRestrictionsRemoveMembersDetails_validator +EventDetails._emm_add_exception_details_validator = EmmAddExceptionDetails_validator +EventDetails._emm_change_policy_details_validator = EmmChangePolicyDetails_validator +EventDetails._emm_remove_exception_details_validator = EmmRemoveExceptionDetails_validator +EventDetails._extended_version_history_change_policy_details_validator = ExtendedVersionHistoryChangePolicyDetails_validator +EventDetails._file_comments_change_policy_details_validator = FileCommentsChangePolicyDetails_validator +EventDetails._file_requests_change_policy_details_validator = FileRequestsChangePolicyDetails_validator +EventDetails._file_requests_emails_enabled_details_validator = FileRequestsEmailsEnabledDetails_validator +EventDetails._file_requests_emails_restricted_to_team_only_details_validator = FileRequestsEmailsRestrictedToTeamOnlyDetails_validator +EventDetails._google_sso_change_policy_details_validator = GoogleSsoChangePolicyDetails_validator +EventDetails._group_user_management_change_policy_details_validator = GroupUserManagementChangePolicyDetails_validator +EventDetails._member_requests_change_policy_details_validator = MemberRequestsChangePolicyDetails_validator +EventDetails._member_space_limits_add_exception_details_validator = MemberSpaceLimitsAddExceptionDetails_validator +EventDetails._member_space_limits_change_caps_type_policy_details_validator = MemberSpaceLimitsChangeCapsTypePolicyDetails_validator +EventDetails._member_space_limits_change_policy_details_validator = MemberSpaceLimitsChangePolicyDetails_validator +EventDetails._member_space_limits_remove_exception_details_validator = MemberSpaceLimitsRemoveExceptionDetails_validator +EventDetails._member_suggestions_change_policy_details_validator = MemberSuggestionsChangePolicyDetails_validator +EventDetails._microsoft_office_addin_change_policy_details_validator = MicrosoftOfficeAddinChangePolicyDetails_validator +EventDetails._network_control_change_policy_details_validator = NetworkControlChangePolicyDetails_validator +EventDetails._paper_change_deployment_policy_details_validator = PaperChangeDeploymentPolicyDetails_validator +EventDetails._paper_change_member_link_policy_details_validator = PaperChangeMemberLinkPolicyDetails_validator +EventDetails._paper_change_member_policy_details_validator = PaperChangeMemberPolicyDetails_validator +EventDetails._paper_change_policy_details_validator = PaperChangePolicyDetails_validator +EventDetails._paper_enabled_users_group_addition_details_validator = PaperEnabledUsersGroupAdditionDetails_validator +EventDetails._paper_enabled_users_group_removal_details_validator = PaperEnabledUsersGroupRemovalDetails_validator +EventDetails._permanent_delete_change_policy_details_validator = PermanentDeleteChangePolicyDetails_validator +EventDetails._sharing_change_folder_join_policy_details_validator = SharingChangeFolderJoinPolicyDetails_validator +EventDetails._sharing_change_link_policy_details_validator = SharingChangeLinkPolicyDetails_validator +EventDetails._sharing_change_member_policy_details_validator = SharingChangeMemberPolicyDetails_validator +EventDetails._showcase_change_download_policy_details_validator = ShowcaseChangeDownloadPolicyDetails_validator +EventDetails._showcase_change_enabled_policy_details_validator = ShowcaseChangeEnabledPolicyDetails_validator +EventDetails._showcase_change_external_sharing_policy_details_validator = ShowcaseChangeExternalSharingPolicyDetails_validator +EventDetails._smart_sync_change_policy_details_validator = SmartSyncChangePolicyDetails_validator +EventDetails._smart_sync_not_opt_out_details_validator = SmartSyncNotOptOutDetails_validator +EventDetails._smart_sync_opt_out_details_validator = SmartSyncOptOutDetails_validator +EventDetails._sso_change_policy_details_validator = SsoChangePolicyDetails_validator +EventDetails._team_selective_sync_policy_changed_details_validator = TeamSelectiveSyncPolicyChangedDetails_validator +EventDetails._tfa_change_policy_details_validator = TfaChangePolicyDetails_validator +EventDetails._two_account_change_policy_details_validator = TwoAccountChangePolicyDetails_validator +EventDetails._viewer_info_policy_changed_details_validator = ViewerInfoPolicyChangedDetails_validator +EventDetails._web_sessions_change_fixed_length_policy_details_validator = WebSessionsChangeFixedLengthPolicyDetails_validator +EventDetails._web_sessions_change_idle_length_policy_details_validator = WebSessionsChangeIdleLengthPolicyDetails_validator +EventDetails._team_merge_from_details_validator = TeamMergeFromDetails_validator +EventDetails._team_merge_to_details_validator = TeamMergeToDetails_validator +EventDetails._team_profile_add_logo_details_validator = TeamProfileAddLogoDetails_validator +EventDetails._team_profile_change_default_language_details_validator = TeamProfileChangeDefaultLanguageDetails_validator +EventDetails._team_profile_change_logo_details_validator = TeamProfileChangeLogoDetails_validator +EventDetails._team_profile_change_name_details_validator = TeamProfileChangeNameDetails_validator +EventDetails._team_profile_remove_logo_details_validator = TeamProfileRemoveLogoDetails_validator +EventDetails._tfa_add_backup_phone_details_validator = TfaAddBackupPhoneDetails_validator +EventDetails._tfa_add_security_key_details_validator = TfaAddSecurityKeyDetails_validator +EventDetails._tfa_change_backup_phone_details_validator = TfaChangeBackupPhoneDetails_validator +EventDetails._tfa_change_status_details_validator = TfaChangeStatusDetails_validator +EventDetails._tfa_remove_backup_phone_details_validator = TfaRemoveBackupPhoneDetails_validator +EventDetails._tfa_remove_security_key_details_validator = TfaRemoveSecurityKeyDetails_validator +EventDetails._tfa_reset_details_validator = TfaResetDetails_validator +EventDetails._missing_details_validator = MissingDetails_validator +EventDetails._other_validator = bv.Void() +EventDetails._tagmap = { + 'app_link_team_details': EventDetails._app_link_team_details_validator, + 'app_link_user_details': EventDetails._app_link_user_details_validator, + 'app_unlink_team_details': EventDetails._app_unlink_team_details_validator, + 'app_unlink_user_details': EventDetails._app_unlink_user_details_validator, + 'file_add_comment_details': EventDetails._file_add_comment_details_validator, + 'file_change_comment_subscription_details': EventDetails._file_change_comment_subscription_details_validator, + 'file_delete_comment_details': EventDetails._file_delete_comment_details_validator, + 'file_edit_comment_details': EventDetails._file_edit_comment_details_validator, + 'file_like_comment_details': EventDetails._file_like_comment_details_validator, + 'file_resolve_comment_details': EventDetails._file_resolve_comment_details_validator, + 'file_unlike_comment_details': EventDetails._file_unlike_comment_details_validator, + 'file_unresolve_comment_details': EventDetails._file_unresolve_comment_details_validator, + 'device_change_ip_desktop_details': EventDetails._device_change_ip_desktop_details_validator, + 'device_change_ip_mobile_details': EventDetails._device_change_ip_mobile_details_validator, + 'device_change_ip_web_details': EventDetails._device_change_ip_web_details_validator, + 'device_delete_on_unlink_fail_details': EventDetails._device_delete_on_unlink_fail_details_validator, + 'device_delete_on_unlink_success_details': EventDetails._device_delete_on_unlink_success_details_validator, + 'device_link_fail_details': EventDetails._device_link_fail_details_validator, + 'device_link_success_details': EventDetails._device_link_success_details_validator, + 'device_management_disabled_details': EventDetails._device_management_disabled_details_validator, + 'device_management_enabled_details': EventDetails._device_management_enabled_details_validator, + 'device_unlink_details': EventDetails._device_unlink_details_validator, + 'emm_refresh_auth_token_details': EventDetails._emm_refresh_auth_token_details_validator, + 'account_capture_change_availability_details': EventDetails._account_capture_change_availability_details_validator, + 'account_capture_migrate_account_details': EventDetails._account_capture_migrate_account_details_validator, + 'account_capture_notification_emails_sent_details': EventDetails._account_capture_notification_emails_sent_details_validator, + 'account_capture_relinquish_account_details': EventDetails._account_capture_relinquish_account_details_validator, + 'disabled_domain_invites_details': EventDetails._disabled_domain_invites_details_validator, + 'domain_invites_approve_request_to_join_team_details': EventDetails._domain_invites_approve_request_to_join_team_details_validator, + 'domain_invites_decline_request_to_join_team_details': EventDetails._domain_invites_decline_request_to_join_team_details_validator, + 'domain_invites_email_existing_users_details': EventDetails._domain_invites_email_existing_users_details_validator, + 'domain_invites_request_to_join_team_details': EventDetails._domain_invites_request_to_join_team_details_validator, + 'domain_invites_set_invite_new_user_pref_to_no_details': EventDetails._domain_invites_set_invite_new_user_pref_to_no_details_validator, + 'domain_invites_set_invite_new_user_pref_to_yes_details': EventDetails._domain_invites_set_invite_new_user_pref_to_yes_details_validator, + 'domain_verification_add_domain_fail_details': EventDetails._domain_verification_add_domain_fail_details_validator, + 'domain_verification_add_domain_success_details': EventDetails._domain_verification_add_domain_success_details_validator, + 'domain_verification_remove_domain_details': EventDetails._domain_verification_remove_domain_details_validator, + 'enabled_domain_invites_details': EventDetails._enabled_domain_invites_details_validator, + 'create_folder_details': EventDetails._create_folder_details_validator, + 'file_add_details': EventDetails._file_add_details_validator, + 'file_copy_details': EventDetails._file_copy_details_validator, + 'file_delete_details': EventDetails._file_delete_details_validator, + 'file_download_details': EventDetails._file_download_details_validator, + 'file_edit_details': EventDetails._file_edit_details_validator, + 'file_get_copy_reference_details': EventDetails._file_get_copy_reference_details_validator, + 'file_move_details': EventDetails._file_move_details_validator, + 'file_permanently_delete_details': EventDetails._file_permanently_delete_details_validator, + 'file_preview_details': EventDetails._file_preview_details_validator, + 'file_rename_details': EventDetails._file_rename_details_validator, + 'file_restore_details': EventDetails._file_restore_details_validator, + 'file_revert_details': EventDetails._file_revert_details_validator, + 'file_rollback_changes_details': EventDetails._file_rollback_changes_details_validator, + 'file_save_copy_reference_details': EventDetails._file_save_copy_reference_details_validator, + 'file_request_change_details': EventDetails._file_request_change_details_validator, + 'file_request_close_details': EventDetails._file_request_close_details_validator, + 'file_request_create_details': EventDetails._file_request_create_details_validator, + 'file_request_receive_file_details': EventDetails._file_request_receive_file_details_validator, + 'group_add_external_id_details': EventDetails._group_add_external_id_details_validator, + 'group_add_member_details': EventDetails._group_add_member_details_validator, + 'group_change_external_id_details': EventDetails._group_change_external_id_details_validator, + 'group_change_management_type_details': EventDetails._group_change_management_type_details_validator, + 'group_change_member_role_details': EventDetails._group_change_member_role_details_validator, + 'group_create_details': EventDetails._group_create_details_validator, + 'group_delete_details': EventDetails._group_delete_details_validator, + 'group_description_updated_details': EventDetails._group_description_updated_details_validator, + 'group_join_policy_updated_details': EventDetails._group_join_policy_updated_details_validator, + 'group_moved_details': EventDetails._group_moved_details_validator, + 'group_remove_external_id_details': EventDetails._group_remove_external_id_details_validator, + 'group_remove_member_details': EventDetails._group_remove_member_details_validator, + 'group_rename_details': EventDetails._group_rename_details_validator, + 'emm_error_details': EventDetails._emm_error_details_validator, + 'login_fail_details': EventDetails._login_fail_details_validator, + 'login_success_details': EventDetails._login_success_details_validator, + 'logout_details': EventDetails._logout_details_validator, + 'reseller_support_session_end_details': EventDetails._reseller_support_session_end_details_validator, + 'reseller_support_session_start_details': EventDetails._reseller_support_session_start_details_validator, + 'sign_in_as_session_end_details': EventDetails._sign_in_as_session_end_details_validator, + 'sign_in_as_session_start_details': EventDetails._sign_in_as_session_start_details_validator, + 'sso_error_details': EventDetails._sso_error_details_validator, + 'member_add_name_details': EventDetails._member_add_name_details_validator, + 'member_change_admin_role_details': EventDetails._member_change_admin_role_details_validator, + 'member_change_email_details': EventDetails._member_change_email_details_validator, + 'member_change_membership_type_details': EventDetails._member_change_membership_type_details_validator, + 'member_change_name_details': EventDetails._member_change_name_details_validator, + 'member_change_status_details': EventDetails._member_change_status_details_validator, + 'member_delete_manual_contacts_details': EventDetails._member_delete_manual_contacts_details_validator, + 'member_permanently_delete_account_contents_details': EventDetails._member_permanently_delete_account_contents_details_validator, + 'member_space_limits_add_custom_quota_details': EventDetails._member_space_limits_add_custom_quota_details_validator, + 'member_space_limits_change_custom_quota_details': EventDetails._member_space_limits_change_custom_quota_details_validator, + 'member_space_limits_change_status_details': EventDetails._member_space_limits_change_status_details_validator, + 'member_space_limits_remove_custom_quota_details': EventDetails._member_space_limits_remove_custom_quota_details_validator, + 'member_suggest_details': EventDetails._member_suggest_details_validator, + 'member_transfer_account_contents_details': EventDetails._member_transfer_account_contents_details_validator, + 'secondary_mails_policy_changed_details': EventDetails._secondary_mails_policy_changed_details_validator, + 'paper_content_add_member_details': EventDetails._paper_content_add_member_details_validator, + 'paper_content_add_to_folder_details': EventDetails._paper_content_add_to_folder_details_validator, + 'paper_content_archive_details': EventDetails._paper_content_archive_details_validator, + 'paper_content_create_details': EventDetails._paper_content_create_details_validator, + 'paper_content_permanently_delete_details': EventDetails._paper_content_permanently_delete_details_validator, + 'paper_content_remove_from_folder_details': EventDetails._paper_content_remove_from_folder_details_validator, + 'paper_content_remove_member_details': EventDetails._paper_content_remove_member_details_validator, + 'paper_content_rename_details': EventDetails._paper_content_rename_details_validator, + 'paper_content_restore_details': EventDetails._paper_content_restore_details_validator, + 'paper_doc_add_comment_details': EventDetails._paper_doc_add_comment_details_validator, + 'paper_doc_change_member_role_details': EventDetails._paper_doc_change_member_role_details_validator, + 'paper_doc_change_sharing_policy_details': EventDetails._paper_doc_change_sharing_policy_details_validator, + 'paper_doc_change_subscription_details': EventDetails._paper_doc_change_subscription_details_validator, + 'paper_doc_deleted_details': EventDetails._paper_doc_deleted_details_validator, + 'paper_doc_delete_comment_details': EventDetails._paper_doc_delete_comment_details_validator, + 'paper_doc_download_details': EventDetails._paper_doc_download_details_validator, + 'paper_doc_edit_details': EventDetails._paper_doc_edit_details_validator, + 'paper_doc_edit_comment_details': EventDetails._paper_doc_edit_comment_details_validator, + 'paper_doc_followed_details': EventDetails._paper_doc_followed_details_validator, + 'paper_doc_mention_details': EventDetails._paper_doc_mention_details_validator, + 'paper_doc_ownership_changed_details': EventDetails._paper_doc_ownership_changed_details_validator, + 'paper_doc_request_access_details': EventDetails._paper_doc_request_access_details_validator, + 'paper_doc_resolve_comment_details': EventDetails._paper_doc_resolve_comment_details_validator, + 'paper_doc_revert_details': EventDetails._paper_doc_revert_details_validator, + 'paper_doc_slack_share_details': EventDetails._paper_doc_slack_share_details_validator, + 'paper_doc_team_invite_details': EventDetails._paper_doc_team_invite_details_validator, + 'paper_doc_trashed_details': EventDetails._paper_doc_trashed_details_validator, + 'paper_doc_unresolve_comment_details': EventDetails._paper_doc_unresolve_comment_details_validator, + 'paper_doc_untrashed_details': EventDetails._paper_doc_untrashed_details_validator, + 'paper_doc_view_details': EventDetails._paper_doc_view_details_validator, + 'paper_external_view_allow_details': EventDetails._paper_external_view_allow_details_validator, + 'paper_external_view_default_team_details': EventDetails._paper_external_view_default_team_details_validator, + 'paper_external_view_forbid_details': EventDetails._paper_external_view_forbid_details_validator, + 'paper_folder_change_subscription_details': EventDetails._paper_folder_change_subscription_details_validator, + 'paper_folder_deleted_details': EventDetails._paper_folder_deleted_details_validator, + 'paper_folder_followed_details': EventDetails._paper_folder_followed_details_validator, + 'paper_folder_team_invite_details': EventDetails._paper_folder_team_invite_details_validator, + 'password_change_details': EventDetails._password_change_details_validator, + 'password_reset_details': EventDetails._password_reset_details_validator, + 'password_reset_all_details': EventDetails._password_reset_all_details_validator, + 'emm_create_exceptions_report_details': EventDetails._emm_create_exceptions_report_details_validator, + 'emm_create_usage_report_details': EventDetails._emm_create_usage_report_details_validator, + 'export_members_report_details': EventDetails._export_members_report_details_validator, + 'paper_admin_export_start_details': EventDetails._paper_admin_export_start_details_validator, + 'smart_sync_create_admin_privilege_report_details': EventDetails._smart_sync_create_admin_privilege_report_details_validator, + 'team_activity_create_report_details': EventDetails._team_activity_create_report_details_validator, + 'collection_share_details': EventDetails._collection_share_details_validator, + 'note_acl_invite_only_details': EventDetails._note_acl_invite_only_details_validator, + 'note_acl_link_details': EventDetails._note_acl_link_details_validator, + 'note_acl_team_link_details': EventDetails._note_acl_team_link_details_validator, + 'note_shared_details': EventDetails._note_shared_details_validator, + 'note_share_receive_details': EventDetails._note_share_receive_details_validator, + 'open_note_shared_details': EventDetails._open_note_shared_details_validator, + 'sf_add_group_details': EventDetails._sf_add_group_details_validator, + 'sf_allow_non_members_to_view_shared_links_details': EventDetails._sf_allow_non_members_to_view_shared_links_details_validator, + 'sf_external_invite_warn_details': EventDetails._sf_external_invite_warn_details_validator, + 'sf_fb_invite_details': EventDetails._sf_fb_invite_details_validator, + 'sf_fb_invite_change_role_details': EventDetails._sf_fb_invite_change_role_details_validator, + 'sf_fb_uninvite_details': EventDetails._sf_fb_uninvite_details_validator, + 'sf_invite_group_details': EventDetails._sf_invite_group_details_validator, + 'sf_team_grant_access_details': EventDetails._sf_team_grant_access_details_validator, + 'sf_team_invite_details': EventDetails._sf_team_invite_details_validator, + 'sf_team_invite_change_role_details': EventDetails._sf_team_invite_change_role_details_validator, + 'sf_team_join_details': EventDetails._sf_team_join_details_validator, + 'sf_team_join_from_oob_link_details': EventDetails._sf_team_join_from_oob_link_details_validator, + 'sf_team_uninvite_details': EventDetails._sf_team_uninvite_details_validator, + 'shared_content_add_invitees_details': EventDetails._shared_content_add_invitees_details_validator, + 'shared_content_add_link_expiry_details': EventDetails._shared_content_add_link_expiry_details_validator, + 'shared_content_add_link_password_details': EventDetails._shared_content_add_link_password_details_validator, + 'shared_content_add_member_details': EventDetails._shared_content_add_member_details_validator, + 'shared_content_change_downloads_policy_details': EventDetails._shared_content_change_downloads_policy_details_validator, + 'shared_content_change_invitee_role_details': EventDetails._shared_content_change_invitee_role_details_validator, + 'shared_content_change_link_audience_details': EventDetails._shared_content_change_link_audience_details_validator, + 'shared_content_change_link_expiry_details': EventDetails._shared_content_change_link_expiry_details_validator, + 'shared_content_change_link_password_details': EventDetails._shared_content_change_link_password_details_validator, + 'shared_content_change_member_role_details': EventDetails._shared_content_change_member_role_details_validator, + 'shared_content_change_viewer_info_policy_details': EventDetails._shared_content_change_viewer_info_policy_details_validator, + 'shared_content_claim_invitation_details': EventDetails._shared_content_claim_invitation_details_validator, + 'shared_content_copy_details': EventDetails._shared_content_copy_details_validator, + 'shared_content_download_details': EventDetails._shared_content_download_details_validator, + 'shared_content_relinquish_membership_details': EventDetails._shared_content_relinquish_membership_details_validator, + 'shared_content_remove_invitees_details': EventDetails._shared_content_remove_invitees_details_validator, + 'shared_content_remove_link_expiry_details': EventDetails._shared_content_remove_link_expiry_details_validator, + 'shared_content_remove_link_password_details': EventDetails._shared_content_remove_link_password_details_validator, + 'shared_content_remove_member_details': EventDetails._shared_content_remove_member_details_validator, + 'shared_content_request_access_details': EventDetails._shared_content_request_access_details_validator, + 'shared_content_unshare_details': EventDetails._shared_content_unshare_details_validator, + 'shared_content_view_details': EventDetails._shared_content_view_details_validator, + 'shared_folder_change_link_policy_details': EventDetails._shared_folder_change_link_policy_details_validator, + 'shared_folder_change_members_inheritance_policy_details': EventDetails._shared_folder_change_members_inheritance_policy_details_validator, + 'shared_folder_change_members_management_policy_details': EventDetails._shared_folder_change_members_management_policy_details_validator, + 'shared_folder_change_members_policy_details': EventDetails._shared_folder_change_members_policy_details_validator, + 'shared_folder_create_details': EventDetails._shared_folder_create_details_validator, + 'shared_folder_decline_invitation_details': EventDetails._shared_folder_decline_invitation_details_validator, + 'shared_folder_mount_details': EventDetails._shared_folder_mount_details_validator, + 'shared_folder_nest_details': EventDetails._shared_folder_nest_details_validator, + 'shared_folder_transfer_ownership_details': EventDetails._shared_folder_transfer_ownership_details_validator, + 'shared_folder_unmount_details': EventDetails._shared_folder_unmount_details_validator, + 'shared_link_add_expiry_details': EventDetails._shared_link_add_expiry_details_validator, + 'shared_link_change_expiry_details': EventDetails._shared_link_change_expiry_details_validator, + 'shared_link_change_visibility_details': EventDetails._shared_link_change_visibility_details_validator, + 'shared_link_copy_details': EventDetails._shared_link_copy_details_validator, + 'shared_link_create_details': EventDetails._shared_link_create_details_validator, + 'shared_link_disable_details': EventDetails._shared_link_disable_details_validator, + 'shared_link_download_details': EventDetails._shared_link_download_details_validator, + 'shared_link_remove_expiry_details': EventDetails._shared_link_remove_expiry_details_validator, + 'shared_link_share_details': EventDetails._shared_link_share_details_validator, + 'shared_link_view_details': EventDetails._shared_link_view_details_validator, + 'shared_note_opened_details': EventDetails._shared_note_opened_details_validator, + 'shmodel_group_share_details': EventDetails._shmodel_group_share_details_validator, + 'showcase_access_granted_details': EventDetails._showcase_access_granted_details_validator, + 'showcase_add_member_details': EventDetails._showcase_add_member_details_validator, + 'showcase_archived_details': EventDetails._showcase_archived_details_validator, + 'showcase_created_details': EventDetails._showcase_created_details_validator, + 'showcase_delete_comment_details': EventDetails._showcase_delete_comment_details_validator, + 'showcase_edited_details': EventDetails._showcase_edited_details_validator, + 'showcase_edit_comment_details': EventDetails._showcase_edit_comment_details_validator, + 'showcase_file_added_details': EventDetails._showcase_file_added_details_validator, + 'showcase_file_download_details': EventDetails._showcase_file_download_details_validator, + 'showcase_file_removed_details': EventDetails._showcase_file_removed_details_validator, + 'showcase_file_view_details': EventDetails._showcase_file_view_details_validator, + 'showcase_permanently_deleted_details': EventDetails._showcase_permanently_deleted_details_validator, + 'showcase_post_comment_details': EventDetails._showcase_post_comment_details_validator, + 'showcase_remove_member_details': EventDetails._showcase_remove_member_details_validator, + 'showcase_renamed_details': EventDetails._showcase_renamed_details_validator, + 'showcase_request_access_details': EventDetails._showcase_request_access_details_validator, + 'showcase_resolve_comment_details': EventDetails._showcase_resolve_comment_details_validator, + 'showcase_restored_details': EventDetails._showcase_restored_details_validator, + 'showcase_trashed_details': EventDetails._showcase_trashed_details_validator, + 'showcase_trashed_deprecated_details': EventDetails._showcase_trashed_deprecated_details_validator, + 'showcase_unresolve_comment_details': EventDetails._showcase_unresolve_comment_details_validator, + 'showcase_untrashed_details': EventDetails._showcase_untrashed_details_validator, + 'showcase_untrashed_deprecated_details': EventDetails._showcase_untrashed_deprecated_details_validator, + 'showcase_view_details': EventDetails._showcase_view_details_validator, + 'sso_add_cert_details': EventDetails._sso_add_cert_details_validator, + 'sso_add_login_url_details': EventDetails._sso_add_login_url_details_validator, + 'sso_add_logout_url_details': EventDetails._sso_add_logout_url_details_validator, + 'sso_change_cert_details': EventDetails._sso_change_cert_details_validator, + 'sso_change_login_url_details': EventDetails._sso_change_login_url_details_validator, + 'sso_change_logout_url_details': EventDetails._sso_change_logout_url_details_validator, + 'sso_change_saml_identity_mode_details': EventDetails._sso_change_saml_identity_mode_details_validator, + 'sso_remove_cert_details': EventDetails._sso_remove_cert_details_validator, + 'sso_remove_login_url_details': EventDetails._sso_remove_login_url_details_validator, + 'sso_remove_logout_url_details': EventDetails._sso_remove_logout_url_details_validator, + 'team_folder_change_status_details': EventDetails._team_folder_change_status_details_validator, + 'team_folder_create_details': EventDetails._team_folder_create_details_validator, + 'team_folder_downgrade_details': EventDetails._team_folder_downgrade_details_validator, + 'team_folder_permanently_delete_details': EventDetails._team_folder_permanently_delete_details_validator, + 'team_folder_rename_details': EventDetails._team_folder_rename_details_validator, + 'team_selective_sync_settings_changed_details': EventDetails._team_selective_sync_settings_changed_details_validator, + 'account_capture_change_policy_details': EventDetails._account_capture_change_policy_details_validator, + 'allow_download_disabled_details': EventDetails._allow_download_disabled_details_validator, + 'allow_download_enabled_details': EventDetails._allow_download_enabled_details_validator, + 'camera_uploads_policy_changed_details': EventDetails._camera_uploads_policy_changed_details_validator, + 'data_placement_restriction_change_policy_details': EventDetails._data_placement_restriction_change_policy_details_validator, + 'data_placement_restriction_satisfy_policy_details': EventDetails._data_placement_restriction_satisfy_policy_details_validator, + 'device_approvals_change_desktop_policy_details': EventDetails._device_approvals_change_desktop_policy_details_validator, + 'device_approvals_change_mobile_policy_details': EventDetails._device_approvals_change_mobile_policy_details_validator, + 'device_approvals_change_overage_action_details': EventDetails._device_approvals_change_overage_action_details_validator, + 'device_approvals_change_unlink_action_details': EventDetails._device_approvals_change_unlink_action_details_validator, + 'directory_restrictions_add_members_details': EventDetails._directory_restrictions_add_members_details_validator, + 'directory_restrictions_remove_members_details': EventDetails._directory_restrictions_remove_members_details_validator, + 'emm_add_exception_details': EventDetails._emm_add_exception_details_validator, + 'emm_change_policy_details': EventDetails._emm_change_policy_details_validator, + 'emm_remove_exception_details': EventDetails._emm_remove_exception_details_validator, + 'extended_version_history_change_policy_details': EventDetails._extended_version_history_change_policy_details_validator, + 'file_comments_change_policy_details': EventDetails._file_comments_change_policy_details_validator, + 'file_requests_change_policy_details': EventDetails._file_requests_change_policy_details_validator, + 'file_requests_emails_enabled_details': EventDetails._file_requests_emails_enabled_details_validator, + 'file_requests_emails_restricted_to_team_only_details': EventDetails._file_requests_emails_restricted_to_team_only_details_validator, + 'google_sso_change_policy_details': EventDetails._google_sso_change_policy_details_validator, + 'group_user_management_change_policy_details': EventDetails._group_user_management_change_policy_details_validator, + 'member_requests_change_policy_details': EventDetails._member_requests_change_policy_details_validator, + 'member_space_limits_add_exception_details': EventDetails._member_space_limits_add_exception_details_validator, + 'member_space_limits_change_caps_type_policy_details': EventDetails._member_space_limits_change_caps_type_policy_details_validator, + 'member_space_limits_change_policy_details': EventDetails._member_space_limits_change_policy_details_validator, + 'member_space_limits_remove_exception_details': EventDetails._member_space_limits_remove_exception_details_validator, + 'member_suggestions_change_policy_details': EventDetails._member_suggestions_change_policy_details_validator, + 'microsoft_office_addin_change_policy_details': EventDetails._microsoft_office_addin_change_policy_details_validator, + 'network_control_change_policy_details': EventDetails._network_control_change_policy_details_validator, + 'paper_change_deployment_policy_details': EventDetails._paper_change_deployment_policy_details_validator, + 'paper_change_member_link_policy_details': EventDetails._paper_change_member_link_policy_details_validator, + 'paper_change_member_policy_details': EventDetails._paper_change_member_policy_details_validator, + 'paper_change_policy_details': EventDetails._paper_change_policy_details_validator, + 'paper_enabled_users_group_addition_details': EventDetails._paper_enabled_users_group_addition_details_validator, + 'paper_enabled_users_group_removal_details': EventDetails._paper_enabled_users_group_removal_details_validator, + 'permanent_delete_change_policy_details': EventDetails._permanent_delete_change_policy_details_validator, + 'sharing_change_folder_join_policy_details': EventDetails._sharing_change_folder_join_policy_details_validator, + 'sharing_change_link_policy_details': EventDetails._sharing_change_link_policy_details_validator, + 'sharing_change_member_policy_details': EventDetails._sharing_change_member_policy_details_validator, + 'showcase_change_download_policy_details': EventDetails._showcase_change_download_policy_details_validator, + 'showcase_change_enabled_policy_details': EventDetails._showcase_change_enabled_policy_details_validator, + 'showcase_change_external_sharing_policy_details': EventDetails._showcase_change_external_sharing_policy_details_validator, + 'smart_sync_change_policy_details': EventDetails._smart_sync_change_policy_details_validator, + 'smart_sync_not_opt_out_details': EventDetails._smart_sync_not_opt_out_details_validator, + 'smart_sync_opt_out_details': EventDetails._smart_sync_opt_out_details_validator, + 'sso_change_policy_details': EventDetails._sso_change_policy_details_validator, + 'team_selective_sync_policy_changed_details': EventDetails._team_selective_sync_policy_changed_details_validator, + 'tfa_change_policy_details': EventDetails._tfa_change_policy_details_validator, + 'two_account_change_policy_details': EventDetails._two_account_change_policy_details_validator, + 'viewer_info_policy_changed_details': EventDetails._viewer_info_policy_changed_details_validator, + 'web_sessions_change_fixed_length_policy_details': EventDetails._web_sessions_change_fixed_length_policy_details_validator, + 'web_sessions_change_idle_length_policy_details': EventDetails._web_sessions_change_idle_length_policy_details_validator, + 'team_merge_from_details': EventDetails._team_merge_from_details_validator, + 'team_merge_to_details': EventDetails._team_merge_to_details_validator, + 'team_profile_add_logo_details': EventDetails._team_profile_add_logo_details_validator, + 'team_profile_change_default_language_details': EventDetails._team_profile_change_default_language_details_validator, + 'team_profile_change_logo_details': EventDetails._team_profile_change_logo_details_validator, + 'team_profile_change_name_details': EventDetails._team_profile_change_name_details_validator, + 'team_profile_remove_logo_details': EventDetails._team_profile_remove_logo_details_validator, + 'tfa_add_backup_phone_details': EventDetails._tfa_add_backup_phone_details_validator, + 'tfa_add_security_key_details': EventDetails._tfa_add_security_key_details_validator, + 'tfa_change_backup_phone_details': EventDetails._tfa_change_backup_phone_details_validator, + 'tfa_change_status_details': EventDetails._tfa_change_status_details_validator, + 'tfa_remove_backup_phone_details': EventDetails._tfa_remove_backup_phone_details_validator, + 'tfa_remove_security_key_details': EventDetails._tfa_remove_security_key_details_validator, + 'tfa_reset_details': EventDetails._tfa_reset_details_validator, + 'missing_details': EventDetails._missing_details_validator, + 'other': EventDetails._other_validator, +} + +EventDetails.other = EventDetails('other') + +EventType._app_link_team_validator = AppLinkTeamType_validator +EventType._app_link_user_validator = AppLinkUserType_validator +EventType._app_unlink_team_validator = AppUnlinkTeamType_validator +EventType._app_unlink_user_validator = AppUnlinkUserType_validator +EventType._file_add_comment_validator = FileAddCommentType_validator +EventType._file_change_comment_subscription_validator = FileChangeCommentSubscriptionType_validator +EventType._file_delete_comment_validator = FileDeleteCommentType_validator +EventType._file_edit_comment_validator = FileEditCommentType_validator +EventType._file_like_comment_validator = FileLikeCommentType_validator +EventType._file_resolve_comment_validator = FileResolveCommentType_validator +EventType._file_unlike_comment_validator = FileUnlikeCommentType_validator +EventType._file_unresolve_comment_validator = FileUnresolveCommentType_validator +EventType._device_change_ip_desktop_validator = DeviceChangeIpDesktopType_validator +EventType._device_change_ip_mobile_validator = DeviceChangeIpMobileType_validator +EventType._device_change_ip_web_validator = DeviceChangeIpWebType_validator +EventType._device_delete_on_unlink_fail_validator = DeviceDeleteOnUnlinkFailType_validator +EventType._device_delete_on_unlink_success_validator = DeviceDeleteOnUnlinkSuccessType_validator +EventType._device_link_fail_validator = DeviceLinkFailType_validator +EventType._device_link_success_validator = DeviceLinkSuccessType_validator +EventType._device_management_disabled_validator = DeviceManagementDisabledType_validator +EventType._device_management_enabled_validator = DeviceManagementEnabledType_validator +EventType._device_unlink_validator = DeviceUnlinkType_validator +EventType._emm_refresh_auth_token_validator = EmmRefreshAuthTokenType_validator +EventType._account_capture_change_availability_validator = AccountCaptureChangeAvailabilityType_validator +EventType._account_capture_migrate_account_validator = AccountCaptureMigrateAccountType_validator +EventType._account_capture_notification_emails_sent_validator = AccountCaptureNotificationEmailsSentType_validator +EventType._account_capture_relinquish_account_validator = AccountCaptureRelinquishAccountType_validator +EventType._disabled_domain_invites_validator = DisabledDomainInvitesType_validator +EventType._domain_invites_approve_request_to_join_team_validator = DomainInvitesApproveRequestToJoinTeamType_validator +EventType._domain_invites_decline_request_to_join_team_validator = DomainInvitesDeclineRequestToJoinTeamType_validator +EventType._domain_invites_email_existing_users_validator = DomainInvitesEmailExistingUsersType_validator +EventType._domain_invites_request_to_join_team_validator = DomainInvitesRequestToJoinTeamType_validator +EventType._domain_invites_set_invite_new_user_pref_to_no_validator = DomainInvitesSetInviteNewUserPrefToNoType_validator +EventType._domain_invites_set_invite_new_user_pref_to_yes_validator = DomainInvitesSetInviteNewUserPrefToYesType_validator +EventType._domain_verification_add_domain_fail_validator = DomainVerificationAddDomainFailType_validator +EventType._domain_verification_add_domain_success_validator = DomainVerificationAddDomainSuccessType_validator +EventType._domain_verification_remove_domain_validator = DomainVerificationRemoveDomainType_validator +EventType._enabled_domain_invites_validator = EnabledDomainInvitesType_validator +EventType._create_folder_validator = CreateFolderType_validator +EventType._file_add_validator = FileAddType_validator +EventType._file_copy_validator = FileCopyType_validator +EventType._file_delete_validator = FileDeleteType_validator +EventType._file_download_validator = FileDownloadType_validator +EventType._file_edit_validator = FileEditType_validator +EventType._file_get_copy_reference_validator = FileGetCopyReferenceType_validator +EventType._file_move_validator = FileMoveType_validator +EventType._file_permanently_delete_validator = FilePermanentlyDeleteType_validator +EventType._file_preview_validator = FilePreviewType_validator +EventType._file_rename_validator = FileRenameType_validator +EventType._file_restore_validator = FileRestoreType_validator +EventType._file_revert_validator = FileRevertType_validator +EventType._file_rollback_changes_validator = FileRollbackChangesType_validator +EventType._file_save_copy_reference_validator = FileSaveCopyReferenceType_validator +EventType._file_request_change_validator = FileRequestChangeType_validator +EventType._file_request_close_validator = FileRequestCloseType_validator +EventType._file_request_create_validator = FileRequestCreateType_validator +EventType._file_request_receive_file_validator = FileRequestReceiveFileType_validator +EventType._group_add_external_id_validator = GroupAddExternalIdType_validator +EventType._group_add_member_validator = GroupAddMemberType_validator +EventType._group_change_external_id_validator = GroupChangeExternalIdType_validator +EventType._group_change_management_type_validator = GroupChangeManagementTypeType_validator +EventType._group_change_member_role_validator = GroupChangeMemberRoleType_validator +EventType._group_create_validator = GroupCreateType_validator +EventType._group_delete_validator = GroupDeleteType_validator +EventType._group_description_updated_validator = GroupDescriptionUpdatedType_validator +EventType._group_join_policy_updated_validator = GroupJoinPolicyUpdatedType_validator +EventType._group_moved_validator = GroupMovedType_validator +EventType._group_remove_external_id_validator = GroupRemoveExternalIdType_validator +EventType._group_remove_member_validator = GroupRemoveMemberType_validator +EventType._group_rename_validator = GroupRenameType_validator +EventType._emm_error_validator = EmmErrorType_validator +EventType._login_fail_validator = LoginFailType_validator +EventType._login_success_validator = LoginSuccessType_validator +EventType._logout_validator = LogoutType_validator +EventType._reseller_support_session_end_validator = ResellerSupportSessionEndType_validator +EventType._reseller_support_session_start_validator = ResellerSupportSessionStartType_validator +EventType._sign_in_as_session_end_validator = SignInAsSessionEndType_validator +EventType._sign_in_as_session_start_validator = SignInAsSessionStartType_validator +EventType._sso_error_validator = SsoErrorType_validator +EventType._member_add_name_validator = MemberAddNameType_validator +EventType._member_change_admin_role_validator = MemberChangeAdminRoleType_validator +EventType._member_change_email_validator = MemberChangeEmailType_validator +EventType._member_change_membership_type_validator = MemberChangeMembershipTypeType_validator +EventType._member_change_name_validator = MemberChangeNameType_validator +EventType._member_change_status_validator = MemberChangeStatusType_validator +EventType._member_delete_manual_contacts_validator = MemberDeleteManualContactsType_validator +EventType._member_permanently_delete_account_contents_validator = MemberPermanentlyDeleteAccountContentsType_validator +EventType._member_space_limits_add_custom_quota_validator = MemberSpaceLimitsAddCustomQuotaType_validator +EventType._member_space_limits_change_custom_quota_validator = MemberSpaceLimitsChangeCustomQuotaType_validator +EventType._member_space_limits_change_status_validator = MemberSpaceLimitsChangeStatusType_validator +EventType._member_space_limits_remove_custom_quota_validator = MemberSpaceLimitsRemoveCustomQuotaType_validator +EventType._member_suggest_validator = MemberSuggestType_validator +EventType._member_transfer_account_contents_validator = MemberTransferAccountContentsType_validator +EventType._secondary_mails_policy_changed_validator = SecondaryMailsPolicyChangedType_validator +EventType._paper_content_add_member_validator = PaperContentAddMemberType_validator +EventType._paper_content_add_to_folder_validator = PaperContentAddToFolderType_validator +EventType._paper_content_archive_validator = PaperContentArchiveType_validator +EventType._paper_content_create_validator = PaperContentCreateType_validator +EventType._paper_content_permanently_delete_validator = PaperContentPermanentlyDeleteType_validator +EventType._paper_content_remove_from_folder_validator = PaperContentRemoveFromFolderType_validator +EventType._paper_content_remove_member_validator = PaperContentRemoveMemberType_validator +EventType._paper_content_rename_validator = PaperContentRenameType_validator +EventType._paper_content_restore_validator = PaperContentRestoreType_validator +EventType._paper_doc_add_comment_validator = PaperDocAddCommentType_validator +EventType._paper_doc_change_member_role_validator = PaperDocChangeMemberRoleType_validator +EventType._paper_doc_change_sharing_policy_validator = PaperDocChangeSharingPolicyType_validator +EventType._paper_doc_change_subscription_validator = PaperDocChangeSubscriptionType_validator +EventType._paper_doc_deleted_validator = PaperDocDeletedType_validator +EventType._paper_doc_delete_comment_validator = PaperDocDeleteCommentType_validator +EventType._paper_doc_download_validator = PaperDocDownloadType_validator +EventType._paper_doc_edit_validator = PaperDocEditType_validator +EventType._paper_doc_edit_comment_validator = PaperDocEditCommentType_validator +EventType._paper_doc_followed_validator = PaperDocFollowedType_validator +EventType._paper_doc_mention_validator = PaperDocMentionType_validator +EventType._paper_doc_ownership_changed_validator = PaperDocOwnershipChangedType_validator +EventType._paper_doc_request_access_validator = PaperDocRequestAccessType_validator +EventType._paper_doc_resolve_comment_validator = PaperDocResolveCommentType_validator +EventType._paper_doc_revert_validator = PaperDocRevertType_validator +EventType._paper_doc_slack_share_validator = PaperDocSlackShareType_validator +EventType._paper_doc_team_invite_validator = PaperDocTeamInviteType_validator +EventType._paper_doc_trashed_validator = PaperDocTrashedType_validator +EventType._paper_doc_unresolve_comment_validator = PaperDocUnresolveCommentType_validator +EventType._paper_doc_untrashed_validator = PaperDocUntrashedType_validator +EventType._paper_doc_view_validator = PaperDocViewType_validator +EventType._paper_external_view_allow_validator = PaperExternalViewAllowType_validator +EventType._paper_external_view_default_team_validator = PaperExternalViewDefaultTeamType_validator +EventType._paper_external_view_forbid_validator = PaperExternalViewForbidType_validator +EventType._paper_folder_change_subscription_validator = PaperFolderChangeSubscriptionType_validator +EventType._paper_folder_deleted_validator = PaperFolderDeletedType_validator +EventType._paper_folder_followed_validator = PaperFolderFollowedType_validator +EventType._paper_folder_team_invite_validator = PaperFolderTeamInviteType_validator +EventType._password_change_validator = PasswordChangeType_validator +EventType._password_reset_validator = PasswordResetType_validator +EventType._password_reset_all_validator = PasswordResetAllType_validator +EventType._emm_create_exceptions_report_validator = EmmCreateExceptionsReportType_validator +EventType._emm_create_usage_report_validator = EmmCreateUsageReportType_validator +EventType._export_members_report_validator = ExportMembersReportType_validator +EventType._paper_admin_export_start_validator = PaperAdminExportStartType_validator +EventType._smart_sync_create_admin_privilege_report_validator = SmartSyncCreateAdminPrivilegeReportType_validator +EventType._team_activity_create_report_validator = TeamActivityCreateReportType_validator +EventType._collection_share_validator = CollectionShareType_validator +EventType._note_acl_invite_only_validator = NoteAclInviteOnlyType_validator +EventType._note_acl_link_validator = NoteAclLinkType_validator +EventType._note_acl_team_link_validator = NoteAclTeamLinkType_validator +EventType._note_shared_validator = NoteSharedType_validator +EventType._note_share_receive_validator = NoteShareReceiveType_validator +EventType._open_note_shared_validator = OpenNoteSharedType_validator +EventType._sf_add_group_validator = SfAddGroupType_validator +EventType._sf_allow_non_members_to_view_shared_links_validator = SfAllowNonMembersToViewSharedLinksType_validator +EventType._sf_external_invite_warn_validator = SfExternalInviteWarnType_validator +EventType._sf_fb_invite_validator = SfFbInviteType_validator +EventType._sf_fb_invite_change_role_validator = SfFbInviteChangeRoleType_validator +EventType._sf_fb_uninvite_validator = SfFbUninviteType_validator +EventType._sf_invite_group_validator = SfInviteGroupType_validator +EventType._sf_team_grant_access_validator = SfTeamGrantAccessType_validator +EventType._sf_team_invite_validator = SfTeamInviteType_validator +EventType._sf_team_invite_change_role_validator = SfTeamInviteChangeRoleType_validator +EventType._sf_team_join_validator = SfTeamJoinType_validator +EventType._sf_team_join_from_oob_link_validator = SfTeamJoinFromOobLinkType_validator +EventType._sf_team_uninvite_validator = SfTeamUninviteType_validator +EventType._shared_content_add_invitees_validator = SharedContentAddInviteesType_validator +EventType._shared_content_add_link_expiry_validator = SharedContentAddLinkExpiryType_validator +EventType._shared_content_add_link_password_validator = SharedContentAddLinkPasswordType_validator +EventType._shared_content_add_member_validator = SharedContentAddMemberType_validator +EventType._shared_content_change_downloads_policy_validator = SharedContentChangeDownloadsPolicyType_validator +EventType._shared_content_change_invitee_role_validator = SharedContentChangeInviteeRoleType_validator +EventType._shared_content_change_link_audience_validator = SharedContentChangeLinkAudienceType_validator +EventType._shared_content_change_link_expiry_validator = SharedContentChangeLinkExpiryType_validator +EventType._shared_content_change_link_password_validator = SharedContentChangeLinkPasswordType_validator +EventType._shared_content_change_member_role_validator = SharedContentChangeMemberRoleType_validator +EventType._shared_content_change_viewer_info_policy_validator = SharedContentChangeViewerInfoPolicyType_validator +EventType._shared_content_claim_invitation_validator = SharedContentClaimInvitationType_validator +EventType._shared_content_copy_validator = SharedContentCopyType_validator +EventType._shared_content_download_validator = SharedContentDownloadType_validator +EventType._shared_content_relinquish_membership_validator = SharedContentRelinquishMembershipType_validator +EventType._shared_content_remove_invitees_validator = SharedContentRemoveInviteesType_validator +EventType._shared_content_remove_link_expiry_validator = SharedContentRemoveLinkExpiryType_validator +EventType._shared_content_remove_link_password_validator = SharedContentRemoveLinkPasswordType_validator +EventType._shared_content_remove_member_validator = SharedContentRemoveMemberType_validator +EventType._shared_content_request_access_validator = SharedContentRequestAccessType_validator +EventType._shared_content_unshare_validator = SharedContentUnshareType_validator +EventType._shared_content_view_validator = SharedContentViewType_validator +EventType._shared_folder_change_link_policy_validator = SharedFolderChangeLinkPolicyType_validator +EventType._shared_folder_change_members_inheritance_policy_validator = SharedFolderChangeMembersInheritancePolicyType_validator +EventType._shared_folder_change_members_management_policy_validator = SharedFolderChangeMembersManagementPolicyType_validator +EventType._shared_folder_change_members_policy_validator = SharedFolderChangeMembersPolicyType_validator +EventType._shared_folder_create_validator = SharedFolderCreateType_validator +EventType._shared_folder_decline_invitation_validator = SharedFolderDeclineInvitationType_validator +EventType._shared_folder_mount_validator = SharedFolderMountType_validator +EventType._shared_folder_nest_validator = SharedFolderNestType_validator +EventType._shared_folder_transfer_ownership_validator = SharedFolderTransferOwnershipType_validator +EventType._shared_folder_unmount_validator = SharedFolderUnmountType_validator +EventType._shared_link_add_expiry_validator = SharedLinkAddExpiryType_validator +EventType._shared_link_change_expiry_validator = SharedLinkChangeExpiryType_validator +EventType._shared_link_change_visibility_validator = SharedLinkChangeVisibilityType_validator +EventType._shared_link_copy_validator = SharedLinkCopyType_validator +EventType._shared_link_create_validator = SharedLinkCreateType_validator +EventType._shared_link_disable_validator = SharedLinkDisableType_validator +EventType._shared_link_download_validator = SharedLinkDownloadType_validator +EventType._shared_link_remove_expiry_validator = SharedLinkRemoveExpiryType_validator +EventType._shared_link_share_validator = SharedLinkShareType_validator +EventType._shared_link_view_validator = SharedLinkViewType_validator +EventType._shared_note_opened_validator = SharedNoteOpenedType_validator +EventType._shmodel_group_share_validator = ShmodelGroupShareType_validator +EventType._showcase_access_granted_validator = ShowcaseAccessGrantedType_validator +EventType._showcase_add_member_validator = ShowcaseAddMemberType_validator +EventType._showcase_archived_validator = ShowcaseArchivedType_validator +EventType._showcase_created_validator = ShowcaseCreatedType_validator +EventType._showcase_delete_comment_validator = ShowcaseDeleteCommentType_validator +EventType._showcase_edited_validator = ShowcaseEditedType_validator +EventType._showcase_edit_comment_validator = ShowcaseEditCommentType_validator +EventType._showcase_file_added_validator = ShowcaseFileAddedType_validator +EventType._showcase_file_download_validator = ShowcaseFileDownloadType_validator +EventType._showcase_file_removed_validator = ShowcaseFileRemovedType_validator +EventType._showcase_file_view_validator = ShowcaseFileViewType_validator +EventType._showcase_permanently_deleted_validator = ShowcasePermanentlyDeletedType_validator +EventType._showcase_post_comment_validator = ShowcasePostCommentType_validator +EventType._showcase_remove_member_validator = ShowcaseRemoveMemberType_validator +EventType._showcase_renamed_validator = ShowcaseRenamedType_validator +EventType._showcase_request_access_validator = ShowcaseRequestAccessType_validator +EventType._showcase_resolve_comment_validator = ShowcaseResolveCommentType_validator +EventType._showcase_restored_validator = ShowcaseRestoredType_validator +EventType._showcase_trashed_validator = ShowcaseTrashedType_validator +EventType._showcase_trashed_deprecated_validator = ShowcaseTrashedDeprecatedType_validator +EventType._showcase_unresolve_comment_validator = ShowcaseUnresolveCommentType_validator +EventType._showcase_untrashed_validator = ShowcaseUntrashedType_validator +EventType._showcase_untrashed_deprecated_validator = ShowcaseUntrashedDeprecatedType_validator +EventType._showcase_view_validator = ShowcaseViewType_validator +EventType._sso_add_cert_validator = SsoAddCertType_validator +EventType._sso_add_login_url_validator = SsoAddLoginUrlType_validator +EventType._sso_add_logout_url_validator = SsoAddLogoutUrlType_validator +EventType._sso_change_cert_validator = SsoChangeCertType_validator +EventType._sso_change_login_url_validator = SsoChangeLoginUrlType_validator +EventType._sso_change_logout_url_validator = SsoChangeLogoutUrlType_validator +EventType._sso_change_saml_identity_mode_validator = SsoChangeSamlIdentityModeType_validator +EventType._sso_remove_cert_validator = SsoRemoveCertType_validator +EventType._sso_remove_login_url_validator = SsoRemoveLoginUrlType_validator +EventType._sso_remove_logout_url_validator = SsoRemoveLogoutUrlType_validator +EventType._team_folder_change_status_validator = TeamFolderChangeStatusType_validator +EventType._team_folder_create_validator = TeamFolderCreateType_validator +EventType._team_folder_downgrade_validator = TeamFolderDowngradeType_validator +EventType._team_folder_permanently_delete_validator = TeamFolderPermanentlyDeleteType_validator +EventType._team_folder_rename_validator = TeamFolderRenameType_validator +EventType._team_selective_sync_settings_changed_validator = TeamSelectiveSyncSettingsChangedType_validator +EventType._account_capture_change_policy_validator = AccountCaptureChangePolicyType_validator +EventType._allow_download_disabled_validator = AllowDownloadDisabledType_validator +EventType._allow_download_enabled_validator = AllowDownloadEnabledType_validator +EventType._camera_uploads_policy_changed_validator = CameraUploadsPolicyChangedType_validator +EventType._data_placement_restriction_change_policy_validator = DataPlacementRestrictionChangePolicyType_validator +EventType._data_placement_restriction_satisfy_policy_validator = DataPlacementRestrictionSatisfyPolicyType_validator +EventType._device_approvals_change_desktop_policy_validator = DeviceApprovalsChangeDesktopPolicyType_validator +EventType._device_approvals_change_mobile_policy_validator = DeviceApprovalsChangeMobilePolicyType_validator +EventType._device_approvals_change_overage_action_validator = DeviceApprovalsChangeOverageActionType_validator +EventType._device_approvals_change_unlink_action_validator = DeviceApprovalsChangeUnlinkActionType_validator +EventType._directory_restrictions_add_members_validator = DirectoryRestrictionsAddMembersType_validator +EventType._directory_restrictions_remove_members_validator = DirectoryRestrictionsRemoveMembersType_validator +EventType._emm_add_exception_validator = EmmAddExceptionType_validator +EventType._emm_change_policy_validator = EmmChangePolicyType_validator +EventType._emm_remove_exception_validator = EmmRemoveExceptionType_validator +EventType._extended_version_history_change_policy_validator = ExtendedVersionHistoryChangePolicyType_validator +EventType._file_comments_change_policy_validator = FileCommentsChangePolicyType_validator +EventType._file_requests_change_policy_validator = FileRequestsChangePolicyType_validator +EventType._file_requests_emails_enabled_validator = FileRequestsEmailsEnabledType_validator +EventType._file_requests_emails_restricted_to_team_only_validator = FileRequestsEmailsRestrictedToTeamOnlyType_validator +EventType._google_sso_change_policy_validator = GoogleSsoChangePolicyType_validator +EventType._group_user_management_change_policy_validator = GroupUserManagementChangePolicyType_validator +EventType._member_requests_change_policy_validator = MemberRequestsChangePolicyType_validator +EventType._member_space_limits_add_exception_validator = MemberSpaceLimitsAddExceptionType_validator +EventType._member_space_limits_change_caps_type_policy_validator = MemberSpaceLimitsChangeCapsTypePolicyType_validator +EventType._member_space_limits_change_policy_validator = MemberSpaceLimitsChangePolicyType_validator +EventType._member_space_limits_remove_exception_validator = MemberSpaceLimitsRemoveExceptionType_validator +EventType._member_suggestions_change_policy_validator = MemberSuggestionsChangePolicyType_validator +EventType._microsoft_office_addin_change_policy_validator = MicrosoftOfficeAddinChangePolicyType_validator +EventType._network_control_change_policy_validator = NetworkControlChangePolicyType_validator +EventType._paper_change_deployment_policy_validator = PaperChangeDeploymentPolicyType_validator +EventType._paper_change_member_link_policy_validator = PaperChangeMemberLinkPolicyType_validator +EventType._paper_change_member_policy_validator = PaperChangeMemberPolicyType_validator +EventType._paper_change_policy_validator = PaperChangePolicyType_validator +EventType._paper_enabled_users_group_addition_validator = PaperEnabledUsersGroupAdditionType_validator +EventType._paper_enabled_users_group_removal_validator = PaperEnabledUsersGroupRemovalType_validator +EventType._permanent_delete_change_policy_validator = PermanentDeleteChangePolicyType_validator +EventType._sharing_change_folder_join_policy_validator = SharingChangeFolderJoinPolicyType_validator +EventType._sharing_change_link_policy_validator = SharingChangeLinkPolicyType_validator +EventType._sharing_change_member_policy_validator = SharingChangeMemberPolicyType_validator +EventType._showcase_change_download_policy_validator = ShowcaseChangeDownloadPolicyType_validator +EventType._showcase_change_enabled_policy_validator = ShowcaseChangeEnabledPolicyType_validator +EventType._showcase_change_external_sharing_policy_validator = ShowcaseChangeExternalSharingPolicyType_validator +EventType._smart_sync_change_policy_validator = SmartSyncChangePolicyType_validator +EventType._smart_sync_not_opt_out_validator = SmartSyncNotOptOutType_validator +EventType._smart_sync_opt_out_validator = SmartSyncOptOutType_validator +EventType._sso_change_policy_validator = SsoChangePolicyType_validator +EventType._team_selective_sync_policy_changed_validator = TeamSelectiveSyncPolicyChangedType_validator +EventType._tfa_change_policy_validator = TfaChangePolicyType_validator +EventType._two_account_change_policy_validator = TwoAccountChangePolicyType_validator +EventType._viewer_info_policy_changed_validator = ViewerInfoPolicyChangedType_validator +EventType._web_sessions_change_fixed_length_policy_validator = WebSessionsChangeFixedLengthPolicyType_validator +EventType._web_sessions_change_idle_length_policy_validator = WebSessionsChangeIdleLengthPolicyType_validator +EventType._team_merge_from_validator = TeamMergeFromType_validator +EventType._team_merge_to_validator = TeamMergeToType_validator +EventType._team_profile_add_logo_validator = TeamProfileAddLogoType_validator +EventType._team_profile_change_default_language_validator = TeamProfileChangeDefaultLanguageType_validator +EventType._team_profile_change_logo_validator = TeamProfileChangeLogoType_validator +EventType._team_profile_change_name_validator = TeamProfileChangeNameType_validator +EventType._team_profile_remove_logo_validator = TeamProfileRemoveLogoType_validator +EventType._tfa_add_backup_phone_validator = TfaAddBackupPhoneType_validator +EventType._tfa_add_security_key_validator = TfaAddSecurityKeyType_validator +EventType._tfa_change_backup_phone_validator = TfaChangeBackupPhoneType_validator +EventType._tfa_change_status_validator = TfaChangeStatusType_validator +EventType._tfa_remove_backup_phone_validator = TfaRemoveBackupPhoneType_validator +EventType._tfa_remove_security_key_validator = TfaRemoveSecurityKeyType_validator +EventType._tfa_reset_validator = TfaResetType_validator +EventType._other_validator = bv.Void() +EventType._tagmap = { + 'app_link_team': EventType._app_link_team_validator, + 'app_link_user': EventType._app_link_user_validator, + 'app_unlink_team': EventType._app_unlink_team_validator, + 'app_unlink_user': EventType._app_unlink_user_validator, + 'file_add_comment': EventType._file_add_comment_validator, + 'file_change_comment_subscription': EventType._file_change_comment_subscription_validator, + 'file_delete_comment': EventType._file_delete_comment_validator, + 'file_edit_comment': EventType._file_edit_comment_validator, + 'file_like_comment': EventType._file_like_comment_validator, + 'file_resolve_comment': EventType._file_resolve_comment_validator, + 'file_unlike_comment': EventType._file_unlike_comment_validator, + 'file_unresolve_comment': EventType._file_unresolve_comment_validator, + 'device_change_ip_desktop': EventType._device_change_ip_desktop_validator, + 'device_change_ip_mobile': EventType._device_change_ip_mobile_validator, + 'device_change_ip_web': EventType._device_change_ip_web_validator, + 'device_delete_on_unlink_fail': EventType._device_delete_on_unlink_fail_validator, + 'device_delete_on_unlink_success': EventType._device_delete_on_unlink_success_validator, + 'device_link_fail': EventType._device_link_fail_validator, + 'device_link_success': EventType._device_link_success_validator, + 'device_management_disabled': EventType._device_management_disabled_validator, + 'device_management_enabled': EventType._device_management_enabled_validator, + 'device_unlink': EventType._device_unlink_validator, + 'emm_refresh_auth_token': EventType._emm_refresh_auth_token_validator, + 'account_capture_change_availability': EventType._account_capture_change_availability_validator, + 'account_capture_migrate_account': EventType._account_capture_migrate_account_validator, + 'account_capture_notification_emails_sent': EventType._account_capture_notification_emails_sent_validator, + 'account_capture_relinquish_account': EventType._account_capture_relinquish_account_validator, + 'disabled_domain_invites': EventType._disabled_domain_invites_validator, + 'domain_invites_approve_request_to_join_team': EventType._domain_invites_approve_request_to_join_team_validator, + 'domain_invites_decline_request_to_join_team': EventType._domain_invites_decline_request_to_join_team_validator, + 'domain_invites_email_existing_users': EventType._domain_invites_email_existing_users_validator, + 'domain_invites_request_to_join_team': EventType._domain_invites_request_to_join_team_validator, + 'domain_invites_set_invite_new_user_pref_to_no': EventType._domain_invites_set_invite_new_user_pref_to_no_validator, + 'domain_invites_set_invite_new_user_pref_to_yes': EventType._domain_invites_set_invite_new_user_pref_to_yes_validator, + 'domain_verification_add_domain_fail': EventType._domain_verification_add_domain_fail_validator, + 'domain_verification_add_domain_success': EventType._domain_verification_add_domain_success_validator, + 'domain_verification_remove_domain': EventType._domain_verification_remove_domain_validator, + 'enabled_domain_invites': EventType._enabled_domain_invites_validator, + 'create_folder': EventType._create_folder_validator, + 'file_add': EventType._file_add_validator, + 'file_copy': EventType._file_copy_validator, + 'file_delete': EventType._file_delete_validator, + 'file_download': EventType._file_download_validator, + 'file_edit': EventType._file_edit_validator, + 'file_get_copy_reference': EventType._file_get_copy_reference_validator, + 'file_move': EventType._file_move_validator, + 'file_permanently_delete': EventType._file_permanently_delete_validator, + 'file_preview': EventType._file_preview_validator, + 'file_rename': EventType._file_rename_validator, + 'file_restore': EventType._file_restore_validator, + 'file_revert': EventType._file_revert_validator, + 'file_rollback_changes': EventType._file_rollback_changes_validator, + 'file_save_copy_reference': EventType._file_save_copy_reference_validator, + 'file_request_change': EventType._file_request_change_validator, + 'file_request_close': EventType._file_request_close_validator, + 'file_request_create': EventType._file_request_create_validator, + 'file_request_receive_file': EventType._file_request_receive_file_validator, + 'group_add_external_id': EventType._group_add_external_id_validator, + 'group_add_member': EventType._group_add_member_validator, + 'group_change_external_id': EventType._group_change_external_id_validator, + 'group_change_management_type': EventType._group_change_management_type_validator, + 'group_change_member_role': EventType._group_change_member_role_validator, + 'group_create': EventType._group_create_validator, + 'group_delete': EventType._group_delete_validator, + 'group_description_updated': EventType._group_description_updated_validator, + 'group_join_policy_updated': EventType._group_join_policy_updated_validator, + 'group_moved': EventType._group_moved_validator, + 'group_remove_external_id': EventType._group_remove_external_id_validator, + 'group_remove_member': EventType._group_remove_member_validator, + 'group_rename': EventType._group_rename_validator, + 'emm_error': EventType._emm_error_validator, + 'login_fail': EventType._login_fail_validator, + 'login_success': EventType._login_success_validator, + 'logout': EventType._logout_validator, + 'reseller_support_session_end': EventType._reseller_support_session_end_validator, + 'reseller_support_session_start': EventType._reseller_support_session_start_validator, + 'sign_in_as_session_end': EventType._sign_in_as_session_end_validator, + 'sign_in_as_session_start': EventType._sign_in_as_session_start_validator, + 'sso_error': EventType._sso_error_validator, + 'member_add_name': EventType._member_add_name_validator, + 'member_change_admin_role': EventType._member_change_admin_role_validator, + 'member_change_email': EventType._member_change_email_validator, + 'member_change_membership_type': EventType._member_change_membership_type_validator, + 'member_change_name': EventType._member_change_name_validator, + 'member_change_status': EventType._member_change_status_validator, + 'member_delete_manual_contacts': EventType._member_delete_manual_contacts_validator, + 'member_permanently_delete_account_contents': EventType._member_permanently_delete_account_contents_validator, + 'member_space_limits_add_custom_quota': EventType._member_space_limits_add_custom_quota_validator, + 'member_space_limits_change_custom_quota': EventType._member_space_limits_change_custom_quota_validator, + 'member_space_limits_change_status': EventType._member_space_limits_change_status_validator, + 'member_space_limits_remove_custom_quota': EventType._member_space_limits_remove_custom_quota_validator, + 'member_suggest': EventType._member_suggest_validator, + 'member_transfer_account_contents': EventType._member_transfer_account_contents_validator, + 'secondary_mails_policy_changed': EventType._secondary_mails_policy_changed_validator, + 'paper_content_add_member': EventType._paper_content_add_member_validator, + 'paper_content_add_to_folder': EventType._paper_content_add_to_folder_validator, + 'paper_content_archive': EventType._paper_content_archive_validator, + 'paper_content_create': EventType._paper_content_create_validator, + 'paper_content_permanently_delete': EventType._paper_content_permanently_delete_validator, + 'paper_content_remove_from_folder': EventType._paper_content_remove_from_folder_validator, + 'paper_content_remove_member': EventType._paper_content_remove_member_validator, + 'paper_content_rename': EventType._paper_content_rename_validator, + 'paper_content_restore': EventType._paper_content_restore_validator, + 'paper_doc_add_comment': EventType._paper_doc_add_comment_validator, + 'paper_doc_change_member_role': EventType._paper_doc_change_member_role_validator, + 'paper_doc_change_sharing_policy': EventType._paper_doc_change_sharing_policy_validator, + 'paper_doc_change_subscription': EventType._paper_doc_change_subscription_validator, + 'paper_doc_deleted': EventType._paper_doc_deleted_validator, + 'paper_doc_delete_comment': EventType._paper_doc_delete_comment_validator, + 'paper_doc_download': EventType._paper_doc_download_validator, + 'paper_doc_edit': EventType._paper_doc_edit_validator, + 'paper_doc_edit_comment': EventType._paper_doc_edit_comment_validator, + 'paper_doc_followed': EventType._paper_doc_followed_validator, + 'paper_doc_mention': EventType._paper_doc_mention_validator, + 'paper_doc_ownership_changed': EventType._paper_doc_ownership_changed_validator, + 'paper_doc_request_access': EventType._paper_doc_request_access_validator, + 'paper_doc_resolve_comment': EventType._paper_doc_resolve_comment_validator, + 'paper_doc_revert': EventType._paper_doc_revert_validator, + 'paper_doc_slack_share': EventType._paper_doc_slack_share_validator, + 'paper_doc_team_invite': EventType._paper_doc_team_invite_validator, + 'paper_doc_trashed': EventType._paper_doc_trashed_validator, + 'paper_doc_unresolve_comment': EventType._paper_doc_unresolve_comment_validator, + 'paper_doc_untrashed': EventType._paper_doc_untrashed_validator, + 'paper_doc_view': EventType._paper_doc_view_validator, + 'paper_external_view_allow': EventType._paper_external_view_allow_validator, + 'paper_external_view_default_team': EventType._paper_external_view_default_team_validator, + 'paper_external_view_forbid': EventType._paper_external_view_forbid_validator, + 'paper_folder_change_subscription': EventType._paper_folder_change_subscription_validator, + 'paper_folder_deleted': EventType._paper_folder_deleted_validator, + 'paper_folder_followed': EventType._paper_folder_followed_validator, + 'paper_folder_team_invite': EventType._paper_folder_team_invite_validator, + 'password_change': EventType._password_change_validator, + 'password_reset': EventType._password_reset_validator, + 'password_reset_all': EventType._password_reset_all_validator, + 'emm_create_exceptions_report': EventType._emm_create_exceptions_report_validator, + 'emm_create_usage_report': EventType._emm_create_usage_report_validator, + 'export_members_report': EventType._export_members_report_validator, + 'paper_admin_export_start': EventType._paper_admin_export_start_validator, + 'smart_sync_create_admin_privilege_report': EventType._smart_sync_create_admin_privilege_report_validator, + 'team_activity_create_report': EventType._team_activity_create_report_validator, + 'collection_share': EventType._collection_share_validator, + 'note_acl_invite_only': EventType._note_acl_invite_only_validator, + 'note_acl_link': EventType._note_acl_link_validator, + 'note_acl_team_link': EventType._note_acl_team_link_validator, + 'note_shared': EventType._note_shared_validator, + 'note_share_receive': EventType._note_share_receive_validator, + 'open_note_shared': EventType._open_note_shared_validator, + 'sf_add_group': EventType._sf_add_group_validator, + 'sf_allow_non_members_to_view_shared_links': EventType._sf_allow_non_members_to_view_shared_links_validator, + 'sf_external_invite_warn': EventType._sf_external_invite_warn_validator, + 'sf_fb_invite': EventType._sf_fb_invite_validator, + 'sf_fb_invite_change_role': EventType._sf_fb_invite_change_role_validator, + 'sf_fb_uninvite': EventType._sf_fb_uninvite_validator, + 'sf_invite_group': EventType._sf_invite_group_validator, + 'sf_team_grant_access': EventType._sf_team_grant_access_validator, + 'sf_team_invite': EventType._sf_team_invite_validator, + 'sf_team_invite_change_role': EventType._sf_team_invite_change_role_validator, + 'sf_team_join': EventType._sf_team_join_validator, + 'sf_team_join_from_oob_link': EventType._sf_team_join_from_oob_link_validator, + 'sf_team_uninvite': EventType._sf_team_uninvite_validator, + 'shared_content_add_invitees': EventType._shared_content_add_invitees_validator, + 'shared_content_add_link_expiry': EventType._shared_content_add_link_expiry_validator, + 'shared_content_add_link_password': EventType._shared_content_add_link_password_validator, + 'shared_content_add_member': EventType._shared_content_add_member_validator, + 'shared_content_change_downloads_policy': EventType._shared_content_change_downloads_policy_validator, + 'shared_content_change_invitee_role': EventType._shared_content_change_invitee_role_validator, + 'shared_content_change_link_audience': EventType._shared_content_change_link_audience_validator, + 'shared_content_change_link_expiry': EventType._shared_content_change_link_expiry_validator, + 'shared_content_change_link_password': EventType._shared_content_change_link_password_validator, + 'shared_content_change_member_role': EventType._shared_content_change_member_role_validator, + 'shared_content_change_viewer_info_policy': EventType._shared_content_change_viewer_info_policy_validator, + 'shared_content_claim_invitation': EventType._shared_content_claim_invitation_validator, + 'shared_content_copy': EventType._shared_content_copy_validator, + 'shared_content_download': EventType._shared_content_download_validator, + 'shared_content_relinquish_membership': EventType._shared_content_relinquish_membership_validator, + 'shared_content_remove_invitees': EventType._shared_content_remove_invitees_validator, + 'shared_content_remove_link_expiry': EventType._shared_content_remove_link_expiry_validator, + 'shared_content_remove_link_password': EventType._shared_content_remove_link_password_validator, + 'shared_content_remove_member': EventType._shared_content_remove_member_validator, + 'shared_content_request_access': EventType._shared_content_request_access_validator, + 'shared_content_unshare': EventType._shared_content_unshare_validator, + 'shared_content_view': EventType._shared_content_view_validator, + 'shared_folder_change_link_policy': EventType._shared_folder_change_link_policy_validator, + 'shared_folder_change_members_inheritance_policy': EventType._shared_folder_change_members_inheritance_policy_validator, + 'shared_folder_change_members_management_policy': EventType._shared_folder_change_members_management_policy_validator, + 'shared_folder_change_members_policy': EventType._shared_folder_change_members_policy_validator, + 'shared_folder_create': EventType._shared_folder_create_validator, + 'shared_folder_decline_invitation': EventType._shared_folder_decline_invitation_validator, + 'shared_folder_mount': EventType._shared_folder_mount_validator, + 'shared_folder_nest': EventType._shared_folder_nest_validator, + 'shared_folder_transfer_ownership': EventType._shared_folder_transfer_ownership_validator, + 'shared_folder_unmount': EventType._shared_folder_unmount_validator, + 'shared_link_add_expiry': EventType._shared_link_add_expiry_validator, + 'shared_link_change_expiry': EventType._shared_link_change_expiry_validator, + 'shared_link_change_visibility': EventType._shared_link_change_visibility_validator, + 'shared_link_copy': EventType._shared_link_copy_validator, + 'shared_link_create': EventType._shared_link_create_validator, + 'shared_link_disable': EventType._shared_link_disable_validator, + 'shared_link_download': EventType._shared_link_download_validator, + 'shared_link_remove_expiry': EventType._shared_link_remove_expiry_validator, + 'shared_link_share': EventType._shared_link_share_validator, + 'shared_link_view': EventType._shared_link_view_validator, + 'shared_note_opened': EventType._shared_note_opened_validator, + 'shmodel_group_share': EventType._shmodel_group_share_validator, + 'showcase_access_granted': EventType._showcase_access_granted_validator, + 'showcase_add_member': EventType._showcase_add_member_validator, + 'showcase_archived': EventType._showcase_archived_validator, + 'showcase_created': EventType._showcase_created_validator, + 'showcase_delete_comment': EventType._showcase_delete_comment_validator, + 'showcase_edited': EventType._showcase_edited_validator, + 'showcase_edit_comment': EventType._showcase_edit_comment_validator, + 'showcase_file_added': EventType._showcase_file_added_validator, + 'showcase_file_download': EventType._showcase_file_download_validator, + 'showcase_file_removed': EventType._showcase_file_removed_validator, + 'showcase_file_view': EventType._showcase_file_view_validator, + 'showcase_permanently_deleted': EventType._showcase_permanently_deleted_validator, + 'showcase_post_comment': EventType._showcase_post_comment_validator, + 'showcase_remove_member': EventType._showcase_remove_member_validator, + 'showcase_renamed': EventType._showcase_renamed_validator, + 'showcase_request_access': EventType._showcase_request_access_validator, + 'showcase_resolve_comment': EventType._showcase_resolve_comment_validator, + 'showcase_restored': EventType._showcase_restored_validator, + 'showcase_trashed': EventType._showcase_trashed_validator, + 'showcase_trashed_deprecated': EventType._showcase_trashed_deprecated_validator, + 'showcase_unresolve_comment': EventType._showcase_unresolve_comment_validator, + 'showcase_untrashed': EventType._showcase_untrashed_validator, + 'showcase_untrashed_deprecated': EventType._showcase_untrashed_deprecated_validator, + 'showcase_view': EventType._showcase_view_validator, + 'sso_add_cert': EventType._sso_add_cert_validator, + 'sso_add_login_url': EventType._sso_add_login_url_validator, + 'sso_add_logout_url': EventType._sso_add_logout_url_validator, + 'sso_change_cert': EventType._sso_change_cert_validator, + 'sso_change_login_url': EventType._sso_change_login_url_validator, + 'sso_change_logout_url': EventType._sso_change_logout_url_validator, + 'sso_change_saml_identity_mode': EventType._sso_change_saml_identity_mode_validator, + 'sso_remove_cert': EventType._sso_remove_cert_validator, + 'sso_remove_login_url': EventType._sso_remove_login_url_validator, + 'sso_remove_logout_url': EventType._sso_remove_logout_url_validator, + 'team_folder_change_status': EventType._team_folder_change_status_validator, + 'team_folder_create': EventType._team_folder_create_validator, + 'team_folder_downgrade': EventType._team_folder_downgrade_validator, + 'team_folder_permanently_delete': EventType._team_folder_permanently_delete_validator, + 'team_folder_rename': EventType._team_folder_rename_validator, + 'team_selective_sync_settings_changed': EventType._team_selective_sync_settings_changed_validator, + 'account_capture_change_policy': EventType._account_capture_change_policy_validator, + 'allow_download_disabled': EventType._allow_download_disabled_validator, + 'allow_download_enabled': EventType._allow_download_enabled_validator, + 'camera_uploads_policy_changed': EventType._camera_uploads_policy_changed_validator, + 'data_placement_restriction_change_policy': EventType._data_placement_restriction_change_policy_validator, + 'data_placement_restriction_satisfy_policy': EventType._data_placement_restriction_satisfy_policy_validator, + 'device_approvals_change_desktop_policy': EventType._device_approvals_change_desktop_policy_validator, + 'device_approvals_change_mobile_policy': EventType._device_approvals_change_mobile_policy_validator, + 'device_approvals_change_overage_action': EventType._device_approvals_change_overage_action_validator, + 'device_approvals_change_unlink_action': EventType._device_approvals_change_unlink_action_validator, + 'directory_restrictions_add_members': EventType._directory_restrictions_add_members_validator, + 'directory_restrictions_remove_members': EventType._directory_restrictions_remove_members_validator, + 'emm_add_exception': EventType._emm_add_exception_validator, + 'emm_change_policy': EventType._emm_change_policy_validator, + 'emm_remove_exception': EventType._emm_remove_exception_validator, + 'extended_version_history_change_policy': EventType._extended_version_history_change_policy_validator, + 'file_comments_change_policy': EventType._file_comments_change_policy_validator, + 'file_requests_change_policy': EventType._file_requests_change_policy_validator, + 'file_requests_emails_enabled': EventType._file_requests_emails_enabled_validator, + 'file_requests_emails_restricted_to_team_only': EventType._file_requests_emails_restricted_to_team_only_validator, + 'google_sso_change_policy': EventType._google_sso_change_policy_validator, + 'group_user_management_change_policy': EventType._group_user_management_change_policy_validator, + 'member_requests_change_policy': EventType._member_requests_change_policy_validator, + 'member_space_limits_add_exception': EventType._member_space_limits_add_exception_validator, + 'member_space_limits_change_caps_type_policy': EventType._member_space_limits_change_caps_type_policy_validator, + 'member_space_limits_change_policy': EventType._member_space_limits_change_policy_validator, + 'member_space_limits_remove_exception': EventType._member_space_limits_remove_exception_validator, + 'member_suggestions_change_policy': EventType._member_suggestions_change_policy_validator, + 'microsoft_office_addin_change_policy': EventType._microsoft_office_addin_change_policy_validator, + 'network_control_change_policy': EventType._network_control_change_policy_validator, + 'paper_change_deployment_policy': EventType._paper_change_deployment_policy_validator, + 'paper_change_member_link_policy': EventType._paper_change_member_link_policy_validator, + 'paper_change_member_policy': EventType._paper_change_member_policy_validator, + 'paper_change_policy': EventType._paper_change_policy_validator, + 'paper_enabled_users_group_addition': EventType._paper_enabled_users_group_addition_validator, + 'paper_enabled_users_group_removal': EventType._paper_enabled_users_group_removal_validator, + 'permanent_delete_change_policy': EventType._permanent_delete_change_policy_validator, + 'sharing_change_folder_join_policy': EventType._sharing_change_folder_join_policy_validator, + 'sharing_change_link_policy': EventType._sharing_change_link_policy_validator, + 'sharing_change_member_policy': EventType._sharing_change_member_policy_validator, + 'showcase_change_download_policy': EventType._showcase_change_download_policy_validator, + 'showcase_change_enabled_policy': EventType._showcase_change_enabled_policy_validator, + 'showcase_change_external_sharing_policy': EventType._showcase_change_external_sharing_policy_validator, + 'smart_sync_change_policy': EventType._smart_sync_change_policy_validator, + 'smart_sync_not_opt_out': EventType._smart_sync_not_opt_out_validator, + 'smart_sync_opt_out': EventType._smart_sync_opt_out_validator, + 'sso_change_policy': EventType._sso_change_policy_validator, + 'team_selective_sync_policy_changed': EventType._team_selective_sync_policy_changed_validator, + 'tfa_change_policy': EventType._tfa_change_policy_validator, + 'two_account_change_policy': EventType._two_account_change_policy_validator, + 'viewer_info_policy_changed': EventType._viewer_info_policy_changed_validator, + 'web_sessions_change_fixed_length_policy': EventType._web_sessions_change_fixed_length_policy_validator, + 'web_sessions_change_idle_length_policy': EventType._web_sessions_change_idle_length_policy_validator, + 'team_merge_from': EventType._team_merge_from_validator, + 'team_merge_to': EventType._team_merge_to_validator, + 'team_profile_add_logo': EventType._team_profile_add_logo_validator, + 'team_profile_change_default_language': EventType._team_profile_change_default_language_validator, + 'team_profile_change_logo': EventType._team_profile_change_logo_validator, + 'team_profile_change_name': EventType._team_profile_change_name_validator, + 'team_profile_remove_logo': EventType._team_profile_remove_logo_validator, + 'tfa_add_backup_phone': EventType._tfa_add_backup_phone_validator, + 'tfa_add_security_key': EventType._tfa_add_security_key_validator, + 'tfa_change_backup_phone': EventType._tfa_change_backup_phone_validator, + 'tfa_change_status': EventType._tfa_change_status_validator, + 'tfa_remove_backup_phone': EventType._tfa_remove_backup_phone_validator, + 'tfa_remove_security_key': EventType._tfa_remove_security_key_validator, + 'tfa_reset': EventType._tfa_reset_validator, + 'other': EventType._other_validator, +} + +EventType.other = EventType('other') + +ExportMembersReportDetails._all_field_names_ = set([]) +ExportMembersReportDetails._all_fields_ = [] + +ExportMembersReportType._description_validator = bv.String() +ExportMembersReportType._all_field_names_ = set(['description']) +ExportMembersReportType._all_fields_ = [('description', ExportMembersReportType._description_validator)] + +ExtendedVersionHistoryChangePolicyDetails._new_value_validator = ExtendedVersionHistoryPolicy_validator +ExtendedVersionHistoryChangePolicyDetails._previous_value_validator = bv.Nullable(ExtendedVersionHistoryPolicy_validator) +ExtendedVersionHistoryChangePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +ExtendedVersionHistoryChangePolicyDetails._all_fields_ = [ + ('new_value', ExtendedVersionHistoryChangePolicyDetails._new_value_validator), + ('previous_value', ExtendedVersionHistoryChangePolicyDetails._previous_value_validator), +] + +ExtendedVersionHistoryChangePolicyType._description_validator = bv.String() +ExtendedVersionHistoryChangePolicyType._all_field_names_ = set(['description']) +ExtendedVersionHistoryChangePolicyType._all_fields_ = [('description', ExtendedVersionHistoryChangePolicyType._description_validator)] + +ExtendedVersionHistoryPolicy._explicitly_limited_validator = bv.Void() +ExtendedVersionHistoryPolicy._explicitly_unlimited_validator = bv.Void() +ExtendedVersionHistoryPolicy._implicitly_limited_validator = bv.Void() +ExtendedVersionHistoryPolicy._implicitly_unlimited_validator = bv.Void() +ExtendedVersionHistoryPolicy._other_validator = bv.Void() +ExtendedVersionHistoryPolicy._tagmap = { + 'explicitly_limited': ExtendedVersionHistoryPolicy._explicitly_limited_validator, + 'explicitly_unlimited': ExtendedVersionHistoryPolicy._explicitly_unlimited_validator, + 'implicitly_limited': ExtendedVersionHistoryPolicy._implicitly_limited_validator, + 'implicitly_unlimited': ExtendedVersionHistoryPolicy._implicitly_unlimited_validator, + 'other': ExtendedVersionHistoryPolicy._other_validator, +} + +ExtendedVersionHistoryPolicy.explicitly_limited = ExtendedVersionHistoryPolicy('explicitly_limited') +ExtendedVersionHistoryPolicy.explicitly_unlimited = ExtendedVersionHistoryPolicy('explicitly_unlimited') +ExtendedVersionHistoryPolicy.implicitly_limited = ExtendedVersionHistoryPolicy('implicitly_limited') +ExtendedVersionHistoryPolicy.implicitly_unlimited = ExtendedVersionHistoryPolicy('implicitly_unlimited') +ExtendedVersionHistoryPolicy.other = ExtendedVersionHistoryPolicy('other') + +ExternalUserLogInfo._user_identifier_validator = bv.String() +ExternalUserLogInfo._identifier_type_validator = IdentifierType_validator +ExternalUserLogInfo._all_field_names_ = set([ + 'user_identifier', + 'identifier_type', +]) +ExternalUserLogInfo._all_fields_ = [ + ('user_identifier', ExternalUserLogInfo._user_identifier_validator), + ('identifier_type', ExternalUserLogInfo._identifier_type_validator), +] + +FailureDetailsLogInfo._user_friendly_message_validator = bv.Nullable(bv.String()) +FailureDetailsLogInfo._technical_error_message_validator = bv.Nullable(bv.String()) +FailureDetailsLogInfo._all_field_names_ = set([ + 'user_friendly_message', + 'technical_error_message', +]) +FailureDetailsLogInfo._all_fields_ = [ + ('user_friendly_message', FailureDetailsLogInfo._user_friendly_message_validator), + ('technical_error_message', FailureDetailsLogInfo._technical_error_message_validator), +] + +FileAddCommentDetails._comment_text_validator = bv.Nullable(bv.String()) +FileAddCommentDetails._all_field_names_ = set(['comment_text']) +FileAddCommentDetails._all_fields_ = [('comment_text', FileAddCommentDetails._comment_text_validator)] + +FileAddCommentType._description_validator = bv.String() +FileAddCommentType._all_field_names_ = set(['description']) +FileAddCommentType._all_fields_ = [('description', FileAddCommentType._description_validator)] + +FileAddDetails._all_field_names_ = set([]) +FileAddDetails._all_fields_ = [] + +FileAddType._description_validator = bv.String() +FileAddType._all_field_names_ = set(['description']) +FileAddType._all_fields_ = [('description', FileAddType._description_validator)] + +FileChangeCommentSubscriptionDetails._new_value_validator = FileCommentNotificationPolicy_validator +FileChangeCommentSubscriptionDetails._previous_value_validator = bv.Nullable(FileCommentNotificationPolicy_validator) +FileChangeCommentSubscriptionDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +FileChangeCommentSubscriptionDetails._all_fields_ = [ + ('new_value', FileChangeCommentSubscriptionDetails._new_value_validator), + ('previous_value', FileChangeCommentSubscriptionDetails._previous_value_validator), +] + +FileChangeCommentSubscriptionType._description_validator = bv.String() +FileChangeCommentSubscriptionType._all_field_names_ = set(['description']) +FileChangeCommentSubscriptionType._all_fields_ = [('description', FileChangeCommentSubscriptionType._description_validator)] + +FileCommentNotificationPolicy._disabled_validator = bv.Void() +FileCommentNotificationPolicy._enabled_validator = bv.Void() +FileCommentNotificationPolicy._other_validator = bv.Void() +FileCommentNotificationPolicy._tagmap = { + 'disabled': FileCommentNotificationPolicy._disabled_validator, + 'enabled': FileCommentNotificationPolicy._enabled_validator, + 'other': FileCommentNotificationPolicy._other_validator, +} + +FileCommentNotificationPolicy.disabled = FileCommentNotificationPolicy('disabled') +FileCommentNotificationPolicy.enabled = FileCommentNotificationPolicy('enabled') +FileCommentNotificationPolicy.other = FileCommentNotificationPolicy('other') + +FileCommentsChangePolicyDetails._new_value_validator = FileCommentsPolicy_validator +FileCommentsChangePolicyDetails._previous_value_validator = bv.Nullable(FileCommentsPolicy_validator) +FileCommentsChangePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +FileCommentsChangePolicyDetails._all_fields_ = [ + ('new_value', FileCommentsChangePolicyDetails._new_value_validator), + ('previous_value', FileCommentsChangePolicyDetails._previous_value_validator), +] + +FileCommentsChangePolicyType._description_validator = bv.String() +FileCommentsChangePolicyType._all_field_names_ = set(['description']) +FileCommentsChangePolicyType._all_fields_ = [('description', FileCommentsChangePolicyType._description_validator)] + +FileCommentsPolicy._disabled_validator = bv.Void() +FileCommentsPolicy._enabled_validator = bv.Void() +FileCommentsPolicy._other_validator = bv.Void() +FileCommentsPolicy._tagmap = { + 'disabled': FileCommentsPolicy._disabled_validator, + 'enabled': FileCommentsPolicy._enabled_validator, + 'other': FileCommentsPolicy._other_validator, +} + +FileCommentsPolicy.disabled = FileCommentsPolicy('disabled') +FileCommentsPolicy.enabled = FileCommentsPolicy('enabled') +FileCommentsPolicy.other = FileCommentsPolicy('other') + +FileCopyDetails._relocate_action_details_validator = bv.List(RelocateAssetReferencesLogInfo_validator) +FileCopyDetails._all_field_names_ = set(['relocate_action_details']) +FileCopyDetails._all_fields_ = [('relocate_action_details', FileCopyDetails._relocate_action_details_validator)] + +FileCopyType._description_validator = bv.String() +FileCopyType._all_field_names_ = set(['description']) +FileCopyType._all_fields_ = [('description', FileCopyType._description_validator)] + +FileDeleteCommentDetails._comment_text_validator = bv.Nullable(bv.String()) +FileDeleteCommentDetails._all_field_names_ = set(['comment_text']) +FileDeleteCommentDetails._all_fields_ = [('comment_text', FileDeleteCommentDetails._comment_text_validator)] + +FileDeleteCommentType._description_validator = bv.String() +FileDeleteCommentType._all_field_names_ = set(['description']) +FileDeleteCommentType._all_fields_ = [('description', FileDeleteCommentType._description_validator)] + +FileDeleteDetails._all_field_names_ = set([]) +FileDeleteDetails._all_fields_ = [] + +FileDeleteType._description_validator = bv.String() +FileDeleteType._all_field_names_ = set(['description']) +FileDeleteType._all_fields_ = [('description', FileDeleteType._description_validator)] + +FileDownloadDetails._all_field_names_ = set([]) +FileDownloadDetails._all_fields_ = [] + +FileDownloadType._description_validator = bv.String() +FileDownloadType._all_field_names_ = set(['description']) +FileDownloadType._all_fields_ = [('description', FileDownloadType._description_validator)] + +FileEditCommentDetails._comment_text_validator = bv.Nullable(bv.String()) +FileEditCommentDetails._previous_comment_text_validator = bv.String() +FileEditCommentDetails._all_field_names_ = set([ + 'comment_text', + 'previous_comment_text', +]) +FileEditCommentDetails._all_fields_ = [ + ('comment_text', FileEditCommentDetails._comment_text_validator), + ('previous_comment_text', FileEditCommentDetails._previous_comment_text_validator), +] + +FileEditCommentType._description_validator = bv.String() +FileEditCommentType._all_field_names_ = set(['description']) +FileEditCommentType._all_fields_ = [('description', FileEditCommentType._description_validator)] + +FileEditDetails._all_field_names_ = set([]) +FileEditDetails._all_fields_ = [] + +FileEditType._description_validator = bv.String() +FileEditType._all_field_names_ = set(['description']) +FileEditType._all_fields_ = [('description', FileEditType._description_validator)] + +FileGetCopyReferenceDetails._all_field_names_ = set([]) +FileGetCopyReferenceDetails._all_fields_ = [] + +FileGetCopyReferenceType._description_validator = bv.String() +FileGetCopyReferenceType._all_field_names_ = set(['description']) +FileGetCopyReferenceType._all_fields_ = [('description', FileGetCopyReferenceType._description_validator)] + +FileLikeCommentDetails._comment_text_validator = bv.Nullable(bv.String()) +FileLikeCommentDetails._all_field_names_ = set(['comment_text']) +FileLikeCommentDetails._all_fields_ = [('comment_text', FileLikeCommentDetails._comment_text_validator)] + +FileLikeCommentType._description_validator = bv.String() +FileLikeCommentType._all_field_names_ = set(['description']) +FileLikeCommentType._all_fields_ = [('description', FileLikeCommentType._description_validator)] + +FileOrFolderLogInfo._path_validator = PathLogInfo_validator +FileOrFolderLogInfo._display_name_validator = bv.Nullable(bv.String()) +FileOrFolderLogInfo._file_id_validator = bv.Nullable(bv.String()) +FileOrFolderLogInfo._all_field_names_ = set([ + 'path', + 'display_name', + 'file_id', +]) +FileOrFolderLogInfo._all_fields_ = [ + ('path', FileOrFolderLogInfo._path_validator), + ('display_name', FileOrFolderLogInfo._display_name_validator), + ('file_id', FileOrFolderLogInfo._file_id_validator), +] + +FileLogInfo._all_field_names_ = FileOrFolderLogInfo._all_field_names_.union(set([])) +FileLogInfo._all_fields_ = FileOrFolderLogInfo._all_fields_ + [] + +FileMoveDetails._relocate_action_details_validator = bv.List(RelocateAssetReferencesLogInfo_validator) +FileMoveDetails._all_field_names_ = set(['relocate_action_details']) +FileMoveDetails._all_fields_ = [('relocate_action_details', FileMoveDetails._relocate_action_details_validator)] + +FileMoveType._description_validator = bv.String() +FileMoveType._all_field_names_ = set(['description']) +FileMoveType._all_fields_ = [('description', FileMoveType._description_validator)] + +FilePermanentlyDeleteDetails._all_field_names_ = set([]) +FilePermanentlyDeleteDetails._all_fields_ = [] + +FilePermanentlyDeleteType._description_validator = bv.String() +FilePermanentlyDeleteType._all_field_names_ = set(['description']) +FilePermanentlyDeleteType._all_fields_ = [('description', FilePermanentlyDeleteType._description_validator)] + +FilePreviewDetails._all_field_names_ = set([]) +FilePreviewDetails._all_fields_ = [] + +FilePreviewType._description_validator = bv.String() +FilePreviewType._all_field_names_ = set(['description']) +FilePreviewType._all_fields_ = [('description', FilePreviewType._description_validator)] + +FileRenameDetails._relocate_action_details_validator = bv.List(RelocateAssetReferencesLogInfo_validator) +FileRenameDetails._all_field_names_ = set(['relocate_action_details']) +FileRenameDetails._all_fields_ = [('relocate_action_details', FileRenameDetails._relocate_action_details_validator)] + +FileRenameType._description_validator = bv.String() +FileRenameType._all_field_names_ = set(['description']) +FileRenameType._all_fields_ = [('description', FileRenameType._description_validator)] + +FileRequestChangeDetails._file_request_id_validator = bv.Nullable(file_requests.FileRequestId_validator) +FileRequestChangeDetails._previous_details_validator = bv.Nullable(FileRequestDetails_validator) +FileRequestChangeDetails._new_details_validator = FileRequestDetails_validator +FileRequestChangeDetails._all_field_names_ = set([ + 'file_request_id', + 'previous_details', + 'new_details', +]) +FileRequestChangeDetails._all_fields_ = [ + ('file_request_id', FileRequestChangeDetails._file_request_id_validator), + ('previous_details', FileRequestChangeDetails._previous_details_validator), + ('new_details', FileRequestChangeDetails._new_details_validator), +] + +FileRequestChangeType._description_validator = bv.String() +FileRequestChangeType._all_field_names_ = set(['description']) +FileRequestChangeType._all_fields_ = [('description', FileRequestChangeType._description_validator)] + +FileRequestCloseDetails._file_request_id_validator = bv.Nullable(file_requests.FileRequestId_validator) +FileRequestCloseDetails._previous_details_validator = bv.Nullable(FileRequestDetails_validator) +FileRequestCloseDetails._all_field_names_ = set([ + 'file_request_id', + 'previous_details', +]) +FileRequestCloseDetails._all_fields_ = [ + ('file_request_id', FileRequestCloseDetails._file_request_id_validator), + ('previous_details', FileRequestCloseDetails._previous_details_validator), +] + +FileRequestCloseType._description_validator = bv.String() +FileRequestCloseType._all_field_names_ = set(['description']) +FileRequestCloseType._all_fields_ = [('description', FileRequestCloseType._description_validator)] + +FileRequestCreateDetails._file_request_id_validator = bv.Nullable(file_requests.FileRequestId_validator) +FileRequestCreateDetails._request_details_validator = bv.Nullable(FileRequestDetails_validator) +FileRequestCreateDetails._all_field_names_ = set([ + 'file_request_id', + 'request_details', +]) +FileRequestCreateDetails._all_fields_ = [ + ('file_request_id', FileRequestCreateDetails._file_request_id_validator), + ('request_details', FileRequestCreateDetails._request_details_validator), +] + +FileRequestCreateType._description_validator = bv.String() +FileRequestCreateType._all_field_names_ = set(['description']) +FileRequestCreateType._all_fields_ = [('description', FileRequestCreateType._description_validator)] + +FileRequestDeadline._deadline_validator = bv.Nullable(common.DropboxTimestamp_validator) +FileRequestDeadline._allow_late_uploads_validator = bv.Nullable(bv.String()) +FileRequestDeadline._all_field_names_ = set([ + 'deadline', + 'allow_late_uploads', +]) +FileRequestDeadline._all_fields_ = [ + ('deadline', FileRequestDeadline._deadline_validator), + ('allow_late_uploads', FileRequestDeadline._allow_late_uploads_validator), +] + +FileRequestDetails._asset_index_validator = bv.UInt64() +FileRequestDetails._deadline_validator = bv.Nullable(FileRequestDeadline_validator) +FileRequestDetails._all_field_names_ = set([ + 'asset_index', + 'deadline', +]) +FileRequestDetails._all_fields_ = [ + ('asset_index', FileRequestDetails._asset_index_validator), + ('deadline', FileRequestDetails._deadline_validator), +] + +FileRequestReceiveFileDetails._file_request_id_validator = bv.Nullable(file_requests.FileRequestId_validator) +FileRequestReceiveFileDetails._file_request_details_validator = bv.Nullable(FileRequestDetails_validator) +FileRequestReceiveFileDetails._submitted_file_names_validator = bv.List(bv.String()) +FileRequestReceiveFileDetails._submitter_name_validator = bv.Nullable(common.DisplayNameLegacy_validator) +FileRequestReceiveFileDetails._submitter_email_validator = bv.Nullable(EmailAddress_validator) +FileRequestReceiveFileDetails._all_field_names_ = set([ + 'file_request_id', + 'file_request_details', + 'submitted_file_names', + 'submitter_name', + 'submitter_email', +]) +FileRequestReceiveFileDetails._all_fields_ = [ + ('file_request_id', FileRequestReceiveFileDetails._file_request_id_validator), + ('file_request_details', FileRequestReceiveFileDetails._file_request_details_validator), + ('submitted_file_names', FileRequestReceiveFileDetails._submitted_file_names_validator), + ('submitter_name', FileRequestReceiveFileDetails._submitter_name_validator), + ('submitter_email', FileRequestReceiveFileDetails._submitter_email_validator), +] + +FileRequestReceiveFileType._description_validator = bv.String() +FileRequestReceiveFileType._all_field_names_ = set(['description']) +FileRequestReceiveFileType._all_fields_ = [('description', FileRequestReceiveFileType._description_validator)] + +FileRequestsChangePolicyDetails._new_value_validator = FileRequestsPolicy_validator +FileRequestsChangePolicyDetails._previous_value_validator = bv.Nullable(FileRequestsPolicy_validator) +FileRequestsChangePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +FileRequestsChangePolicyDetails._all_fields_ = [ + ('new_value', FileRequestsChangePolicyDetails._new_value_validator), + ('previous_value', FileRequestsChangePolicyDetails._previous_value_validator), +] + +FileRequestsChangePolicyType._description_validator = bv.String() +FileRequestsChangePolicyType._all_field_names_ = set(['description']) +FileRequestsChangePolicyType._all_fields_ = [('description', FileRequestsChangePolicyType._description_validator)] + +FileRequestsEmailsEnabledDetails._all_field_names_ = set([]) +FileRequestsEmailsEnabledDetails._all_fields_ = [] + +FileRequestsEmailsEnabledType._description_validator = bv.String() +FileRequestsEmailsEnabledType._all_field_names_ = set(['description']) +FileRequestsEmailsEnabledType._all_fields_ = [('description', FileRequestsEmailsEnabledType._description_validator)] + +FileRequestsEmailsRestrictedToTeamOnlyDetails._all_field_names_ = set([]) +FileRequestsEmailsRestrictedToTeamOnlyDetails._all_fields_ = [] + +FileRequestsEmailsRestrictedToTeamOnlyType._description_validator = bv.String() +FileRequestsEmailsRestrictedToTeamOnlyType._all_field_names_ = set(['description']) +FileRequestsEmailsRestrictedToTeamOnlyType._all_fields_ = [('description', FileRequestsEmailsRestrictedToTeamOnlyType._description_validator)] + +FileRequestsPolicy._disabled_validator = bv.Void() +FileRequestsPolicy._enabled_validator = bv.Void() +FileRequestsPolicy._other_validator = bv.Void() +FileRequestsPolicy._tagmap = { + 'disabled': FileRequestsPolicy._disabled_validator, + 'enabled': FileRequestsPolicy._enabled_validator, + 'other': FileRequestsPolicy._other_validator, +} + +FileRequestsPolicy.disabled = FileRequestsPolicy('disabled') +FileRequestsPolicy.enabled = FileRequestsPolicy('enabled') +FileRequestsPolicy.other = FileRequestsPolicy('other') + +FileResolveCommentDetails._comment_text_validator = bv.Nullable(bv.String()) +FileResolveCommentDetails._all_field_names_ = set(['comment_text']) +FileResolveCommentDetails._all_fields_ = [('comment_text', FileResolveCommentDetails._comment_text_validator)] + +FileResolveCommentType._description_validator = bv.String() +FileResolveCommentType._all_field_names_ = set(['description']) +FileResolveCommentType._all_fields_ = [('description', FileResolveCommentType._description_validator)] + +FileRestoreDetails._all_field_names_ = set([]) +FileRestoreDetails._all_fields_ = [] + +FileRestoreType._description_validator = bv.String() +FileRestoreType._all_field_names_ = set(['description']) +FileRestoreType._all_fields_ = [('description', FileRestoreType._description_validator)] + +FileRevertDetails._all_field_names_ = set([]) +FileRevertDetails._all_fields_ = [] + +FileRevertType._description_validator = bv.String() +FileRevertType._all_field_names_ = set(['description']) +FileRevertType._all_fields_ = [('description', FileRevertType._description_validator)] + +FileRollbackChangesDetails._all_field_names_ = set([]) +FileRollbackChangesDetails._all_fields_ = [] + +FileRollbackChangesType._description_validator = bv.String() +FileRollbackChangesType._all_field_names_ = set(['description']) +FileRollbackChangesType._all_fields_ = [('description', FileRollbackChangesType._description_validator)] + +FileSaveCopyReferenceDetails._relocate_action_details_validator = bv.List(RelocateAssetReferencesLogInfo_validator) +FileSaveCopyReferenceDetails._all_field_names_ = set(['relocate_action_details']) +FileSaveCopyReferenceDetails._all_fields_ = [('relocate_action_details', FileSaveCopyReferenceDetails._relocate_action_details_validator)] + +FileSaveCopyReferenceType._description_validator = bv.String() +FileSaveCopyReferenceType._all_field_names_ = set(['description']) +FileSaveCopyReferenceType._all_fields_ = [('description', FileSaveCopyReferenceType._description_validator)] + +FileUnlikeCommentDetails._comment_text_validator = bv.Nullable(bv.String()) +FileUnlikeCommentDetails._all_field_names_ = set(['comment_text']) +FileUnlikeCommentDetails._all_fields_ = [('comment_text', FileUnlikeCommentDetails._comment_text_validator)] + +FileUnlikeCommentType._description_validator = bv.String() +FileUnlikeCommentType._all_field_names_ = set(['description']) +FileUnlikeCommentType._all_fields_ = [('description', FileUnlikeCommentType._description_validator)] + +FileUnresolveCommentDetails._comment_text_validator = bv.Nullable(bv.String()) +FileUnresolveCommentDetails._all_field_names_ = set(['comment_text']) +FileUnresolveCommentDetails._all_fields_ = [('comment_text', FileUnresolveCommentDetails._comment_text_validator)] + +FileUnresolveCommentType._description_validator = bv.String() +FileUnresolveCommentType._all_field_names_ = set(['description']) +FileUnresolveCommentType._all_fields_ = [('description', FileUnresolveCommentType._description_validator)] + +FolderLogInfo._all_field_names_ = FileOrFolderLogInfo._all_field_names_.union(set([])) +FolderLogInfo._all_fields_ = FileOrFolderLogInfo._all_fields_ + [] + +GeoLocationLogInfo._city_validator = bv.Nullable(bv.String()) +GeoLocationLogInfo._region_validator = bv.Nullable(bv.String()) +GeoLocationLogInfo._country_validator = bv.Nullable(bv.String()) +GeoLocationLogInfo._ip_address_validator = IpAddress_validator +GeoLocationLogInfo._all_field_names_ = set([ + 'city', + 'region', + 'country', + 'ip_address', +]) +GeoLocationLogInfo._all_fields_ = [ + ('city', GeoLocationLogInfo._city_validator), + ('region', GeoLocationLogInfo._region_validator), + ('country', GeoLocationLogInfo._country_validator), + ('ip_address', GeoLocationLogInfo._ip_address_validator), +] + +GetTeamEventsArg._limit_validator = bv.UInt32(min_value=1, max_value=1000) +GetTeamEventsArg._account_id_validator = bv.Nullable(users_common.AccountId_validator) +GetTeamEventsArg._time_validator = bv.Nullable(team_common.TimeRange_validator) +GetTeamEventsArg._category_validator = bv.Nullable(EventCategory_validator) +GetTeamEventsArg._all_field_names_ = set([ + 'limit', + 'account_id', + 'time', + 'category', +]) +GetTeamEventsArg._all_fields_ = [ + ('limit', GetTeamEventsArg._limit_validator), + ('account_id', GetTeamEventsArg._account_id_validator), + ('time', GetTeamEventsArg._time_validator), + ('category', GetTeamEventsArg._category_validator), +] + +GetTeamEventsContinueArg._cursor_validator = bv.String() +GetTeamEventsContinueArg._all_field_names_ = set(['cursor']) +GetTeamEventsContinueArg._all_fields_ = [('cursor', GetTeamEventsContinueArg._cursor_validator)] + +GetTeamEventsContinueError._bad_cursor_validator = bv.Void() +GetTeamEventsContinueError._reset_validator = common.DropboxTimestamp_validator +GetTeamEventsContinueError._other_validator = bv.Void() +GetTeamEventsContinueError._tagmap = { + 'bad_cursor': GetTeamEventsContinueError._bad_cursor_validator, + 'reset': GetTeamEventsContinueError._reset_validator, + 'other': GetTeamEventsContinueError._other_validator, +} + +GetTeamEventsContinueError.bad_cursor = GetTeamEventsContinueError('bad_cursor') +GetTeamEventsContinueError.other = GetTeamEventsContinueError('other') + +GetTeamEventsError._account_id_not_found_validator = bv.Void() +GetTeamEventsError._invalid_time_range_validator = bv.Void() +GetTeamEventsError._other_validator = bv.Void() +GetTeamEventsError._tagmap = { + 'account_id_not_found': GetTeamEventsError._account_id_not_found_validator, + 'invalid_time_range': GetTeamEventsError._invalid_time_range_validator, + 'other': GetTeamEventsError._other_validator, +} + +GetTeamEventsError.account_id_not_found = GetTeamEventsError('account_id_not_found') +GetTeamEventsError.invalid_time_range = GetTeamEventsError('invalid_time_range') +GetTeamEventsError.other = GetTeamEventsError('other') + +GetTeamEventsResult._events_validator = bv.List(TeamEvent_validator) +GetTeamEventsResult._cursor_validator = bv.String() +GetTeamEventsResult._has_more_validator = bv.Boolean() +GetTeamEventsResult._all_field_names_ = set([ + 'events', + 'cursor', + 'has_more', +]) +GetTeamEventsResult._all_fields_ = [ + ('events', GetTeamEventsResult._events_validator), + ('cursor', GetTeamEventsResult._cursor_validator), + ('has_more', GetTeamEventsResult._has_more_validator), +] + +GoogleSsoChangePolicyDetails._new_value_validator = GoogleSsoPolicy_validator +GoogleSsoChangePolicyDetails._previous_value_validator = bv.Nullable(GoogleSsoPolicy_validator) +GoogleSsoChangePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +GoogleSsoChangePolicyDetails._all_fields_ = [ + ('new_value', GoogleSsoChangePolicyDetails._new_value_validator), + ('previous_value', GoogleSsoChangePolicyDetails._previous_value_validator), +] + +GoogleSsoChangePolicyType._description_validator = bv.String() +GoogleSsoChangePolicyType._all_field_names_ = set(['description']) +GoogleSsoChangePolicyType._all_fields_ = [('description', GoogleSsoChangePolicyType._description_validator)] + +GoogleSsoPolicy._disabled_validator = bv.Void() +GoogleSsoPolicy._enabled_validator = bv.Void() +GoogleSsoPolicy._other_validator = bv.Void() +GoogleSsoPolicy._tagmap = { + 'disabled': GoogleSsoPolicy._disabled_validator, + 'enabled': GoogleSsoPolicy._enabled_validator, + 'other': GoogleSsoPolicy._other_validator, +} + +GoogleSsoPolicy.disabled = GoogleSsoPolicy('disabled') +GoogleSsoPolicy.enabled = GoogleSsoPolicy('enabled') +GoogleSsoPolicy.other = GoogleSsoPolicy('other') + +GroupAddExternalIdDetails._new_value_validator = team_common.GroupExternalId_validator +GroupAddExternalIdDetails._all_field_names_ = set(['new_value']) +GroupAddExternalIdDetails._all_fields_ = [('new_value', GroupAddExternalIdDetails._new_value_validator)] + +GroupAddExternalIdType._description_validator = bv.String() +GroupAddExternalIdType._all_field_names_ = set(['description']) +GroupAddExternalIdType._all_fields_ = [('description', GroupAddExternalIdType._description_validator)] + +GroupAddMemberDetails._is_group_owner_validator = bv.Boolean() +GroupAddMemberDetails._all_field_names_ = set(['is_group_owner']) +GroupAddMemberDetails._all_fields_ = [('is_group_owner', GroupAddMemberDetails._is_group_owner_validator)] + +GroupAddMemberType._description_validator = bv.String() +GroupAddMemberType._all_field_names_ = set(['description']) +GroupAddMemberType._all_fields_ = [('description', GroupAddMemberType._description_validator)] + +GroupChangeExternalIdDetails._new_value_validator = team_common.GroupExternalId_validator +GroupChangeExternalIdDetails._previous_value_validator = team_common.GroupExternalId_validator +GroupChangeExternalIdDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +GroupChangeExternalIdDetails._all_fields_ = [ + ('new_value', GroupChangeExternalIdDetails._new_value_validator), + ('previous_value', GroupChangeExternalIdDetails._previous_value_validator), +] + +GroupChangeExternalIdType._description_validator = bv.String() +GroupChangeExternalIdType._all_field_names_ = set(['description']) +GroupChangeExternalIdType._all_fields_ = [('description', GroupChangeExternalIdType._description_validator)] + +GroupChangeManagementTypeDetails._new_value_validator = team_common.GroupManagementType_validator +GroupChangeManagementTypeDetails._previous_value_validator = bv.Nullable(team_common.GroupManagementType_validator) +GroupChangeManagementTypeDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +GroupChangeManagementTypeDetails._all_fields_ = [ + ('new_value', GroupChangeManagementTypeDetails._new_value_validator), + ('previous_value', GroupChangeManagementTypeDetails._previous_value_validator), +] + +GroupChangeManagementTypeType._description_validator = bv.String() +GroupChangeManagementTypeType._all_field_names_ = set(['description']) +GroupChangeManagementTypeType._all_fields_ = [('description', GroupChangeManagementTypeType._description_validator)] + +GroupChangeMemberRoleDetails._is_group_owner_validator = bv.Boolean() +GroupChangeMemberRoleDetails._all_field_names_ = set(['is_group_owner']) +GroupChangeMemberRoleDetails._all_fields_ = [('is_group_owner', GroupChangeMemberRoleDetails._is_group_owner_validator)] + +GroupChangeMemberRoleType._description_validator = bv.String() +GroupChangeMemberRoleType._all_field_names_ = set(['description']) +GroupChangeMemberRoleType._all_fields_ = [('description', GroupChangeMemberRoleType._description_validator)] + +GroupCreateDetails._is_company_managed_validator = bv.Nullable(bv.Boolean()) +GroupCreateDetails._join_policy_validator = bv.Nullable(GroupJoinPolicy_validator) +GroupCreateDetails._all_field_names_ = set([ + 'is_company_managed', + 'join_policy', +]) +GroupCreateDetails._all_fields_ = [ + ('is_company_managed', GroupCreateDetails._is_company_managed_validator), + ('join_policy', GroupCreateDetails._join_policy_validator), +] + +GroupCreateType._description_validator = bv.String() +GroupCreateType._all_field_names_ = set(['description']) +GroupCreateType._all_fields_ = [('description', GroupCreateType._description_validator)] + +GroupDeleteDetails._is_company_managed_validator = bv.Nullable(bv.Boolean()) +GroupDeleteDetails._all_field_names_ = set(['is_company_managed']) +GroupDeleteDetails._all_fields_ = [('is_company_managed', GroupDeleteDetails._is_company_managed_validator)] + +GroupDeleteType._description_validator = bv.String() +GroupDeleteType._all_field_names_ = set(['description']) +GroupDeleteType._all_fields_ = [('description', GroupDeleteType._description_validator)] + +GroupDescriptionUpdatedDetails._all_field_names_ = set([]) +GroupDescriptionUpdatedDetails._all_fields_ = [] + +GroupDescriptionUpdatedType._description_validator = bv.String() +GroupDescriptionUpdatedType._all_field_names_ = set(['description']) +GroupDescriptionUpdatedType._all_fields_ = [('description', GroupDescriptionUpdatedType._description_validator)] + +GroupJoinPolicy._open_validator = bv.Void() +GroupJoinPolicy._request_to_join_validator = bv.Void() +GroupJoinPolicy._other_validator = bv.Void() +GroupJoinPolicy._tagmap = { + 'open': GroupJoinPolicy._open_validator, + 'request_to_join': GroupJoinPolicy._request_to_join_validator, + 'other': GroupJoinPolicy._other_validator, +} + +GroupJoinPolicy.open = GroupJoinPolicy('open') +GroupJoinPolicy.request_to_join = GroupJoinPolicy('request_to_join') +GroupJoinPolicy.other = GroupJoinPolicy('other') + +GroupJoinPolicyUpdatedDetails._is_company_managed_validator = bv.Nullable(bv.Boolean()) +GroupJoinPolicyUpdatedDetails._join_policy_validator = bv.Nullable(GroupJoinPolicy_validator) +GroupJoinPolicyUpdatedDetails._all_field_names_ = set([ + 'is_company_managed', + 'join_policy', +]) +GroupJoinPolicyUpdatedDetails._all_fields_ = [ + ('is_company_managed', GroupJoinPolicyUpdatedDetails._is_company_managed_validator), + ('join_policy', GroupJoinPolicyUpdatedDetails._join_policy_validator), +] + +GroupJoinPolicyUpdatedType._description_validator = bv.String() +GroupJoinPolicyUpdatedType._all_field_names_ = set(['description']) +GroupJoinPolicyUpdatedType._all_fields_ = [('description', GroupJoinPolicyUpdatedType._description_validator)] + +GroupLogInfo._group_id_validator = bv.Nullable(team_common.GroupId_validator) +GroupLogInfo._display_name_validator = bv.String() +GroupLogInfo._external_id_validator = bv.Nullable(team_common.GroupExternalId_validator) +GroupLogInfo._all_field_names_ = set([ + 'group_id', + 'display_name', + 'external_id', +]) +GroupLogInfo._all_fields_ = [ + ('group_id', GroupLogInfo._group_id_validator), + ('display_name', GroupLogInfo._display_name_validator), + ('external_id', GroupLogInfo._external_id_validator), +] + +GroupMovedDetails._all_field_names_ = set([]) +GroupMovedDetails._all_fields_ = [] + +GroupMovedType._description_validator = bv.String() +GroupMovedType._all_field_names_ = set(['description']) +GroupMovedType._all_fields_ = [('description', GroupMovedType._description_validator)] + +GroupRemoveExternalIdDetails._previous_value_validator = team_common.GroupExternalId_validator +GroupRemoveExternalIdDetails._all_field_names_ = set(['previous_value']) +GroupRemoveExternalIdDetails._all_fields_ = [('previous_value', GroupRemoveExternalIdDetails._previous_value_validator)] + +GroupRemoveExternalIdType._description_validator = bv.String() +GroupRemoveExternalIdType._all_field_names_ = set(['description']) +GroupRemoveExternalIdType._all_fields_ = [('description', GroupRemoveExternalIdType._description_validator)] + +GroupRemoveMemberDetails._all_field_names_ = set([]) +GroupRemoveMemberDetails._all_fields_ = [] + +GroupRemoveMemberType._description_validator = bv.String() +GroupRemoveMemberType._all_field_names_ = set(['description']) +GroupRemoveMemberType._all_fields_ = [('description', GroupRemoveMemberType._description_validator)] + +GroupRenameDetails._previous_value_validator = bv.String() +GroupRenameDetails._new_value_validator = bv.String() +GroupRenameDetails._all_field_names_ = set([ + 'previous_value', + 'new_value', +]) +GroupRenameDetails._all_fields_ = [ + ('previous_value', GroupRenameDetails._previous_value_validator), + ('new_value', GroupRenameDetails._new_value_validator), +] + +GroupRenameType._description_validator = bv.String() +GroupRenameType._all_field_names_ = set(['description']) +GroupRenameType._all_fields_ = [('description', GroupRenameType._description_validator)] + +GroupUserManagementChangePolicyDetails._new_value_validator = team_policies.GroupCreation_validator +GroupUserManagementChangePolicyDetails._previous_value_validator = bv.Nullable(team_policies.GroupCreation_validator) +GroupUserManagementChangePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +GroupUserManagementChangePolicyDetails._all_fields_ = [ + ('new_value', GroupUserManagementChangePolicyDetails._new_value_validator), + ('previous_value', GroupUserManagementChangePolicyDetails._previous_value_validator), +] + +GroupUserManagementChangePolicyType._description_validator = bv.String() +GroupUserManagementChangePolicyType._all_field_names_ = set(['description']) +GroupUserManagementChangePolicyType._all_fields_ = [('description', GroupUserManagementChangePolicyType._description_validator)] + +IdentifierType._email_validator = bv.Void() +IdentifierType._facebook_profile_name_validator = bv.Void() +IdentifierType._other_validator = bv.Void() +IdentifierType._tagmap = { + 'email': IdentifierType._email_validator, + 'facebook_profile_name': IdentifierType._facebook_profile_name_validator, + 'other': IdentifierType._other_validator, +} + +IdentifierType.email = IdentifierType('email') +IdentifierType.facebook_profile_name = IdentifierType('facebook_profile_name') +IdentifierType.other = IdentifierType('other') + +JoinTeamDetails._linked_apps_validator = bv.List(UserLinkedAppLogInfo_validator) +JoinTeamDetails._linked_devices_validator = bv.List(LinkedDeviceLogInfo_validator) +JoinTeamDetails._linked_shared_folders_validator = bv.List(FolderLogInfo_validator) +JoinTeamDetails._all_field_names_ = set([ + 'linked_apps', + 'linked_devices', + 'linked_shared_folders', +]) +JoinTeamDetails._all_fields_ = [ + ('linked_apps', JoinTeamDetails._linked_apps_validator), + ('linked_devices', JoinTeamDetails._linked_devices_validator), + ('linked_shared_folders', JoinTeamDetails._linked_shared_folders_validator), +] + +LegacyDeviceSessionLogInfo._session_info_validator = bv.Nullable(SessionLogInfo_validator) +LegacyDeviceSessionLogInfo._display_name_validator = bv.Nullable(bv.String()) +LegacyDeviceSessionLogInfo._is_emm_managed_validator = bv.Nullable(bv.Boolean()) +LegacyDeviceSessionLogInfo._platform_validator = bv.Nullable(bv.String()) +LegacyDeviceSessionLogInfo._mac_address_validator = bv.Nullable(IpAddress_validator) +LegacyDeviceSessionLogInfo._os_version_validator = bv.Nullable(bv.String()) +LegacyDeviceSessionLogInfo._device_type_validator = bv.Nullable(bv.String()) +LegacyDeviceSessionLogInfo._client_version_validator = bv.Nullable(bv.String()) +LegacyDeviceSessionLogInfo._legacy_uniq_id_validator = bv.Nullable(bv.String()) +LegacyDeviceSessionLogInfo._field_names_ = set([ + 'session_info', + 'display_name', + 'is_emm_managed', + 'platform', + 'mac_address', + 'os_version', + 'device_type', + 'client_version', + 'legacy_uniq_id', +]) +LegacyDeviceSessionLogInfo._all_field_names_ = DeviceSessionLogInfo._all_field_names_.union(LegacyDeviceSessionLogInfo._field_names_) +LegacyDeviceSessionLogInfo._fields_ = [ + ('session_info', LegacyDeviceSessionLogInfo._session_info_validator), + ('display_name', LegacyDeviceSessionLogInfo._display_name_validator), + ('is_emm_managed', LegacyDeviceSessionLogInfo._is_emm_managed_validator), + ('platform', LegacyDeviceSessionLogInfo._platform_validator), + ('mac_address', LegacyDeviceSessionLogInfo._mac_address_validator), + ('os_version', LegacyDeviceSessionLogInfo._os_version_validator), + ('device_type', LegacyDeviceSessionLogInfo._device_type_validator), + ('client_version', LegacyDeviceSessionLogInfo._client_version_validator), + ('legacy_uniq_id', LegacyDeviceSessionLogInfo._legacy_uniq_id_validator), +] +LegacyDeviceSessionLogInfo._all_fields_ = DeviceSessionLogInfo._all_fields_ + LegacyDeviceSessionLogInfo._fields_ + +LinkedDeviceLogInfo._mobile_device_session_validator = MobileDeviceSessionLogInfo_validator +LinkedDeviceLogInfo._desktop_device_session_validator = DesktopDeviceSessionLogInfo_validator +LinkedDeviceLogInfo._web_device_session_validator = WebDeviceSessionLogInfo_validator +LinkedDeviceLogInfo._legacy_device_session_validator = LegacyDeviceSessionLogInfo_validator +LinkedDeviceLogInfo._other_validator = bv.Void() +LinkedDeviceLogInfo._tagmap = { + 'mobile_device_session': LinkedDeviceLogInfo._mobile_device_session_validator, + 'desktop_device_session': LinkedDeviceLogInfo._desktop_device_session_validator, + 'web_device_session': LinkedDeviceLogInfo._web_device_session_validator, + 'legacy_device_session': LinkedDeviceLogInfo._legacy_device_session_validator, + 'other': LinkedDeviceLogInfo._other_validator, +} + +LinkedDeviceLogInfo.other = LinkedDeviceLogInfo('other') + +LoginFailDetails._is_emm_managed_validator = bv.Nullable(bv.Boolean()) +LoginFailDetails._login_method_validator = LoginMethod_validator +LoginFailDetails._error_details_validator = FailureDetailsLogInfo_validator +LoginFailDetails._all_field_names_ = set([ + 'is_emm_managed', + 'login_method', + 'error_details', +]) +LoginFailDetails._all_fields_ = [ + ('is_emm_managed', LoginFailDetails._is_emm_managed_validator), + ('login_method', LoginFailDetails._login_method_validator), + ('error_details', LoginFailDetails._error_details_validator), +] + +LoginFailType._description_validator = bv.String() +LoginFailType._all_field_names_ = set(['description']) +LoginFailType._all_fields_ = [('description', LoginFailType._description_validator)] + +LoginMethod._password_validator = bv.Void() +LoginMethod._two_factor_authentication_validator = bv.Void() +LoginMethod._saml_validator = bv.Void() +LoginMethod._other_validator = bv.Void() +LoginMethod._tagmap = { + 'password': LoginMethod._password_validator, + 'two_factor_authentication': LoginMethod._two_factor_authentication_validator, + 'saml': LoginMethod._saml_validator, + 'other': LoginMethod._other_validator, +} + +LoginMethod.password = LoginMethod('password') +LoginMethod.two_factor_authentication = LoginMethod('two_factor_authentication') +LoginMethod.saml = LoginMethod('saml') +LoginMethod.other = LoginMethod('other') + +LoginSuccessDetails._is_emm_managed_validator = bv.Nullable(bv.Boolean()) +LoginSuccessDetails._login_method_validator = LoginMethod_validator +LoginSuccessDetails._all_field_names_ = set([ + 'is_emm_managed', + 'login_method', +]) +LoginSuccessDetails._all_fields_ = [ + ('is_emm_managed', LoginSuccessDetails._is_emm_managed_validator), + ('login_method', LoginSuccessDetails._login_method_validator), +] + +LoginSuccessType._description_validator = bv.String() +LoginSuccessType._all_field_names_ = set(['description']) +LoginSuccessType._all_fields_ = [('description', LoginSuccessType._description_validator)] + +LogoutDetails._all_field_names_ = set([]) +LogoutDetails._all_fields_ = [] + +LogoutType._description_validator = bv.String() +LogoutType._all_field_names_ = set(['description']) +LogoutType._all_fields_ = [('description', LogoutType._description_validator)] + +MemberAddNameDetails._new_value_validator = UserNameLogInfo_validator +MemberAddNameDetails._all_field_names_ = set(['new_value']) +MemberAddNameDetails._all_fields_ = [('new_value', MemberAddNameDetails._new_value_validator)] + +MemberAddNameType._description_validator = bv.String() +MemberAddNameType._all_field_names_ = set(['description']) +MemberAddNameType._all_fields_ = [('description', MemberAddNameType._description_validator)] + +MemberChangeAdminRoleDetails._new_value_validator = bv.Nullable(AdminRole_validator) +MemberChangeAdminRoleDetails._previous_value_validator = bv.Nullable(AdminRole_validator) +MemberChangeAdminRoleDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +MemberChangeAdminRoleDetails._all_fields_ = [ + ('new_value', MemberChangeAdminRoleDetails._new_value_validator), + ('previous_value', MemberChangeAdminRoleDetails._previous_value_validator), +] + +MemberChangeAdminRoleType._description_validator = bv.String() +MemberChangeAdminRoleType._all_field_names_ = set(['description']) +MemberChangeAdminRoleType._all_fields_ = [('description', MemberChangeAdminRoleType._description_validator)] + +MemberChangeEmailDetails._new_value_validator = EmailAddress_validator +MemberChangeEmailDetails._previous_value_validator = bv.Nullable(EmailAddress_validator) +MemberChangeEmailDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +MemberChangeEmailDetails._all_fields_ = [ + ('new_value', MemberChangeEmailDetails._new_value_validator), + ('previous_value', MemberChangeEmailDetails._previous_value_validator), +] + +MemberChangeEmailType._description_validator = bv.String() +MemberChangeEmailType._all_field_names_ = set(['description']) +MemberChangeEmailType._all_fields_ = [('description', MemberChangeEmailType._description_validator)] + +MemberChangeMembershipTypeDetails._prev_value_validator = TeamMembershipType_validator +MemberChangeMembershipTypeDetails._new_value_validator = TeamMembershipType_validator +MemberChangeMembershipTypeDetails._all_field_names_ = set([ + 'prev_value', + 'new_value', +]) +MemberChangeMembershipTypeDetails._all_fields_ = [ + ('prev_value', MemberChangeMembershipTypeDetails._prev_value_validator), + ('new_value', MemberChangeMembershipTypeDetails._new_value_validator), +] + +MemberChangeMembershipTypeType._description_validator = bv.String() +MemberChangeMembershipTypeType._all_field_names_ = set(['description']) +MemberChangeMembershipTypeType._all_fields_ = [('description', MemberChangeMembershipTypeType._description_validator)] + +MemberChangeNameDetails._new_value_validator = UserNameLogInfo_validator +MemberChangeNameDetails._previous_value_validator = bv.Nullable(UserNameLogInfo_validator) +MemberChangeNameDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +MemberChangeNameDetails._all_fields_ = [ + ('new_value', MemberChangeNameDetails._new_value_validator), + ('previous_value', MemberChangeNameDetails._previous_value_validator), +] + +MemberChangeNameType._description_validator = bv.String() +MemberChangeNameType._all_field_names_ = set(['description']) +MemberChangeNameType._all_fields_ = [('description', MemberChangeNameType._description_validator)] + +MemberChangeStatusDetails._previous_value_validator = bv.Nullable(MemberStatus_validator) +MemberChangeStatusDetails._new_value_validator = MemberStatus_validator +MemberChangeStatusDetails._action_validator = bv.Nullable(ActionDetails_validator) +MemberChangeStatusDetails._all_field_names_ = set([ + 'previous_value', + 'new_value', + 'action', +]) +MemberChangeStatusDetails._all_fields_ = [ + ('previous_value', MemberChangeStatusDetails._previous_value_validator), + ('new_value', MemberChangeStatusDetails._new_value_validator), + ('action', MemberChangeStatusDetails._action_validator), +] + +MemberChangeStatusType._description_validator = bv.String() +MemberChangeStatusType._all_field_names_ = set(['description']) +MemberChangeStatusType._all_fields_ = [('description', MemberChangeStatusType._description_validator)] + +MemberDeleteManualContactsDetails._all_field_names_ = set([]) +MemberDeleteManualContactsDetails._all_fields_ = [] + +MemberDeleteManualContactsType._description_validator = bv.String() +MemberDeleteManualContactsType._all_field_names_ = set(['description']) +MemberDeleteManualContactsType._all_fields_ = [('description', MemberDeleteManualContactsType._description_validator)] + +MemberPermanentlyDeleteAccountContentsDetails._all_field_names_ = set([]) +MemberPermanentlyDeleteAccountContentsDetails._all_fields_ = [] + +MemberPermanentlyDeleteAccountContentsType._description_validator = bv.String() +MemberPermanentlyDeleteAccountContentsType._all_field_names_ = set(['description']) +MemberPermanentlyDeleteAccountContentsType._all_fields_ = [('description', MemberPermanentlyDeleteAccountContentsType._description_validator)] + +MemberRemoveActionType._delete_validator = bv.Void() +MemberRemoveActionType._offboard_validator = bv.Void() +MemberRemoveActionType._leave_validator = bv.Void() +MemberRemoveActionType._other_validator = bv.Void() +MemberRemoveActionType._tagmap = { + 'delete': MemberRemoveActionType._delete_validator, + 'offboard': MemberRemoveActionType._offboard_validator, + 'leave': MemberRemoveActionType._leave_validator, + 'other': MemberRemoveActionType._other_validator, +} + +MemberRemoveActionType.delete = MemberRemoveActionType('delete') +MemberRemoveActionType.offboard = MemberRemoveActionType('offboard') +MemberRemoveActionType.leave = MemberRemoveActionType('leave') +MemberRemoveActionType.other = MemberRemoveActionType('other') + +MemberRequestsChangePolicyDetails._new_value_validator = MemberRequestsPolicy_validator +MemberRequestsChangePolicyDetails._previous_value_validator = bv.Nullable(MemberRequestsPolicy_validator) +MemberRequestsChangePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +MemberRequestsChangePolicyDetails._all_fields_ = [ + ('new_value', MemberRequestsChangePolicyDetails._new_value_validator), + ('previous_value', MemberRequestsChangePolicyDetails._previous_value_validator), +] + +MemberRequestsChangePolicyType._description_validator = bv.String() +MemberRequestsChangePolicyType._all_field_names_ = set(['description']) +MemberRequestsChangePolicyType._all_fields_ = [('description', MemberRequestsChangePolicyType._description_validator)] + +MemberRequestsPolicy._auto_accept_validator = bv.Void() +MemberRequestsPolicy._disabled_validator = bv.Void() +MemberRequestsPolicy._require_approval_validator = bv.Void() +MemberRequestsPolicy._other_validator = bv.Void() +MemberRequestsPolicy._tagmap = { + 'auto_accept': MemberRequestsPolicy._auto_accept_validator, + 'disabled': MemberRequestsPolicy._disabled_validator, + 'require_approval': MemberRequestsPolicy._require_approval_validator, + 'other': MemberRequestsPolicy._other_validator, +} + +MemberRequestsPolicy.auto_accept = MemberRequestsPolicy('auto_accept') +MemberRequestsPolicy.disabled = MemberRequestsPolicy('disabled') +MemberRequestsPolicy.require_approval = MemberRequestsPolicy('require_approval') +MemberRequestsPolicy.other = MemberRequestsPolicy('other') + +MemberSpaceLimitsAddCustomQuotaDetails._new_value_validator = bv.UInt64() +MemberSpaceLimitsAddCustomQuotaDetails._all_field_names_ = set(['new_value']) +MemberSpaceLimitsAddCustomQuotaDetails._all_fields_ = [('new_value', MemberSpaceLimitsAddCustomQuotaDetails._new_value_validator)] + +MemberSpaceLimitsAddCustomQuotaType._description_validator = bv.String() +MemberSpaceLimitsAddCustomQuotaType._all_field_names_ = set(['description']) +MemberSpaceLimitsAddCustomQuotaType._all_fields_ = [('description', MemberSpaceLimitsAddCustomQuotaType._description_validator)] + +MemberSpaceLimitsAddExceptionDetails._all_field_names_ = set([]) +MemberSpaceLimitsAddExceptionDetails._all_fields_ = [] + +MemberSpaceLimitsAddExceptionType._description_validator = bv.String() +MemberSpaceLimitsAddExceptionType._all_field_names_ = set(['description']) +MemberSpaceLimitsAddExceptionType._all_fields_ = [('description', MemberSpaceLimitsAddExceptionType._description_validator)] + +MemberSpaceLimitsChangeCapsTypePolicyDetails._previous_value_validator = SpaceCapsType_validator +MemberSpaceLimitsChangeCapsTypePolicyDetails._new_value_validator = SpaceCapsType_validator +MemberSpaceLimitsChangeCapsTypePolicyDetails._all_field_names_ = set([ + 'previous_value', + 'new_value', +]) +MemberSpaceLimitsChangeCapsTypePolicyDetails._all_fields_ = [ + ('previous_value', MemberSpaceLimitsChangeCapsTypePolicyDetails._previous_value_validator), + ('new_value', MemberSpaceLimitsChangeCapsTypePolicyDetails._new_value_validator), +] + +MemberSpaceLimitsChangeCapsTypePolicyType._description_validator = bv.String() +MemberSpaceLimitsChangeCapsTypePolicyType._all_field_names_ = set(['description']) +MemberSpaceLimitsChangeCapsTypePolicyType._all_fields_ = [('description', MemberSpaceLimitsChangeCapsTypePolicyType._description_validator)] + +MemberSpaceLimitsChangeCustomQuotaDetails._previous_value_validator = bv.UInt64() +MemberSpaceLimitsChangeCustomQuotaDetails._new_value_validator = bv.UInt64() +MemberSpaceLimitsChangeCustomQuotaDetails._all_field_names_ = set([ + 'previous_value', + 'new_value', +]) +MemberSpaceLimitsChangeCustomQuotaDetails._all_fields_ = [ + ('previous_value', MemberSpaceLimitsChangeCustomQuotaDetails._previous_value_validator), + ('new_value', MemberSpaceLimitsChangeCustomQuotaDetails._new_value_validator), +] + +MemberSpaceLimitsChangeCustomQuotaType._description_validator = bv.String() +MemberSpaceLimitsChangeCustomQuotaType._all_field_names_ = set(['description']) +MemberSpaceLimitsChangeCustomQuotaType._all_fields_ = [('description', MemberSpaceLimitsChangeCustomQuotaType._description_validator)] + +MemberSpaceLimitsChangePolicyDetails._previous_value_validator = bv.Nullable(bv.UInt64()) +MemberSpaceLimitsChangePolicyDetails._new_value_validator = bv.Nullable(bv.UInt64()) +MemberSpaceLimitsChangePolicyDetails._all_field_names_ = set([ + 'previous_value', + 'new_value', +]) +MemberSpaceLimitsChangePolicyDetails._all_fields_ = [ + ('previous_value', MemberSpaceLimitsChangePolicyDetails._previous_value_validator), + ('new_value', MemberSpaceLimitsChangePolicyDetails._new_value_validator), +] + +MemberSpaceLimitsChangePolicyType._description_validator = bv.String() +MemberSpaceLimitsChangePolicyType._all_field_names_ = set(['description']) +MemberSpaceLimitsChangePolicyType._all_fields_ = [('description', MemberSpaceLimitsChangePolicyType._description_validator)] + +MemberSpaceLimitsChangeStatusDetails._previous_value_validator = SpaceLimitsStatus_validator +MemberSpaceLimitsChangeStatusDetails._new_value_validator = SpaceLimitsStatus_validator +MemberSpaceLimitsChangeStatusDetails._all_field_names_ = set([ + 'previous_value', + 'new_value', +]) +MemberSpaceLimitsChangeStatusDetails._all_fields_ = [ + ('previous_value', MemberSpaceLimitsChangeStatusDetails._previous_value_validator), + ('new_value', MemberSpaceLimitsChangeStatusDetails._new_value_validator), +] + +MemberSpaceLimitsChangeStatusType._description_validator = bv.String() +MemberSpaceLimitsChangeStatusType._all_field_names_ = set(['description']) +MemberSpaceLimitsChangeStatusType._all_fields_ = [('description', MemberSpaceLimitsChangeStatusType._description_validator)] + +MemberSpaceLimitsRemoveCustomQuotaDetails._all_field_names_ = set([]) +MemberSpaceLimitsRemoveCustomQuotaDetails._all_fields_ = [] + +MemberSpaceLimitsRemoveCustomQuotaType._description_validator = bv.String() +MemberSpaceLimitsRemoveCustomQuotaType._all_field_names_ = set(['description']) +MemberSpaceLimitsRemoveCustomQuotaType._all_fields_ = [('description', MemberSpaceLimitsRemoveCustomQuotaType._description_validator)] + +MemberSpaceLimitsRemoveExceptionDetails._all_field_names_ = set([]) +MemberSpaceLimitsRemoveExceptionDetails._all_fields_ = [] + +MemberSpaceLimitsRemoveExceptionType._description_validator = bv.String() +MemberSpaceLimitsRemoveExceptionType._all_field_names_ = set(['description']) +MemberSpaceLimitsRemoveExceptionType._all_fields_ = [('description', MemberSpaceLimitsRemoveExceptionType._description_validator)] + +MemberStatus._not_joined_validator = bv.Void() +MemberStatus._invited_validator = bv.Void() +MemberStatus._active_validator = bv.Void() +MemberStatus._suspended_validator = bv.Void() +MemberStatus._removed_validator = bv.Void() +MemberStatus._other_validator = bv.Void() +MemberStatus._tagmap = { + 'not_joined': MemberStatus._not_joined_validator, + 'invited': MemberStatus._invited_validator, + 'active': MemberStatus._active_validator, + 'suspended': MemberStatus._suspended_validator, + 'removed': MemberStatus._removed_validator, + 'other': MemberStatus._other_validator, +} + +MemberStatus.not_joined = MemberStatus('not_joined') +MemberStatus.invited = MemberStatus('invited') +MemberStatus.active = MemberStatus('active') +MemberStatus.suspended = MemberStatus('suspended') +MemberStatus.removed = MemberStatus('removed') +MemberStatus.other = MemberStatus('other') + +MemberSuggestDetails._suggested_members_validator = bv.List(EmailAddress_validator) +MemberSuggestDetails._all_field_names_ = set(['suggested_members']) +MemberSuggestDetails._all_fields_ = [('suggested_members', MemberSuggestDetails._suggested_members_validator)] + +MemberSuggestType._description_validator = bv.String() +MemberSuggestType._all_field_names_ = set(['description']) +MemberSuggestType._all_fields_ = [('description', MemberSuggestType._description_validator)] + +MemberSuggestionsChangePolicyDetails._new_value_validator = MemberSuggestionsPolicy_validator +MemberSuggestionsChangePolicyDetails._previous_value_validator = bv.Nullable(MemberSuggestionsPolicy_validator) +MemberSuggestionsChangePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +MemberSuggestionsChangePolicyDetails._all_fields_ = [ + ('new_value', MemberSuggestionsChangePolicyDetails._new_value_validator), + ('previous_value', MemberSuggestionsChangePolicyDetails._previous_value_validator), +] + +MemberSuggestionsChangePolicyType._description_validator = bv.String() +MemberSuggestionsChangePolicyType._all_field_names_ = set(['description']) +MemberSuggestionsChangePolicyType._all_fields_ = [('description', MemberSuggestionsChangePolicyType._description_validator)] + +MemberSuggestionsPolicy._disabled_validator = bv.Void() +MemberSuggestionsPolicy._enabled_validator = bv.Void() +MemberSuggestionsPolicy._other_validator = bv.Void() +MemberSuggestionsPolicy._tagmap = { + 'disabled': MemberSuggestionsPolicy._disabled_validator, + 'enabled': MemberSuggestionsPolicy._enabled_validator, + 'other': MemberSuggestionsPolicy._other_validator, +} + +MemberSuggestionsPolicy.disabled = MemberSuggestionsPolicy('disabled') +MemberSuggestionsPolicy.enabled = MemberSuggestionsPolicy('enabled') +MemberSuggestionsPolicy.other = MemberSuggestionsPolicy('other') + +MemberTransferAccountContentsDetails._all_field_names_ = set([]) +MemberTransferAccountContentsDetails._all_fields_ = [] + +MemberTransferAccountContentsType._description_validator = bv.String() +MemberTransferAccountContentsType._all_field_names_ = set(['description']) +MemberTransferAccountContentsType._all_fields_ = [('description', MemberTransferAccountContentsType._description_validator)] + +MicrosoftOfficeAddinChangePolicyDetails._new_value_validator = MicrosoftOfficeAddinPolicy_validator +MicrosoftOfficeAddinChangePolicyDetails._previous_value_validator = bv.Nullable(MicrosoftOfficeAddinPolicy_validator) +MicrosoftOfficeAddinChangePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +MicrosoftOfficeAddinChangePolicyDetails._all_fields_ = [ + ('new_value', MicrosoftOfficeAddinChangePolicyDetails._new_value_validator), + ('previous_value', MicrosoftOfficeAddinChangePolicyDetails._previous_value_validator), +] + +MicrosoftOfficeAddinChangePolicyType._description_validator = bv.String() +MicrosoftOfficeAddinChangePolicyType._all_field_names_ = set(['description']) +MicrosoftOfficeAddinChangePolicyType._all_fields_ = [('description', MicrosoftOfficeAddinChangePolicyType._description_validator)] + +MicrosoftOfficeAddinPolicy._disabled_validator = bv.Void() +MicrosoftOfficeAddinPolicy._enabled_validator = bv.Void() +MicrosoftOfficeAddinPolicy._other_validator = bv.Void() +MicrosoftOfficeAddinPolicy._tagmap = { + 'disabled': MicrosoftOfficeAddinPolicy._disabled_validator, + 'enabled': MicrosoftOfficeAddinPolicy._enabled_validator, + 'other': MicrosoftOfficeAddinPolicy._other_validator, +} + +MicrosoftOfficeAddinPolicy.disabled = MicrosoftOfficeAddinPolicy('disabled') +MicrosoftOfficeAddinPolicy.enabled = MicrosoftOfficeAddinPolicy('enabled') +MicrosoftOfficeAddinPolicy.other = MicrosoftOfficeAddinPolicy('other') + +MissingDetails._source_event_fields_validator = bv.Nullable(bv.String()) +MissingDetails._all_field_names_ = set(['source_event_fields']) +MissingDetails._all_fields_ = [('source_event_fields', MissingDetails._source_event_fields_validator)] + +MobileDeviceSessionLogInfo._session_info_validator = bv.Nullable(MobileSessionLogInfo_validator) +MobileDeviceSessionLogInfo._device_name_validator = bv.String() +MobileDeviceSessionLogInfo._client_type_validator = team.MobileClientPlatform_validator +MobileDeviceSessionLogInfo._client_version_validator = bv.Nullable(bv.String()) +MobileDeviceSessionLogInfo._os_version_validator = bv.Nullable(bv.String()) +MobileDeviceSessionLogInfo._last_carrier_validator = bv.Nullable(bv.String()) +MobileDeviceSessionLogInfo._field_names_ = set([ + 'session_info', + 'device_name', + 'client_type', + 'client_version', + 'os_version', + 'last_carrier', +]) +MobileDeviceSessionLogInfo._all_field_names_ = DeviceSessionLogInfo._all_field_names_.union(MobileDeviceSessionLogInfo._field_names_) +MobileDeviceSessionLogInfo._fields_ = [ + ('session_info', MobileDeviceSessionLogInfo._session_info_validator), + ('device_name', MobileDeviceSessionLogInfo._device_name_validator), + ('client_type', MobileDeviceSessionLogInfo._client_type_validator), + ('client_version', MobileDeviceSessionLogInfo._client_version_validator), + ('os_version', MobileDeviceSessionLogInfo._os_version_validator), + ('last_carrier', MobileDeviceSessionLogInfo._last_carrier_validator), +] +MobileDeviceSessionLogInfo._all_fields_ = DeviceSessionLogInfo._all_fields_ + MobileDeviceSessionLogInfo._fields_ + +MobileSessionLogInfo._field_names_ = set([]) +MobileSessionLogInfo._all_field_names_ = SessionLogInfo._all_field_names_.union(MobileSessionLogInfo._field_names_) +MobileSessionLogInfo._fields_ = [] +MobileSessionLogInfo._all_fields_ = SessionLogInfo._all_fields_ + MobileSessionLogInfo._fields_ + +NamespaceRelativePathLogInfo._ns_id_validator = bv.Nullable(NamespaceId_validator) +NamespaceRelativePathLogInfo._relative_path_validator = bv.Nullable(FilePath_validator) +NamespaceRelativePathLogInfo._all_field_names_ = set([ + 'ns_id', + 'relative_path', +]) +NamespaceRelativePathLogInfo._all_fields_ = [ + ('ns_id', NamespaceRelativePathLogInfo._ns_id_validator), + ('relative_path', NamespaceRelativePathLogInfo._relative_path_validator), +] + +NetworkControlChangePolicyDetails._new_value_validator = NetworkControlPolicy_validator +NetworkControlChangePolicyDetails._previous_value_validator = bv.Nullable(NetworkControlPolicy_validator) +NetworkControlChangePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +NetworkControlChangePolicyDetails._all_fields_ = [ + ('new_value', NetworkControlChangePolicyDetails._new_value_validator), + ('previous_value', NetworkControlChangePolicyDetails._previous_value_validator), +] + +NetworkControlChangePolicyType._description_validator = bv.String() +NetworkControlChangePolicyType._all_field_names_ = set(['description']) +NetworkControlChangePolicyType._all_fields_ = [('description', NetworkControlChangePolicyType._description_validator)] + +NetworkControlPolicy._disabled_validator = bv.Void() +NetworkControlPolicy._enabled_validator = bv.Void() +NetworkControlPolicy._other_validator = bv.Void() +NetworkControlPolicy._tagmap = { + 'disabled': NetworkControlPolicy._disabled_validator, + 'enabled': NetworkControlPolicy._enabled_validator, + 'other': NetworkControlPolicy._other_validator, +} + +NetworkControlPolicy.disabled = NetworkControlPolicy('disabled') +NetworkControlPolicy.enabled = NetworkControlPolicy('enabled') +NetworkControlPolicy.other = NetworkControlPolicy('other') + +UserLogInfo._account_id_validator = bv.Nullable(users_common.AccountId_validator) +UserLogInfo._display_name_validator = bv.Nullable(common.DisplayNameLegacy_validator) +UserLogInfo._email_validator = bv.Nullable(EmailAddress_validator) +UserLogInfo._field_names_ = set([ + 'account_id', + 'display_name', + 'email', +]) +UserLogInfo._all_field_names_ = UserLogInfo._field_names_ +UserLogInfo._fields_ = [ + ('account_id', UserLogInfo._account_id_validator), + ('display_name', UserLogInfo._display_name_validator), + ('email', UserLogInfo._email_validator), +] +UserLogInfo._all_fields_ = UserLogInfo._fields_ + +UserLogInfo._tag_to_subtype_ = { + (u'team_member',): TeamMemberLogInfo_validator, + (u'trusted_non_team_member',): TrustedNonTeamMemberLogInfo_validator, + (u'non_team_member',): NonTeamMemberLogInfo_validator, +} +UserLogInfo._pytype_to_tag_and_subtype_ = { + TeamMemberLogInfo: ((u'team_member',), TeamMemberLogInfo_validator), + TrustedNonTeamMemberLogInfo: ((u'trusted_non_team_member',), TrustedNonTeamMemberLogInfo_validator), + NonTeamMemberLogInfo: ((u'non_team_member',), NonTeamMemberLogInfo_validator), +} +UserLogInfo._is_catch_all_ = True + +NonTeamMemberLogInfo._field_names_ = set([]) +NonTeamMemberLogInfo._all_field_names_ = UserLogInfo._all_field_names_.union(NonTeamMemberLogInfo._field_names_) +NonTeamMemberLogInfo._fields_ = [] +NonTeamMemberLogInfo._all_fields_ = UserLogInfo._all_fields_ + NonTeamMemberLogInfo._fields_ + +NoteAclInviteOnlyDetails._all_field_names_ = set([]) +NoteAclInviteOnlyDetails._all_fields_ = [] + +NoteAclInviteOnlyType._description_validator = bv.String() +NoteAclInviteOnlyType._all_field_names_ = set(['description']) +NoteAclInviteOnlyType._all_fields_ = [('description', NoteAclInviteOnlyType._description_validator)] + +NoteAclLinkDetails._all_field_names_ = set([]) +NoteAclLinkDetails._all_fields_ = [] + +NoteAclLinkType._description_validator = bv.String() +NoteAclLinkType._all_field_names_ = set(['description']) +NoteAclLinkType._all_fields_ = [('description', NoteAclLinkType._description_validator)] + +NoteAclTeamLinkDetails._all_field_names_ = set([]) +NoteAclTeamLinkDetails._all_fields_ = [] + +NoteAclTeamLinkType._description_validator = bv.String() +NoteAclTeamLinkType._all_field_names_ = set(['description']) +NoteAclTeamLinkType._all_fields_ = [('description', NoteAclTeamLinkType._description_validator)] + +NoteShareReceiveDetails._all_field_names_ = set([]) +NoteShareReceiveDetails._all_fields_ = [] + +NoteShareReceiveType._description_validator = bv.String() +NoteShareReceiveType._all_field_names_ = set(['description']) +NoteShareReceiveType._all_fields_ = [('description', NoteShareReceiveType._description_validator)] + +NoteSharedDetails._all_field_names_ = set([]) +NoteSharedDetails._all_fields_ = [] + +NoteSharedType._description_validator = bv.String() +NoteSharedType._all_field_names_ = set(['description']) +NoteSharedType._all_fields_ = [('description', NoteSharedType._description_validator)] + +OpenNoteSharedDetails._all_field_names_ = set([]) +OpenNoteSharedDetails._all_fields_ = [] + +OpenNoteSharedType._description_validator = bv.String() +OpenNoteSharedType._all_field_names_ = set(['description']) +OpenNoteSharedType._all_fields_ = [('description', OpenNoteSharedType._description_validator)] + +OriginLogInfo._geo_location_validator = bv.Nullable(GeoLocationLogInfo_validator) +OriginLogInfo._access_method_validator = AccessMethodLogInfo_validator +OriginLogInfo._all_field_names_ = set([ + 'geo_location', + 'access_method', +]) +OriginLogInfo._all_fields_ = [ + ('geo_location', OriginLogInfo._geo_location_validator), + ('access_method', OriginLogInfo._access_method_validator), +] + +PaperAccessType._viewer_validator = bv.Void() +PaperAccessType._commenter_validator = bv.Void() +PaperAccessType._editor_validator = bv.Void() +PaperAccessType._other_validator = bv.Void() +PaperAccessType._tagmap = { + 'viewer': PaperAccessType._viewer_validator, + 'commenter': PaperAccessType._commenter_validator, + 'editor': PaperAccessType._editor_validator, + 'other': PaperAccessType._other_validator, +} + +PaperAccessType.viewer = PaperAccessType('viewer') +PaperAccessType.commenter = PaperAccessType('commenter') +PaperAccessType.editor = PaperAccessType('editor') +PaperAccessType.other = PaperAccessType('other') + +PaperAdminExportStartDetails._all_field_names_ = set([]) +PaperAdminExportStartDetails._all_fields_ = [] + +PaperAdminExportStartType._description_validator = bv.String() +PaperAdminExportStartType._all_field_names_ = set(['description']) +PaperAdminExportStartType._all_fields_ = [('description', PaperAdminExportStartType._description_validator)] + +PaperChangeDeploymentPolicyDetails._new_value_validator = team_policies.PaperDeploymentPolicy_validator +PaperChangeDeploymentPolicyDetails._previous_value_validator = bv.Nullable(team_policies.PaperDeploymentPolicy_validator) +PaperChangeDeploymentPolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +PaperChangeDeploymentPolicyDetails._all_fields_ = [ + ('new_value', PaperChangeDeploymentPolicyDetails._new_value_validator), + ('previous_value', PaperChangeDeploymentPolicyDetails._previous_value_validator), +] + +PaperChangeDeploymentPolicyType._description_validator = bv.String() +PaperChangeDeploymentPolicyType._all_field_names_ = set(['description']) +PaperChangeDeploymentPolicyType._all_fields_ = [('description', PaperChangeDeploymentPolicyType._description_validator)] + +PaperChangeMemberLinkPolicyDetails._new_value_validator = PaperMemberPolicy_validator +PaperChangeMemberLinkPolicyDetails._all_field_names_ = set(['new_value']) +PaperChangeMemberLinkPolicyDetails._all_fields_ = [('new_value', PaperChangeMemberLinkPolicyDetails._new_value_validator)] + +PaperChangeMemberLinkPolicyType._description_validator = bv.String() +PaperChangeMemberLinkPolicyType._all_field_names_ = set(['description']) +PaperChangeMemberLinkPolicyType._all_fields_ = [('description', PaperChangeMemberLinkPolicyType._description_validator)] + +PaperChangeMemberPolicyDetails._new_value_validator = PaperMemberPolicy_validator +PaperChangeMemberPolicyDetails._previous_value_validator = bv.Nullable(PaperMemberPolicy_validator) +PaperChangeMemberPolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +PaperChangeMemberPolicyDetails._all_fields_ = [ + ('new_value', PaperChangeMemberPolicyDetails._new_value_validator), + ('previous_value', PaperChangeMemberPolicyDetails._previous_value_validator), +] + +PaperChangeMemberPolicyType._description_validator = bv.String() +PaperChangeMemberPolicyType._all_field_names_ = set(['description']) +PaperChangeMemberPolicyType._all_fields_ = [('description', PaperChangeMemberPolicyType._description_validator)] + +PaperChangePolicyDetails._new_value_validator = team_policies.PaperEnabledPolicy_validator +PaperChangePolicyDetails._previous_value_validator = bv.Nullable(team_policies.PaperEnabledPolicy_validator) +PaperChangePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +PaperChangePolicyDetails._all_fields_ = [ + ('new_value', PaperChangePolicyDetails._new_value_validator), + ('previous_value', PaperChangePolicyDetails._previous_value_validator), +] + +PaperChangePolicyType._description_validator = bv.String() +PaperChangePolicyType._all_field_names_ = set(['description']) +PaperChangePolicyType._all_fields_ = [('description', PaperChangePolicyType._description_validator)] + +PaperContentAddMemberDetails._event_uuid_validator = bv.String() +PaperContentAddMemberDetails._all_field_names_ = set(['event_uuid']) +PaperContentAddMemberDetails._all_fields_ = [('event_uuid', PaperContentAddMemberDetails._event_uuid_validator)] + +PaperContentAddMemberType._description_validator = bv.String() +PaperContentAddMemberType._all_field_names_ = set(['description']) +PaperContentAddMemberType._all_fields_ = [('description', PaperContentAddMemberType._description_validator)] + +PaperContentAddToFolderDetails._event_uuid_validator = bv.String() +PaperContentAddToFolderDetails._target_asset_index_validator = bv.UInt64() +PaperContentAddToFolderDetails._parent_asset_index_validator = bv.UInt64() +PaperContentAddToFolderDetails._all_field_names_ = set([ + 'event_uuid', + 'target_asset_index', + 'parent_asset_index', +]) +PaperContentAddToFolderDetails._all_fields_ = [ + ('event_uuid', PaperContentAddToFolderDetails._event_uuid_validator), + ('target_asset_index', PaperContentAddToFolderDetails._target_asset_index_validator), + ('parent_asset_index', PaperContentAddToFolderDetails._parent_asset_index_validator), +] + +PaperContentAddToFolderType._description_validator = bv.String() +PaperContentAddToFolderType._all_field_names_ = set(['description']) +PaperContentAddToFolderType._all_fields_ = [('description', PaperContentAddToFolderType._description_validator)] + +PaperContentArchiveDetails._event_uuid_validator = bv.String() +PaperContentArchiveDetails._all_field_names_ = set(['event_uuid']) +PaperContentArchiveDetails._all_fields_ = [('event_uuid', PaperContentArchiveDetails._event_uuid_validator)] + +PaperContentArchiveType._description_validator = bv.String() +PaperContentArchiveType._all_field_names_ = set(['description']) +PaperContentArchiveType._all_fields_ = [('description', PaperContentArchiveType._description_validator)] + +PaperContentCreateDetails._event_uuid_validator = bv.String() +PaperContentCreateDetails._all_field_names_ = set(['event_uuid']) +PaperContentCreateDetails._all_fields_ = [('event_uuid', PaperContentCreateDetails._event_uuid_validator)] + +PaperContentCreateType._description_validator = bv.String() +PaperContentCreateType._all_field_names_ = set(['description']) +PaperContentCreateType._all_fields_ = [('description', PaperContentCreateType._description_validator)] + +PaperContentPermanentlyDeleteDetails._event_uuid_validator = bv.String() +PaperContentPermanentlyDeleteDetails._all_field_names_ = set(['event_uuid']) +PaperContentPermanentlyDeleteDetails._all_fields_ = [('event_uuid', PaperContentPermanentlyDeleteDetails._event_uuid_validator)] + +PaperContentPermanentlyDeleteType._description_validator = bv.String() +PaperContentPermanentlyDeleteType._all_field_names_ = set(['description']) +PaperContentPermanentlyDeleteType._all_fields_ = [('description', PaperContentPermanentlyDeleteType._description_validator)] + +PaperContentRemoveFromFolderDetails._event_uuid_validator = bv.String() +PaperContentRemoveFromFolderDetails._target_asset_index_validator = bv.UInt64() +PaperContentRemoveFromFolderDetails._parent_asset_index_validator = bv.UInt64() +PaperContentRemoveFromFolderDetails._all_field_names_ = set([ + 'event_uuid', + 'target_asset_index', + 'parent_asset_index', +]) +PaperContentRemoveFromFolderDetails._all_fields_ = [ + ('event_uuid', PaperContentRemoveFromFolderDetails._event_uuid_validator), + ('target_asset_index', PaperContentRemoveFromFolderDetails._target_asset_index_validator), + ('parent_asset_index', PaperContentRemoveFromFolderDetails._parent_asset_index_validator), +] + +PaperContentRemoveFromFolderType._description_validator = bv.String() +PaperContentRemoveFromFolderType._all_field_names_ = set(['description']) +PaperContentRemoveFromFolderType._all_fields_ = [('description', PaperContentRemoveFromFolderType._description_validator)] + +PaperContentRemoveMemberDetails._event_uuid_validator = bv.String() +PaperContentRemoveMemberDetails._all_field_names_ = set(['event_uuid']) +PaperContentRemoveMemberDetails._all_fields_ = [('event_uuid', PaperContentRemoveMemberDetails._event_uuid_validator)] + +PaperContentRemoveMemberType._description_validator = bv.String() +PaperContentRemoveMemberType._all_field_names_ = set(['description']) +PaperContentRemoveMemberType._all_fields_ = [('description', PaperContentRemoveMemberType._description_validator)] + +PaperContentRenameDetails._event_uuid_validator = bv.String() +PaperContentRenameDetails._all_field_names_ = set(['event_uuid']) +PaperContentRenameDetails._all_fields_ = [('event_uuid', PaperContentRenameDetails._event_uuid_validator)] + +PaperContentRenameType._description_validator = bv.String() +PaperContentRenameType._all_field_names_ = set(['description']) +PaperContentRenameType._all_fields_ = [('description', PaperContentRenameType._description_validator)] + +PaperContentRestoreDetails._event_uuid_validator = bv.String() +PaperContentRestoreDetails._all_field_names_ = set(['event_uuid']) +PaperContentRestoreDetails._all_fields_ = [('event_uuid', PaperContentRestoreDetails._event_uuid_validator)] + +PaperContentRestoreType._description_validator = bv.String() +PaperContentRestoreType._all_field_names_ = set(['description']) +PaperContentRestoreType._all_fields_ = [('description', PaperContentRestoreType._description_validator)] + +PaperDocAddCommentDetails._event_uuid_validator = bv.String() +PaperDocAddCommentDetails._comment_text_validator = bv.Nullable(bv.String()) +PaperDocAddCommentDetails._all_field_names_ = set([ + 'event_uuid', + 'comment_text', +]) +PaperDocAddCommentDetails._all_fields_ = [ + ('event_uuid', PaperDocAddCommentDetails._event_uuid_validator), + ('comment_text', PaperDocAddCommentDetails._comment_text_validator), +] + +PaperDocAddCommentType._description_validator = bv.String() +PaperDocAddCommentType._all_field_names_ = set(['description']) +PaperDocAddCommentType._all_fields_ = [('description', PaperDocAddCommentType._description_validator)] + +PaperDocChangeMemberRoleDetails._event_uuid_validator = bv.String() +PaperDocChangeMemberRoleDetails._access_type_validator = PaperAccessType_validator +PaperDocChangeMemberRoleDetails._all_field_names_ = set([ + 'event_uuid', + 'access_type', +]) +PaperDocChangeMemberRoleDetails._all_fields_ = [ + ('event_uuid', PaperDocChangeMemberRoleDetails._event_uuid_validator), + ('access_type', PaperDocChangeMemberRoleDetails._access_type_validator), +] + +PaperDocChangeMemberRoleType._description_validator = bv.String() +PaperDocChangeMemberRoleType._all_field_names_ = set(['description']) +PaperDocChangeMemberRoleType._all_fields_ = [('description', PaperDocChangeMemberRoleType._description_validator)] + +PaperDocChangeSharingPolicyDetails._event_uuid_validator = bv.String() +PaperDocChangeSharingPolicyDetails._public_sharing_policy_validator = bv.Nullable(bv.String()) +PaperDocChangeSharingPolicyDetails._team_sharing_policy_validator = bv.Nullable(bv.String()) +PaperDocChangeSharingPolicyDetails._all_field_names_ = set([ + 'event_uuid', + 'public_sharing_policy', + 'team_sharing_policy', +]) +PaperDocChangeSharingPolicyDetails._all_fields_ = [ + ('event_uuid', PaperDocChangeSharingPolicyDetails._event_uuid_validator), + ('public_sharing_policy', PaperDocChangeSharingPolicyDetails._public_sharing_policy_validator), + ('team_sharing_policy', PaperDocChangeSharingPolicyDetails._team_sharing_policy_validator), +] + +PaperDocChangeSharingPolicyType._description_validator = bv.String() +PaperDocChangeSharingPolicyType._all_field_names_ = set(['description']) +PaperDocChangeSharingPolicyType._all_fields_ = [('description', PaperDocChangeSharingPolicyType._description_validator)] + +PaperDocChangeSubscriptionDetails._event_uuid_validator = bv.String() +PaperDocChangeSubscriptionDetails._new_subscription_level_validator = bv.String() +PaperDocChangeSubscriptionDetails._previous_subscription_level_validator = bv.Nullable(bv.String()) +PaperDocChangeSubscriptionDetails._all_field_names_ = set([ + 'event_uuid', + 'new_subscription_level', + 'previous_subscription_level', +]) +PaperDocChangeSubscriptionDetails._all_fields_ = [ + ('event_uuid', PaperDocChangeSubscriptionDetails._event_uuid_validator), + ('new_subscription_level', PaperDocChangeSubscriptionDetails._new_subscription_level_validator), + ('previous_subscription_level', PaperDocChangeSubscriptionDetails._previous_subscription_level_validator), +] + +PaperDocChangeSubscriptionType._description_validator = bv.String() +PaperDocChangeSubscriptionType._all_field_names_ = set(['description']) +PaperDocChangeSubscriptionType._all_fields_ = [('description', PaperDocChangeSubscriptionType._description_validator)] + +PaperDocDeleteCommentDetails._event_uuid_validator = bv.String() +PaperDocDeleteCommentDetails._comment_text_validator = bv.Nullable(bv.String()) +PaperDocDeleteCommentDetails._all_field_names_ = set([ + 'event_uuid', + 'comment_text', +]) +PaperDocDeleteCommentDetails._all_fields_ = [ + ('event_uuid', PaperDocDeleteCommentDetails._event_uuid_validator), + ('comment_text', PaperDocDeleteCommentDetails._comment_text_validator), +] + +PaperDocDeleteCommentType._description_validator = bv.String() +PaperDocDeleteCommentType._all_field_names_ = set(['description']) +PaperDocDeleteCommentType._all_fields_ = [('description', PaperDocDeleteCommentType._description_validator)] + +PaperDocDeletedDetails._event_uuid_validator = bv.String() +PaperDocDeletedDetails._all_field_names_ = set(['event_uuid']) +PaperDocDeletedDetails._all_fields_ = [('event_uuid', PaperDocDeletedDetails._event_uuid_validator)] + +PaperDocDeletedType._description_validator = bv.String() +PaperDocDeletedType._all_field_names_ = set(['description']) +PaperDocDeletedType._all_fields_ = [('description', PaperDocDeletedType._description_validator)] + +PaperDocDownloadDetails._event_uuid_validator = bv.String() +PaperDocDownloadDetails._export_file_format_validator = PaperDownloadFormat_validator +PaperDocDownloadDetails._all_field_names_ = set([ + 'event_uuid', + 'export_file_format', +]) +PaperDocDownloadDetails._all_fields_ = [ + ('event_uuid', PaperDocDownloadDetails._event_uuid_validator), + ('export_file_format', PaperDocDownloadDetails._export_file_format_validator), +] + +PaperDocDownloadType._description_validator = bv.String() +PaperDocDownloadType._all_field_names_ = set(['description']) +PaperDocDownloadType._all_fields_ = [('description', PaperDocDownloadType._description_validator)] + +PaperDocEditCommentDetails._event_uuid_validator = bv.String() +PaperDocEditCommentDetails._comment_text_validator = bv.Nullable(bv.String()) +PaperDocEditCommentDetails._all_field_names_ = set([ + 'event_uuid', + 'comment_text', +]) +PaperDocEditCommentDetails._all_fields_ = [ + ('event_uuid', PaperDocEditCommentDetails._event_uuid_validator), + ('comment_text', PaperDocEditCommentDetails._comment_text_validator), +] + +PaperDocEditCommentType._description_validator = bv.String() +PaperDocEditCommentType._all_field_names_ = set(['description']) +PaperDocEditCommentType._all_fields_ = [('description', PaperDocEditCommentType._description_validator)] + +PaperDocEditDetails._event_uuid_validator = bv.String() +PaperDocEditDetails._all_field_names_ = set(['event_uuid']) +PaperDocEditDetails._all_fields_ = [('event_uuid', PaperDocEditDetails._event_uuid_validator)] + +PaperDocEditType._description_validator = bv.String() +PaperDocEditType._all_field_names_ = set(['description']) +PaperDocEditType._all_fields_ = [('description', PaperDocEditType._description_validator)] + +PaperDocFollowedDetails._event_uuid_validator = bv.String() +PaperDocFollowedDetails._all_field_names_ = set(['event_uuid']) +PaperDocFollowedDetails._all_fields_ = [('event_uuid', PaperDocFollowedDetails._event_uuid_validator)] + +PaperDocFollowedType._description_validator = bv.String() +PaperDocFollowedType._all_field_names_ = set(['description']) +PaperDocFollowedType._all_fields_ = [('description', PaperDocFollowedType._description_validator)] + +PaperDocMentionDetails._event_uuid_validator = bv.String() +PaperDocMentionDetails._all_field_names_ = set(['event_uuid']) +PaperDocMentionDetails._all_fields_ = [('event_uuid', PaperDocMentionDetails._event_uuid_validator)] + +PaperDocMentionType._description_validator = bv.String() +PaperDocMentionType._all_field_names_ = set(['description']) +PaperDocMentionType._all_fields_ = [('description', PaperDocMentionType._description_validator)] + +PaperDocOwnershipChangedDetails._event_uuid_validator = bv.String() +PaperDocOwnershipChangedDetails._old_owner_user_id_validator = bv.Nullable(users_common.AccountId_validator) +PaperDocOwnershipChangedDetails._new_owner_user_id_validator = users_common.AccountId_validator +PaperDocOwnershipChangedDetails._all_field_names_ = set([ + 'event_uuid', + 'old_owner_user_id', + 'new_owner_user_id', +]) +PaperDocOwnershipChangedDetails._all_fields_ = [ + ('event_uuid', PaperDocOwnershipChangedDetails._event_uuid_validator), + ('old_owner_user_id', PaperDocOwnershipChangedDetails._old_owner_user_id_validator), + ('new_owner_user_id', PaperDocOwnershipChangedDetails._new_owner_user_id_validator), +] + +PaperDocOwnershipChangedType._description_validator = bv.String() +PaperDocOwnershipChangedType._all_field_names_ = set(['description']) +PaperDocOwnershipChangedType._all_fields_ = [('description', PaperDocOwnershipChangedType._description_validator)] + +PaperDocRequestAccessDetails._event_uuid_validator = bv.String() +PaperDocRequestAccessDetails._all_field_names_ = set(['event_uuid']) +PaperDocRequestAccessDetails._all_fields_ = [('event_uuid', PaperDocRequestAccessDetails._event_uuid_validator)] + +PaperDocRequestAccessType._description_validator = bv.String() +PaperDocRequestAccessType._all_field_names_ = set(['description']) +PaperDocRequestAccessType._all_fields_ = [('description', PaperDocRequestAccessType._description_validator)] + +PaperDocResolveCommentDetails._event_uuid_validator = bv.String() +PaperDocResolveCommentDetails._comment_text_validator = bv.Nullable(bv.String()) +PaperDocResolveCommentDetails._all_field_names_ = set([ + 'event_uuid', + 'comment_text', +]) +PaperDocResolveCommentDetails._all_fields_ = [ + ('event_uuid', PaperDocResolveCommentDetails._event_uuid_validator), + ('comment_text', PaperDocResolveCommentDetails._comment_text_validator), +] + +PaperDocResolveCommentType._description_validator = bv.String() +PaperDocResolveCommentType._all_field_names_ = set(['description']) +PaperDocResolveCommentType._all_fields_ = [('description', PaperDocResolveCommentType._description_validator)] + +PaperDocRevertDetails._event_uuid_validator = bv.String() +PaperDocRevertDetails._all_field_names_ = set(['event_uuid']) +PaperDocRevertDetails._all_fields_ = [('event_uuid', PaperDocRevertDetails._event_uuid_validator)] + +PaperDocRevertType._description_validator = bv.String() +PaperDocRevertType._all_field_names_ = set(['description']) +PaperDocRevertType._all_fields_ = [('description', PaperDocRevertType._description_validator)] + +PaperDocSlackShareDetails._event_uuid_validator = bv.String() +PaperDocSlackShareDetails._all_field_names_ = set(['event_uuid']) +PaperDocSlackShareDetails._all_fields_ = [('event_uuid', PaperDocSlackShareDetails._event_uuid_validator)] + +PaperDocSlackShareType._description_validator = bv.String() +PaperDocSlackShareType._all_field_names_ = set(['description']) +PaperDocSlackShareType._all_fields_ = [('description', PaperDocSlackShareType._description_validator)] + +PaperDocTeamInviteDetails._event_uuid_validator = bv.String() +PaperDocTeamInviteDetails._all_field_names_ = set(['event_uuid']) +PaperDocTeamInviteDetails._all_fields_ = [('event_uuid', PaperDocTeamInviteDetails._event_uuid_validator)] + +PaperDocTeamInviteType._description_validator = bv.String() +PaperDocTeamInviteType._all_field_names_ = set(['description']) +PaperDocTeamInviteType._all_fields_ = [('description', PaperDocTeamInviteType._description_validator)] + +PaperDocTrashedDetails._event_uuid_validator = bv.String() +PaperDocTrashedDetails._all_field_names_ = set(['event_uuid']) +PaperDocTrashedDetails._all_fields_ = [('event_uuid', PaperDocTrashedDetails._event_uuid_validator)] + +PaperDocTrashedType._description_validator = bv.String() +PaperDocTrashedType._all_field_names_ = set(['description']) +PaperDocTrashedType._all_fields_ = [('description', PaperDocTrashedType._description_validator)] + +PaperDocUnresolveCommentDetails._event_uuid_validator = bv.String() +PaperDocUnresolveCommentDetails._comment_text_validator = bv.Nullable(bv.String()) +PaperDocUnresolveCommentDetails._all_field_names_ = set([ + 'event_uuid', + 'comment_text', +]) +PaperDocUnresolveCommentDetails._all_fields_ = [ + ('event_uuid', PaperDocUnresolveCommentDetails._event_uuid_validator), + ('comment_text', PaperDocUnresolveCommentDetails._comment_text_validator), +] + +PaperDocUnresolveCommentType._description_validator = bv.String() +PaperDocUnresolveCommentType._all_field_names_ = set(['description']) +PaperDocUnresolveCommentType._all_fields_ = [('description', PaperDocUnresolveCommentType._description_validator)] + +PaperDocUntrashedDetails._event_uuid_validator = bv.String() +PaperDocUntrashedDetails._all_field_names_ = set(['event_uuid']) +PaperDocUntrashedDetails._all_fields_ = [('event_uuid', PaperDocUntrashedDetails._event_uuid_validator)] + +PaperDocUntrashedType._description_validator = bv.String() +PaperDocUntrashedType._all_field_names_ = set(['description']) +PaperDocUntrashedType._all_fields_ = [('description', PaperDocUntrashedType._description_validator)] + +PaperDocViewDetails._event_uuid_validator = bv.String() +PaperDocViewDetails._all_field_names_ = set(['event_uuid']) +PaperDocViewDetails._all_fields_ = [('event_uuid', PaperDocViewDetails._event_uuid_validator)] + +PaperDocViewType._description_validator = bv.String() +PaperDocViewType._all_field_names_ = set(['description']) +PaperDocViewType._all_fields_ = [('description', PaperDocViewType._description_validator)] + +PaperDocumentLogInfo._doc_id_validator = bv.String() +PaperDocumentLogInfo._doc_title_validator = bv.String() +PaperDocumentLogInfo._all_field_names_ = set([ + 'doc_id', + 'doc_title', +]) +PaperDocumentLogInfo._all_fields_ = [ + ('doc_id', PaperDocumentLogInfo._doc_id_validator), + ('doc_title', PaperDocumentLogInfo._doc_title_validator), +] + +PaperDownloadFormat._docx_validator = bv.Void() +PaperDownloadFormat._html_validator = bv.Void() +PaperDownloadFormat._markdown_validator = bv.Void() +PaperDownloadFormat._pdf_validator = bv.Void() +PaperDownloadFormat._other_validator = bv.Void() +PaperDownloadFormat._tagmap = { + 'docx': PaperDownloadFormat._docx_validator, + 'html': PaperDownloadFormat._html_validator, + 'markdown': PaperDownloadFormat._markdown_validator, + 'pdf': PaperDownloadFormat._pdf_validator, + 'other': PaperDownloadFormat._other_validator, +} + +PaperDownloadFormat.docx = PaperDownloadFormat('docx') +PaperDownloadFormat.html = PaperDownloadFormat('html') +PaperDownloadFormat.markdown = PaperDownloadFormat('markdown') +PaperDownloadFormat.pdf = PaperDownloadFormat('pdf') +PaperDownloadFormat.other = PaperDownloadFormat('other') + +PaperEnabledUsersGroupAdditionDetails._all_field_names_ = set([]) +PaperEnabledUsersGroupAdditionDetails._all_fields_ = [] + +PaperEnabledUsersGroupAdditionType._description_validator = bv.String() +PaperEnabledUsersGroupAdditionType._all_field_names_ = set(['description']) +PaperEnabledUsersGroupAdditionType._all_fields_ = [('description', PaperEnabledUsersGroupAdditionType._description_validator)] + +PaperEnabledUsersGroupRemovalDetails._all_field_names_ = set([]) +PaperEnabledUsersGroupRemovalDetails._all_fields_ = [] + +PaperEnabledUsersGroupRemovalType._description_validator = bv.String() +PaperEnabledUsersGroupRemovalType._all_field_names_ = set(['description']) +PaperEnabledUsersGroupRemovalType._all_fields_ = [('description', PaperEnabledUsersGroupRemovalType._description_validator)] + +PaperExternalViewAllowDetails._event_uuid_validator = bv.String() +PaperExternalViewAllowDetails._all_field_names_ = set(['event_uuid']) +PaperExternalViewAllowDetails._all_fields_ = [('event_uuid', PaperExternalViewAllowDetails._event_uuid_validator)] + +PaperExternalViewAllowType._description_validator = bv.String() +PaperExternalViewAllowType._all_field_names_ = set(['description']) +PaperExternalViewAllowType._all_fields_ = [('description', PaperExternalViewAllowType._description_validator)] + +PaperExternalViewDefaultTeamDetails._event_uuid_validator = bv.String() +PaperExternalViewDefaultTeamDetails._all_field_names_ = set(['event_uuid']) +PaperExternalViewDefaultTeamDetails._all_fields_ = [('event_uuid', PaperExternalViewDefaultTeamDetails._event_uuid_validator)] + +PaperExternalViewDefaultTeamType._description_validator = bv.String() +PaperExternalViewDefaultTeamType._all_field_names_ = set(['description']) +PaperExternalViewDefaultTeamType._all_fields_ = [('description', PaperExternalViewDefaultTeamType._description_validator)] + +PaperExternalViewForbidDetails._event_uuid_validator = bv.String() +PaperExternalViewForbidDetails._all_field_names_ = set(['event_uuid']) +PaperExternalViewForbidDetails._all_fields_ = [('event_uuid', PaperExternalViewForbidDetails._event_uuid_validator)] + +PaperExternalViewForbidType._description_validator = bv.String() +PaperExternalViewForbidType._all_field_names_ = set(['description']) +PaperExternalViewForbidType._all_fields_ = [('description', PaperExternalViewForbidType._description_validator)] + +PaperFolderChangeSubscriptionDetails._event_uuid_validator = bv.String() +PaperFolderChangeSubscriptionDetails._new_subscription_level_validator = bv.String() +PaperFolderChangeSubscriptionDetails._previous_subscription_level_validator = bv.Nullable(bv.String()) +PaperFolderChangeSubscriptionDetails._all_field_names_ = set([ + 'event_uuid', + 'new_subscription_level', + 'previous_subscription_level', +]) +PaperFolderChangeSubscriptionDetails._all_fields_ = [ + ('event_uuid', PaperFolderChangeSubscriptionDetails._event_uuid_validator), + ('new_subscription_level', PaperFolderChangeSubscriptionDetails._new_subscription_level_validator), + ('previous_subscription_level', PaperFolderChangeSubscriptionDetails._previous_subscription_level_validator), +] + +PaperFolderChangeSubscriptionType._description_validator = bv.String() +PaperFolderChangeSubscriptionType._all_field_names_ = set(['description']) +PaperFolderChangeSubscriptionType._all_fields_ = [('description', PaperFolderChangeSubscriptionType._description_validator)] + +PaperFolderDeletedDetails._event_uuid_validator = bv.String() +PaperFolderDeletedDetails._all_field_names_ = set(['event_uuid']) +PaperFolderDeletedDetails._all_fields_ = [('event_uuid', PaperFolderDeletedDetails._event_uuid_validator)] + +PaperFolderDeletedType._description_validator = bv.String() +PaperFolderDeletedType._all_field_names_ = set(['description']) +PaperFolderDeletedType._all_fields_ = [('description', PaperFolderDeletedType._description_validator)] + +PaperFolderFollowedDetails._event_uuid_validator = bv.String() +PaperFolderFollowedDetails._all_field_names_ = set(['event_uuid']) +PaperFolderFollowedDetails._all_fields_ = [('event_uuid', PaperFolderFollowedDetails._event_uuid_validator)] + +PaperFolderFollowedType._description_validator = bv.String() +PaperFolderFollowedType._all_field_names_ = set(['description']) +PaperFolderFollowedType._all_fields_ = [('description', PaperFolderFollowedType._description_validator)] + +PaperFolderLogInfo._folder_id_validator = bv.String() +PaperFolderLogInfo._folder_name_validator = bv.String() +PaperFolderLogInfo._all_field_names_ = set([ + 'folder_id', + 'folder_name', +]) +PaperFolderLogInfo._all_fields_ = [ + ('folder_id', PaperFolderLogInfo._folder_id_validator), + ('folder_name', PaperFolderLogInfo._folder_name_validator), +] + +PaperFolderTeamInviteDetails._event_uuid_validator = bv.String() +PaperFolderTeamInviteDetails._all_field_names_ = set(['event_uuid']) +PaperFolderTeamInviteDetails._all_fields_ = [('event_uuid', PaperFolderTeamInviteDetails._event_uuid_validator)] + +PaperFolderTeamInviteType._description_validator = bv.String() +PaperFolderTeamInviteType._all_field_names_ = set(['description']) +PaperFolderTeamInviteType._all_fields_ = [('description', PaperFolderTeamInviteType._description_validator)] + +PaperMemberPolicy._anyone_with_link_validator = bv.Void() +PaperMemberPolicy._only_team_validator = bv.Void() +PaperMemberPolicy._team_and_explicitly_shared_validator = bv.Void() +PaperMemberPolicy._other_validator = bv.Void() +PaperMemberPolicy._tagmap = { + 'anyone_with_link': PaperMemberPolicy._anyone_with_link_validator, + 'only_team': PaperMemberPolicy._only_team_validator, + 'team_and_explicitly_shared': PaperMemberPolicy._team_and_explicitly_shared_validator, + 'other': PaperMemberPolicy._other_validator, +} + +PaperMemberPolicy.anyone_with_link = PaperMemberPolicy('anyone_with_link') +PaperMemberPolicy.only_team = PaperMemberPolicy('only_team') +PaperMemberPolicy.team_and_explicitly_shared = PaperMemberPolicy('team_and_explicitly_shared') +PaperMemberPolicy.other = PaperMemberPolicy('other') + +ParticipantLogInfo._user_validator = UserLogInfo_validator +ParticipantLogInfo._group_validator = GroupLogInfo_validator +ParticipantLogInfo._other_validator = bv.Void() +ParticipantLogInfo._tagmap = { + 'user': ParticipantLogInfo._user_validator, + 'group': ParticipantLogInfo._group_validator, + 'other': ParticipantLogInfo._other_validator, +} + +ParticipantLogInfo.other = ParticipantLogInfo('other') + +PassPolicy._enabled_validator = bv.Void() +PassPolicy._allow_validator = bv.Void() +PassPolicy._disabled_validator = bv.Void() +PassPolicy._other_validator = bv.Void() +PassPolicy._tagmap = { + 'enabled': PassPolicy._enabled_validator, + 'allow': PassPolicy._allow_validator, + 'disabled': PassPolicy._disabled_validator, + 'other': PassPolicy._other_validator, +} + +PassPolicy.enabled = PassPolicy('enabled') +PassPolicy.allow = PassPolicy('allow') +PassPolicy.disabled = PassPolicy('disabled') +PassPolicy.other = PassPolicy('other') + +PasswordChangeDetails._all_field_names_ = set([]) +PasswordChangeDetails._all_fields_ = [] + +PasswordChangeType._description_validator = bv.String() +PasswordChangeType._all_field_names_ = set(['description']) +PasswordChangeType._all_fields_ = [('description', PasswordChangeType._description_validator)] + +PasswordResetAllDetails._all_field_names_ = set([]) +PasswordResetAllDetails._all_fields_ = [] + +PasswordResetAllType._description_validator = bv.String() +PasswordResetAllType._all_field_names_ = set(['description']) +PasswordResetAllType._all_fields_ = [('description', PasswordResetAllType._description_validator)] + +PasswordResetDetails._all_field_names_ = set([]) +PasswordResetDetails._all_fields_ = [] + +PasswordResetType._description_validator = bv.String() +PasswordResetType._all_field_names_ = set(['description']) +PasswordResetType._all_fields_ = [('description', PasswordResetType._description_validator)] + +PathLogInfo._contextual_validator = bv.Nullable(FilePath_validator) +PathLogInfo._namespace_relative_validator = NamespaceRelativePathLogInfo_validator +PathLogInfo._all_field_names_ = set([ + 'contextual', + 'namespace_relative', +]) +PathLogInfo._all_fields_ = [ + ('contextual', PathLogInfo._contextual_validator), + ('namespace_relative', PathLogInfo._namespace_relative_validator), +] + +PermanentDeleteChangePolicyDetails._new_value_validator = ContentPermanentDeletePolicy_validator +PermanentDeleteChangePolicyDetails._previous_value_validator = bv.Nullable(ContentPermanentDeletePolicy_validator) +PermanentDeleteChangePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +PermanentDeleteChangePolicyDetails._all_fields_ = [ + ('new_value', PermanentDeleteChangePolicyDetails._new_value_validator), + ('previous_value', PermanentDeleteChangePolicyDetails._previous_value_validator), +] + +PermanentDeleteChangePolicyType._description_validator = bv.String() +PermanentDeleteChangePolicyType._all_field_names_ = set(['description']) +PermanentDeleteChangePolicyType._all_fields_ = [('description', PermanentDeleteChangePolicyType._description_validator)] + +PlacementRestriction._europe_only_validator = bv.Void() +PlacementRestriction._none_validator = bv.Void() +PlacementRestriction._other_validator = bv.Void() +PlacementRestriction._tagmap = { + 'europe_only': PlacementRestriction._europe_only_validator, + 'none': PlacementRestriction._none_validator, + 'other': PlacementRestriction._other_validator, +} + +PlacementRestriction.europe_only = PlacementRestriction('europe_only') +PlacementRestriction.none = PlacementRestriction('none') +PlacementRestriction.other = PlacementRestriction('other') + +QuickActionType._delete_shared_link_validator = bv.Void() +QuickActionType._other_validator = bv.Void() +QuickActionType._tagmap = { + 'delete_shared_link': QuickActionType._delete_shared_link_validator, + 'other': QuickActionType._other_validator, +} + +QuickActionType.delete_shared_link = QuickActionType('delete_shared_link') +QuickActionType.other = QuickActionType('other') + +RelocateAssetReferencesLogInfo._src_asset_index_validator = bv.UInt64() +RelocateAssetReferencesLogInfo._dest_asset_index_validator = bv.UInt64() +RelocateAssetReferencesLogInfo._all_field_names_ = set([ + 'src_asset_index', + 'dest_asset_index', +]) +RelocateAssetReferencesLogInfo._all_fields_ = [ + ('src_asset_index', RelocateAssetReferencesLogInfo._src_asset_index_validator), + ('dest_asset_index', RelocateAssetReferencesLogInfo._dest_asset_index_validator), +] + +ResellerLogInfo._reseller_name_validator = bv.String() +ResellerLogInfo._reseller_email_validator = EmailAddress_validator +ResellerLogInfo._all_field_names_ = set([ + 'reseller_name', + 'reseller_email', +]) +ResellerLogInfo._all_fields_ = [ + ('reseller_name', ResellerLogInfo._reseller_name_validator), + ('reseller_email', ResellerLogInfo._reseller_email_validator), +] + +ResellerSupportSessionEndDetails._all_field_names_ = set([]) +ResellerSupportSessionEndDetails._all_fields_ = [] + +ResellerSupportSessionEndType._description_validator = bv.String() +ResellerSupportSessionEndType._all_field_names_ = set(['description']) +ResellerSupportSessionEndType._all_fields_ = [('description', ResellerSupportSessionEndType._description_validator)] + +ResellerSupportSessionStartDetails._all_field_names_ = set([]) +ResellerSupportSessionStartDetails._all_fields_ = [] + +ResellerSupportSessionStartType._description_validator = bv.String() +ResellerSupportSessionStartType._all_field_names_ = set(['description']) +ResellerSupportSessionStartType._all_fields_ = [('description', ResellerSupportSessionStartType._description_validator)] + +SecondaryMailsPolicy._disabled_validator = bv.Void() +SecondaryMailsPolicy._enabled_validator = bv.Void() +SecondaryMailsPolicy._other_validator = bv.Void() +SecondaryMailsPolicy._tagmap = { + 'disabled': SecondaryMailsPolicy._disabled_validator, + 'enabled': SecondaryMailsPolicy._enabled_validator, + 'other': SecondaryMailsPolicy._other_validator, +} + +SecondaryMailsPolicy.disabled = SecondaryMailsPolicy('disabled') +SecondaryMailsPolicy.enabled = SecondaryMailsPolicy('enabled') +SecondaryMailsPolicy.other = SecondaryMailsPolicy('other') + +SecondaryMailsPolicyChangedDetails._previous_value_validator = SecondaryMailsPolicy_validator +SecondaryMailsPolicyChangedDetails._new_value_validator = SecondaryMailsPolicy_validator +SecondaryMailsPolicyChangedDetails._all_field_names_ = set([ + 'previous_value', + 'new_value', +]) +SecondaryMailsPolicyChangedDetails._all_fields_ = [ + ('previous_value', SecondaryMailsPolicyChangedDetails._previous_value_validator), + ('new_value', SecondaryMailsPolicyChangedDetails._new_value_validator), +] + +SecondaryMailsPolicyChangedType._description_validator = bv.String() +SecondaryMailsPolicyChangedType._all_field_names_ = set(['description']) +SecondaryMailsPolicyChangedType._all_fields_ = [('description', SecondaryMailsPolicyChangedType._description_validator)] + +SfAddGroupDetails._target_asset_index_validator = bv.UInt64() +SfAddGroupDetails._original_folder_name_validator = bv.String() +SfAddGroupDetails._sharing_permission_validator = bv.Nullable(bv.String()) +SfAddGroupDetails._team_name_validator = bv.String() +SfAddGroupDetails._all_field_names_ = set([ + 'target_asset_index', + 'original_folder_name', + 'sharing_permission', + 'team_name', +]) +SfAddGroupDetails._all_fields_ = [ + ('target_asset_index', SfAddGroupDetails._target_asset_index_validator), + ('original_folder_name', SfAddGroupDetails._original_folder_name_validator), + ('sharing_permission', SfAddGroupDetails._sharing_permission_validator), + ('team_name', SfAddGroupDetails._team_name_validator), +] + +SfAddGroupType._description_validator = bv.String() +SfAddGroupType._all_field_names_ = set(['description']) +SfAddGroupType._all_fields_ = [('description', SfAddGroupType._description_validator)] + +SfAllowNonMembersToViewSharedLinksDetails._target_asset_index_validator = bv.UInt64() +SfAllowNonMembersToViewSharedLinksDetails._original_folder_name_validator = bv.String() +SfAllowNonMembersToViewSharedLinksDetails._shared_folder_type_validator = bv.Nullable(bv.String()) +SfAllowNonMembersToViewSharedLinksDetails._all_field_names_ = set([ + 'target_asset_index', + 'original_folder_name', + 'shared_folder_type', +]) +SfAllowNonMembersToViewSharedLinksDetails._all_fields_ = [ + ('target_asset_index', SfAllowNonMembersToViewSharedLinksDetails._target_asset_index_validator), + ('original_folder_name', SfAllowNonMembersToViewSharedLinksDetails._original_folder_name_validator), + ('shared_folder_type', SfAllowNonMembersToViewSharedLinksDetails._shared_folder_type_validator), +] + +SfAllowNonMembersToViewSharedLinksType._description_validator = bv.String() +SfAllowNonMembersToViewSharedLinksType._all_field_names_ = set(['description']) +SfAllowNonMembersToViewSharedLinksType._all_fields_ = [('description', SfAllowNonMembersToViewSharedLinksType._description_validator)] + +SfExternalInviteWarnDetails._target_asset_index_validator = bv.UInt64() +SfExternalInviteWarnDetails._original_folder_name_validator = bv.String() +SfExternalInviteWarnDetails._new_sharing_permission_validator = bv.Nullable(bv.String()) +SfExternalInviteWarnDetails._previous_sharing_permission_validator = bv.Nullable(bv.String()) +SfExternalInviteWarnDetails._all_field_names_ = set([ + 'target_asset_index', + 'original_folder_name', + 'new_sharing_permission', + 'previous_sharing_permission', +]) +SfExternalInviteWarnDetails._all_fields_ = [ + ('target_asset_index', SfExternalInviteWarnDetails._target_asset_index_validator), + ('original_folder_name', SfExternalInviteWarnDetails._original_folder_name_validator), + ('new_sharing_permission', SfExternalInviteWarnDetails._new_sharing_permission_validator), + ('previous_sharing_permission', SfExternalInviteWarnDetails._previous_sharing_permission_validator), +] + +SfExternalInviteWarnType._description_validator = bv.String() +SfExternalInviteWarnType._all_field_names_ = set(['description']) +SfExternalInviteWarnType._all_fields_ = [('description', SfExternalInviteWarnType._description_validator)] + +SfFbInviteChangeRoleDetails._target_asset_index_validator = bv.UInt64() +SfFbInviteChangeRoleDetails._original_folder_name_validator = bv.String() +SfFbInviteChangeRoleDetails._previous_sharing_permission_validator = bv.Nullable(bv.String()) +SfFbInviteChangeRoleDetails._new_sharing_permission_validator = bv.Nullable(bv.String()) +SfFbInviteChangeRoleDetails._all_field_names_ = set([ + 'target_asset_index', + 'original_folder_name', + 'previous_sharing_permission', + 'new_sharing_permission', +]) +SfFbInviteChangeRoleDetails._all_fields_ = [ + ('target_asset_index', SfFbInviteChangeRoleDetails._target_asset_index_validator), + ('original_folder_name', SfFbInviteChangeRoleDetails._original_folder_name_validator), + ('previous_sharing_permission', SfFbInviteChangeRoleDetails._previous_sharing_permission_validator), + ('new_sharing_permission', SfFbInviteChangeRoleDetails._new_sharing_permission_validator), +] + +SfFbInviteChangeRoleType._description_validator = bv.String() +SfFbInviteChangeRoleType._all_field_names_ = set(['description']) +SfFbInviteChangeRoleType._all_fields_ = [('description', SfFbInviteChangeRoleType._description_validator)] + +SfFbInviteDetails._target_asset_index_validator = bv.UInt64() +SfFbInviteDetails._original_folder_name_validator = bv.String() +SfFbInviteDetails._sharing_permission_validator = bv.Nullable(bv.String()) +SfFbInviteDetails._all_field_names_ = set([ + 'target_asset_index', + 'original_folder_name', + 'sharing_permission', +]) +SfFbInviteDetails._all_fields_ = [ + ('target_asset_index', SfFbInviteDetails._target_asset_index_validator), + ('original_folder_name', SfFbInviteDetails._original_folder_name_validator), + ('sharing_permission', SfFbInviteDetails._sharing_permission_validator), +] + +SfFbInviteType._description_validator = bv.String() +SfFbInviteType._all_field_names_ = set(['description']) +SfFbInviteType._all_fields_ = [('description', SfFbInviteType._description_validator)] + +SfFbUninviteDetails._target_asset_index_validator = bv.UInt64() +SfFbUninviteDetails._original_folder_name_validator = bv.String() +SfFbUninviteDetails._all_field_names_ = set([ + 'target_asset_index', + 'original_folder_name', +]) +SfFbUninviteDetails._all_fields_ = [ + ('target_asset_index', SfFbUninviteDetails._target_asset_index_validator), + ('original_folder_name', SfFbUninviteDetails._original_folder_name_validator), +] + +SfFbUninviteType._description_validator = bv.String() +SfFbUninviteType._all_field_names_ = set(['description']) +SfFbUninviteType._all_fields_ = [('description', SfFbUninviteType._description_validator)] + +SfInviteGroupDetails._target_asset_index_validator = bv.UInt64() +SfInviteGroupDetails._all_field_names_ = set(['target_asset_index']) +SfInviteGroupDetails._all_fields_ = [('target_asset_index', SfInviteGroupDetails._target_asset_index_validator)] + +SfInviteGroupType._description_validator = bv.String() +SfInviteGroupType._all_field_names_ = set(['description']) +SfInviteGroupType._all_fields_ = [('description', SfInviteGroupType._description_validator)] + +SfTeamGrantAccessDetails._target_asset_index_validator = bv.UInt64() +SfTeamGrantAccessDetails._original_folder_name_validator = bv.String() +SfTeamGrantAccessDetails._all_field_names_ = set([ + 'target_asset_index', + 'original_folder_name', +]) +SfTeamGrantAccessDetails._all_fields_ = [ + ('target_asset_index', SfTeamGrantAccessDetails._target_asset_index_validator), + ('original_folder_name', SfTeamGrantAccessDetails._original_folder_name_validator), +] + +SfTeamGrantAccessType._description_validator = bv.String() +SfTeamGrantAccessType._all_field_names_ = set(['description']) +SfTeamGrantAccessType._all_fields_ = [('description', SfTeamGrantAccessType._description_validator)] + +SfTeamInviteChangeRoleDetails._target_asset_index_validator = bv.UInt64() +SfTeamInviteChangeRoleDetails._original_folder_name_validator = bv.String() +SfTeamInviteChangeRoleDetails._new_sharing_permission_validator = bv.Nullable(bv.String()) +SfTeamInviteChangeRoleDetails._previous_sharing_permission_validator = bv.Nullable(bv.String()) +SfTeamInviteChangeRoleDetails._all_field_names_ = set([ + 'target_asset_index', + 'original_folder_name', + 'new_sharing_permission', + 'previous_sharing_permission', +]) +SfTeamInviteChangeRoleDetails._all_fields_ = [ + ('target_asset_index', SfTeamInviteChangeRoleDetails._target_asset_index_validator), + ('original_folder_name', SfTeamInviteChangeRoleDetails._original_folder_name_validator), + ('new_sharing_permission', SfTeamInviteChangeRoleDetails._new_sharing_permission_validator), + ('previous_sharing_permission', SfTeamInviteChangeRoleDetails._previous_sharing_permission_validator), +] + +SfTeamInviteChangeRoleType._description_validator = bv.String() +SfTeamInviteChangeRoleType._all_field_names_ = set(['description']) +SfTeamInviteChangeRoleType._all_fields_ = [('description', SfTeamInviteChangeRoleType._description_validator)] + +SfTeamInviteDetails._target_asset_index_validator = bv.UInt64() +SfTeamInviteDetails._original_folder_name_validator = bv.String() +SfTeamInviteDetails._sharing_permission_validator = bv.Nullable(bv.String()) +SfTeamInviteDetails._all_field_names_ = set([ + 'target_asset_index', + 'original_folder_name', + 'sharing_permission', +]) +SfTeamInviteDetails._all_fields_ = [ + ('target_asset_index', SfTeamInviteDetails._target_asset_index_validator), + ('original_folder_name', SfTeamInviteDetails._original_folder_name_validator), + ('sharing_permission', SfTeamInviteDetails._sharing_permission_validator), +] + +SfTeamInviteType._description_validator = bv.String() +SfTeamInviteType._all_field_names_ = set(['description']) +SfTeamInviteType._all_fields_ = [('description', SfTeamInviteType._description_validator)] + +SfTeamJoinDetails._target_asset_index_validator = bv.UInt64() +SfTeamJoinDetails._original_folder_name_validator = bv.String() +SfTeamJoinDetails._all_field_names_ = set([ + 'target_asset_index', + 'original_folder_name', +]) +SfTeamJoinDetails._all_fields_ = [ + ('target_asset_index', SfTeamJoinDetails._target_asset_index_validator), + ('original_folder_name', SfTeamJoinDetails._original_folder_name_validator), +] + +SfTeamJoinFromOobLinkDetails._target_asset_index_validator = bv.UInt64() +SfTeamJoinFromOobLinkDetails._original_folder_name_validator = bv.String() +SfTeamJoinFromOobLinkDetails._token_key_validator = bv.Nullable(bv.String()) +SfTeamJoinFromOobLinkDetails._sharing_permission_validator = bv.Nullable(bv.String()) +SfTeamJoinFromOobLinkDetails._all_field_names_ = set([ + 'target_asset_index', + 'original_folder_name', + 'token_key', + 'sharing_permission', +]) +SfTeamJoinFromOobLinkDetails._all_fields_ = [ + ('target_asset_index', SfTeamJoinFromOobLinkDetails._target_asset_index_validator), + ('original_folder_name', SfTeamJoinFromOobLinkDetails._original_folder_name_validator), + ('token_key', SfTeamJoinFromOobLinkDetails._token_key_validator), + ('sharing_permission', SfTeamJoinFromOobLinkDetails._sharing_permission_validator), +] + +SfTeamJoinFromOobLinkType._description_validator = bv.String() +SfTeamJoinFromOobLinkType._all_field_names_ = set(['description']) +SfTeamJoinFromOobLinkType._all_fields_ = [('description', SfTeamJoinFromOobLinkType._description_validator)] + +SfTeamJoinType._description_validator = bv.String() +SfTeamJoinType._all_field_names_ = set(['description']) +SfTeamJoinType._all_fields_ = [('description', SfTeamJoinType._description_validator)] + +SfTeamUninviteDetails._target_asset_index_validator = bv.UInt64() +SfTeamUninviteDetails._original_folder_name_validator = bv.String() +SfTeamUninviteDetails._all_field_names_ = set([ + 'target_asset_index', + 'original_folder_name', +]) +SfTeamUninviteDetails._all_fields_ = [ + ('target_asset_index', SfTeamUninviteDetails._target_asset_index_validator), + ('original_folder_name', SfTeamUninviteDetails._original_folder_name_validator), +] + +SfTeamUninviteType._description_validator = bv.String() +SfTeamUninviteType._all_field_names_ = set(['description']) +SfTeamUninviteType._all_fields_ = [('description', SfTeamUninviteType._description_validator)] + +SharedContentAddInviteesDetails._shared_content_access_level_validator = sharing.AccessLevel_validator +SharedContentAddInviteesDetails._invitees_validator = bv.List(EmailAddress_validator) +SharedContentAddInviteesDetails._all_field_names_ = set([ + 'shared_content_access_level', + 'invitees', +]) +SharedContentAddInviteesDetails._all_fields_ = [ + ('shared_content_access_level', SharedContentAddInviteesDetails._shared_content_access_level_validator), + ('invitees', SharedContentAddInviteesDetails._invitees_validator), +] + +SharedContentAddInviteesType._description_validator = bv.String() +SharedContentAddInviteesType._all_field_names_ = set(['description']) +SharedContentAddInviteesType._all_fields_ = [('description', SharedContentAddInviteesType._description_validator)] + +SharedContentAddLinkExpiryDetails._new_value_validator = bv.Nullable(common.DropboxTimestamp_validator) +SharedContentAddLinkExpiryDetails._all_field_names_ = set(['new_value']) +SharedContentAddLinkExpiryDetails._all_fields_ = [('new_value', SharedContentAddLinkExpiryDetails._new_value_validator)] + +SharedContentAddLinkExpiryType._description_validator = bv.String() +SharedContentAddLinkExpiryType._all_field_names_ = set(['description']) +SharedContentAddLinkExpiryType._all_fields_ = [('description', SharedContentAddLinkExpiryType._description_validator)] + +SharedContentAddLinkPasswordDetails._all_field_names_ = set([]) +SharedContentAddLinkPasswordDetails._all_fields_ = [] + +SharedContentAddLinkPasswordType._description_validator = bv.String() +SharedContentAddLinkPasswordType._all_field_names_ = set(['description']) +SharedContentAddLinkPasswordType._all_fields_ = [('description', SharedContentAddLinkPasswordType._description_validator)] + +SharedContentAddMemberDetails._shared_content_access_level_validator = sharing.AccessLevel_validator +SharedContentAddMemberDetails._all_field_names_ = set(['shared_content_access_level']) +SharedContentAddMemberDetails._all_fields_ = [('shared_content_access_level', SharedContentAddMemberDetails._shared_content_access_level_validator)] + +SharedContentAddMemberType._description_validator = bv.String() +SharedContentAddMemberType._all_field_names_ = set(['description']) +SharedContentAddMemberType._all_fields_ = [('description', SharedContentAddMemberType._description_validator)] + +SharedContentChangeDownloadsPolicyDetails._new_value_validator = DownloadPolicyType_validator +SharedContentChangeDownloadsPolicyDetails._previous_value_validator = bv.Nullable(DownloadPolicyType_validator) +SharedContentChangeDownloadsPolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +SharedContentChangeDownloadsPolicyDetails._all_fields_ = [ + ('new_value', SharedContentChangeDownloadsPolicyDetails._new_value_validator), + ('previous_value', SharedContentChangeDownloadsPolicyDetails._previous_value_validator), +] + +SharedContentChangeDownloadsPolicyType._description_validator = bv.String() +SharedContentChangeDownloadsPolicyType._all_field_names_ = set(['description']) +SharedContentChangeDownloadsPolicyType._all_fields_ = [('description', SharedContentChangeDownloadsPolicyType._description_validator)] + +SharedContentChangeInviteeRoleDetails._previous_access_level_validator = bv.Nullable(sharing.AccessLevel_validator) +SharedContentChangeInviteeRoleDetails._new_access_level_validator = sharing.AccessLevel_validator +SharedContentChangeInviteeRoleDetails._invitee_validator = EmailAddress_validator +SharedContentChangeInviteeRoleDetails._all_field_names_ = set([ + 'previous_access_level', + 'new_access_level', + 'invitee', +]) +SharedContentChangeInviteeRoleDetails._all_fields_ = [ + ('previous_access_level', SharedContentChangeInviteeRoleDetails._previous_access_level_validator), + ('new_access_level', SharedContentChangeInviteeRoleDetails._new_access_level_validator), + ('invitee', SharedContentChangeInviteeRoleDetails._invitee_validator), +] + +SharedContentChangeInviteeRoleType._description_validator = bv.String() +SharedContentChangeInviteeRoleType._all_field_names_ = set(['description']) +SharedContentChangeInviteeRoleType._all_fields_ = [('description', SharedContentChangeInviteeRoleType._description_validator)] + +SharedContentChangeLinkAudienceDetails._new_value_validator = sharing.LinkAudience_validator +SharedContentChangeLinkAudienceDetails._previous_value_validator = bv.Nullable(sharing.LinkAudience_validator) +SharedContentChangeLinkAudienceDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +SharedContentChangeLinkAudienceDetails._all_fields_ = [ + ('new_value', SharedContentChangeLinkAudienceDetails._new_value_validator), + ('previous_value', SharedContentChangeLinkAudienceDetails._previous_value_validator), +] + +SharedContentChangeLinkAudienceType._description_validator = bv.String() +SharedContentChangeLinkAudienceType._all_field_names_ = set(['description']) +SharedContentChangeLinkAudienceType._all_fields_ = [('description', SharedContentChangeLinkAudienceType._description_validator)] + +SharedContentChangeLinkExpiryDetails._new_value_validator = bv.Nullable(common.DropboxTimestamp_validator) +SharedContentChangeLinkExpiryDetails._previous_value_validator = bv.Nullable(common.DropboxTimestamp_validator) +SharedContentChangeLinkExpiryDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +SharedContentChangeLinkExpiryDetails._all_fields_ = [ + ('new_value', SharedContentChangeLinkExpiryDetails._new_value_validator), + ('previous_value', SharedContentChangeLinkExpiryDetails._previous_value_validator), +] + +SharedContentChangeLinkExpiryType._description_validator = bv.String() +SharedContentChangeLinkExpiryType._all_field_names_ = set(['description']) +SharedContentChangeLinkExpiryType._all_fields_ = [('description', SharedContentChangeLinkExpiryType._description_validator)] + +SharedContentChangeLinkPasswordDetails._all_field_names_ = set([]) +SharedContentChangeLinkPasswordDetails._all_fields_ = [] + +SharedContentChangeLinkPasswordType._description_validator = bv.String() +SharedContentChangeLinkPasswordType._all_field_names_ = set(['description']) +SharedContentChangeLinkPasswordType._all_fields_ = [('description', SharedContentChangeLinkPasswordType._description_validator)] + +SharedContentChangeMemberRoleDetails._previous_access_level_validator = bv.Nullable(sharing.AccessLevel_validator) +SharedContentChangeMemberRoleDetails._new_access_level_validator = sharing.AccessLevel_validator +SharedContentChangeMemberRoleDetails._all_field_names_ = set([ + 'previous_access_level', + 'new_access_level', +]) +SharedContentChangeMemberRoleDetails._all_fields_ = [ + ('previous_access_level', SharedContentChangeMemberRoleDetails._previous_access_level_validator), + ('new_access_level', SharedContentChangeMemberRoleDetails._new_access_level_validator), +] + +SharedContentChangeMemberRoleType._description_validator = bv.String() +SharedContentChangeMemberRoleType._all_field_names_ = set(['description']) +SharedContentChangeMemberRoleType._all_fields_ = [('description', SharedContentChangeMemberRoleType._description_validator)] + +SharedContentChangeViewerInfoPolicyDetails._new_value_validator = sharing.ViewerInfoPolicy_validator +SharedContentChangeViewerInfoPolicyDetails._previous_value_validator = bv.Nullable(sharing.ViewerInfoPolicy_validator) +SharedContentChangeViewerInfoPolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +SharedContentChangeViewerInfoPolicyDetails._all_fields_ = [ + ('new_value', SharedContentChangeViewerInfoPolicyDetails._new_value_validator), + ('previous_value', SharedContentChangeViewerInfoPolicyDetails._previous_value_validator), +] + +SharedContentChangeViewerInfoPolicyType._description_validator = bv.String() +SharedContentChangeViewerInfoPolicyType._all_field_names_ = set(['description']) +SharedContentChangeViewerInfoPolicyType._all_fields_ = [('description', SharedContentChangeViewerInfoPolicyType._description_validator)] + +SharedContentClaimInvitationDetails._shared_content_link_validator = bv.Nullable(bv.String()) +SharedContentClaimInvitationDetails._all_field_names_ = set(['shared_content_link']) +SharedContentClaimInvitationDetails._all_fields_ = [('shared_content_link', SharedContentClaimInvitationDetails._shared_content_link_validator)] + +SharedContentClaimInvitationType._description_validator = bv.String() +SharedContentClaimInvitationType._all_field_names_ = set(['description']) +SharedContentClaimInvitationType._all_fields_ = [('description', SharedContentClaimInvitationType._description_validator)] + +SharedContentCopyDetails._shared_content_link_validator = bv.String() +SharedContentCopyDetails._shared_content_owner_validator = bv.Nullable(UserLogInfo_validator) +SharedContentCopyDetails._shared_content_access_level_validator = sharing.AccessLevel_validator +SharedContentCopyDetails._destination_path_validator = FilePath_validator +SharedContentCopyDetails._all_field_names_ = set([ + 'shared_content_link', + 'shared_content_owner', + 'shared_content_access_level', + 'destination_path', +]) +SharedContentCopyDetails._all_fields_ = [ + ('shared_content_link', SharedContentCopyDetails._shared_content_link_validator), + ('shared_content_owner', SharedContentCopyDetails._shared_content_owner_validator), + ('shared_content_access_level', SharedContentCopyDetails._shared_content_access_level_validator), + ('destination_path', SharedContentCopyDetails._destination_path_validator), +] + +SharedContentCopyType._description_validator = bv.String() +SharedContentCopyType._all_field_names_ = set(['description']) +SharedContentCopyType._all_fields_ = [('description', SharedContentCopyType._description_validator)] + +SharedContentDownloadDetails._shared_content_link_validator = bv.String() +SharedContentDownloadDetails._shared_content_owner_validator = bv.Nullable(UserLogInfo_validator) +SharedContentDownloadDetails._shared_content_access_level_validator = sharing.AccessLevel_validator +SharedContentDownloadDetails._all_field_names_ = set([ + 'shared_content_link', + 'shared_content_owner', + 'shared_content_access_level', +]) +SharedContentDownloadDetails._all_fields_ = [ + ('shared_content_link', SharedContentDownloadDetails._shared_content_link_validator), + ('shared_content_owner', SharedContentDownloadDetails._shared_content_owner_validator), + ('shared_content_access_level', SharedContentDownloadDetails._shared_content_access_level_validator), +] + +SharedContentDownloadType._description_validator = bv.String() +SharedContentDownloadType._all_field_names_ = set(['description']) +SharedContentDownloadType._all_fields_ = [('description', SharedContentDownloadType._description_validator)] + +SharedContentRelinquishMembershipDetails._all_field_names_ = set([]) +SharedContentRelinquishMembershipDetails._all_fields_ = [] + +SharedContentRelinquishMembershipType._description_validator = bv.String() +SharedContentRelinquishMembershipType._all_field_names_ = set(['description']) +SharedContentRelinquishMembershipType._all_fields_ = [('description', SharedContentRelinquishMembershipType._description_validator)] + +SharedContentRemoveInviteesDetails._invitees_validator = bv.List(EmailAddress_validator) +SharedContentRemoveInviteesDetails._all_field_names_ = set(['invitees']) +SharedContentRemoveInviteesDetails._all_fields_ = [('invitees', SharedContentRemoveInviteesDetails._invitees_validator)] + +SharedContentRemoveInviteesType._description_validator = bv.String() +SharedContentRemoveInviteesType._all_field_names_ = set(['description']) +SharedContentRemoveInviteesType._all_fields_ = [('description', SharedContentRemoveInviteesType._description_validator)] + +SharedContentRemoveLinkExpiryDetails._previous_value_validator = bv.Nullable(common.DropboxTimestamp_validator) +SharedContentRemoveLinkExpiryDetails._all_field_names_ = set(['previous_value']) +SharedContentRemoveLinkExpiryDetails._all_fields_ = [('previous_value', SharedContentRemoveLinkExpiryDetails._previous_value_validator)] + +SharedContentRemoveLinkExpiryType._description_validator = bv.String() +SharedContentRemoveLinkExpiryType._all_field_names_ = set(['description']) +SharedContentRemoveLinkExpiryType._all_fields_ = [('description', SharedContentRemoveLinkExpiryType._description_validator)] + +SharedContentRemoveLinkPasswordDetails._all_field_names_ = set([]) +SharedContentRemoveLinkPasswordDetails._all_fields_ = [] + +SharedContentRemoveLinkPasswordType._description_validator = bv.String() +SharedContentRemoveLinkPasswordType._all_field_names_ = set(['description']) +SharedContentRemoveLinkPasswordType._all_fields_ = [('description', SharedContentRemoveLinkPasswordType._description_validator)] + +SharedContentRemoveMemberDetails._shared_content_access_level_validator = bv.Nullable(sharing.AccessLevel_validator) +SharedContentRemoveMemberDetails._all_field_names_ = set(['shared_content_access_level']) +SharedContentRemoveMemberDetails._all_fields_ = [('shared_content_access_level', SharedContentRemoveMemberDetails._shared_content_access_level_validator)] + +SharedContentRemoveMemberType._description_validator = bv.String() +SharedContentRemoveMemberType._all_field_names_ = set(['description']) +SharedContentRemoveMemberType._all_fields_ = [('description', SharedContentRemoveMemberType._description_validator)] + +SharedContentRequestAccessDetails._shared_content_link_validator = bv.Nullable(bv.String()) +SharedContentRequestAccessDetails._all_field_names_ = set(['shared_content_link']) +SharedContentRequestAccessDetails._all_fields_ = [('shared_content_link', SharedContentRequestAccessDetails._shared_content_link_validator)] + +SharedContentRequestAccessType._description_validator = bv.String() +SharedContentRequestAccessType._all_field_names_ = set(['description']) +SharedContentRequestAccessType._all_fields_ = [('description', SharedContentRequestAccessType._description_validator)] + +SharedContentUnshareDetails._all_field_names_ = set([]) +SharedContentUnshareDetails._all_fields_ = [] + +SharedContentUnshareType._description_validator = bv.String() +SharedContentUnshareType._all_field_names_ = set(['description']) +SharedContentUnshareType._all_fields_ = [('description', SharedContentUnshareType._description_validator)] + +SharedContentViewDetails._shared_content_link_validator = bv.String() +SharedContentViewDetails._shared_content_owner_validator = bv.Nullable(UserLogInfo_validator) +SharedContentViewDetails._shared_content_access_level_validator = sharing.AccessLevel_validator +SharedContentViewDetails._all_field_names_ = set([ + 'shared_content_link', + 'shared_content_owner', + 'shared_content_access_level', +]) +SharedContentViewDetails._all_fields_ = [ + ('shared_content_link', SharedContentViewDetails._shared_content_link_validator), + ('shared_content_owner', SharedContentViewDetails._shared_content_owner_validator), + ('shared_content_access_level', SharedContentViewDetails._shared_content_access_level_validator), +] + +SharedContentViewType._description_validator = bv.String() +SharedContentViewType._all_field_names_ = set(['description']) +SharedContentViewType._all_fields_ = [('description', SharedContentViewType._description_validator)] + +SharedFolderChangeLinkPolicyDetails._new_value_validator = sharing.SharedLinkPolicy_validator +SharedFolderChangeLinkPolicyDetails._previous_value_validator = bv.Nullable(sharing.SharedLinkPolicy_validator) +SharedFolderChangeLinkPolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +SharedFolderChangeLinkPolicyDetails._all_fields_ = [ + ('new_value', SharedFolderChangeLinkPolicyDetails._new_value_validator), + ('previous_value', SharedFolderChangeLinkPolicyDetails._previous_value_validator), +] + +SharedFolderChangeLinkPolicyType._description_validator = bv.String() +SharedFolderChangeLinkPolicyType._all_field_names_ = set(['description']) +SharedFolderChangeLinkPolicyType._all_fields_ = [('description', SharedFolderChangeLinkPolicyType._description_validator)] + +SharedFolderChangeMembersInheritancePolicyDetails._new_value_validator = SharedFolderMembersInheritancePolicy_validator +SharedFolderChangeMembersInheritancePolicyDetails._previous_value_validator = bv.Nullable(SharedFolderMembersInheritancePolicy_validator) +SharedFolderChangeMembersInheritancePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +SharedFolderChangeMembersInheritancePolicyDetails._all_fields_ = [ + ('new_value', SharedFolderChangeMembersInheritancePolicyDetails._new_value_validator), + ('previous_value', SharedFolderChangeMembersInheritancePolicyDetails._previous_value_validator), +] + +SharedFolderChangeMembersInheritancePolicyType._description_validator = bv.String() +SharedFolderChangeMembersInheritancePolicyType._all_field_names_ = set(['description']) +SharedFolderChangeMembersInheritancePolicyType._all_fields_ = [('description', SharedFolderChangeMembersInheritancePolicyType._description_validator)] + +SharedFolderChangeMembersManagementPolicyDetails._new_value_validator = sharing.AclUpdatePolicy_validator +SharedFolderChangeMembersManagementPolicyDetails._previous_value_validator = bv.Nullable(sharing.AclUpdatePolicy_validator) +SharedFolderChangeMembersManagementPolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +SharedFolderChangeMembersManagementPolicyDetails._all_fields_ = [ + ('new_value', SharedFolderChangeMembersManagementPolicyDetails._new_value_validator), + ('previous_value', SharedFolderChangeMembersManagementPolicyDetails._previous_value_validator), +] + +SharedFolderChangeMembersManagementPolicyType._description_validator = bv.String() +SharedFolderChangeMembersManagementPolicyType._all_field_names_ = set(['description']) +SharedFolderChangeMembersManagementPolicyType._all_fields_ = [('description', SharedFolderChangeMembersManagementPolicyType._description_validator)] + +SharedFolderChangeMembersPolicyDetails._new_value_validator = sharing.MemberPolicy_validator +SharedFolderChangeMembersPolicyDetails._previous_value_validator = bv.Nullable(sharing.MemberPolicy_validator) +SharedFolderChangeMembersPolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +SharedFolderChangeMembersPolicyDetails._all_fields_ = [ + ('new_value', SharedFolderChangeMembersPolicyDetails._new_value_validator), + ('previous_value', SharedFolderChangeMembersPolicyDetails._previous_value_validator), +] + +SharedFolderChangeMembersPolicyType._description_validator = bv.String() +SharedFolderChangeMembersPolicyType._all_field_names_ = set(['description']) +SharedFolderChangeMembersPolicyType._all_fields_ = [('description', SharedFolderChangeMembersPolicyType._description_validator)] + +SharedFolderCreateDetails._target_ns_id_validator = bv.Nullable(NamespaceId_validator) +SharedFolderCreateDetails._all_field_names_ = set(['target_ns_id']) +SharedFolderCreateDetails._all_fields_ = [('target_ns_id', SharedFolderCreateDetails._target_ns_id_validator)] + +SharedFolderCreateType._description_validator = bv.String() +SharedFolderCreateType._all_field_names_ = set(['description']) +SharedFolderCreateType._all_fields_ = [('description', SharedFolderCreateType._description_validator)] + +SharedFolderDeclineInvitationDetails._all_field_names_ = set([]) +SharedFolderDeclineInvitationDetails._all_fields_ = [] + +SharedFolderDeclineInvitationType._description_validator = bv.String() +SharedFolderDeclineInvitationType._all_field_names_ = set(['description']) +SharedFolderDeclineInvitationType._all_fields_ = [('description', SharedFolderDeclineInvitationType._description_validator)] + +SharedFolderMembersInheritancePolicy._inherit_members_validator = bv.Void() +SharedFolderMembersInheritancePolicy._dont_inherit_members_validator = bv.Void() +SharedFolderMembersInheritancePolicy._other_validator = bv.Void() +SharedFolderMembersInheritancePolicy._tagmap = { + 'inherit_members': SharedFolderMembersInheritancePolicy._inherit_members_validator, + 'dont_inherit_members': SharedFolderMembersInheritancePolicy._dont_inherit_members_validator, + 'other': SharedFolderMembersInheritancePolicy._other_validator, +} + +SharedFolderMembersInheritancePolicy.inherit_members = SharedFolderMembersInheritancePolicy('inherit_members') +SharedFolderMembersInheritancePolicy.dont_inherit_members = SharedFolderMembersInheritancePolicy('dont_inherit_members') +SharedFolderMembersInheritancePolicy.other = SharedFolderMembersInheritancePolicy('other') + +SharedFolderMountDetails._all_field_names_ = set([]) +SharedFolderMountDetails._all_fields_ = [] + +SharedFolderMountType._description_validator = bv.String() +SharedFolderMountType._all_field_names_ = set(['description']) +SharedFolderMountType._all_fields_ = [('description', SharedFolderMountType._description_validator)] + +SharedFolderNestDetails._previous_parent_ns_id_validator = bv.Nullable(NamespaceId_validator) +SharedFolderNestDetails._new_parent_ns_id_validator = bv.Nullable(NamespaceId_validator) +SharedFolderNestDetails._previous_ns_path_validator = bv.Nullable(FilePath_validator) +SharedFolderNestDetails._new_ns_path_validator = bv.Nullable(FilePath_validator) +SharedFolderNestDetails._all_field_names_ = set([ + 'previous_parent_ns_id', + 'new_parent_ns_id', + 'previous_ns_path', + 'new_ns_path', +]) +SharedFolderNestDetails._all_fields_ = [ + ('previous_parent_ns_id', SharedFolderNestDetails._previous_parent_ns_id_validator), + ('new_parent_ns_id', SharedFolderNestDetails._new_parent_ns_id_validator), + ('previous_ns_path', SharedFolderNestDetails._previous_ns_path_validator), + ('new_ns_path', SharedFolderNestDetails._new_ns_path_validator), +] + +SharedFolderNestType._description_validator = bv.String() +SharedFolderNestType._all_field_names_ = set(['description']) +SharedFolderNestType._all_fields_ = [('description', SharedFolderNestType._description_validator)] + +SharedFolderTransferOwnershipDetails._previous_owner_email_validator = bv.Nullable(EmailAddress_validator) +SharedFolderTransferOwnershipDetails._new_owner_email_validator = EmailAddress_validator +SharedFolderTransferOwnershipDetails._all_field_names_ = set([ + 'previous_owner_email', + 'new_owner_email', +]) +SharedFolderTransferOwnershipDetails._all_fields_ = [ + ('previous_owner_email', SharedFolderTransferOwnershipDetails._previous_owner_email_validator), + ('new_owner_email', SharedFolderTransferOwnershipDetails._new_owner_email_validator), +] + +SharedFolderTransferOwnershipType._description_validator = bv.String() +SharedFolderTransferOwnershipType._all_field_names_ = set(['description']) +SharedFolderTransferOwnershipType._all_fields_ = [('description', SharedFolderTransferOwnershipType._description_validator)] + +SharedFolderUnmountDetails._all_field_names_ = set([]) +SharedFolderUnmountDetails._all_fields_ = [] + +SharedFolderUnmountType._description_validator = bv.String() +SharedFolderUnmountType._all_field_names_ = set(['description']) +SharedFolderUnmountType._all_fields_ = [('description', SharedFolderUnmountType._description_validator)] + +SharedLinkAccessLevel._none_validator = bv.Void() +SharedLinkAccessLevel._reader_validator = bv.Void() +SharedLinkAccessLevel._writer_validator = bv.Void() +SharedLinkAccessLevel._other_validator = bv.Void() +SharedLinkAccessLevel._tagmap = { + 'none': SharedLinkAccessLevel._none_validator, + 'reader': SharedLinkAccessLevel._reader_validator, + 'writer': SharedLinkAccessLevel._writer_validator, + 'other': SharedLinkAccessLevel._other_validator, +} + +SharedLinkAccessLevel.none = SharedLinkAccessLevel('none') +SharedLinkAccessLevel.reader = SharedLinkAccessLevel('reader') +SharedLinkAccessLevel.writer = SharedLinkAccessLevel('writer') +SharedLinkAccessLevel.other = SharedLinkAccessLevel('other') + +SharedLinkAddExpiryDetails._new_value_validator = common.DropboxTimestamp_validator +SharedLinkAddExpiryDetails._all_field_names_ = set(['new_value']) +SharedLinkAddExpiryDetails._all_fields_ = [('new_value', SharedLinkAddExpiryDetails._new_value_validator)] + +SharedLinkAddExpiryType._description_validator = bv.String() +SharedLinkAddExpiryType._all_field_names_ = set(['description']) +SharedLinkAddExpiryType._all_fields_ = [('description', SharedLinkAddExpiryType._description_validator)] + +SharedLinkChangeExpiryDetails._new_value_validator = bv.Nullable(common.DropboxTimestamp_validator) +SharedLinkChangeExpiryDetails._previous_value_validator = bv.Nullable(common.DropboxTimestamp_validator) +SharedLinkChangeExpiryDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +SharedLinkChangeExpiryDetails._all_fields_ = [ + ('new_value', SharedLinkChangeExpiryDetails._new_value_validator), + ('previous_value', SharedLinkChangeExpiryDetails._previous_value_validator), +] + +SharedLinkChangeExpiryType._description_validator = bv.String() +SharedLinkChangeExpiryType._all_field_names_ = set(['description']) +SharedLinkChangeExpiryType._all_fields_ = [('description', SharedLinkChangeExpiryType._description_validator)] + +SharedLinkChangeVisibilityDetails._new_value_validator = SharedLinkVisibility_validator +SharedLinkChangeVisibilityDetails._previous_value_validator = bv.Nullable(SharedLinkVisibility_validator) +SharedLinkChangeVisibilityDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +SharedLinkChangeVisibilityDetails._all_fields_ = [ + ('new_value', SharedLinkChangeVisibilityDetails._new_value_validator), + ('previous_value', SharedLinkChangeVisibilityDetails._previous_value_validator), +] + +SharedLinkChangeVisibilityType._description_validator = bv.String() +SharedLinkChangeVisibilityType._all_field_names_ = set(['description']) +SharedLinkChangeVisibilityType._all_fields_ = [('description', SharedLinkChangeVisibilityType._description_validator)] + +SharedLinkCopyDetails._shared_link_owner_validator = bv.Nullable(UserLogInfo_validator) +SharedLinkCopyDetails._all_field_names_ = set(['shared_link_owner']) +SharedLinkCopyDetails._all_fields_ = [('shared_link_owner', SharedLinkCopyDetails._shared_link_owner_validator)] + +SharedLinkCopyType._description_validator = bv.String() +SharedLinkCopyType._all_field_names_ = set(['description']) +SharedLinkCopyType._all_fields_ = [('description', SharedLinkCopyType._description_validator)] + +SharedLinkCreateDetails._shared_link_access_level_validator = bv.Nullable(SharedLinkAccessLevel_validator) +SharedLinkCreateDetails._all_field_names_ = set(['shared_link_access_level']) +SharedLinkCreateDetails._all_fields_ = [('shared_link_access_level', SharedLinkCreateDetails._shared_link_access_level_validator)] + +SharedLinkCreateType._description_validator = bv.String() +SharedLinkCreateType._all_field_names_ = set(['description']) +SharedLinkCreateType._all_fields_ = [('description', SharedLinkCreateType._description_validator)] + +SharedLinkDisableDetails._shared_link_owner_validator = bv.Nullable(UserLogInfo_validator) +SharedLinkDisableDetails._all_field_names_ = set(['shared_link_owner']) +SharedLinkDisableDetails._all_fields_ = [('shared_link_owner', SharedLinkDisableDetails._shared_link_owner_validator)] + +SharedLinkDisableType._description_validator = bv.String() +SharedLinkDisableType._all_field_names_ = set(['description']) +SharedLinkDisableType._all_fields_ = [('description', SharedLinkDisableType._description_validator)] + +SharedLinkDownloadDetails._shared_link_owner_validator = bv.Nullable(UserLogInfo_validator) +SharedLinkDownloadDetails._all_field_names_ = set(['shared_link_owner']) +SharedLinkDownloadDetails._all_fields_ = [('shared_link_owner', SharedLinkDownloadDetails._shared_link_owner_validator)] + +SharedLinkDownloadType._description_validator = bv.String() +SharedLinkDownloadType._all_field_names_ = set(['description']) +SharedLinkDownloadType._all_fields_ = [('description', SharedLinkDownloadType._description_validator)] + +SharedLinkRemoveExpiryDetails._previous_value_validator = bv.Nullable(common.DropboxTimestamp_validator) +SharedLinkRemoveExpiryDetails._all_field_names_ = set(['previous_value']) +SharedLinkRemoveExpiryDetails._all_fields_ = [('previous_value', SharedLinkRemoveExpiryDetails._previous_value_validator)] + +SharedLinkRemoveExpiryType._description_validator = bv.String() +SharedLinkRemoveExpiryType._all_field_names_ = set(['description']) +SharedLinkRemoveExpiryType._all_fields_ = [('description', SharedLinkRemoveExpiryType._description_validator)] + +SharedLinkShareDetails._shared_link_owner_validator = bv.Nullable(UserLogInfo_validator) +SharedLinkShareDetails._external_users_validator = bv.Nullable(bv.List(ExternalUserLogInfo_validator)) +SharedLinkShareDetails._all_field_names_ = set([ + 'shared_link_owner', + 'external_users', +]) +SharedLinkShareDetails._all_fields_ = [ + ('shared_link_owner', SharedLinkShareDetails._shared_link_owner_validator), + ('external_users', SharedLinkShareDetails._external_users_validator), +] + +SharedLinkShareType._description_validator = bv.String() +SharedLinkShareType._all_field_names_ = set(['description']) +SharedLinkShareType._all_fields_ = [('description', SharedLinkShareType._description_validator)] + +SharedLinkViewDetails._shared_link_owner_validator = bv.Nullable(UserLogInfo_validator) +SharedLinkViewDetails._all_field_names_ = set(['shared_link_owner']) +SharedLinkViewDetails._all_fields_ = [('shared_link_owner', SharedLinkViewDetails._shared_link_owner_validator)] + +SharedLinkViewType._description_validator = bv.String() +SharedLinkViewType._all_field_names_ = set(['description']) +SharedLinkViewType._all_fields_ = [('description', SharedLinkViewType._description_validator)] + +SharedLinkVisibility._password_validator = bv.Void() +SharedLinkVisibility._public_validator = bv.Void() +SharedLinkVisibility._team_only_validator = bv.Void() +SharedLinkVisibility._other_validator = bv.Void() +SharedLinkVisibility._tagmap = { + 'password': SharedLinkVisibility._password_validator, + 'public': SharedLinkVisibility._public_validator, + 'team_only': SharedLinkVisibility._team_only_validator, + 'other': SharedLinkVisibility._other_validator, +} + +SharedLinkVisibility.password = SharedLinkVisibility('password') +SharedLinkVisibility.public = SharedLinkVisibility('public') +SharedLinkVisibility.team_only = SharedLinkVisibility('team_only') +SharedLinkVisibility.other = SharedLinkVisibility('other') + +SharedNoteOpenedDetails._all_field_names_ = set([]) +SharedNoteOpenedDetails._all_fields_ = [] + +SharedNoteOpenedType._description_validator = bv.String() +SharedNoteOpenedType._all_field_names_ = set(['description']) +SharedNoteOpenedType._all_fields_ = [('description', SharedNoteOpenedType._description_validator)] + +SharingChangeFolderJoinPolicyDetails._new_value_validator = SharingFolderJoinPolicy_validator +SharingChangeFolderJoinPolicyDetails._previous_value_validator = bv.Nullable(SharingFolderJoinPolicy_validator) +SharingChangeFolderJoinPolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +SharingChangeFolderJoinPolicyDetails._all_fields_ = [ + ('new_value', SharingChangeFolderJoinPolicyDetails._new_value_validator), + ('previous_value', SharingChangeFolderJoinPolicyDetails._previous_value_validator), +] + +SharingChangeFolderJoinPolicyType._description_validator = bv.String() +SharingChangeFolderJoinPolicyType._all_field_names_ = set(['description']) +SharingChangeFolderJoinPolicyType._all_fields_ = [('description', SharingChangeFolderJoinPolicyType._description_validator)] + +SharingChangeLinkPolicyDetails._new_value_validator = SharingLinkPolicy_validator +SharingChangeLinkPolicyDetails._previous_value_validator = bv.Nullable(SharingLinkPolicy_validator) +SharingChangeLinkPolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +SharingChangeLinkPolicyDetails._all_fields_ = [ + ('new_value', SharingChangeLinkPolicyDetails._new_value_validator), + ('previous_value', SharingChangeLinkPolicyDetails._previous_value_validator), +] + +SharingChangeLinkPolicyType._description_validator = bv.String() +SharingChangeLinkPolicyType._all_field_names_ = set(['description']) +SharingChangeLinkPolicyType._all_fields_ = [('description', SharingChangeLinkPolicyType._description_validator)] + +SharingChangeMemberPolicyDetails._new_value_validator = SharingMemberPolicy_validator +SharingChangeMemberPolicyDetails._previous_value_validator = bv.Nullable(SharingMemberPolicy_validator) +SharingChangeMemberPolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +SharingChangeMemberPolicyDetails._all_fields_ = [ + ('new_value', SharingChangeMemberPolicyDetails._new_value_validator), + ('previous_value', SharingChangeMemberPolicyDetails._previous_value_validator), +] + +SharingChangeMemberPolicyType._description_validator = bv.String() +SharingChangeMemberPolicyType._all_field_names_ = set(['description']) +SharingChangeMemberPolicyType._all_fields_ = [('description', SharingChangeMemberPolicyType._description_validator)] + +SharingFolderJoinPolicy._from_anyone_validator = bv.Void() +SharingFolderJoinPolicy._from_team_only_validator = bv.Void() +SharingFolderJoinPolicy._other_validator = bv.Void() +SharingFolderJoinPolicy._tagmap = { + 'from_anyone': SharingFolderJoinPolicy._from_anyone_validator, + 'from_team_only': SharingFolderJoinPolicy._from_team_only_validator, + 'other': SharingFolderJoinPolicy._other_validator, +} + +SharingFolderJoinPolicy.from_anyone = SharingFolderJoinPolicy('from_anyone') +SharingFolderJoinPolicy.from_team_only = SharingFolderJoinPolicy('from_team_only') +SharingFolderJoinPolicy.other = SharingFolderJoinPolicy('other') + +SharingLinkPolicy._default_private_validator = bv.Void() +SharingLinkPolicy._default_public_validator = bv.Void() +SharingLinkPolicy._only_private_validator = bv.Void() +SharingLinkPolicy._other_validator = bv.Void() +SharingLinkPolicy._tagmap = { + 'default_private': SharingLinkPolicy._default_private_validator, + 'default_public': SharingLinkPolicy._default_public_validator, + 'only_private': SharingLinkPolicy._only_private_validator, + 'other': SharingLinkPolicy._other_validator, +} + +SharingLinkPolicy.default_private = SharingLinkPolicy('default_private') +SharingLinkPolicy.default_public = SharingLinkPolicy('default_public') +SharingLinkPolicy.only_private = SharingLinkPolicy('only_private') +SharingLinkPolicy.other = SharingLinkPolicy('other') + +SharingMemberPolicy._allow_validator = bv.Void() +SharingMemberPolicy._forbid_validator = bv.Void() +SharingMemberPolicy._other_validator = bv.Void() +SharingMemberPolicy._tagmap = { + 'allow': SharingMemberPolicy._allow_validator, + 'forbid': SharingMemberPolicy._forbid_validator, + 'other': SharingMemberPolicy._other_validator, +} + +SharingMemberPolicy.allow = SharingMemberPolicy('allow') +SharingMemberPolicy.forbid = SharingMemberPolicy('forbid') +SharingMemberPolicy.other = SharingMemberPolicy('other') + +ShmodelGroupShareDetails._all_field_names_ = set([]) +ShmodelGroupShareDetails._all_fields_ = [] + +ShmodelGroupShareType._description_validator = bv.String() +ShmodelGroupShareType._all_field_names_ = set(['description']) +ShmodelGroupShareType._all_fields_ = [('description', ShmodelGroupShareType._description_validator)] + +ShowcaseAccessGrantedDetails._event_uuid_validator = bv.String() +ShowcaseAccessGrantedDetails._all_field_names_ = set(['event_uuid']) +ShowcaseAccessGrantedDetails._all_fields_ = [('event_uuid', ShowcaseAccessGrantedDetails._event_uuid_validator)] + +ShowcaseAccessGrantedType._description_validator = bv.String() +ShowcaseAccessGrantedType._all_field_names_ = set(['description']) +ShowcaseAccessGrantedType._all_fields_ = [('description', ShowcaseAccessGrantedType._description_validator)] + +ShowcaseAddMemberDetails._event_uuid_validator = bv.String() +ShowcaseAddMemberDetails._all_field_names_ = set(['event_uuid']) +ShowcaseAddMemberDetails._all_fields_ = [('event_uuid', ShowcaseAddMemberDetails._event_uuid_validator)] + +ShowcaseAddMemberType._description_validator = bv.String() +ShowcaseAddMemberType._all_field_names_ = set(['description']) +ShowcaseAddMemberType._all_fields_ = [('description', ShowcaseAddMemberType._description_validator)] + +ShowcaseArchivedDetails._event_uuid_validator = bv.String() +ShowcaseArchivedDetails._all_field_names_ = set(['event_uuid']) +ShowcaseArchivedDetails._all_fields_ = [('event_uuid', ShowcaseArchivedDetails._event_uuid_validator)] + +ShowcaseArchivedType._description_validator = bv.String() +ShowcaseArchivedType._all_field_names_ = set(['description']) +ShowcaseArchivedType._all_fields_ = [('description', ShowcaseArchivedType._description_validator)] + +ShowcaseChangeDownloadPolicyDetails._new_value_validator = ShowcaseDownloadPolicy_validator +ShowcaseChangeDownloadPolicyDetails._previous_value_validator = ShowcaseDownloadPolicy_validator +ShowcaseChangeDownloadPolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +ShowcaseChangeDownloadPolicyDetails._all_fields_ = [ + ('new_value', ShowcaseChangeDownloadPolicyDetails._new_value_validator), + ('previous_value', ShowcaseChangeDownloadPolicyDetails._previous_value_validator), +] + +ShowcaseChangeDownloadPolicyType._description_validator = bv.String() +ShowcaseChangeDownloadPolicyType._all_field_names_ = set(['description']) +ShowcaseChangeDownloadPolicyType._all_fields_ = [('description', ShowcaseChangeDownloadPolicyType._description_validator)] + +ShowcaseChangeEnabledPolicyDetails._new_value_validator = ShowcaseEnabledPolicy_validator +ShowcaseChangeEnabledPolicyDetails._previous_value_validator = ShowcaseEnabledPolicy_validator +ShowcaseChangeEnabledPolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +ShowcaseChangeEnabledPolicyDetails._all_fields_ = [ + ('new_value', ShowcaseChangeEnabledPolicyDetails._new_value_validator), + ('previous_value', ShowcaseChangeEnabledPolicyDetails._previous_value_validator), +] + +ShowcaseChangeEnabledPolicyType._description_validator = bv.String() +ShowcaseChangeEnabledPolicyType._all_field_names_ = set(['description']) +ShowcaseChangeEnabledPolicyType._all_fields_ = [('description', ShowcaseChangeEnabledPolicyType._description_validator)] + +ShowcaseChangeExternalSharingPolicyDetails._new_value_validator = ShowcaseExternalSharingPolicy_validator +ShowcaseChangeExternalSharingPolicyDetails._previous_value_validator = ShowcaseExternalSharingPolicy_validator +ShowcaseChangeExternalSharingPolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +ShowcaseChangeExternalSharingPolicyDetails._all_fields_ = [ + ('new_value', ShowcaseChangeExternalSharingPolicyDetails._new_value_validator), + ('previous_value', ShowcaseChangeExternalSharingPolicyDetails._previous_value_validator), +] + +ShowcaseChangeExternalSharingPolicyType._description_validator = bv.String() +ShowcaseChangeExternalSharingPolicyType._all_field_names_ = set(['description']) +ShowcaseChangeExternalSharingPolicyType._all_fields_ = [('description', ShowcaseChangeExternalSharingPolicyType._description_validator)] + +ShowcaseCreatedDetails._event_uuid_validator = bv.String() +ShowcaseCreatedDetails._all_field_names_ = set(['event_uuid']) +ShowcaseCreatedDetails._all_fields_ = [('event_uuid', ShowcaseCreatedDetails._event_uuid_validator)] + +ShowcaseCreatedType._description_validator = bv.String() +ShowcaseCreatedType._all_field_names_ = set(['description']) +ShowcaseCreatedType._all_fields_ = [('description', ShowcaseCreatedType._description_validator)] + +ShowcaseDeleteCommentDetails._event_uuid_validator = bv.String() +ShowcaseDeleteCommentDetails._comment_text_validator = bv.Nullable(bv.String()) +ShowcaseDeleteCommentDetails._all_field_names_ = set([ + 'event_uuid', + 'comment_text', +]) +ShowcaseDeleteCommentDetails._all_fields_ = [ + ('event_uuid', ShowcaseDeleteCommentDetails._event_uuid_validator), + ('comment_text', ShowcaseDeleteCommentDetails._comment_text_validator), +] + +ShowcaseDeleteCommentType._description_validator = bv.String() +ShowcaseDeleteCommentType._all_field_names_ = set(['description']) +ShowcaseDeleteCommentType._all_fields_ = [('description', ShowcaseDeleteCommentType._description_validator)] + +ShowcaseDocumentLogInfo._showcase_id_validator = bv.String() +ShowcaseDocumentLogInfo._showcase_title_validator = bv.String() +ShowcaseDocumentLogInfo._all_field_names_ = set([ + 'showcase_id', + 'showcase_title', +]) +ShowcaseDocumentLogInfo._all_fields_ = [ + ('showcase_id', ShowcaseDocumentLogInfo._showcase_id_validator), + ('showcase_title', ShowcaseDocumentLogInfo._showcase_title_validator), +] + +ShowcaseDownloadPolicy._disabled_validator = bv.Void() +ShowcaseDownloadPolicy._enabled_validator = bv.Void() +ShowcaseDownloadPolicy._other_validator = bv.Void() +ShowcaseDownloadPolicy._tagmap = { + 'disabled': ShowcaseDownloadPolicy._disabled_validator, + 'enabled': ShowcaseDownloadPolicy._enabled_validator, + 'other': ShowcaseDownloadPolicy._other_validator, +} + +ShowcaseDownloadPolicy.disabled = ShowcaseDownloadPolicy('disabled') +ShowcaseDownloadPolicy.enabled = ShowcaseDownloadPolicy('enabled') +ShowcaseDownloadPolicy.other = ShowcaseDownloadPolicy('other') + +ShowcaseEditCommentDetails._event_uuid_validator = bv.String() +ShowcaseEditCommentDetails._comment_text_validator = bv.Nullable(bv.String()) +ShowcaseEditCommentDetails._all_field_names_ = set([ + 'event_uuid', + 'comment_text', +]) +ShowcaseEditCommentDetails._all_fields_ = [ + ('event_uuid', ShowcaseEditCommentDetails._event_uuid_validator), + ('comment_text', ShowcaseEditCommentDetails._comment_text_validator), +] + +ShowcaseEditCommentType._description_validator = bv.String() +ShowcaseEditCommentType._all_field_names_ = set(['description']) +ShowcaseEditCommentType._all_fields_ = [('description', ShowcaseEditCommentType._description_validator)] + +ShowcaseEditedDetails._event_uuid_validator = bv.String() +ShowcaseEditedDetails._all_field_names_ = set(['event_uuid']) +ShowcaseEditedDetails._all_fields_ = [('event_uuid', ShowcaseEditedDetails._event_uuid_validator)] + +ShowcaseEditedType._description_validator = bv.String() +ShowcaseEditedType._all_field_names_ = set(['description']) +ShowcaseEditedType._all_fields_ = [('description', ShowcaseEditedType._description_validator)] + +ShowcaseEnabledPolicy._disabled_validator = bv.Void() +ShowcaseEnabledPolicy._enabled_validator = bv.Void() +ShowcaseEnabledPolicy._other_validator = bv.Void() +ShowcaseEnabledPolicy._tagmap = { + 'disabled': ShowcaseEnabledPolicy._disabled_validator, + 'enabled': ShowcaseEnabledPolicy._enabled_validator, + 'other': ShowcaseEnabledPolicy._other_validator, +} + +ShowcaseEnabledPolicy.disabled = ShowcaseEnabledPolicy('disabled') +ShowcaseEnabledPolicy.enabled = ShowcaseEnabledPolicy('enabled') +ShowcaseEnabledPolicy.other = ShowcaseEnabledPolicy('other') + +ShowcaseExternalSharingPolicy._disabled_validator = bv.Void() +ShowcaseExternalSharingPolicy._enabled_validator = bv.Void() +ShowcaseExternalSharingPolicy._other_validator = bv.Void() +ShowcaseExternalSharingPolicy._tagmap = { + 'disabled': ShowcaseExternalSharingPolicy._disabled_validator, + 'enabled': ShowcaseExternalSharingPolicy._enabled_validator, + 'other': ShowcaseExternalSharingPolicy._other_validator, +} + +ShowcaseExternalSharingPolicy.disabled = ShowcaseExternalSharingPolicy('disabled') +ShowcaseExternalSharingPolicy.enabled = ShowcaseExternalSharingPolicy('enabled') +ShowcaseExternalSharingPolicy.other = ShowcaseExternalSharingPolicy('other') + +ShowcaseFileAddedDetails._event_uuid_validator = bv.String() +ShowcaseFileAddedDetails._all_field_names_ = set(['event_uuid']) +ShowcaseFileAddedDetails._all_fields_ = [('event_uuid', ShowcaseFileAddedDetails._event_uuid_validator)] + +ShowcaseFileAddedType._description_validator = bv.String() +ShowcaseFileAddedType._all_field_names_ = set(['description']) +ShowcaseFileAddedType._all_fields_ = [('description', ShowcaseFileAddedType._description_validator)] + +ShowcaseFileDownloadDetails._event_uuid_validator = bv.String() +ShowcaseFileDownloadDetails._download_type_validator = bv.String() +ShowcaseFileDownloadDetails._all_field_names_ = set([ + 'event_uuid', + 'download_type', +]) +ShowcaseFileDownloadDetails._all_fields_ = [ + ('event_uuid', ShowcaseFileDownloadDetails._event_uuid_validator), + ('download_type', ShowcaseFileDownloadDetails._download_type_validator), +] + +ShowcaseFileDownloadType._description_validator = bv.String() +ShowcaseFileDownloadType._all_field_names_ = set(['description']) +ShowcaseFileDownloadType._all_fields_ = [('description', ShowcaseFileDownloadType._description_validator)] + +ShowcaseFileRemovedDetails._event_uuid_validator = bv.String() +ShowcaseFileRemovedDetails._all_field_names_ = set(['event_uuid']) +ShowcaseFileRemovedDetails._all_fields_ = [('event_uuid', ShowcaseFileRemovedDetails._event_uuid_validator)] + +ShowcaseFileRemovedType._description_validator = bv.String() +ShowcaseFileRemovedType._all_field_names_ = set(['description']) +ShowcaseFileRemovedType._all_fields_ = [('description', ShowcaseFileRemovedType._description_validator)] + +ShowcaseFileViewDetails._event_uuid_validator = bv.String() +ShowcaseFileViewDetails._all_field_names_ = set(['event_uuid']) +ShowcaseFileViewDetails._all_fields_ = [('event_uuid', ShowcaseFileViewDetails._event_uuid_validator)] + +ShowcaseFileViewType._description_validator = bv.String() +ShowcaseFileViewType._all_field_names_ = set(['description']) +ShowcaseFileViewType._all_fields_ = [('description', ShowcaseFileViewType._description_validator)] + +ShowcasePermanentlyDeletedDetails._event_uuid_validator = bv.String() +ShowcasePermanentlyDeletedDetails._all_field_names_ = set(['event_uuid']) +ShowcasePermanentlyDeletedDetails._all_fields_ = [('event_uuid', ShowcasePermanentlyDeletedDetails._event_uuid_validator)] + +ShowcasePermanentlyDeletedType._description_validator = bv.String() +ShowcasePermanentlyDeletedType._all_field_names_ = set(['description']) +ShowcasePermanentlyDeletedType._all_fields_ = [('description', ShowcasePermanentlyDeletedType._description_validator)] + +ShowcasePostCommentDetails._event_uuid_validator = bv.String() +ShowcasePostCommentDetails._comment_text_validator = bv.Nullable(bv.String()) +ShowcasePostCommentDetails._all_field_names_ = set([ + 'event_uuid', + 'comment_text', +]) +ShowcasePostCommentDetails._all_fields_ = [ + ('event_uuid', ShowcasePostCommentDetails._event_uuid_validator), + ('comment_text', ShowcasePostCommentDetails._comment_text_validator), +] + +ShowcasePostCommentType._description_validator = bv.String() +ShowcasePostCommentType._all_field_names_ = set(['description']) +ShowcasePostCommentType._all_fields_ = [('description', ShowcasePostCommentType._description_validator)] + +ShowcaseRemoveMemberDetails._event_uuid_validator = bv.String() +ShowcaseRemoveMemberDetails._all_field_names_ = set(['event_uuid']) +ShowcaseRemoveMemberDetails._all_fields_ = [('event_uuid', ShowcaseRemoveMemberDetails._event_uuid_validator)] + +ShowcaseRemoveMemberType._description_validator = bv.String() +ShowcaseRemoveMemberType._all_field_names_ = set(['description']) +ShowcaseRemoveMemberType._all_fields_ = [('description', ShowcaseRemoveMemberType._description_validator)] + +ShowcaseRenamedDetails._event_uuid_validator = bv.String() +ShowcaseRenamedDetails._all_field_names_ = set(['event_uuid']) +ShowcaseRenamedDetails._all_fields_ = [('event_uuid', ShowcaseRenamedDetails._event_uuid_validator)] + +ShowcaseRenamedType._description_validator = bv.String() +ShowcaseRenamedType._all_field_names_ = set(['description']) +ShowcaseRenamedType._all_fields_ = [('description', ShowcaseRenamedType._description_validator)] + +ShowcaseRequestAccessDetails._event_uuid_validator = bv.String() +ShowcaseRequestAccessDetails._all_field_names_ = set(['event_uuid']) +ShowcaseRequestAccessDetails._all_fields_ = [('event_uuid', ShowcaseRequestAccessDetails._event_uuid_validator)] + +ShowcaseRequestAccessType._description_validator = bv.String() +ShowcaseRequestAccessType._all_field_names_ = set(['description']) +ShowcaseRequestAccessType._all_fields_ = [('description', ShowcaseRequestAccessType._description_validator)] + +ShowcaseResolveCommentDetails._event_uuid_validator = bv.String() +ShowcaseResolveCommentDetails._comment_text_validator = bv.Nullable(bv.String()) +ShowcaseResolveCommentDetails._all_field_names_ = set([ + 'event_uuid', + 'comment_text', +]) +ShowcaseResolveCommentDetails._all_fields_ = [ + ('event_uuid', ShowcaseResolveCommentDetails._event_uuid_validator), + ('comment_text', ShowcaseResolveCommentDetails._comment_text_validator), +] + +ShowcaseResolveCommentType._description_validator = bv.String() +ShowcaseResolveCommentType._all_field_names_ = set(['description']) +ShowcaseResolveCommentType._all_fields_ = [('description', ShowcaseResolveCommentType._description_validator)] + +ShowcaseRestoredDetails._event_uuid_validator = bv.String() +ShowcaseRestoredDetails._all_field_names_ = set(['event_uuid']) +ShowcaseRestoredDetails._all_fields_ = [('event_uuid', ShowcaseRestoredDetails._event_uuid_validator)] + +ShowcaseRestoredType._description_validator = bv.String() +ShowcaseRestoredType._all_field_names_ = set(['description']) +ShowcaseRestoredType._all_fields_ = [('description', ShowcaseRestoredType._description_validator)] + +ShowcaseTrashedDeprecatedDetails._event_uuid_validator = bv.String() +ShowcaseTrashedDeprecatedDetails._all_field_names_ = set(['event_uuid']) +ShowcaseTrashedDeprecatedDetails._all_fields_ = [('event_uuid', ShowcaseTrashedDeprecatedDetails._event_uuid_validator)] + +ShowcaseTrashedDeprecatedType._description_validator = bv.String() +ShowcaseTrashedDeprecatedType._all_field_names_ = set(['description']) +ShowcaseTrashedDeprecatedType._all_fields_ = [('description', ShowcaseTrashedDeprecatedType._description_validator)] + +ShowcaseTrashedDetails._event_uuid_validator = bv.String() +ShowcaseTrashedDetails._all_field_names_ = set(['event_uuid']) +ShowcaseTrashedDetails._all_fields_ = [('event_uuid', ShowcaseTrashedDetails._event_uuid_validator)] + +ShowcaseTrashedType._description_validator = bv.String() +ShowcaseTrashedType._all_field_names_ = set(['description']) +ShowcaseTrashedType._all_fields_ = [('description', ShowcaseTrashedType._description_validator)] + +ShowcaseUnresolveCommentDetails._event_uuid_validator = bv.String() +ShowcaseUnresolveCommentDetails._comment_text_validator = bv.Nullable(bv.String()) +ShowcaseUnresolveCommentDetails._all_field_names_ = set([ + 'event_uuid', + 'comment_text', +]) +ShowcaseUnresolveCommentDetails._all_fields_ = [ + ('event_uuid', ShowcaseUnresolveCommentDetails._event_uuid_validator), + ('comment_text', ShowcaseUnresolveCommentDetails._comment_text_validator), +] + +ShowcaseUnresolveCommentType._description_validator = bv.String() +ShowcaseUnresolveCommentType._all_field_names_ = set(['description']) +ShowcaseUnresolveCommentType._all_fields_ = [('description', ShowcaseUnresolveCommentType._description_validator)] + +ShowcaseUntrashedDeprecatedDetails._event_uuid_validator = bv.String() +ShowcaseUntrashedDeprecatedDetails._all_field_names_ = set(['event_uuid']) +ShowcaseUntrashedDeprecatedDetails._all_fields_ = [('event_uuid', ShowcaseUntrashedDeprecatedDetails._event_uuid_validator)] + +ShowcaseUntrashedDeprecatedType._description_validator = bv.String() +ShowcaseUntrashedDeprecatedType._all_field_names_ = set(['description']) +ShowcaseUntrashedDeprecatedType._all_fields_ = [('description', ShowcaseUntrashedDeprecatedType._description_validator)] + +ShowcaseUntrashedDetails._event_uuid_validator = bv.String() +ShowcaseUntrashedDetails._all_field_names_ = set(['event_uuid']) +ShowcaseUntrashedDetails._all_fields_ = [('event_uuid', ShowcaseUntrashedDetails._event_uuid_validator)] + +ShowcaseUntrashedType._description_validator = bv.String() +ShowcaseUntrashedType._all_field_names_ = set(['description']) +ShowcaseUntrashedType._all_fields_ = [('description', ShowcaseUntrashedType._description_validator)] + +ShowcaseViewDetails._event_uuid_validator = bv.String() +ShowcaseViewDetails._all_field_names_ = set(['event_uuid']) +ShowcaseViewDetails._all_fields_ = [('event_uuid', ShowcaseViewDetails._event_uuid_validator)] + +ShowcaseViewType._description_validator = bv.String() +ShowcaseViewType._all_field_names_ = set(['description']) +ShowcaseViewType._all_fields_ = [('description', ShowcaseViewType._description_validator)] + +SignInAsSessionEndDetails._all_field_names_ = set([]) +SignInAsSessionEndDetails._all_fields_ = [] + +SignInAsSessionEndType._description_validator = bv.String() +SignInAsSessionEndType._all_field_names_ = set(['description']) +SignInAsSessionEndType._all_fields_ = [('description', SignInAsSessionEndType._description_validator)] + +SignInAsSessionStartDetails._all_field_names_ = set([]) +SignInAsSessionStartDetails._all_fields_ = [] + +SignInAsSessionStartType._description_validator = bv.String() +SignInAsSessionStartType._all_field_names_ = set(['description']) +SignInAsSessionStartType._all_fields_ = [('description', SignInAsSessionStartType._description_validator)] + +SmartSyncChangePolicyDetails._new_value_validator = bv.Nullable(team_policies.SmartSyncPolicy_validator) +SmartSyncChangePolicyDetails._previous_value_validator = bv.Nullable(team_policies.SmartSyncPolicy_validator) +SmartSyncChangePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +SmartSyncChangePolicyDetails._all_fields_ = [ + ('new_value', SmartSyncChangePolicyDetails._new_value_validator), + ('previous_value', SmartSyncChangePolicyDetails._previous_value_validator), +] + +SmartSyncChangePolicyType._description_validator = bv.String() +SmartSyncChangePolicyType._all_field_names_ = set(['description']) +SmartSyncChangePolicyType._all_fields_ = [('description', SmartSyncChangePolicyType._description_validator)] + +SmartSyncCreateAdminPrivilegeReportDetails._all_field_names_ = set([]) +SmartSyncCreateAdminPrivilegeReportDetails._all_fields_ = [] + +SmartSyncCreateAdminPrivilegeReportType._description_validator = bv.String() +SmartSyncCreateAdminPrivilegeReportType._all_field_names_ = set(['description']) +SmartSyncCreateAdminPrivilegeReportType._all_fields_ = [('description', SmartSyncCreateAdminPrivilegeReportType._description_validator)] + +SmartSyncNotOptOutDetails._previous_value_validator = SmartSyncOptOutPolicy_validator +SmartSyncNotOptOutDetails._new_value_validator = SmartSyncOptOutPolicy_validator +SmartSyncNotOptOutDetails._all_field_names_ = set([ + 'previous_value', + 'new_value', +]) +SmartSyncNotOptOutDetails._all_fields_ = [ + ('previous_value', SmartSyncNotOptOutDetails._previous_value_validator), + ('new_value', SmartSyncNotOptOutDetails._new_value_validator), +] + +SmartSyncNotOptOutType._description_validator = bv.String() +SmartSyncNotOptOutType._all_field_names_ = set(['description']) +SmartSyncNotOptOutType._all_fields_ = [('description', SmartSyncNotOptOutType._description_validator)] + +SmartSyncOptOutDetails._previous_value_validator = SmartSyncOptOutPolicy_validator +SmartSyncOptOutDetails._new_value_validator = SmartSyncOptOutPolicy_validator +SmartSyncOptOutDetails._all_field_names_ = set([ + 'previous_value', + 'new_value', +]) +SmartSyncOptOutDetails._all_fields_ = [ + ('previous_value', SmartSyncOptOutDetails._previous_value_validator), + ('new_value', SmartSyncOptOutDetails._new_value_validator), +] + +SmartSyncOptOutPolicy._default_validator = bv.Void() +SmartSyncOptOutPolicy._opted_out_validator = bv.Void() +SmartSyncOptOutPolicy._other_validator = bv.Void() +SmartSyncOptOutPolicy._tagmap = { + 'default': SmartSyncOptOutPolicy._default_validator, + 'opted_out': SmartSyncOptOutPolicy._opted_out_validator, + 'other': SmartSyncOptOutPolicy._other_validator, +} + +SmartSyncOptOutPolicy.default = SmartSyncOptOutPolicy('default') +SmartSyncOptOutPolicy.opted_out = SmartSyncOptOutPolicy('opted_out') +SmartSyncOptOutPolicy.other = SmartSyncOptOutPolicy('other') + +SmartSyncOptOutType._description_validator = bv.String() +SmartSyncOptOutType._all_field_names_ = set(['description']) +SmartSyncOptOutType._all_fields_ = [('description', SmartSyncOptOutType._description_validator)] + +SpaceCapsType._hard_validator = bv.Void() +SpaceCapsType._off_validator = bv.Void() +SpaceCapsType._soft_validator = bv.Void() +SpaceCapsType._other_validator = bv.Void() +SpaceCapsType._tagmap = { + 'hard': SpaceCapsType._hard_validator, + 'off': SpaceCapsType._off_validator, + 'soft': SpaceCapsType._soft_validator, + 'other': SpaceCapsType._other_validator, +} + +SpaceCapsType.hard = SpaceCapsType('hard') +SpaceCapsType.off = SpaceCapsType('off') +SpaceCapsType.soft = SpaceCapsType('soft') +SpaceCapsType.other = SpaceCapsType('other') + +SpaceLimitsStatus._within_quota_validator = bv.Void() +SpaceLimitsStatus._near_quota_validator = bv.Void() +SpaceLimitsStatus._over_quota_validator = bv.Void() +SpaceLimitsStatus._other_validator = bv.Void() +SpaceLimitsStatus._tagmap = { + 'within_quota': SpaceLimitsStatus._within_quota_validator, + 'near_quota': SpaceLimitsStatus._near_quota_validator, + 'over_quota': SpaceLimitsStatus._over_quota_validator, + 'other': SpaceLimitsStatus._other_validator, +} + +SpaceLimitsStatus.within_quota = SpaceLimitsStatus('within_quota') +SpaceLimitsStatus.near_quota = SpaceLimitsStatus('near_quota') +SpaceLimitsStatus.over_quota = SpaceLimitsStatus('over_quota') +SpaceLimitsStatus.other = SpaceLimitsStatus('other') + +SsoAddCertDetails._certificate_details_validator = Certificate_validator +SsoAddCertDetails._all_field_names_ = set(['certificate_details']) +SsoAddCertDetails._all_fields_ = [('certificate_details', SsoAddCertDetails._certificate_details_validator)] + +SsoAddCertType._description_validator = bv.String() +SsoAddCertType._all_field_names_ = set(['description']) +SsoAddCertType._all_fields_ = [('description', SsoAddCertType._description_validator)] + +SsoAddLoginUrlDetails._new_value_validator = bv.String() +SsoAddLoginUrlDetails._all_field_names_ = set(['new_value']) +SsoAddLoginUrlDetails._all_fields_ = [('new_value', SsoAddLoginUrlDetails._new_value_validator)] + +SsoAddLoginUrlType._description_validator = bv.String() +SsoAddLoginUrlType._all_field_names_ = set(['description']) +SsoAddLoginUrlType._all_fields_ = [('description', SsoAddLoginUrlType._description_validator)] + +SsoAddLogoutUrlDetails._new_value_validator = bv.Nullable(bv.String()) +SsoAddLogoutUrlDetails._all_field_names_ = set(['new_value']) +SsoAddLogoutUrlDetails._all_fields_ = [('new_value', SsoAddLogoutUrlDetails._new_value_validator)] + +SsoAddLogoutUrlType._description_validator = bv.String() +SsoAddLogoutUrlType._all_field_names_ = set(['description']) +SsoAddLogoutUrlType._all_fields_ = [('description', SsoAddLogoutUrlType._description_validator)] + +SsoChangeCertDetails._previous_certificate_details_validator = bv.Nullable(Certificate_validator) +SsoChangeCertDetails._new_certificate_details_validator = Certificate_validator +SsoChangeCertDetails._all_field_names_ = set([ + 'previous_certificate_details', + 'new_certificate_details', +]) +SsoChangeCertDetails._all_fields_ = [ + ('previous_certificate_details', SsoChangeCertDetails._previous_certificate_details_validator), + ('new_certificate_details', SsoChangeCertDetails._new_certificate_details_validator), +] + +SsoChangeCertType._description_validator = bv.String() +SsoChangeCertType._all_field_names_ = set(['description']) +SsoChangeCertType._all_fields_ = [('description', SsoChangeCertType._description_validator)] + +SsoChangeLoginUrlDetails._previous_value_validator = bv.String() +SsoChangeLoginUrlDetails._new_value_validator = bv.String() +SsoChangeLoginUrlDetails._all_field_names_ = set([ + 'previous_value', + 'new_value', +]) +SsoChangeLoginUrlDetails._all_fields_ = [ + ('previous_value', SsoChangeLoginUrlDetails._previous_value_validator), + ('new_value', SsoChangeLoginUrlDetails._new_value_validator), +] + +SsoChangeLoginUrlType._description_validator = bv.String() +SsoChangeLoginUrlType._all_field_names_ = set(['description']) +SsoChangeLoginUrlType._all_fields_ = [('description', SsoChangeLoginUrlType._description_validator)] + +SsoChangeLogoutUrlDetails._previous_value_validator = bv.Nullable(bv.String()) +SsoChangeLogoutUrlDetails._new_value_validator = bv.Nullable(bv.String()) +SsoChangeLogoutUrlDetails._all_field_names_ = set([ + 'previous_value', + 'new_value', +]) +SsoChangeLogoutUrlDetails._all_fields_ = [ + ('previous_value', SsoChangeLogoutUrlDetails._previous_value_validator), + ('new_value', SsoChangeLogoutUrlDetails._new_value_validator), +] + +SsoChangeLogoutUrlType._description_validator = bv.String() +SsoChangeLogoutUrlType._all_field_names_ = set(['description']) +SsoChangeLogoutUrlType._all_fields_ = [('description', SsoChangeLogoutUrlType._description_validator)] + +SsoChangePolicyDetails._new_value_validator = team_policies.SsoPolicy_validator +SsoChangePolicyDetails._previous_value_validator = bv.Nullable(team_policies.SsoPolicy_validator) +SsoChangePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +SsoChangePolicyDetails._all_fields_ = [ + ('new_value', SsoChangePolicyDetails._new_value_validator), + ('previous_value', SsoChangePolicyDetails._previous_value_validator), +] + +SsoChangePolicyType._description_validator = bv.String() +SsoChangePolicyType._all_field_names_ = set(['description']) +SsoChangePolicyType._all_fields_ = [('description', SsoChangePolicyType._description_validator)] + +SsoChangeSamlIdentityModeDetails._previous_value_validator = bv.Int64() +SsoChangeSamlIdentityModeDetails._new_value_validator = bv.Int64() +SsoChangeSamlIdentityModeDetails._all_field_names_ = set([ + 'previous_value', + 'new_value', +]) +SsoChangeSamlIdentityModeDetails._all_fields_ = [ + ('previous_value', SsoChangeSamlIdentityModeDetails._previous_value_validator), + ('new_value', SsoChangeSamlIdentityModeDetails._new_value_validator), +] + +SsoChangeSamlIdentityModeType._description_validator = bv.String() +SsoChangeSamlIdentityModeType._all_field_names_ = set(['description']) +SsoChangeSamlIdentityModeType._all_fields_ = [('description', SsoChangeSamlIdentityModeType._description_validator)] + +SsoErrorDetails._error_details_validator = FailureDetailsLogInfo_validator +SsoErrorDetails._all_field_names_ = set(['error_details']) +SsoErrorDetails._all_fields_ = [('error_details', SsoErrorDetails._error_details_validator)] + +SsoErrorType._description_validator = bv.String() +SsoErrorType._all_field_names_ = set(['description']) +SsoErrorType._all_fields_ = [('description', SsoErrorType._description_validator)] + +SsoRemoveCertDetails._all_field_names_ = set([]) +SsoRemoveCertDetails._all_fields_ = [] + +SsoRemoveCertType._description_validator = bv.String() +SsoRemoveCertType._all_field_names_ = set(['description']) +SsoRemoveCertType._all_fields_ = [('description', SsoRemoveCertType._description_validator)] + +SsoRemoveLoginUrlDetails._previous_value_validator = bv.String() +SsoRemoveLoginUrlDetails._all_field_names_ = set(['previous_value']) +SsoRemoveLoginUrlDetails._all_fields_ = [('previous_value', SsoRemoveLoginUrlDetails._previous_value_validator)] + +SsoRemoveLoginUrlType._description_validator = bv.String() +SsoRemoveLoginUrlType._all_field_names_ = set(['description']) +SsoRemoveLoginUrlType._all_fields_ = [('description', SsoRemoveLoginUrlType._description_validator)] + +SsoRemoveLogoutUrlDetails._previous_value_validator = bv.String() +SsoRemoveLogoutUrlDetails._all_field_names_ = set(['previous_value']) +SsoRemoveLogoutUrlDetails._all_fields_ = [('previous_value', SsoRemoveLogoutUrlDetails._previous_value_validator)] + +SsoRemoveLogoutUrlType._description_validator = bv.String() +SsoRemoveLogoutUrlType._all_field_names_ = set(['description']) +SsoRemoveLogoutUrlType._all_fields_ = [('description', SsoRemoveLogoutUrlType._description_validator)] + +TeamActivityCreateReportDetails._start_date_validator = common.DropboxTimestamp_validator +TeamActivityCreateReportDetails._end_date_validator = common.DropboxTimestamp_validator +TeamActivityCreateReportDetails._all_field_names_ = set([ + 'start_date', + 'end_date', +]) +TeamActivityCreateReportDetails._all_fields_ = [ + ('start_date', TeamActivityCreateReportDetails._start_date_validator), + ('end_date', TeamActivityCreateReportDetails._end_date_validator), +] + +TeamActivityCreateReportType._description_validator = bv.String() +TeamActivityCreateReportType._all_field_names_ = set(['description']) +TeamActivityCreateReportType._all_fields_ = [('description', TeamActivityCreateReportType._description_validator)] + +TeamEvent._timestamp_validator = common.DropboxTimestamp_validator +TeamEvent._event_category_validator = EventCategory_validator +TeamEvent._actor_validator = bv.Nullable(ActorLogInfo_validator) +TeamEvent._origin_validator = bv.Nullable(OriginLogInfo_validator) +TeamEvent._involve_non_team_member_validator = bv.Nullable(bv.Boolean()) +TeamEvent._context_validator = bv.Nullable(ContextLogInfo_validator) +TeamEvent._participants_validator = bv.Nullable(bv.List(ParticipantLogInfo_validator)) +TeamEvent._assets_validator = bv.Nullable(bv.List(AssetLogInfo_validator)) +TeamEvent._event_type_validator = EventType_validator +TeamEvent._details_validator = EventDetails_validator +TeamEvent._all_field_names_ = set([ + 'timestamp', + 'event_category', + 'actor', + 'origin', + 'involve_non_team_member', + 'context', + 'participants', + 'assets', + 'event_type', + 'details', +]) +TeamEvent._all_fields_ = [ + ('timestamp', TeamEvent._timestamp_validator), + ('event_category', TeamEvent._event_category_validator), + ('actor', TeamEvent._actor_validator), + ('origin', TeamEvent._origin_validator), + ('involve_non_team_member', TeamEvent._involve_non_team_member_validator), + ('context', TeamEvent._context_validator), + ('participants', TeamEvent._participants_validator), + ('assets', TeamEvent._assets_validator), + ('event_type', TeamEvent._event_type_validator), + ('details', TeamEvent._details_validator), +] + +TeamFolderChangeStatusDetails._new_value_validator = team.TeamFolderStatus_validator +TeamFolderChangeStatusDetails._previous_value_validator = bv.Nullable(team.TeamFolderStatus_validator) +TeamFolderChangeStatusDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +TeamFolderChangeStatusDetails._all_fields_ = [ + ('new_value', TeamFolderChangeStatusDetails._new_value_validator), + ('previous_value', TeamFolderChangeStatusDetails._previous_value_validator), +] + +TeamFolderChangeStatusType._description_validator = bv.String() +TeamFolderChangeStatusType._all_field_names_ = set(['description']) +TeamFolderChangeStatusType._all_fields_ = [('description', TeamFolderChangeStatusType._description_validator)] + +TeamFolderCreateDetails._all_field_names_ = set([]) +TeamFolderCreateDetails._all_fields_ = [] + +TeamFolderCreateType._description_validator = bv.String() +TeamFolderCreateType._all_field_names_ = set(['description']) +TeamFolderCreateType._all_fields_ = [('description', TeamFolderCreateType._description_validator)] + +TeamFolderDowngradeDetails._target_asset_index_validator = bv.UInt64() +TeamFolderDowngradeDetails._all_field_names_ = set(['target_asset_index']) +TeamFolderDowngradeDetails._all_fields_ = [('target_asset_index', TeamFolderDowngradeDetails._target_asset_index_validator)] + +TeamFolderDowngradeType._description_validator = bv.String() +TeamFolderDowngradeType._all_field_names_ = set(['description']) +TeamFolderDowngradeType._all_fields_ = [('description', TeamFolderDowngradeType._description_validator)] + +TeamFolderPermanentlyDeleteDetails._all_field_names_ = set([]) +TeamFolderPermanentlyDeleteDetails._all_fields_ = [] + +TeamFolderPermanentlyDeleteType._description_validator = bv.String() +TeamFolderPermanentlyDeleteType._all_field_names_ = set(['description']) +TeamFolderPermanentlyDeleteType._all_fields_ = [('description', TeamFolderPermanentlyDeleteType._description_validator)] + +TeamFolderRenameDetails._previous_folder_name_validator = bv.String() +TeamFolderRenameDetails._new_folder_name_validator = bv.String() +TeamFolderRenameDetails._all_field_names_ = set([ + 'previous_folder_name', + 'new_folder_name', +]) +TeamFolderRenameDetails._all_fields_ = [ + ('previous_folder_name', TeamFolderRenameDetails._previous_folder_name_validator), + ('new_folder_name', TeamFolderRenameDetails._new_folder_name_validator), +] + +TeamFolderRenameType._description_validator = bv.String() +TeamFolderRenameType._all_field_names_ = set(['description']) +TeamFolderRenameType._all_fields_ = [('description', TeamFolderRenameType._description_validator)] + +TeamLinkedAppLogInfo._field_names_ = set([]) +TeamLinkedAppLogInfo._all_field_names_ = AppLogInfo._all_field_names_.union(TeamLinkedAppLogInfo._field_names_) +TeamLinkedAppLogInfo._fields_ = [] +TeamLinkedAppLogInfo._all_fields_ = AppLogInfo._all_fields_ + TeamLinkedAppLogInfo._fields_ + +TeamMemberLogInfo._team_member_id_validator = bv.Nullable(team_common.TeamMemberId_validator) +TeamMemberLogInfo._member_external_id_validator = bv.Nullable(team_common.MemberExternalId_validator) +TeamMemberLogInfo._field_names_ = set([ + 'team_member_id', + 'member_external_id', +]) +TeamMemberLogInfo._all_field_names_ = UserLogInfo._all_field_names_.union(TeamMemberLogInfo._field_names_) +TeamMemberLogInfo._fields_ = [ + ('team_member_id', TeamMemberLogInfo._team_member_id_validator), + ('member_external_id', TeamMemberLogInfo._member_external_id_validator), +] +TeamMemberLogInfo._all_fields_ = UserLogInfo._all_fields_ + TeamMemberLogInfo._fields_ + +TeamMembershipType._free_validator = bv.Void() +TeamMembershipType._full_validator = bv.Void() +TeamMembershipType._other_validator = bv.Void() +TeamMembershipType._tagmap = { + 'free': TeamMembershipType._free_validator, + 'full': TeamMembershipType._full_validator, + 'other': TeamMembershipType._other_validator, +} + +TeamMembershipType.free = TeamMembershipType('free') +TeamMembershipType.full = TeamMembershipType('full') +TeamMembershipType.other = TeamMembershipType('other') + +TeamMergeFromDetails._team_name_validator = bv.String() +TeamMergeFromDetails._all_field_names_ = set(['team_name']) +TeamMergeFromDetails._all_fields_ = [('team_name', TeamMergeFromDetails._team_name_validator)] + +TeamMergeFromType._description_validator = bv.String() +TeamMergeFromType._all_field_names_ = set(['description']) +TeamMergeFromType._all_fields_ = [('description', TeamMergeFromType._description_validator)] + +TeamMergeToDetails._team_name_validator = bv.String() +TeamMergeToDetails._all_field_names_ = set(['team_name']) +TeamMergeToDetails._all_fields_ = [('team_name', TeamMergeToDetails._team_name_validator)] + +TeamMergeToType._description_validator = bv.String() +TeamMergeToType._all_field_names_ = set(['description']) +TeamMergeToType._all_fields_ = [('description', TeamMergeToType._description_validator)] + +TeamName._team_display_name_validator = bv.String() +TeamName._team_legal_name_validator = bv.String() +TeamName._all_field_names_ = set([ + 'team_display_name', + 'team_legal_name', +]) +TeamName._all_fields_ = [ + ('team_display_name', TeamName._team_display_name_validator), + ('team_legal_name', TeamName._team_legal_name_validator), +] + +TeamProfileAddLogoDetails._all_field_names_ = set([]) +TeamProfileAddLogoDetails._all_fields_ = [] + +TeamProfileAddLogoType._description_validator = bv.String() +TeamProfileAddLogoType._all_field_names_ = set(['description']) +TeamProfileAddLogoType._all_fields_ = [('description', TeamProfileAddLogoType._description_validator)] + +TeamProfileChangeDefaultLanguageDetails._new_value_validator = common.LanguageCode_validator +TeamProfileChangeDefaultLanguageDetails._previous_value_validator = common.LanguageCode_validator +TeamProfileChangeDefaultLanguageDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +TeamProfileChangeDefaultLanguageDetails._all_fields_ = [ + ('new_value', TeamProfileChangeDefaultLanguageDetails._new_value_validator), + ('previous_value', TeamProfileChangeDefaultLanguageDetails._previous_value_validator), +] + +TeamProfileChangeDefaultLanguageType._description_validator = bv.String() +TeamProfileChangeDefaultLanguageType._all_field_names_ = set(['description']) +TeamProfileChangeDefaultLanguageType._all_fields_ = [('description', TeamProfileChangeDefaultLanguageType._description_validator)] + +TeamProfileChangeLogoDetails._all_field_names_ = set([]) +TeamProfileChangeLogoDetails._all_fields_ = [] + +TeamProfileChangeLogoType._description_validator = bv.String() +TeamProfileChangeLogoType._all_field_names_ = set(['description']) +TeamProfileChangeLogoType._all_fields_ = [('description', TeamProfileChangeLogoType._description_validator)] + +TeamProfileChangeNameDetails._previous_value_validator = bv.Nullable(TeamName_validator) +TeamProfileChangeNameDetails._new_value_validator = TeamName_validator +TeamProfileChangeNameDetails._all_field_names_ = set([ + 'previous_value', + 'new_value', +]) +TeamProfileChangeNameDetails._all_fields_ = [ + ('previous_value', TeamProfileChangeNameDetails._previous_value_validator), + ('new_value', TeamProfileChangeNameDetails._new_value_validator), +] + +TeamProfileChangeNameType._description_validator = bv.String() +TeamProfileChangeNameType._all_field_names_ = set(['description']) +TeamProfileChangeNameType._all_fields_ = [('description', TeamProfileChangeNameType._description_validator)] + +TeamProfileRemoveLogoDetails._all_field_names_ = set([]) +TeamProfileRemoveLogoDetails._all_fields_ = [] + +TeamProfileRemoveLogoType._description_validator = bv.String() +TeamProfileRemoveLogoType._all_field_names_ = set(['description']) +TeamProfileRemoveLogoType._all_fields_ = [('description', TeamProfileRemoveLogoType._description_validator)] + +TeamSelectiveSyncPolicy._disabled_validator = bv.Void() +TeamSelectiveSyncPolicy._enabled_validator = bv.Void() +TeamSelectiveSyncPolicy._other_validator = bv.Void() +TeamSelectiveSyncPolicy._tagmap = { + 'disabled': TeamSelectiveSyncPolicy._disabled_validator, + 'enabled': TeamSelectiveSyncPolicy._enabled_validator, + 'other': TeamSelectiveSyncPolicy._other_validator, +} + +TeamSelectiveSyncPolicy.disabled = TeamSelectiveSyncPolicy('disabled') +TeamSelectiveSyncPolicy.enabled = TeamSelectiveSyncPolicy('enabled') +TeamSelectiveSyncPolicy.other = TeamSelectiveSyncPolicy('other') + +TeamSelectiveSyncPolicyChangedDetails._new_value_validator = TeamSelectiveSyncPolicy_validator +TeamSelectiveSyncPolicyChangedDetails._previous_value_validator = TeamSelectiveSyncPolicy_validator +TeamSelectiveSyncPolicyChangedDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +TeamSelectiveSyncPolicyChangedDetails._all_fields_ = [ + ('new_value', TeamSelectiveSyncPolicyChangedDetails._new_value_validator), + ('previous_value', TeamSelectiveSyncPolicyChangedDetails._previous_value_validator), +] + +TeamSelectiveSyncPolicyChangedType._description_validator = bv.String() +TeamSelectiveSyncPolicyChangedType._all_field_names_ = set(['description']) +TeamSelectiveSyncPolicyChangedType._all_fields_ = [('description', TeamSelectiveSyncPolicyChangedType._description_validator)] + +TeamSelectiveSyncSettingsChangedDetails._previous_value_validator = files.SyncSetting_validator +TeamSelectiveSyncSettingsChangedDetails._new_value_validator = files.SyncSetting_validator +TeamSelectiveSyncSettingsChangedDetails._all_field_names_ = set([ + 'previous_value', + 'new_value', +]) +TeamSelectiveSyncSettingsChangedDetails._all_fields_ = [ + ('previous_value', TeamSelectiveSyncSettingsChangedDetails._previous_value_validator), + ('new_value', TeamSelectiveSyncSettingsChangedDetails._new_value_validator), +] + +TeamSelectiveSyncSettingsChangedType._description_validator = bv.String() +TeamSelectiveSyncSettingsChangedType._all_field_names_ = set(['description']) +TeamSelectiveSyncSettingsChangedType._all_fields_ = [('description', TeamSelectiveSyncSettingsChangedType._description_validator)] + +TfaAddBackupPhoneDetails._all_field_names_ = set([]) +TfaAddBackupPhoneDetails._all_fields_ = [] + +TfaAddBackupPhoneType._description_validator = bv.String() +TfaAddBackupPhoneType._all_field_names_ = set(['description']) +TfaAddBackupPhoneType._all_fields_ = [('description', TfaAddBackupPhoneType._description_validator)] + +TfaAddSecurityKeyDetails._all_field_names_ = set([]) +TfaAddSecurityKeyDetails._all_fields_ = [] + +TfaAddSecurityKeyType._description_validator = bv.String() +TfaAddSecurityKeyType._all_field_names_ = set(['description']) +TfaAddSecurityKeyType._all_fields_ = [('description', TfaAddSecurityKeyType._description_validator)] + +TfaChangeBackupPhoneDetails._all_field_names_ = set([]) +TfaChangeBackupPhoneDetails._all_fields_ = [] + +TfaChangeBackupPhoneType._description_validator = bv.String() +TfaChangeBackupPhoneType._all_field_names_ = set(['description']) +TfaChangeBackupPhoneType._all_fields_ = [('description', TfaChangeBackupPhoneType._description_validator)] + +TfaChangePolicyDetails._new_value_validator = team_policies.TwoStepVerificationPolicy_validator +TfaChangePolicyDetails._previous_value_validator = bv.Nullable(team_policies.TwoStepVerificationPolicy_validator) +TfaChangePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +TfaChangePolicyDetails._all_fields_ = [ + ('new_value', TfaChangePolicyDetails._new_value_validator), + ('previous_value', TfaChangePolicyDetails._previous_value_validator), +] + +TfaChangePolicyType._description_validator = bv.String() +TfaChangePolicyType._all_field_names_ = set(['description']) +TfaChangePolicyType._all_fields_ = [('description', TfaChangePolicyType._description_validator)] + +TfaChangeStatusDetails._new_value_validator = TfaConfiguration_validator +TfaChangeStatusDetails._previous_value_validator = bv.Nullable(TfaConfiguration_validator) +TfaChangeStatusDetails._used_rescue_code_validator = bv.Nullable(bv.Boolean()) +TfaChangeStatusDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', + 'used_rescue_code', +]) +TfaChangeStatusDetails._all_fields_ = [ + ('new_value', TfaChangeStatusDetails._new_value_validator), + ('previous_value', TfaChangeStatusDetails._previous_value_validator), + ('used_rescue_code', TfaChangeStatusDetails._used_rescue_code_validator), +] + +TfaChangeStatusType._description_validator = bv.String() +TfaChangeStatusType._all_field_names_ = set(['description']) +TfaChangeStatusType._all_fields_ = [('description', TfaChangeStatusType._description_validator)] + +TfaConfiguration._disabled_validator = bv.Void() +TfaConfiguration._enabled_validator = bv.Void() +TfaConfiguration._sms_validator = bv.Void() +TfaConfiguration._authenticator_validator = bv.Void() +TfaConfiguration._other_validator = bv.Void() +TfaConfiguration._tagmap = { + 'disabled': TfaConfiguration._disabled_validator, + 'enabled': TfaConfiguration._enabled_validator, + 'sms': TfaConfiguration._sms_validator, + 'authenticator': TfaConfiguration._authenticator_validator, + 'other': TfaConfiguration._other_validator, +} + +TfaConfiguration.disabled = TfaConfiguration('disabled') +TfaConfiguration.enabled = TfaConfiguration('enabled') +TfaConfiguration.sms = TfaConfiguration('sms') +TfaConfiguration.authenticator = TfaConfiguration('authenticator') +TfaConfiguration.other = TfaConfiguration('other') + +TfaRemoveBackupPhoneDetails._all_field_names_ = set([]) +TfaRemoveBackupPhoneDetails._all_fields_ = [] + +TfaRemoveBackupPhoneType._description_validator = bv.String() +TfaRemoveBackupPhoneType._all_field_names_ = set(['description']) +TfaRemoveBackupPhoneType._all_fields_ = [('description', TfaRemoveBackupPhoneType._description_validator)] + +TfaRemoveSecurityKeyDetails._all_field_names_ = set([]) +TfaRemoveSecurityKeyDetails._all_fields_ = [] + +TfaRemoveSecurityKeyType._description_validator = bv.String() +TfaRemoveSecurityKeyType._all_field_names_ = set(['description']) +TfaRemoveSecurityKeyType._all_fields_ = [('description', TfaRemoveSecurityKeyType._description_validator)] + +TfaResetDetails._all_field_names_ = set([]) +TfaResetDetails._all_fields_ = [] + +TfaResetType._description_validator = bv.String() +TfaResetType._all_field_names_ = set(['description']) +TfaResetType._all_fields_ = [('description', TfaResetType._description_validator)] + +TimeUnit._milliseconds_validator = bv.Void() +TimeUnit._seconds_validator = bv.Void() +TimeUnit._minutes_validator = bv.Void() +TimeUnit._hours_validator = bv.Void() +TimeUnit._days_validator = bv.Void() +TimeUnit._weeks_validator = bv.Void() +TimeUnit._months_validator = bv.Void() +TimeUnit._years_validator = bv.Void() +TimeUnit._other_validator = bv.Void() +TimeUnit._tagmap = { + 'milliseconds': TimeUnit._milliseconds_validator, + 'seconds': TimeUnit._seconds_validator, + 'minutes': TimeUnit._minutes_validator, + 'hours': TimeUnit._hours_validator, + 'days': TimeUnit._days_validator, + 'weeks': TimeUnit._weeks_validator, + 'months': TimeUnit._months_validator, + 'years': TimeUnit._years_validator, + 'other': TimeUnit._other_validator, +} + +TimeUnit.milliseconds = TimeUnit('milliseconds') +TimeUnit.seconds = TimeUnit('seconds') +TimeUnit.minutes = TimeUnit('minutes') +TimeUnit.hours = TimeUnit('hours') +TimeUnit.days = TimeUnit('days') +TimeUnit.weeks = TimeUnit('weeks') +TimeUnit.months = TimeUnit('months') +TimeUnit.years = TimeUnit('years') +TimeUnit.other = TimeUnit('other') + +TrustedNonTeamMemberLogInfo._trusted_non_team_member_type_validator = TrustedNonTeamMemberType_validator +TrustedNonTeamMemberLogInfo._field_names_ = set(['trusted_non_team_member_type']) +TrustedNonTeamMemberLogInfo._all_field_names_ = UserLogInfo._all_field_names_.union(TrustedNonTeamMemberLogInfo._field_names_) +TrustedNonTeamMemberLogInfo._fields_ = [('trusted_non_team_member_type', TrustedNonTeamMemberLogInfo._trusted_non_team_member_type_validator)] +TrustedNonTeamMemberLogInfo._all_fields_ = UserLogInfo._all_fields_ + TrustedNonTeamMemberLogInfo._fields_ + +TrustedNonTeamMemberType._multi_instance_admin_validator = bv.Void() +TrustedNonTeamMemberType._other_validator = bv.Void() +TrustedNonTeamMemberType._tagmap = { + 'multi_instance_admin': TrustedNonTeamMemberType._multi_instance_admin_validator, + 'other': TrustedNonTeamMemberType._other_validator, +} + +TrustedNonTeamMemberType.multi_instance_admin = TrustedNonTeamMemberType('multi_instance_admin') +TrustedNonTeamMemberType.other = TrustedNonTeamMemberType('other') + +TwoAccountChangePolicyDetails._new_value_validator = TwoAccountPolicy_validator +TwoAccountChangePolicyDetails._previous_value_validator = bv.Nullable(TwoAccountPolicy_validator) +TwoAccountChangePolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +TwoAccountChangePolicyDetails._all_fields_ = [ + ('new_value', TwoAccountChangePolicyDetails._new_value_validator), + ('previous_value', TwoAccountChangePolicyDetails._previous_value_validator), +] + +TwoAccountChangePolicyType._description_validator = bv.String() +TwoAccountChangePolicyType._all_field_names_ = set(['description']) +TwoAccountChangePolicyType._all_fields_ = [('description', TwoAccountChangePolicyType._description_validator)] + +TwoAccountPolicy._disabled_validator = bv.Void() +TwoAccountPolicy._enabled_validator = bv.Void() +TwoAccountPolicy._other_validator = bv.Void() +TwoAccountPolicy._tagmap = { + 'disabled': TwoAccountPolicy._disabled_validator, + 'enabled': TwoAccountPolicy._enabled_validator, + 'other': TwoAccountPolicy._other_validator, +} + +TwoAccountPolicy.disabled = TwoAccountPolicy('disabled') +TwoAccountPolicy.enabled = TwoAccountPolicy('enabled') +TwoAccountPolicy.other = TwoAccountPolicy('other') + +UserLinkedAppLogInfo._field_names_ = set([]) +UserLinkedAppLogInfo._all_field_names_ = AppLogInfo._all_field_names_.union(UserLinkedAppLogInfo._field_names_) +UserLinkedAppLogInfo._fields_ = [] +UserLinkedAppLogInfo._all_fields_ = AppLogInfo._all_fields_ + UserLinkedAppLogInfo._fields_ + +UserNameLogInfo._given_name_validator = bv.String() +UserNameLogInfo._surname_validator = bv.String() +UserNameLogInfo._locale_validator = bv.Nullable(bv.String()) +UserNameLogInfo._all_field_names_ = set([ + 'given_name', + 'surname', + 'locale', +]) +UserNameLogInfo._all_fields_ = [ + ('given_name', UserNameLogInfo._given_name_validator), + ('surname', UserNameLogInfo._surname_validator), + ('locale', UserNameLogInfo._locale_validator), +] + +UserOrTeamLinkedAppLogInfo._field_names_ = set([]) +UserOrTeamLinkedAppLogInfo._all_field_names_ = AppLogInfo._all_field_names_.union(UserOrTeamLinkedAppLogInfo._field_names_) +UserOrTeamLinkedAppLogInfo._fields_ = [] +UserOrTeamLinkedAppLogInfo._all_fields_ = AppLogInfo._all_fields_ + UserOrTeamLinkedAppLogInfo._fields_ + +ViewerInfoPolicyChangedDetails._previous_value_validator = PassPolicy_validator +ViewerInfoPolicyChangedDetails._new_value_validator = PassPolicy_validator +ViewerInfoPolicyChangedDetails._all_field_names_ = set([ + 'previous_value', + 'new_value', +]) +ViewerInfoPolicyChangedDetails._all_fields_ = [ + ('previous_value', ViewerInfoPolicyChangedDetails._previous_value_validator), + ('new_value', ViewerInfoPolicyChangedDetails._new_value_validator), +] + +ViewerInfoPolicyChangedType._description_validator = bv.String() +ViewerInfoPolicyChangedType._all_field_names_ = set(['description']) +ViewerInfoPolicyChangedType._all_fields_ = [('description', ViewerInfoPolicyChangedType._description_validator)] + +WebDeviceSessionLogInfo._session_info_validator = bv.Nullable(WebSessionLogInfo_validator) +WebDeviceSessionLogInfo._user_agent_validator = bv.String() +WebDeviceSessionLogInfo._os_validator = bv.String() +WebDeviceSessionLogInfo._browser_validator = bv.String() +WebDeviceSessionLogInfo._field_names_ = set([ + 'session_info', + 'user_agent', + 'os', + 'browser', +]) +WebDeviceSessionLogInfo._all_field_names_ = DeviceSessionLogInfo._all_field_names_.union(WebDeviceSessionLogInfo._field_names_) +WebDeviceSessionLogInfo._fields_ = [ + ('session_info', WebDeviceSessionLogInfo._session_info_validator), + ('user_agent', WebDeviceSessionLogInfo._user_agent_validator), + ('os', WebDeviceSessionLogInfo._os_validator), + ('browser', WebDeviceSessionLogInfo._browser_validator), +] +WebDeviceSessionLogInfo._all_fields_ = DeviceSessionLogInfo._all_fields_ + WebDeviceSessionLogInfo._fields_ + +WebSessionLogInfo._field_names_ = set([]) +WebSessionLogInfo._all_field_names_ = SessionLogInfo._all_field_names_.union(WebSessionLogInfo._field_names_) +WebSessionLogInfo._fields_ = [] +WebSessionLogInfo._all_fields_ = SessionLogInfo._all_fields_ + WebSessionLogInfo._fields_ + +WebSessionsChangeFixedLengthPolicyDetails._new_value_validator = bv.Nullable(WebSessionsFixedLengthPolicy_validator) +WebSessionsChangeFixedLengthPolicyDetails._previous_value_validator = bv.Nullable(WebSessionsFixedLengthPolicy_validator) +WebSessionsChangeFixedLengthPolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +WebSessionsChangeFixedLengthPolicyDetails._all_fields_ = [ + ('new_value', WebSessionsChangeFixedLengthPolicyDetails._new_value_validator), + ('previous_value', WebSessionsChangeFixedLengthPolicyDetails._previous_value_validator), +] + +WebSessionsChangeFixedLengthPolicyType._description_validator = bv.String() +WebSessionsChangeFixedLengthPolicyType._all_field_names_ = set(['description']) +WebSessionsChangeFixedLengthPolicyType._all_fields_ = [('description', WebSessionsChangeFixedLengthPolicyType._description_validator)] + +WebSessionsChangeIdleLengthPolicyDetails._new_value_validator = bv.Nullable(WebSessionsIdleLengthPolicy_validator) +WebSessionsChangeIdleLengthPolicyDetails._previous_value_validator = bv.Nullable(WebSessionsIdleLengthPolicy_validator) +WebSessionsChangeIdleLengthPolicyDetails._all_field_names_ = set([ + 'new_value', + 'previous_value', +]) +WebSessionsChangeIdleLengthPolicyDetails._all_fields_ = [ + ('new_value', WebSessionsChangeIdleLengthPolicyDetails._new_value_validator), + ('previous_value', WebSessionsChangeIdleLengthPolicyDetails._previous_value_validator), +] + +WebSessionsChangeIdleLengthPolicyType._description_validator = bv.String() +WebSessionsChangeIdleLengthPolicyType._all_field_names_ = set(['description']) +WebSessionsChangeIdleLengthPolicyType._all_fields_ = [('description', WebSessionsChangeIdleLengthPolicyType._description_validator)] + +WebSessionsFixedLengthPolicy._defined_validator = DurationLogInfo_validator +WebSessionsFixedLengthPolicy._undefined_validator = bv.Void() +WebSessionsFixedLengthPolicy._other_validator = bv.Void() +WebSessionsFixedLengthPolicy._tagmap = { + 'defined': WebSessionsFixedLengthPolicy._defined_validator, + 'undefined': WebSessionsFixedLengthPolicy._undefined_validator, + 'other': WebSessionsFixedLengthPolicy._other_validator, +} + +WebSessionsFixedLengthPolicy.undefined = WebSessionsFixedLengthPolicy('undefined') +WebSessionsFixedLengthPolicy.other = WebSessionsFixedLengthPolicy('other') + +WebSessionsIdleLengthPolicy._defined_validator = DurationLogInfo_validator +WebSessionsIdleLengthPolicy._undefined_validator = bv.Void() +WebSessionsIdleLengthPolicy._other_validator = bv.Void() +WebSessionsIdleLengthPolicy._tagmap = { + 'defined': WebSessionsIdleLengthPolicy._defined_validator, + 'undefined': WebSessionsIdleLengthPolicy._undefined_validator, + 'other': WebSessionsIdleLengthPolicy._other_validator, +} + +WebSessionsIdleLengthPolicy.undefined = WebSessionsIdleLengthPolicy('undefined') +WebSessionsIdleLengthPolicy.other = WebSessionsIdleLengthPolicy('other') + +get_events = bb.Route( + 'get_events', + 1, + False, + GetTeamEventsArg_validator, + GetTeamEventsResult_validator, + GetTeamEventsError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +get_events_continue = bb.Route( + 'get_events/continue', + 1, + False, + GetTeamEventsContinueArg_validator, + GetTeamEventsResult_validator, + GetTeamEventsContinueError_validator, + {'host': u'api', + 'style': u'rpc'}, +) + +ROUTES = { + 'get_events': get_events, + 'get_events/continue': get_events_continue, +} + diff --git a/dropbox-script/dropbox/team_policies.py b/dropbox-script/dropbox/team_policies.py new file mode 100644 index 0000000..a3a196e --- /dev/null +++ b/dropbox-script/dropbox/team_policies.py @@ -0,0 +1,1447 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# @generated +# flake8: noqa +# pylint: skip-file +try: + from . import stone_validators as bv + from . import stone_base as bb +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bv + import stone_base as bb + +class CameraUploadsPolicyState(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar disabled: Background camera uploads are disabled. + :ivar enabled: Background camera uploads are allowed. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(CameraUploadsPolicyState, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'CameraUploadsPolicyState(%r, %r)' % (self._tag, self._value) + +CameraUploadsPolicyState_validator = bv.Union(CameraUploadsPolicyState) + +class EmmState(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar disabled: Emm token is disabled. + :ivar optional: Emm token is optional. + :ivar required: Emm token is required. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + optional = None + # Attribute is overwritten below the class definition + required = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_optional(self): + """ + Check if the union tag is ``optional``. + + :rtype: bool + """ + return self._tag == 'optional' + + def is_required(self): + """ + Check if the union tag is ``required``. + + :rtype: bool + """ + return self._tag == 'required' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(EmmState, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'EmmState(%r, %r)' % (self._tag, self._value) + +EmmState_validator = bv.Union(EmmState) + +class GroupCreation(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar admins_and_members: Team admins and members can create groups. + :ivar admins_only: Only team admins can create groups. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + admins_and_members = None + # Attribute is overwritten below the class definition + admins_only = None + + def is_admins_and_members(self): + """ + Check if the union tag is ``admins_and_members``. + + :rtype: bool + """ + return self._tag == 'admins_and_members' + + def is_admins_only(self): + """ + Check if the union tag is ``admins_only``. + + :rtype: bool + """ + return self._tag == 'admins_only' + + def _process_custom_annotations(self, annotation_type, processor): + super(GroupCreation, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GroupCreation(%r, %r)' % (self._tag, self._value) + +GroupCreation_validator = bv.Union(GroupCreation) + +class OfficeAddInPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar disabled: Office Add-In is disabled. + :ivar enabled: Office Add-In is enabled. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(OfficeAddInPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'OfficeAddInPolicy(%r, %r)' % (self._tag, self._value) + +OfficeAddInPolicy_validator = bv.Union(OfficeAddInPolicy) + +class PaperDeploymentPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar full: All team members have access to Paper. + :ivar partial: Only whitelisted team members can access Paper. To see which + user is whitelisted, check 'is_paper_whitelisted' on 'account/info'. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + full = None + # Attribute is overwritten below the class definition + partial = None + # Attribute is overwritten below the class definition + other = None + + def is_full(self): + """ + Check if the union tag is ``full``. + + :rtype: bool + """ + return self._tag == 'full' + + def is_partial(self): + """ + Check if the union tag is ``partial``. + + :rtype: bool + """ + return self._tag == 'partial' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperDeploymentPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperDeploymentPolicy(%r, %r)' % (self._tag, self._value) + +PaperDeploymentPolicy_validator = bv.Union(PaperDeploymentPolicy) + +class PaperEnabledPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar disabled: Paper is disabled. + :ivar enabled: Paper is enabled. + :ivar unspecified: Unspecified policy. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + unspecified = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_unspecified(self): + """ + Check if the union tag is ``unspecified``. + + :rtype: bool + """ + return self._tag == 'unspecified' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(PaperEnabledPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PaperEnabledPolicy(%r, %r)' % (self._tag, self._value) + +PaperEnabledPolicy_validator = bv.Union(PaperEnabledPolicy) + +class PasswordStrengthPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar minimal_requirements: User passwords will adhere to the minimal + password strength policy. + :ivar moderate_password: User passwords will adhere to the moderate password + strength policy. + :ivar strong_password: User passwords will adhere to the very strong + password strength policy. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + minimal_requirements = None + # Attribute is overwritten below the class definition + moderate_password = None + # Attribute is overwritten below the class definition + strong_password = None + # Attribute is overwritten below the class definition + other = None + + def is_minimal_requirements(self): + """ + Check if the union tag is ``minimal_requirements``. + + :rtype: bool + """ + return self._tag == 'minimal_requirements' + + def is_moderate_password(self): + """ + Check if the union tag is ``moderate_password``. + + :rtype: bool + """ + return self._tag == 'moderate_password' + + def is_strong_password(self): + """ + Check if the union tag is ``strong_password``. + + :rtype: bool + """ + return self._tag == 'strong_password' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(PasswordStrengthPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'PasswordStrengthPolicy(%r, %r)' % (self._tag, self._value) + +PasswordStrengthPolicy_validator = bv.Union(PasswordStrengthPolicy) + +class RolloutMethod(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar unlink_all: Unlink all. + :ivar unlink_most_inactive: Unlink devices with the most inactivity. + :ivar add_member_to_exceptions: Add member to Exceptions. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + unlink_all = None + # Attribute is overwritten below the class definition + unlink_most_inactive = None + # Attribute is overwritten below the class definition + add_member_to_exceptions = None + + def is_unlink_all(self): + """ + Check if the union tag is ``unlink_all``. + + :rtype: bool + """ + return self._tag == 'unlink_all' + + def is_unlink_most_inactive(self): + """ + Check if the union tag is ``unlink_most_inactive``. + + :rtype: bool + """ + return self._tag == 'unlink_most_inactive' + + def is_add_member_to_exceptions(self): + """ + Check if the union tag is ``add_member_to_exceptions``. + + :rtype: bool + """ + return self._tag == 'add_member_to_exceptions' + + def _process_custom_annotations(self, annotation_type, processor): + super(RolloutMethod, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'RolloutMethod(%r, %r)' % (self._tag, self._value) + +RolloutMethod_validator = bv.Union(RolloutMethod) + +class SharedFolderJoinPolicy(bb.Union): + """ + Policy governing which shared folders a team member can join. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar from_team_only: Team members can only join folders shared by + teammates. + :ivar from_anyone: Team members can join any shared folder, including those + shared by users outside the team. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + from_team_only = None + # Attribute is overwritten below the class definition + from_anyone = None + # Attribute is overwritten below the class definition + other = None + + def is_from_team_only(self): + """ + Check if the union tag is ``from_team_only``. + + :rtype: bool + """ + return self._tag == 'from_team_only' + + def is_from_anyone(self): + """ + Check if the union tag is ``from_anyone``. + + :rtype: bool + """ + return self._tag == 'from_anyone' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderJoinPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderJoinPolicy(%r, %r)' % (self._tag, self._value) + +SharedFolderJoinPolicy_validator = bv.Union(SharedFolderJoinPolicy) + +class SharedFolderMemberPolicy(bb.Union): + """ + Policy governing who can be a member of a folder shared by a team member. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar team: Only a teammate can be a member of a folder shared by a team + member. + :ivar anyone: Anyone can be a member of a folder shared by a team member. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + team = None + # Attribute is overwritten below the class definition + anyone = None + # Attribute is overwritten below the class definition + other = None + + def is_team(self): + """ + Check if the union tag is ``team``. + + :rtype: bool + """ + return self._tag == 'team' + + def is_anyone(self): + """ + Check if the union tag is ``anyone``. + + :rtype: bool + """ + return self._tag == 'anyone' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedFolderMemberPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedFolderMemberPolicy(%r, %r)' % (self._tag, self._value) + +SharedFolderMemberPolicy_validator = bv.Union(SharedFolderMemberPolicy) + +class SharedLinkCreatePolicy(bb.Union): + """ + Policy governing the visibility of shared links. This policy can apply to + newly created shared links, or all shared links. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar default_public: By default, anyone can access newly created shared + links. No login will be required to access the shared links unless + overridden. + :ivar default_team_only: By default, only members of the same team can + access newly created shared links. Login will be required to access the + shared links unless overridden. + :ivar team_only: Only members of the same team can access all shared links. + Login will be required to access all shared links. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + default_public = None + # Attribute is overwritten below the class definition + default_team_only = None + # Attribute is overwritten below the class definition + team_only = None + # Attribute is overwritten below the class definition + other = None + + def is_default_public(self): + """ + Check if the union tag is ``default_public``. + + :rtype: bool + """ + return self._tag == 'default_public' + + def is_default_team_only(self): + """ + Check if the union tag is ``default_team_only``. + + :rtype: bool + """ + return self._tag == 'default_team_only' + + def is_team_only(self): + """ + Check if the union tag is ``team_only``. + + :rtype: bool + """ + return self._tag == 'team_only' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SharedLinkCreatePolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SharedLinkCreatePolicy(%r, %r)' % (self._tag, self._value) + +SharedLinkCreatePolicy_validator = bv.Union(SharedLinkCreatePolicy) + +class ShowcaseDownloadPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar disabled: Do not allow files to be downloaded from Showcases. + :ivar enabled: Allow files to be downloaded from Showcases. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseDownloadPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseDownloadPolicy(%r, %r)' % (self._tag, self._value) + +ShowcaseDownloadPolicy_validator = bv.Union(ShowcaseDownloadPolicy) + +class ShowcaseEnabledPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar disabled: Showcase is disabled. + :ivar enabled: Showcase is enabled. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseEnabledPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseEnabledPolicy(%r, %r)' % (self._tag, self._value) + +ShowcaseEnabledPolicy_validator = bv.Union(ShowcaseEnabledPolicy) + +class ShowcaseExternalSharingPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar disabled: Do not allow showcases to be shared with people not on the + team. + :ivar enabled: Allow showcases to be shared with people not on the team. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + enabled = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_enabled(self): + """ + Check if the union tag is ``enabled``. + + :rtype: bool + """ + return self._tag == 'enabled' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(ShowcaseExternalSharingPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'ShowcaseExternalSharingPolicy(%r, %r)' % (self._tag, self._value) + +ShowcaseExternalSharingPolicy_validator = bv.Union(ShowcaseExternalSharingPolicy) + +class SmartSyncPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar local: The specified content will be synced as local files by default. + :ivar on_demand: The specified content will be synced as on-demand files by + default. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + local = None + # Attribute is overwritten below the class definition + on_demand = None + # Attribute is overwritten below the class definition + other = None + + def is_local(self): + """ + Check if the union tag is ``local``. + + :rtype: bool + """ + return self._tag == 'local' + + def is_on_demand(self): + """ + Check if the union tag is ``on_demand``. + + :rtype: bool + """ + return self._tag == 'on_demand' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SmartSyncPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SmartSyncPolicy(%r, %r)' % (self._tag, self._value) + +SmartSyncPolicy_validator = bv.Union(SmartSyncPolicy) + +class SsoPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar disabled: Users will be able to sign in with their Dropbox + credentials. + :ivar optional: Users will be able to sign in with either their Dropbox or + single sign-on credentials. + :ivar required: Users will be required to sign in with their single sign-on + credentials. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + disabled = None + # Attribute is overwritten below the class definition + optional = None + # Attribute is overwritten below the class definition + required = None + # Attribute is overwritten below the class definition + other = None + + def is_disabled(self): + """ + Check if the union tag is ``disabled``. + + :rtype: bool + """ + return self._tag == 'disabled' + + def is_optional(self): + """ + Check if the union tag is ``optional``. + + :rtype: bool + """ + return self._tag == 'optional' + + def is_required(self): + """ + Check if the union tag is ``required``. + + :rtype: bool + """ + return self._tag == 'required' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(SsoPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SsoPolicy(%r, %r)' % (self._tag, self._value) + +SsoPolicy_validator = bv.Union(SsoPolicy) + +class TeamMemberPolicies(bb.Struct): + """ + Policies governing team members. + + :ivar sharing: Policies governing sharing. + :ivar emm_state: This describes the Enterprise Mobility Management (EMM) + state for this team. This information can be used to understand if an + organization is integrating with a third-party EMM vendor to further + manage and apply restrictions upon the team's Dropbox usage on mobile + devices. This is a new feature and in the future we'll be adding more + new fields and additional documentation. + :ivar office_addin: The admin policy around the Dropbox Office Add-In for + this team. + """ + + __slots__ = [ + '_sharing_value', + '_sharing_present', + '_emm_state_value', + '_emm_state_present', + '_office_addin_value', + '_office_addin_present', + ] + + _has_required_fields = True + + def __init__(self, + sharing=None, + emm_state=None, + office_addin=None): + self._sharing_value = None + self._sharing_present = False + self._emm_state_value = None + self._emm_state_present = False + self._office_addin_value = None + self._office_addin_present = False + if sharing is not None: + self.sharing = sharing + if emm_state is not None: + self.emm_state = emm_state + if office_addin is not None: + self.office_addin = office_addin + + @property + def sharing(self): + """ + Policies governing sharing. + + :rtype: TeamSharingPolicies + """ + if self._sharing_present: + return self._sharing_value + else: + raise AttributeError("missing required field 'sharing'") + + @sharing.setter + def sharing(self, val): + self._sharing_validator.validate_type_only(val) + self._sharing_value = val + self._sharing_present = True + + @sharing.deleter + def sharing(self): + self._sharing_value = None + self._sharing_present = False + + @property + def emm_state(self): + """ + This describes the Enterprise Mobility Management (EMM) state for this + team. This information can be used to understand if an organization is + integrating with a third-party EMM vendor to further manage and apply + restrictions upon the team's Dropbox usage on mobile devices. This is a + new feature and in the future we'll be adding more new fields and + additional documentation. + + :rtype: EmmState + """ + if self._emm_state_present: + return self._emm_state_value + else: + raise AttributeError("missing required field 'emm_state'") + + @emm_state.setter + def emm_state(self, val): + self._emm_state_validator.validate_type_only(val) + self._emm_state_value = val + self._emm_state_present = True + + @emm_state.deleter + def emm_state(self): + self._emm_state_value = None + self._emm_state_present = False + + @property + def office_addin(self): + """ + The admin policy around the Dropbox Office Add-In for this team. + + :rtype: OfficeAddInPolicy + """ + if self._office_addin_present: + return self._office_addin_value + else: + raise AttributeError("missing required field 'office_addin'") + + @office_addin.setter + def office_addin(self, val): + self._office_addin_validator.validate_type_only(val) + self._office_addin_value = val + self._office_addin_present = True + + @office_addin.deleter + def office_addin(self): + self._office_addin_value = None + self._office_addin_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamMemberPolicies, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamMemberPolicies(sharing={!r}, emm_state={!r}, office_addin={!r})'.format( + self._sharing_value, + self._emm_state_value, + self._office_addin_value, + ) + +TeamMemberPolicies_validator = bv.Struct(TeamMemberPolicies) + +class TeamSharingPolicies(bb.Struct): + """ + Policies governing sharing within and outside of the team. + + :ivar shared_folder_member_policy: Who can join folders shared by team + members. + :ivar shared_folder_join_policy: Which shared folders team members can join. + :ivar shared_link_create_policy: Who can view shared links owned by team + members. + """ + + __slots__ = [ + '_shared_folder_member_policy_value', + '_shared_folder_member_policy_present', + '_shared_folder_join_policy_value', + '_shared_folder_join_policy_present', + '_shared_link_create_policy_value', + '_shared_link_create_policy_present', + ] + + _has_required_fields = True + + def __init__(self, + shared_folder_member_policy=None, + shared_folder_join_policy=None, + shared_link_create_policy=None): + self._shared_folder_member_policy_value = None + self._shared_folder_member_policy_present = False + self._shared_folder_join_policy_value = None + self._shared_folder_join_policy_present = False + self._shared_link_create_policy_value = None + self._shared_link_create_policy_present = False + if shared_folder_member_policy is not None: + self.shared_folder_member_policy = shared_folder_member_policy + if shared_folder_join_policy is not None: + self.shared_folder_join_policy = shared_folder_join_policy + if shared_link_create_policy is not None: + self.shared_link_create_policy = shared_link_create_policy + + @property + def shared_folder_member_policy(self): + """ + Who can join folders shared by team members. + + :rtype: SharedFolderMemberPolicy + """ + if self._shared_folder_member_policy_present: + return self._shared_folder_member_policy_value + else: + raise AttributeError("missing required field 'shared_folder_member_policy'") + + @shared_folder_member_policy.setter + def shared_folder_member_policy(self, val): + self._shared_folder_member_policy_validator.validate_type_only(val) + self._shared_folder_member_policy_value = val + self._shared_folder_member_policy_present = True + + @shared_folder_member_policy.deleter + def shared_folder_member_policy(self): + self._shared_folder_member_policy_value = None + self._shared_folder_member_policy_present = False + + @property + def shared_folder_join_policy(self): + """ + Which shared folders team members can join. + + :rtype: SharedFolderJoinPolicy + """ + if self._shared_folder_join_policy_present: + return self._shared_folder_join_policy_value + else: + raise AttributeError("missing required field 'shared_folder_join_policy'") + + @shared_folder_join_policy.setter + def shared_folder_join_policy(self, val): + self._shared_folder_join_policy_validator.validate_type_only(val) + self._shared_folder_join_policy_value = val + self._shared_folder_join_policy_present = True + + @shared_folder_join_policy.deleter + def shared_folder_join_policy(self): + self._shared_folder_join_policy_value = None + self._shared_folder_join_policy_present = False + + @property + def shared_link_create_policy(self): + """ + Who can view shared links owned by team members. + + :rtype: SharedLinkCreatePolicy + """ + if self._shared_link_create_policy_present: + return self._shared_link_create_policy_value + else: + raise AttributeError("missing required field 'shared_link_create_policy'") + + @shared_link_create_policy.setter + def shared_link_create_policy(self, val): + self._shared_link_create_policy_validator.validate_type_only(val) + self._shared_link_create_policy_value = val + self._shared_link_create_policy_present = True + + @shared_link_create_policy.deleter + def shared_link_create_policy(self): + self._shared_link_create_policy_value = None + self._shared_link_create_policy_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamSharingPolicies, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamSharingPolicies(shared_folder_member_policy={!r}, shared_folder_join_policy={!r}, shared_link_create_policy={!r})'.format( + self._shared_folder_member_policy_value, + self._shared_folder_join_policy_value, + self._shared_link_create_policy_value, + ) + +TeamSharingPolicies_validator = bv.Struct(TeamSharingPolicies) + +class TwoStepVerificationPolicy(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar require_tfa_enable: Enabled require two factor authorization. + :ivar require_tfa_disable: Disabled require two factor authorization. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + require_tfa_enable = None + # Attribute is overwritten below the class definition + require_tfa_disable = None + # Attribute is overwritten below the class definition + other = None + + def is_require_tfa_enable(self): + """ + Check if the union tag is ``require_tfa_enable``. + + :rtype: bool + """ + return self._tag == 'require_tfa_enable' + + def is_require_tfa_disable(self): + """ + Check if the union tag is ``require_tfa_disable``. + + :rtype: bool + """ + return self._tag == 'require_tfa_disable' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(TwoStepVerificationPolicy, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TwoStepVerificationPolicy(%r, %r)' % (self._tag, self._value) + +TwoStepVerificationPolicy_validator = bv.Union(TwoStepVerificationPolicy) + +CameraUploadsPolicyState._disabled_validator = bv.Void() +CameraUploadsPolicyState._enabled_validator = bv.Void() +CameraUploadsPolicyState._other_validator = bv.Void() +CameraUploadsPolicyState._tagmap = { + 'disabled': CameraUploadsPolicyState._disabled_validator, + 'enabled': CameraUploadsPolicyState._enabled_validator, + 'other': CameraUploadsPolicyState._other_validator, +} + +CameraUploadsPolicyState.disabled = CameraUploadsPolicyState('disabled') +CameraUploadsPolicyState.enabled = CameraUploadsPolicyState('enabled') +CameraUploadsPolicyState.other = CameraUploadsPolicyState('other') + +EmmState._disabled_validator = bv.Void() +EmmState._optional_validator = bv.Void() +EmmState._required_validator = bv.Void() +EmmState._other_validator = bv.Void() +EmmState._tagmap = { + 'disabled': EmmState._disabled_validator, + 'optional': EmmState._optional_validator, + 'required': EmmState._required_validator, + 'other': EmmState._other_validator, +} + +EmmState.disabled = EmmState('disabled') +EmmState.optional = EmmState('optional') +EmmState.required = EmmState('required') +EmmState.other = EmmState('other') + +GroupCreation._admins_and_members_validator = bv.Void() +GroupCreation._admins_only_validator = bv.Void() +GroupCreation._tagmap = { + 'admins_and_members': GroupCreation._admins_and_members_validator, + 'admins_only': GroupCreation._admins_only_validator, +} + +GroupCreation.admins_and_members = GroupCreation('admins_and_members') +GroupCreation.admins_only = GroupCreation('admins_only') + +OfficeAddInPolicy._disabled_validator = bv.Void() +OfficeAddInPolicy._enabled_validator = bv.Void() +OfficeAddInPolicy._other_validator = bv.Void() +OfficeAddInPolicy._tagmap = { + 'disabled': OfficeAddInPolicy._disabled_validator, + 'enabled': OfficeAddInPolicy._enabled_validator, + 'other': OfficeAddInPolicy._other_validator, +} + +OfficeAddInPolicy.disabled = OfficeAddInPolicy('disabled') +OfficeAddInPolicy.enabled = OfficeAddInPolicy('enabled') +OfficeAddInPolicy.other = OfficeAddInPolicy('other') + +PaperDeploymentPolicy._full_validator = bv.Void() +PaperDeploymentPolicy._partial_validator = bv.Void() +PaperDeploymentPolicy._other_validator = bv.Void() +PaperDeploymentPolicy._tagmap = { + 'full': PaperDeploymentPolicy._full_validator, + 'partial': PaperDeploymentPolicy._partial_validator, + 'other': PaperDeploymentPolicy._other_validator, +} + +PaperDeploymentPolicy.full = PaperDeploymentPolicy('full') +PaperDeploymentPolicy.partial = PaperDeploymentPolicy('partial') +PaperDeploymentPolicy.other = PaperDeploymentPolicy('other') + +PaperEnabledPolicy._disabled_validator = bv.Void() +PaperEnabledPolicy._enabled_validator = bv.Void() +PaperEnabledPolicy._unspecified_validator = bv.Void() +PaperEnabledPolicy._other_validator = bv.Void() +PaperEnabledPolicy._tagmap = { + 'disabled': PaperEnabledPolicy._disabled_validator, + 'enabled': PaperEnabledPolicy._enabled_validator, + 'unspecified': PaperEnabledPolicy._unspecified_validator, + 'other': PaperEnabledPolicy._other_validator, +} + +PaperEnabledPolicy.disabled = PaperEnabledPolicy('disabled') +PaperEnabledPolicy.enabled = PaperEnabledPolicy('enabled') +PaperEnabledPolicy.unspecified = PaperEnabledPolicy('unspecified') +PaperEnabledPolicy.other = PaperEnabledPolicy('other') + +PasswordStrengthPolicy._minimal_requirements_validator = bv.Void() +PasswordStrengthPolicy._moderate_password_validator = bv.Void() +PasswordStrengthPolicy._strong_password_validator = bv.Void() +PasswordStrengthPolicy._other_validator = bv.Void() +PasswordStrengthPolicy._tagmap = { + 'minimal_requirements': PasswordStrengthPolicy._minimal_requirements_validator, + 'moderate_password': PasswordStrengthPolicy._moderate_password_validator, + 'strong_password': PasswordStrengthPolicy._strong_password_validator, + 'other': PasswordStrengthPolicy._other_validator, +} + +PasswordStrengthPolicy.minimal_requirements = PasswordStrengthPolicy('minimal_requirements') +PasswordStrengthPolicy.moderate_password = PasswordStrengthPolicy('moderate_password') +PasswordStrengthPolicy.strong_password = PasswordStrengthPolicy('strong_password') +PasswordStrengthPolicy.other = PasswordStrengthPolicy('other') + +RolloutMethod._unlink_all_validator = bv.Void() +RolloutMethod._unlink_most_inactive_validator = bv.Void() +RolloutMethod._add_member_to_exceptions_validator = bv.Void() +RolloutMethod._tagmap = { + 'unlink_all': RolloutMethod._unlink_all_validator, + 'unlink_most_inactive': RolloutMethod._unlink_most_inactive_validator, + 'add_member_to_exceptions': RolloutMethod._add_member_to_exceptions_validator, +} + +RolloutMethod.unlink_all = RolloutMethod('unlink_all') +RolloutMethod.unlink_most_inactive = RolloutMethod('unlink_most_inactive') +RolloutMethod.add_member_to_exceptions = RolloutMethod('add_member_to_exceptions') + +SharedFolderJoinPolicy._from_team_only_validator = bv.Void() +SharedFolderJoinPolicy._from_anyone_validator = bv.Void() +SharedFolderJoinPolicy._other_validator = bv.Void() +SharedFolderJoinPolicy._tagmap = { + 'from_team_only': SharedFolderJoinPolicy._from_team_only_validator, + 'from_anyone': SharedFolderJoinPolicy._from_anyone_validator, + 'other': SharedFolderJoinPolicy._other_validator, +} + +SharedFolderJoinPolicy.from_team_only = SharedFolderJoinPolicy('from_team_only') +SharedFolderJoinPolicy.from_anyone = SharedFolderJoinPolicy('from_anyone') +SharedFolderJoinPolicy.other = SharedFolderJoinPolicy('other') + +SharedFolderMemberPolicy._team_validator = bv.Void() +SharedFolderMemberPolicy._anyone_validator = bv.Void() +SharedFolderMemberPolicy._other_validator = bv.Void() +SharedFolderMemberPolicy._tagmap = { + 'team': SharedFolderMemberPolicy._team_validator, + 'anyone': SharedFolderMemberPolicy._anyone_validator, + 'other': SharedFolderMemberPolicy._other_validator, +} + +SharedFolderMemberPolicy.team = SharedFolderMemberPolicy('team') +SharedFolderMemberPolicy.anyone = SharedFolderMemberPolicy('anyone') +SharedFolderMemberPolicy.other = SharedFolderMemberPolicy('other') + +SharedLinkCreatePolicy._default_public_validator = bv.Void() +SharedLinkCreatePolicy._default_team_only_validator = bv.Void() +SharedLinkCreatePolicy._team_only_validator = bv.Void() +SharedLinkCreatePolicy._other_validator = bv.Void() +SharedLinkCreatePolicy._tagmap = { + 'default_public': SharedLinkCreatePolicy._default_public_validator, + 'default_team_only': SharedLinkCreatePolicy._default_team_only_validator, + 'team_only': SharedLinkCreatePolicy._team_only_validator, + 'other': SharedLinkCreatePolicy._other_validator, +} + +SharedLinkCreatePolicy.default_public = SharedLinkCreatePolicy('default_public') +SharedLinkCreatePolicy.default_team_only = SharedLinkCreatePolicy('default_team_only') +SharedLinkCreatePolicy.team_only = SharedLinkCreatePolicy('team_only') +SharedLinkCreatePolicy.other = SharedLinkCreatePolicy('other') + +ShowcaseDownloadPolicy._disabled_validator = bv.Void() +ShowcaseDownloadPolicy._enabled_validator = bv.Void() +ShowcaseDownloadPolicy._other_validator = bv.Void() +ShowcaseDownloadPolicy._tagmap = { + 'disabled': ShowcaseDownloadPolicy._disabled_validator, + 'enabled': ShowcaseDownloadPolicy._enabled_validator, + 'other': ShowcaseDownloadPolicy._other_validator, +} + +ShowcaseDownloadPolicy.disabled = ShowcaseDownloadPolicy('disabled') +ShowcaseDownloadPolicy.enabled = ShowcaseDownloadPolicy('enabled') +ShowcaseDownloadPolicy.other = ShowcaseDownloadPolicy('other') + +ShowcaseEnabledPolicy._disabled_validator = bv.Void() +ShowcaseEnabledPolicy._enabled_validator = bv.Void() +ShowcaseEnabledPolicy._other_validator = bv.Void() +ShowcaseEnabledPolicy._tagmap = { + 'disabled': ShowcaseEnabledPolicy._disabled_validator, + 'enabled': ShowcaseEnabledPolicy._enabled_validator, + 'other': ShowcaseEnabledPolicy._other_validator, +} + +ShowcaseEnabledPolicy.disabled = ShowcaseEnabledPolicy('disabled') +ShowcaseEnabledPolicy.enabled = ShowcaseEnabledPolicy('enabled') +ShowcaseEnabledPolicy.other = ShowcaseEnabledPolicy('other') + +ShowcaseExternalSharingPolicy._disabled_validator = bv.Void() +ShowcaseExternalSharingPolicy._enabled_validator = bv.Void() +ShowcaseExternalSharingPolicy._other_validator = bv.Void() +ShowcaseExternalSharingPolicy._tagmap = { + 'disabled': ShowcaseExternalSharingPolicy._disabled_validator, + 'enabled': ShowcaseExternalSharingPolicy._enabled_validator, + 'other': ShowcaseExternalSharingPolicy._other_validator, +} + +ShowcaseExternalSharingPolicy.disabled = ShowcaseExternalSharingPolicy('disabled') +ShowcaseExternalSharingPolicy.enabled = ShowcaseExternalSharingPolicy('enabled') +ShowcaseExternalSharingPolicy.other = ShowcaseExternalSharingPolicy('other') + +SmartSyncPolicy._local_validator = bv.Void() +SmartSyncPolicy._on_demand_validator = bv.Void() +SmartSyncPolicy._other_validator = bv.Void() +SmartSyncPolicy._tagmap = { + 'local': SmartSyncPolicy._local_validator, + 'on_demand': SmartSyncPolicy._on_demand_validator, + 'other': SmartSyncPolicy._other_validator, +} + +SmartSyncPolicy.local = SmartSyncPolicy('local') +SmartSyncPolicy.on_demand = SmartSyncPolicy('on_demand') +SmartSyncPolicy.other = SmartSyncPolicy('other') + +SsoPolicy._disabled_validator = bv.Void() +SsoPolicy._optional_validator = bv.Void() +SsoPolicy._required_validator = bv.Void() +SsoPolicy._other_validator = bv.Void() +SsoPolicy._tagmap = { + 'disabled': SsoPolicy._disabled_validator, + 'optional': SsoPolicy._optional_validator, + 'required': SsoPolicy._required_validator, + 'other': SsoPolicy._other_validator, +} + +SsoPolicy.disabled = SsoPolicy('disabled') +SsoPolicy.optional = SsoPolicy('optional') +SsoPolicy.required = SsoPolicy('required') +SsoPolicy.other = SsoPolicy('other') + +TeamMemberPolicies._sharing_validator = TeamSharingPolicies_validator +TeamMemberPolicies._emm_state_validator = EmmState_validator +TeamMemberPolicies._office_addin_validator = OfficeAddInPolicy_validator +TeamMemberPolicies._all_field_names_ = set([ + 'sharing', + 'emm_state', + 'office_addin', +]) +TeamMemberPolicies._all_fields_ = [ + ('sharing', TeamMemberPolicies._sharing_validator), + ('emm_state', TeamMemberPolicies._emm_state_validator), + ('office_addin', TeamMemberPolicies._office_addin_validator), +] + +TeamSharingPolicies._shared_folder_member_policy_validator = SharedFolderMemberPolicy_validator +TeamSharingPolicies._shared_folder_join_policy_validator = SharedFolderJoinPolicy_validator +TeamSharingPolicies._shared_link_create_policy_validator = SharedLinkCreatePolicy_validator +TeamSharingPolicies._all_field_names_ = set([ + 'shared_folder_member_policy', + 'shared_folder_join_policy', + 'shared_link_create_policy', +]) +TeamSharingPolicies._all_fields_ = [ + ('shared_folder_member_policy', TeamSharingPolicies._shared_folder_member_policy_validator), + ('shared_folder_join_policy', TeamSharingPolicies._shared_folder_join_policy_validator), + ('shared_link_create_policy', TeamSharingPolicies._shared_link_create_policy_validator), +] + +TwoStepVerificationPolicy._require_tfa_enable_validator = bv.Void() +TwoStepVerificationPolicy._require_tfa_disable_validator = bv.Void() +TwoStepVerificationPolicy._other_validator = bv.Void() +TwoStepVerificationPolicy._tagmap = { + 'require_tfa_enable': TwoStepVerificationPolicy._require_tfa_enable_validator, + 'require_tfa_disable': TwoStepVerificationPolicy._require_tfa_disable_validator, + 'other': TwoStepVerificationPolicy._other_validator, +} + +TwoStepVerificationPolicy.require_tfa_enable = TwoStepVerificationPolicy('require_tfa_enable') +TwoStepVerificationPolicy.require_tfa_disable = TwoStepVerificationPolicy('require_tfa_disable') +TwoStepVerificationPolicy.other = TwoStepVerificationPolicy('other') + +ROUTES = { +} + diff --git a/dropbox-script/dropbox/trusted-certs.crt b/dropbox-script/dropbox/trusted-certs.crt new file mode 100644 index 0000000..00c2f2e --- /dev/null +++ b/dropbox-script/dropbox/trusted-certs.crt @@ -0,0 +1,1396 @@ +# DigiCert Assured ID Root CA.pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: +# 0c:e7:e0:e5:17:d8:46:fe:8f:e5:60:fc:1b:f0:30:39 +# Signature Algorithm: sha1WithRSAEncryption +# Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Assured ID Root CA +# Validity +# Not Before: Nov 10 00:00:00 2006 GMT +# Not After : Nov 10 00:00:00 2031 GMT +# Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Assured ID Root CA +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:ad:0e:15:ce:e4:43:80:5c:b1:87:f3:b7:60:f9: +# 71:12:a5:ae:dc:26:94:88:aa:f4:ce:f5:20:39:28: +# 58:60:0c:f8:80:da:a9:15:95:32:61:3c:b5:b1:28: +# 84:8a:8a:dc:9f:0a:0c:83:17:7a:8f:90:ac:8a:e7: +# 79:53:5c:31:84:2a:f6:0f:98:32:36:76:cc:de:dd: +# 3c:a8:a2:ef:6a:fb:21:f2:52:61:df:9f:20:d7:1f: +# e2:b1:d9:fe:18:64:d2:12:5b:5f:f9:58:18:35:bc: +# 47:cd:a1:36:f9:6b:7f:d4:b0:38:3e:c1:1b:c3:8c: +# 33:d9:d8:2f:18:fe:28:0f:b3:a7:83:d6:c3:6e:44: +# c0:61:35:96:16:fe:59:9c:8b:76:6d:d7:f1:a2:4b: +# 0d:2b:ff:0b:72:da:9e:60:d0:8e:90:35:c6:78:55: +# 87:20:a1:cf:e5:6d:0a:c8:49:7c:31:98:33:6c:22: +# e9:87:d0:32:5a:a2:ba:13:82:11:ed:39:17:9d:99: +# 3a:72:a1:e6:fa:a4:d9:d5:17:31:75:ae:85:7d:22: +# ae:3f:01:46:86:f6:28:79:c8:b1:da:e4:57:17:c4: +# 7e:1c:0e:b0:b4:92:a6:56:b3:bd:b2:97:ed:aa:a7: +# f0:b7:c5:a8:3f:95:16:d0:ff:a1:96:eb:08:5f:18: +# 77:4f +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Key Usage: critical +# Digital Signature, Certificate Sign, CRL Sign +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Subject Key Identifier: +# 45:EB:A2:AF:F4:92:CB:82:31:2D:51:8B:A7:A7:21:9D:F3:6D:C8:0F +# X509v3 Authority Key Identifier: +# keyid:45:EB:A2:AF:F4:92:CB:82:31:2D:51:8B:A7:A7:21:9D:F3:6D:C8:0F +# +# Signature Algorithm: sha1WithRSAEncryption +# a2:0e:bc:df:e2:ed:f0:e3:72:73:7a:64:94:bf:f7:72:66:d8: +# 32:e4:42:75:62:ae:87:eb:f2:d5:d9:de:56:b3:9f:cc:ce:14: +# 28:b9:0d:97:60:5c:12:4c:58:e4:d3:3d:83:49:45:58:97:35: +# 69:1a:a8:47:ea:56:c6:79:ab:12:d8:67:81:84:df:7f:09:3c: +# 94:e6:b8:26:2c:20:bd:3d:b3:28:89:f7:5f:ff:22:e2:97:84: +# 1f:e9:65:ef:87:e0:df:c1:67:49:b3:5d:eb:b2:09:2a:eb:26: +# ed:78:be:7d:3f:2b:f3:b7:26:35:6d:5f:89:01:b6:49:5b:9f: +# 01:05:9b:ab:3d:25:c1:cc:b6:7f:c2:f1:6f:86:c6:fa:64:68: +# eb:81:2d:94:eb:42:b7:fa:8c:1e:dd:62:f1:be:50:67:b7:6c: +# bd:f3:f1:1f:6b:0c:36:07:16:7f:37:7c:a9:5b:6d:7a:f1:12: +# 46:60:83:d7:27:04:be:4b:ce:97:be:c3:67:2a:68:11:df:80: +# e7:0c:33:66:bf:13:0d:14:6e:f3:7f:1f:63:10:1e:fa:8d:1b: +# 25:6d:6c:8f:a5:b7:61:01:b1:d2:a3:26:a1:10:71:9d:ad:e2: +# c3:f9:c3:99:51:b7:2b:07:08:ce:2e:e6:50:b2:a7:fa:0a:45: +# 2f:a2:f0:f2 +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- +# DigiCert Global Root CA.pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: +# 08:3b:e0:56:90:42:46:b1:a1:75:6a:c9:59:91:c7:4a +# Signature Algorithm: sha1WithRSAEncryption +# Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root CA +# Validity +# Not Before: Nov 10 00:00:00 2006 GMT +# Not After : Nov 10 00:00:00 2031 GMT +# Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root CA +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:e2:3b:e1:11:72:de:a8:a4:d3:a3:57:aa:50:a2: +# 8f:0b:77:90:c9:a2:a5:ee:12:ce:96:5b:01:09:20: +# cc:01:93:a7:4e:30:b7:53:f7:43:c4:69:00:57:9d: +# e2:8d:22:dd:87:06:40:00:81:09:ce:ce:1b:83:bf: +# df:cd:3b:71:46:e2:d6:66:c7:05:b3:76:27:16:8f: +# 7b:9e:1e:95:7d:ee:b7:48:a3:08:da:d6:af:7a:0c: +# 39:06:65:7f:4a:5d:1f:bc:17:f8:ab:be:ee:28:d7: +# 74:7f:7a:78:99:59:85:68:6e:5c:23:32:4b:bf:4e: +# c0:e8:5a:6d:e3:70:bf:77:10:bf:fc:01:f6:85:d9: +# a8:44:10:58:32:a9:75:18:d5:d1:a2:be:47:e2:27: +# 6a:f4:9a:33:f8:49:08:60:8b:d4:5f:b4:3a:84:bf: +# a1:aa:4a:4c:7d:3e:cf:4f:5f:6c:76:5e:a0:4b:37: +# 91:9e:dc:22:e6:6d:ce:14:1a:8e:6a:cb:fe:cd:b3: +# 14:64:17:c7:5b:29:9e:32:bf:f2:ee:fa:d3:0b:42: +# d4:ab:b7:41:32:da:0c:d4:ef:f8:81:d5:bb:8d:58: +# 3f:b5:1b:e8:49:28:a2:70:da:31:04:dd:f7:b2:16: +# f2:4c:0a:4e:07:a8:ed:4a:3d:5e:b5:7f:a3:90:c3: +# af:27 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Key Usage: critical +# Digital Signature, Certificate Sign, CRL Sign +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Subject Key Identifier: +# 03:DE:50:35:56:D1:4C:BB:66:F0:A3:E2:1B:1B:C3:97:B2:3D:D1:55 +# X509v3 Authority Key Identifier: +# keyid:03:DE:50:35:56:D1:4C:BB:66:F0:A3:E2:1B:1B:C3:97:B2:3D:D1:55 +# +# Signature Algorithm: sha1WithRSAEncryption +# cb:9c:37:aa:48:13:12:0a:fa:dd:44:9c:4f:52:b0:f4:df:ae: +# 04:f5:79:79:08:a3:24:18:fc:4b:2b:84:c0:2d:b9:d5:c7:fe: +# f4:c1:1f:58:cb:b8:6d:9c:7a:74:e7:98:29:ab:11:b5:e3:70: +# a0:a1:cd:4c:88:99:93:8c:91:70:e2:ab:0f:1c:be:93:a9:ff: +# 63:d5:e4:07:60:d3:a3:bf:9d:5b:09:f1:d5:8e:e3:53:f4:8e: +# 63:fa:3f:a7:db:b4:66:df:62:66:d6:d1:6e:41:8d:f2:2d:b5: +# ea:77:4a:9f:9d:58:e2:2b:59:c0:40:23:ed:2d:28:82:45:3e: +# 79:54:92:26:98:e0:80:48:a8:37:ef:f0:d6:79:60:16:de:ac: +# e8:0e:cd:6e:ac:44:17:38:2f:49:da:e1:45:3e:2a:b9:36:53: +# cf:3a:50:06:f7:2e:e8:c4:57:49:6c:61:21:18:d5:04:ad:78: +# 3c:2c:3a:80:6b:a7:eb:af:15:14:e9:d8:89:c1:b9:38:6c:e2: +# 91:6c:8a:ff:64:b9:77:25:57:30:c0:1b:24:a3:e1:dc:e9:df: +# 47:7c:b5:b4:24:08:05:30:ec:2d:bd:0b:bf:45:bf:50:b9:a9: +# f3:eb:98:01:12:ad:c8:88:c6:98:34:5f:8d:0a:3c:c6:e9:d5: +# 95:95:6d:de +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- +# DigiCert High Assurance EV Root CA.pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: +# 02:ac:5c:26:6a:0b:40:9b:8f:0b:79:f2:ae:46:25:77 +# Signature Algorithm: sha1WithRSAEncryption +# Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA +# Validity +# Not Before: Nov 10 00:00:00 2006 GMT +# Not After : Nov 10 00:00:00 2031 GMT +# Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:c6:cc:e5:73:e6:fb:d4:bb:e5:2d:2d:32:a6:df: +# e5:81:3f:c9:cd:25:49:b6:71:2a:c3:d5:94:34:67: +# a2:0a:1c:b0:5f:69:a6:40:b1:c4:b7:b2:8f:d0:98: +# a4:a9:41:59:3a:d3:dc:94:d6:3c:db:74:38:a4:4a: +# cc:4d:25:82:f7:4a:a5:53:12:38:ee:f3:49:6d:71: +# 91:7e:63:b6:ab:a6:5f:c3:a4:84:f8:4f:62:51:be: +# f8:c5:ec:db:38:92:e3:06:e5:08:91:0c:c4:28:41: +# 55:fb:cb:5a:89:15:7e:71:e8:35:bf:4d:72:09:3d: +# be:3a:38:50:5b:77:31:1b:8d:b3:c7:24:45:9a:a7: +# ac:6d:00:14:5a:04:b7:ba:13:eb:51:0a:98:41:41: +# 22:4e:65:61:87:81:41:50:a6:79:5c:89:de:19:4a: +# 57:d5:2e:e6:5d:1c:53:2c:7e:98:cd:1a:06:16:a4: +# 68:73:d0:34:04:13:5c:a1:71:d3:5a:7c:55:db:5e: +# 64:e1:37:87:30:56:04:e5:11:b4:29:80:12:f1:79: +# 39:88:a2:02:11:7c:27:66:b7:88:b7:78:f2:ca:0a: +# a8:38:ab:0a:64:c2:bf:66:5d:95:84:c1:a1:25:1e: +# 87:5d:1a:50:0b:20:12:cc:41:bb:6e:0b:51:38:b8: +# 4b:cb +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Key Usage: critical +# Digital Signature, Certificate Sign, CRL Sign +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Subject Key Identifier: +# B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 +# X509v3 Authority Key Identifier: +# keyid:B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3 +# +# Signature Algorithm: sha1WithRSAEncryption +# 1c:1a:06:97:dc:d7:9c:9f:3c:88:66:06:08:57:21:db:21:47: +# f8:2a:67:aa:bf:18:32:76:40:10:57:c1:8a:f3:7a:d9:11:65: +# 8e:35:fa:9e:fc:45:b5:9e:d9:4c:31:4b:b8:91:e8:43:2c:8e: +# b3:78:ce:db:e3:53:79:71:d6:e5:21:94:01:da:55:87:9a:24: +# 64:f6:8a:66:cc:de:9c:37:cd:a8:34:b1:69:9b:23:c8:9e:78: +# 22:2b:70:43:e3:55:47:31:61:19:ef:58:c5:85:2f:4e:30:f6: +# a0:31:16:23:c8:e7:e2:65:16:33:cb:bf:1a:1b:a0:3d:f8:ca: +# 5e:8b:31:8b:60:08:89:2d:0c:06:5c:52:b7:c4:f9:0a:98:d1: +# 15:5f:9f:12:be:7c:36:63:38:bd:44:a4:7f:e4:26:2b:0a:c4: +# 97:69:0d:e9:8c:e2:c0:10:57:b8:c8:76:12:91:55:f2:48:69: +# d8:bc:2a:02:5b:0f:44:d4:20:31:db:f4:ba:70:26:5d:90:60: +# 9e:bc:4b:17:09:2f:b4:cb:1e:43:68:c9:07:27:c1:d2:5c:f7: +# ea:21:b9:68:12:9c:3c:9c:bf:9e:fc:80:5c:9b:63:cd:ec:47: +# aa:25:27:67:a0:37:f3:00:82:7d:54:d7:a9:f8:e9:2e:13:a3: +# 77:e8:1f:4a +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- +# Entrust Root Certification Authority - EC1.pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: +# a6:8b:79:29:00:00:00:00:50:d0:91:f9 +# Signature Algorithm: ecdsa-with-SHA384 +# Issuer: C=US, O=Entrust, Inc., OU=See www.entrust.net/legal-terms, OU=(c) 2012 Entrust, Inc. - for authorized use only, CN=Entrust Root Certification Authority - EC1 +# Validity +# Not Before: Dec 18 15:25:36 2012 GMT +# Not After : Dec 18 15:55:36 2037 GMT +# Subject: C=US, O=Entrust, Inc., OU=See www.entrust.net/legal-terms, OU=(c) 2012 Entrust, Inc. - for authorized use only, CN=Entrust Root Certification Authority - EC1 +# Subject Public Key Info: +# Public Key Algorithm: id-ecPublicKey +# Public-Key: (384 bit) +# pub: +# 04:84:13:c9:d0:ba:6d:41:7b:e2:6c:d0:eb:55:5f: +# 66:02:1a:24:f4:5b:89:69:47:e3:b8:c2:7d:f1:f2: +# 02:c5:9f:a0:f6:5b:d5:8b:06:19:86:4f:53:10:6d: +# 07:24:27:a1:a0:f8:d5:47:19:61:4c:7d:ca:93:27: +# ea:74:0c:ef:6f:96:09:fe:63:ec:70:5d:36:ad:67: +# 77:ae:c9:9d:7c:55:44:3a:a2:63:51:1f:f5:e3:62: +# d4:a9:47:07:3e:cc:20 +# ASN1 OID: secp384r1 +# X509v3 extensions: +# X509v3 Key Usage: critical +# Certificate Sign, CRL Sign +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Subject Key Identifier: +# B7:63:E7:1A:DD:8D:E9:08:A6:55:83:A4:E0:6A:50:41:65:11:42:49 +# Signature Algorithm: ecdsa-with-SHA384 +# 30:64:02:30:61:79:d8:e5:42:47:df:1c:ae:53:99:17:b6:6f: +# 1c:7d:e1:bf:11:94:d1:03:88:75:e4:8d:89:a4:8a:77:46:de: +# 6d:61:ef:02:f5:fb:b5:df:cc:fe:4e:ff:fe:a9:e6:a7:02:30: +# 5b:99:d7:85:37:06:b5:7b:08:fd:eb:27:8b:4a:94:f9:e1:fa: +# a7:8e:26:08:e8:7c:92:68:6d:73:d8:6f:26:ac:21:02:b8:99: +# b7:26:41:5b:25:60:ae:d0:48:1a:ee:06 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- +# Entrust Root Certification Authority - G2.pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 1246989352 (0x4a538c28) +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: C=US, O=Entrust, Inc., OU=See www.entrust.net/legal-terms, OU=(c) 2009 Entrust, Inc. - for authorized use only, CN=Entrust Root Certification Authority - G2 +# Validity +# Not Before: Jul 7 17:25:54 2009 GMT +# Not After : Dec 7 17:55:54 2030 GMT +# Subject: C=US, O=Entrust, Inc., OU=See www.entrust.net/legal-terms, OU=(c) 2009 Entrust, Inc. - for authorized use only, CN=Entrust Root Certification Authority - G2 +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:ba:84:b6:72:db:9e:0c:6b:e2:99:e9:30:01:a7: +# 76:ea:32:b8:95:41:1a:c9:da:61:4e:58:72:cf:fe: +# f6:82:79:bf:73:61:06:0a:a5:27:d8:b3:5f:d3:45: +# 4e:1c:72:d6:4e:32:f2:72:8a:0f:f7:83:19:d0:6a: +# 80:80:00:45:1e:b0:c7:e7:9a:bf:12:57:27:1c:a3: +# 68:2f:0a:87:bd:6a:6b:0e:5e:65:f3:1c:77:d5:d4: +# 85:8d:70:21:b4:b3:32:e7:8b:a2:d5:86:39:02:b1: +# b8:d2:47:ce:e4:c9:49:c4:3b:a7:de:fb:54:7d:57: +# be:f0:e8:6e:c2:79:b2:3a:0b:55:e2:50:98:16:32: +# 13:5c:2f:78:56:c1:c2:94:b3:f2:5a:e4:27:9a:9f: +# 24:d7:c6:ec:d0:9b:25:82:e3:cc:c2:c4:45:c5:8c: +# 97:7a:06:6b:2a:11:9f:a9:0a:6e:48:3b:6f:db:d4: +# 11:19:42:f7:8f:07:bf:f5:53:5f:9c:3e:f4:17:2c: +# e6:69:ac:4e:32:4c:62:77:ea:b7:e8:e5:bb:34:bc: +# 19:8b:ae:9c:51:e7:b7:7e:b5:53:b1:33:22:e5:6d: +# cf:70:3c:1a:fa:e2:9b:67:b6:83:f4:8d:a5:af:62: +# 4c:4d:e0:58:ac:64:34:12:03:f8:b6:8d:94:63:24: +# a4:71 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Key Usage: critical +# Certificate Sign, CRL Sign +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Subject Key Identifier: +# 6A:72:26:7A:D0:1E:EF:7D:E7:3B:69:51:D4:6C:8D:9F:90:12:66:AB +# Signature Algorithm: sha256WithRSAEncryption +# 79:9f:1d:96:c6:b6:79:3f:22:8d:87:d3:87:03:04:60:6a:6b: +# 9a:2e:59:89:73:11:ac:43:d1:f5:13:ff:8d:39:2b:c0:f2:bd: +# 4f:70:8c:a9:2f:ea:17:c4:0b:54:9e:d4:1b:96:98:33:3c:a8: +# ad:62:a2:00:76:ab:59:69:6e:06:1d:7e:c4:b9:44:8d:98:af: +# 12:d4:61:db:0a:19:46:47:f3:eb:f7:63:c1:40:05:40:a5:d2: +# b7:f4:b5:9a:36:bf:a9:88:76:88:04:55:04:2b:9c:87:7f:1a: +# 37:3c:7e:2d:a5:1a:d8:d4:89:5e:ca:bd:ac:3d:6c:d8:6d:af: +# d5:f3:76:0f:cd:3b:88:38:22:9d:6c:93:9a:c4:3d:bf:82:1b: +# 65:3f:a6:0f:5d:aa:fc:e5:b2:15:ca:b5:ad:c6:bc:3d:d0:84: +# e8:ea:06:72:b0:4d:39:32:78:bf:3e:11:9c:0b:a4:9d:9a:21: +# f3:f0:9b:0b:30:78:db:c1:dc:87:43:fe:bc:63:9a:ca:c5:c2: +# 1c:c9:c7:8d:ff:3b:12:58:08:e6:b6:3d:ec:7a:2c:4e:fb:83: +# 96:ce:0c:3c:69:87:54:73:a4:73:c2:93:ff:51:10:ac:15:54: +# 01:d8:fc:05:b1:89:a1:7f:74:83:9a:49:d7:dc:4e:7b:8a:48: +# 6f:8b:45:f6 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- +# Entrust Root Certification Authority.pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 1164660820 (0x456b5054) +# Signature Algorithm: sha1WithRSAEncryption +# Issuer: C=US, O=Entrust, Inc., OU=www.entrust.net/CPS is incorporated by reference, OU=(c) 2006 Entrust, Inc., CN=Entrust Root Certification Authority +# Validity +# Not Before: Nov 27 20:23:42 2006 GMT +# Not After : Nov 27 20:53:42 2026 GMT +# Subject: C=US, O=Entrust, Inc., OU=www.entrust.net/CPS is incorporated by reference, OU=(c) 2006 Entrust, Inc., CN=Entrust Root Certification Authority +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:b6:95:b6:43:42:fa:c6:6d:2a:6f:48:df:94:4c: +# 39:57:05:ee:c3:79:11:41:68:36:ed:ec:fe:9a:01: +# 8f:a1:38:28:fc:f7:10:46:66:2e:4d:1e:1a:b1:1a: +# 4e:c6:d1:c0:95:88:b0:c9:ff:31:8b:33:03:db:b7: +# 83:7b:3e:20:84:5e:ed:b2:56:28:a7:f8:e0:b9:40: +# 71:37:c5:cb:47:0e:97:2a:68:c0:22:95:62:15:db: +# 47:d9:f5:d0:2b:ff:82:4b:c9:ad:3e:de:4c:db:90: +# 80:50:3f:09:8a:84:00:ec:30:0a:3d:18:cd:fb:fd: +# 2a:59:9a:23:95:17:2c:45:9e:1f:6e:43:79:6d:0c: +# 5c:98:fe:48:a7:c5:23:47:5c:5e:fd:6e:e7:1e:b4: +# f6:68:45:d1:86:83:5b:a2:8a:8d:b1:e3:29:80:fe: +# 25:71:88:ad:be:bc:8f:ac:52:96:4b:aa:51:8d:e4: +# 13:31:19:e8:4e:4d:9f:db:ac:b3:6a:d5:bc:39:54: +# 71:ca:7a:7a:7f:90:dd:7d:1d:80:d9:81:bb:59:26: +# c2:11:fe:e6:93:e2:f7:80:e4:65:fb:34:37:0e:29: +# 80:70:4d:af:38:86:2e:9e:7f:57:af:9e:17:ae:eb: +# 1c:cb:28:21:5f:b6:1c:d8:e7:a2:04:22:f9:d3:da: +# d8:cb +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Key Usage: critical +# Certificate Sign, CRL Sign +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Private Key Usage Period: +# Not Before: Nov 27 20:23:42 2006 GMT, Not After: Nov 27 20:53:42 2026 GMT +# X509v3 Authority Key Identifier: +# keyid:68:90:E4:67:A4:A6:53:80:C7:86:66:A4:F1:F7:4B:43:FB:84:BD:6D +# +# X509v3 Subject Key Identifier: +# 68:90:E4:67:A4:A6:53:80:C7:86:66:A4:F1:F7:4B:43:FB:84:BD:6D +# 1.2.840.113533.7.65.0: +# 0...V7.1:4.0.... +# Signature Algorithm: sha1WithRSAEncryption +# 93:d4:30:b0:d7:03:20:2a:d0:f9:63:e8:91:0c:05:20:a9:5f: +# 19:ca:7b:72:4e:d4:b1:db:d0:96:fb:54:5a:19:2c:0c:08:f7: +# b2:bc:85:a8:9d:7f:6d:3b:52:b3:2a:db:e7:d4:84:8c:63:f6: +# 0f:cb:26:01:91:50:6c:f4:5f:14:e2:93:74:c0:13:9e:30:3a: +# 50:e3:b4:60:c5:1c:f0:22:44:8d:71:47:ac:c8:1a:c9:e9:9b: +# 9a:00:60:13:ff:70:7e:5f:11:4d:49:1b:b3:15:52:7b:c9:54: +# da:bf:9d:95:af:6b:9a:d8:9e:e9:f1:e4:43:8d:e2:11:44:3a: +# bf:af:bd:83:42:73:52:8b:aa:bb:a7:29:cf:f5:64:1c:0a:4d: +# d1:bc:aa:ac:9f:2a:d0:ff:7f:7f:da:7d:ea:b1:ed:30:25:c1: +# 84:da:34:d2:5b:78:83:56:ec:9c:36:c3:26:e2:11:f6:67:49: +# 1d:92:ab:8c:fb:eb:ff:7a:ee:85:4a:a7:50:80:f0:a7:5c:4a: +# 94:2e:5f:05:99:3c:52:41:e0:cd:b4:63:cf:01:43:ba:9c:83: +# dc:8f:60:3b:f3:5a:b4:b4:7b:ae:da:0b:90:38:75:ef:81:1d: +# 66:d2:f7:57:70:36:b3:bf:fc:28:af:71:25:85:5b:13:fe:1e: +# 7f:5a:b4:3c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- +# Entrust.net Certification Authority (2048).pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 946069240 (0x3863def8) +# Signature Algorithm: sha1WithRSAEncryption +# Issuer: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048) +# Validity +# Not Before: Dec 24 17:50:51 1999 GMT +# Not After : Jul 24 14:15:12 2029 GMT +# Subject: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048) +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:ad:4d:4b:a9:12:86:b2:ea:a3:20:07:15:16:64: +# 2a:2b:4b:d1:bf:0b:4a:4d:8e:ed:80:76:a5:67:b7: +# 78:40:c0:73:42:c8:68:c0:db:53:2b:dd:5e:b8:76: +# 98:35:93:8b:1a:9d:7c:13:3a:0e:1f:5b:b7:1e:cf: +# e5:24:14:1e:b1:81:a9:8d:7d:b8:cc:6b:4b:03:f1: +# 02:0c:dc:ab:a5:40:24:00:7f:74:94:a1:9d:08:29: +# b3:88:0b:f5:87:77:9d:55:cd:e4:c3:7e:d7:6a:64: +# ab:85:14:86:95:5b:97:32:50:6f:3d:c8:ba:66:0c: +# e3:fc:bd:b8:49:c1:76:89:49:19:fd:c0:a8:bd:89: +# a3:67:2f:c6:9f:bc:71:19:60:b8:2d:e9:2c:c9:90: +# 76:66:7b:94:e2:af:78:d6:65:53:5d:3c:d6:9c:b2: +# cf:29:03:f9:2f:a4:50:b2:d4:48:ce:05:32:55:8a: +# fd:b2:64:4c:0e:e4:98:07:75:db:7f:df:b9:08:55: +# 60:85:30:29:f9:7b:48:a4:69:86:e3:35:3f:1e:86: +# 5d:7a:7a:15:bd:ef:00:8e:15:22:54:17:00:90:26: +# 93:bc:0e:49:68:91:bf:f8:47:d3:9d:95:42:c1:0e: +# 4d:df:6f:26:cf:c3:18:21:62:66:43:70:d6:d5:c0: +# 07:e1 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Key Usage: critical +# Certificate Sign, CRL Sign +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Subject Key Identifier: +# 55:E4:81:D1:11:80:BE:D8:89:B9:08:A3:31:F9:A1:24:09:16:B9:70 +# Signature Algorithm: sha1WithRSAEncryption +# 3b:9b:8f:56:9b:30:e7:53:99:7c:7a:79:a7:4d:97:d7:19:95: +# 90:fb:06:1f:ca:33:7c:46:63:8f:96:66:24:fa:40:1b:21:27: +# ca:e6:72:73:f2:4f:fe:31:99:fd:c8:0c:4c:68:53:c6:80:82: +# 13:98:fa:b6:ad:da:5d:3d:f1:ce:6e:f6:15:11:94:82:0c:ee: +# 3f:95:af:11:ab:0f:d7:2f:de:1f:03:8f:57:2c:1e:c9:bb:9a: +# 1a:44:95:eb:18:4f:a6:1f:cd:7d:57:10:2f:9b:04:09:5a:84: +# b5:6e:d8:1d:3a:e1:d6:9e:d1:6c:79:5e:79:1c:14:c5:e3:d0: +# 4c:93:3b:65:3c:ed:df:3d:be:a6:e5:95:1a:c3:b5:19:c3:bd: +# 5e:5b:bb:ff:23:ef:68:19:cb:12:93:27:5c:03:2d:6f:30:d0: +# 1e:b6:1a:ac:de:5a:f7:d1:aa:a8:27:a6:fe:79:81:c4:79:99: +# 33:57:ba:12:b0:a9:e0:42:6c:93:ca:56:de:fe:6d:84:0b:08: +# 8b:7e:8d:ea:d7:98:21:c6:f3:e7:3c:79:2f:5e:9c:d1:4c:15: +# 8d:e1:ec:22:37:cc:9a:43:0b:97:dc:80:90:8d:b3:67:9b:6f: +# 48:08:15:56:cf:bf:f1:2b:7c:5e:9a:76:e9:59:90:c5:7c:83: +# 35:11:65:51 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- +# GeoTrust Global CA.pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 144470 (0x23456) +# Signature Algorithm: sha1WithRSAEncryption +# Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA +# Validity +# Not Before: May 21 04:00:00 2002 GMT +# Not After : May 21 04:00:00 2022 GMT +# Subject: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:da:cc:18:63:30:fd:f4:17:23:1a:56:7e:5b:df: +# 3c:6c:38:e4:71:b7:78:91:d4:bc:a1:d8:4c:f8:a8: +# 43:b6:03:e9:4d:21:07:08:88:da:58:2f:66:39:29: +# bd:05:78:8b:9d:38:e8:05:b7:6a:7e:71:a4:e6:c4: +# 60:a6:b0:ef:80:e4:89:28:0f:9e:25:d6:ed:83:f3: +# ad:a6:91:c7:98:c9:42:18:35:14:9d:ad:98:46:92: +# 2e:4f:ca:f1:87:43:c1:16:95:57:2d:50:ef:89:2d: +# 80:7a:57:ad:f2:ee:5f:6b:d2:00:8d:b9:14:f8:14: +# 15:35:d9:c0:46:a3:7b:72:c8:91:bf:c9:55:2b:cd: +# d0:97:3e:9c:26:64:cc:df:ce:83:19:71:ca:4e:e6: +# d4:d5:7b:a9:19:cd:55:de:c8:ec:d2:5e:38:53:e5: +# 5c:4f:8c:2d:fe:50:23:36:fc:66:e6:cb:8e:a4:39: +# 19:00:b7:95:02:39:91:0b:0e:fe:38:2e:d1:1d:05: +# 9a:f6:4d:3e:6f:0f:07:1d:af:2c:1e:8f:60:39:e2: +# fa:36:53:13:39:d4:5e:26:2b:db:3d:a8:14:bd:32: +# eb:18:03:28:52:04:71:e5:ab:33:3d:e1:38:bb:07: +# 36:84:62:9c:79:ea:16:30:f4:5f:c0:2b:e8:71:6b: +# e4:f9 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Subject Key Identifier: +# C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E +# X509v3 Authority Key Identifier: +# keyid:C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E +# +# Signature Algorithm: sha1WithRSAEncryption +# 35:e3:29:6a:e5:2f:5d:54:8e:29:50:94:9f:99:1a:14:e4:8f: +# 78:2a:62:94:a2:27:67:9e:d0:cf:1a:5e:47:e9:c1:b2:a4:cf: +# dd:41:1a:05:4e:9b:4b:ee:4a:6f:55:52:b3:24:a1:37:0a:eb: +# 64:76:2a:2e:2c:f3:fd:3b:75:90:bf:fa:71:d8:c7:3d:37:d2: +# b5:05:95:62:b9:a6:de:89:3d:36:7b:38:77:48:97:ac:a6:20: +# 8f:2e:a6:c9:0c:c2:b2:99:45:00:c7:ce:11:51:22:22:e0:a5: +# ea:b6:15:48:09:64:ea:5e:4f:74:f7:05:3e:c7:8a:52:0c:db: +# 15:b4:bd:6d:9b:e5:c6:b1:54:68:a9:e3:69:90:b6:9a:a5:0f: +# b8:b9:3f:20:7d:ae:4a:b5:b8:9c:e4:1d:b6:ab:e6:94:a5:c1: +# c7:83:ad:db:f5:27:87:0e:04:6c:d5:ff:dd:a0:5d:ed:87:52: +# b7:2b:15:02:ae:39:a6:6a:74:e9:da:c4:e7:bc:4d:34:1e:a9: +# 5c:4d:33:5f:92:09:2f:88:66:5d:77:97:c7:1d:76:13:a9:d5: +# e5:f1:16:09:11:35:d5:ac:db:24:71:70:2c:98:56:0b:d9:17: +# b4:d1:e3:51:2b:5e:75:e8:d5:d0:dc:4f:34:ed:c2:05:66:80: +# a1:cb:e6:33 +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- +# GeoTrust Primary Certification Authority - G2.pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: +# 3c:b2:f4:48:0a:00:e2:fe:eb:24:3b:5e:60:3e:c3:6b +# Signature Algorithm: ecdsa-with-SHA384 +# Issuer: C=US, O=GeoTrust Inc., OU=(c) 2007 GeoTrust Inc. - For authorized use only, CN=GeoTrust Primary Certification Authority - G2 +# Validity +# Not Before: Nov 5 00:00:00 2007 GMT +# Not After : Jan 18 23:59:59 2038 GMT +# Subject: C=US, O=GeoTrust Inc., OU=(c) 2007 GeoTrust Inc. - For authorized use only, CN=GeoTrust Primary Certification Authority - G2 +# Subject Public Key Info: +# Public Key Algorithm: id-ecPublicKey +# Public-Key: (384 bit) +# pub: +# 04:15:b1:e8:fd:03:15:43:e5:ac:eb:87:37:11:62: +# ef:d2:83:36:52:7d:45:57:0b:4a:8d:7b:54:3b:3a: +# 6e:5f:15:02:c0:50:a6:cf:25:2f:7d:ca:48:b8:c7: +# 50:63:1c:2a:21:08:7c:9a:36:d8:0b:fe:d1:26:c5: +# 58:31:30:28:25:f3:5d:5d:a3:b8:b6:a5:b4:92:ed: +# 6c:2c:9f:eb:dd:43:89:a2:3c:4b:48:91:1d:50:ec: +# 26:df:d6:60:2e:bd:21 +# ASN1 OID: secp384r1 +# X509v3 extensions: +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Key Usage: critical +# Certificate Sign, CRL Sign +# X509v3 Subject Key Identifier: +# 15:5F:35:57:51:55:FB:25:B2:AD:03:69:FC:01:A3:FA:BE:11:55:D5 +# Signature Algorithm: ecdsa-with-SHA384 +# 30:64:02:30:64:96:59:a6:e8:09:de:8b:ba:fa:5a:88:88:f0: +# 1f:91:d3:46:a8:f2:4a:4c:02:63:fb:6c:5f:38:db:2e:41:93: +# a9:0e:e6:9d:dc:31:1c:b2:a0:a7:18:1c:79:e1:c7:36:02:30: +# 3a:56:af:9a:74:6c:f6:fb:83:e0:33:d3:08:5f:a1:9c:c2:5b: +# 9f:46:d6:b6:cb:91:06:63:a2:06:e7:33:ac:3e:a8:81:12:d0: +# cb:ba:d0:92:0b:b6:9e:96:aa:04:0f:8a +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- +# GeoTrust Primary Certification Authority - G3.pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: +# 15:ac:6e:94:19:b2:79:4b:41:f6:27:a9:c3:18:0f:1f +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: C=US, O=GeoTrust Inc., OU=(c) 2008 GeoTrust Inc. - For authorized use only, CN=GeoTrust Primary Certification Authority - G3 +# Validity +# Not Before: Apr 2 00:00:00 2008 GMT +# Not After : Dec 1 23:59:59 2037 GMT +# Subject: C=US, O=GeoTrust Inc., OU=(c) 2008 GeoTrust Inc. - For authorized use only, CN=GeoTrust Primary Certification Authority - G3 +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:dc:e2:5e:62:58:1d:33:57:39:32:33:fa:eb:cb: +# 87:8c:a7:d4:4a:dd:06:88:ea:64:8e:31:98:a5:38: +# 90:1e:98:cf:2e:63:2b:f0:46:bc:44:b2:89:a1:c0: +# 28:0c:49:70:21:95:9f:64:c0:a6:93:12:02:65:26: +# 86:c6:a5:89:f0:fa:d7:84:a0:70:af:4f:1a:97:3f: +# 06:44:d5:c9:eb:72:10:7d:e4:31:28:fb:1c:61:e6: +# 28:07:44:73:92:22:69:a7:03:88:6c:9d:63:c8:52: +# da:98:27:e7:08:4c:70:3e:b4:c9:12:c1:c5:67:83: +# 5d:33:f3:03:11:ec:6a:d0:53:e2:d1:ba:36:60:94: +# 80:bb:61:63:6c:5b:17:7e:df:40:94:1e:ab:0d:c2: +# 21:28:70:88:ff:d6:26:6c:6c:60:04:25:4e:55:7e: +# 7d:ef:bf:94:48:de:b7:1d:dd:70:8d:05:5f:88:a5: +# 9b:f2:c2:ee:ea:d1:40:41:6d:62:38:1d:56:06:c5: +# 03:47:51:20:19:fc:7b:10:0b:0e:62:ae:76:55:bf: +# 5f:77:be:3e:49:01:53:3d:98:25:03:76:24:5a:1d: +# b4:db:89:ea:79:e5:b6:b3:3b:3f:ba:4c:28:41:7f: +# 06:ac:6a:8e:c1:d0:f6:05:1d:7d:e6:42:86:e3:a5: +# d5:47 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Key Usage: critical +# Certificate Sign, CRL Sign +# X509v3 Subject Key Identifier: +# C4:79:CA:8E:A1:4E:03:1D:1C:DC:6B:DB:31:5B:94:3E:3F:30:7F:2D +# Signature Algorithm: sha256WithRSAEncryption +# 2d:c5:13:cf:56:80:7b:7a:78:bd:9f:ae:2c:99:e7:ef:da:df: +# 94:5e:09:69:a7:e7:6e:68:8c:bd:72:be:47:a9:0e:97:12:b8: +# 4a:f1:64:d3:39:df:25:34:d4:c1:cd:4e:81:f0:0f:04:c4:24: +# b3:34:96:c6:a6:aa:30:df:68:61:73:d7:f9:8e:85:89:ef:0e: +# 5e:95:28:4a:2a:27:8f:10:8e:2e:7c:86:c4:02:9e:da:0c:77: +# 65:0e:44:0d:92:fd:fd:b3:16:36:fa:11:0d:1d:8c:0e:07:89: +# 6a:29:56:f7:72:f4:dd:15:9c:77:35:66:57:ab:13:53:d8:8e: +# c1:40:c5:d7:13:16:5a:72:c7:b7:69:01:c4:7a:b1:83:01:68: +# 7d:8d:41:a1:94:18:c1:25:5c:fc:f0:fe:83:02:87:7c:0d:0d: +# cf:2e:08:5c:4a:40:0d:3e:ec:81:61:e6:24:db:ca:e0:0e:2d: +# 07:b2:3e:56:dc:8d:f5:41:85:07:48:9b:0c:0b:cb:49:3f:7d: +# ec:b7:fd:cb:8d:67:89:1a:ab:ed:bb:1e:a3:00:08:08:17:2a: +# 82:5c:31:5d:46:8a:2d:0f:86:9b:74:d9:45:fb:d4:40:b1:7a: +# aa:68:2d:86:b2:99:22:e1:c1:2b:c7:9c:f8:f3:5f:a8:82:12: +# eb:19:11:2d +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- +# GeoTrust Primary Certification Authority.pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: +# 18:ac:b5:6a:fd:69:b6:15:3a:63:6c:af:da:fa:c4:a1 +# Signature Algorithm: sha1WithRSAEncryption +# Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Primary Certification Authority +# Validity +# Not Before: Nov 27 00:00:00 2006 GMT +# Not After : Jul 16 23:59:59 2036 GMT +# Subject: C=US, O=GeoTrust Inc., CN=GeoTrust Primary Certification Authority +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:be:b8:15:7b:ff:d4:7c:7d:67:ad:83:64:7b:c8: +# 42:53:2d:df:f6:84:08:20:61:d6:01:59:6a:9c:44: +# 11:af:ef:76:fd:95:7e:ce:61:30:bb:7a:83:5f:02: +# bd:01:66:ca:ee:15:8d:6f:a1:30:9c:bd:a1:85:9e: +# 94:3a:f3:56:88:00:31:cf:d8:ee:6a:96:02:d9:ed: +# 03:8c:fb:75:6d:e7:ea:b8:55:16:05:16:9a:f4:e0: +# 5e:b1:88:c0:64:85:5c:15:4d:88:c7:b7:ba:e0:75: +# e9:ad:05:3d:9d:c7:89:48:e0:bb:28:c8:03:e1:30: +# 93:64:5e:52:c0:59:70:22:35:57:88:8a:f1:95:0a: +# 83:d7:bc:31:73:01:34:ed:ef:46:71:e0:6b:02:a8: +# 35:72:6b:97:9b:66:e0:cb:1c:79:5f:d8:1a:04:68: +# 1e:47:02:e6:9d:60:e2:36:97:01:df:ce:35:92:df: +# be:67:c7:6d:77:59:3b:8f:9d:d6:90:15:94:bc:42: +# 34:10:c1:39:f9:b1:27:3e:7e:d6:8a:75:c5:b2:af: +# 96:d3:a2:de:9b:e4:98:be:7d:e1:e9:81:ad:b6:6f: +# fc:d7:0e:da:e0:34:b0:0d:1a:77:e7:e3:08:98:ef: +# 58:fa:9c:84:b7:36:af:c2:df:ac:d2:f4:10:06:70: +# 71:35 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Key Usage: critical +# Certificate Sign, CRL Sign +# X509v3 Subject Key Identifier: +# 2C:D5:50:41:97:15:8B:F0:8F:36:61:5B:4A:FB:6B:D9:99:C9:33:92 +# Signature Algorithm: sha1WithRSAEncryption +# 5a:70:7f:2c:dd:b7:34:4f:f5:86:51:a9:26:be:4b:b8:aa:f1: +# 71:0d:dc:61:c7:a0:ea:34:1e:7a:77:0f:04:35:e8:27:8f:6c: +# 90:bf:91:16:24:46:3e:4a:4e:ce:2b:16:d5:0b:52:1d:fc:1f: +# 67:a2:02:45:31:4f:ce:f3:fa:03:a7:79:9d:53:6a:d9:da:63: +# 3a:f8:80:d7:d3:99:e1:a5:e1:be:d4:55:71:98:35:3a:be:93: +# ea:ae:ad:42:b2:90:6f:e0:fc:21:4d:35:63:33:89:49:d6:9b: +# 4e:ca:c7:e7:4e:09:00:f7:da:c7:ef:99:62:99:77:b6:95:22: +# 5e:8a:a0:ab:f4:b8:78:98:ca:38:19:99:c9:72:9e:78:cd:4b: +# ac:af:19:a0:73:12:2d:fc:c2:41:ba:81:91:da:16:5a:31:b7: +# f9:b4:71:80:12:48:99:72:73:5a:59:53:c1:63:52:33:ed:a7: +# c9:d2:39:02:70:fa:e0:b1:42:66:29:aa:9b:51:ed:30:54:22: +# 14:5f:d9:ab:1d:c1:e4:94:f0:f8:f5:2b:f7:ea:ca:78:46:d6: +# b8:91:fd:a6:0d:2b:1a:14:01:3e:80:f0:42:a0:95:07:5e:6d: +# cd:cc:4b:a4:45:8d:ab:12:e8:b3:de:5a:e5:a0:7c:e8:0f:22: +# 1d:5a:e9:59 +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- +# Go Daddy Class 2 Certification Authority.pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 0 (0x0) +# Signature Algorithm: sha1WithRSAEncryption +# Issuer: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority +# Validity +# Not Before: Jun 29 17:06:20 2004 GMT +# Not After : Jun 29 17:06:20 2034 GMT +# Subject: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:de:9d:d7:ea:57:18:49:a1:5b:eb:d7:5f:48:86: +# ea:be:dd:ff:e4:ef:67:1c:f4:65:68:b3:57:71:a0: +# 5e:77:bb:ed:9b:49:e9:70:80:3d:56:18:63:08:6f: +# da:f2:cc:d0:3f:7f:02:54:22:54:10:d8:b2:81:d4: +# c0:75:3d:4b:7f:c7:77:c3:3e:78:ab:1a:03:b5:20: +# 6b:2f:6a:2b:b1:c5:88:7e:c4:bb:1e:b0:c1:d8:45: +# 27:6f:aa:37:58:f7:87:26:d7:d8:2d:f6:a9:17:b7: +# 1f:72:36:4e:a6:17:3f:65:98:92:db:2a:6e:5d:a2: +# fe:88:e0:0b:de:7f:e5:8d:15:e1:eb:cb:3a:d5:e2: +# 12:a2:13:2d:d8:8e:af:5f:12:3d:a0:08:05:08:b6: +# 5c:a5:65:38:04:45:99:1e:a3:60:60:74:c5:41:a5: +# 72:62:1b:62:c5:1f:6f:5f:1a:42:be:02:51:65:a8: +# ae:23:18:6a:fc:78:03:a9:4d:7f:80:c3:fa:ab:5a: +# fc:a1:40:a4:ca:19:16:fe:b2:c8:ef:5e:73:0d:ee: +# 77:bd:9a:f6:79:98:bc:b1:07:67:a2:15:0d:dd:a0: +# 58:c6:44:7b:0a:3e:62:28:5f:ba:41:07:53:58:cf: +# 11:7e:38:74:c5:f8:ff:b5:69:90:8f:84:74:ea:97: +# 1b:af +# Exponent: 3 (0x3) +# X509v3 extensions: +# X509v3 Subject Key Identifier: +# D2:C4:B0:D2:91:D4:4C:11:71:B3:61:CB:3D:A1:FE:DD:A8:6A:D4:E3 +# X509v3 Authority Key Identifier: +# keyid:D2:C4:B0:D2:91:D4:4C:11:71:B3:61:CB:3D:A1:FE:DD:A8:6A:D4:E3 +# DirName:/C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority +# serial:00 +# +# X509v3 Basic Constraints: +# CA:TRUE +# Signature Algorithm: sha1WithRSAEncryption +# 32:4b:f3:b2:ca:3e:91:fc:12:c6:a1:07:8c:8e:77:a0:33:06: +# 14:5c:90:1e:18:f7:08:a6:3d:0a:19:f9:87:80:11:6e:69:e4: +# 96:17:30:ff:34:91:63:72:38:ee:cc:1c:01:a3:1d:94:28:a4: +# 31:f6:7a:c4:54:d7:f6:e5:31:58:03:a2:cc:ce:62:db:94:45: +# 73:b5:bf:45:c9:24:b5:d5:82:02:ad:23:79:69:8d:b8:b6:4d: +# ce:cf:4c:ca:33:23:e8:1c:88:aa:9d:8b:41:6e:16:c9:20:e5: +# 89:9e:cd:3b:da:70:f7:7e:99:26:20:14:54:25:ab:6e:73:85: +# e6:9b:21:9d:0a:6c:82:0e:a8:f8:c2:0c:fa:10:1e:6c:96:ef: +# 87:0d:c4:0f:61:8b:ad:ee:83:2b:95:f8:8e:92:84:72:39:eb: +# 20:ea:83:ed:83:cd:97:6e:08:bc:eb:4e:26:b6:73:2b:e4:d3: +# f6:4c:fe:26:71:e2:61:11:74:4a:ff:57:1a:87:0f:75:48:2e: +# cf:51:69:17:a0:02:12:61:95:d5:d1:40:b2:10:4c:ee:c4:ac: +# 10:43:a6:a5:9e:0a:d5:95:62:9a:0d:cf:88:82:c5:32:0c:e4: +# 2b:9f:45:e6:0d:9f:28:9c:b1:b9:2a:5a:57:ad:37:0f:af:1d: +# 7f:db:bd:9f +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- +# Go Daddy Root Certificate Authority - G2.pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 0 (0x0) +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., CN=Go Daddy Root Certificate Authority - G2 +# Validity +# Not Before: Sep 1 00:00:00 2009 GMT +# Not After : Dec 31 23:59:59 2037 GMT +# Subject: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., CN=Go Daddy Root Certificate Authority - G2 +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:bf:71:62:08:f1:fa:59:34:f7:1b:c9:18:a3:f7: +# 80:49:58:e9:22:83:13:a6:c5:20:43:01:3b:84:f1: +# e6:85:49:9f:27:ea:f6:84:1b:4e:a0:b4:db:70:98: +# c7:32:01:b1:05:3e:07:4e:ee:f4:fa:4f:2f:59:30: +# 22:e7:ab:19:56:6b:e2:80:07:fc:f3:16:75:80:39: +# 51:7b:e5:f9:35:b6:74:4e:a9:8d:82:13:e4:b6:3f: +# a9:03:83:fa:a2:be:8a:15:6a:7f:de:0b:c3:b6:19: +# 14:05:ca:ea:c3:a8:04:94:3b:46:7c:32:0d:f3:00: +# 66:22:c8:8d:69:6d:36:8c:11:18:b7:d3:b2:1c:60: +# b4:38:fa:02:8c:ce:d3:dd:46:07:de:0a:3e:eb:5d: +# 7c:c8:7c:fb:b0:2b:53:a4:92:62:69:51:25:05:61: +# 1a:44:81:8c:2c:a9:43:96:23:df:ac:3a:81:9a:0e: +# 29:c5:1c:a9:e9:5d:1e:b6:9e:9e:30:0a:39:ce:f1: +# 88:80:fb:4b:5d:cc:32:ec:85:62:43:25:34:02:56: +# 27:01:91:b4:3b:70:2a:3f:6e:b1:e8:9c:88:01:7d: +# 9f:d4:f9:db:53:6d:60:9d:bf:2c:e7:58:ab:b8:5f: +# 46:fc:ce:c4:1b:03:3c:09:eb:49:31:5c:69:46:b3: +# e0:47 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Key Usage: critical +# Certificate Sign, CRL Sign +# X509v3 Subject Key Identifier: +# 3A:9A:85:07:10:67:28:B6:EF:F6:BD:05:41:6E:20:C1:94:DA:0F:DE +# Signature Algorithm: sha256WithRSAEncryption +# 99:db:5d:79:d5:f9:97:59:67:03:61:f1:7e:3b:06:31:75:2d: +# a1:20:8e:4f:65:87:b4:f7:a6:9c:bc:d8:e9:2f:d0:db:5a:ee: +# cf:74:8c:73:b4:38:42:da:05:7b:f8:02:75:b8:fd:a5:b1:d7: +# ae:f6:d7:de:13:cb:53:10:7e:8a:46:d1:97:fa:b7:2e:2b:11: +# ab:90:b0:27:80:f9:e8:9f:5a:e9:37:9f:ab:e4:df:6c:b3:85: +# 17:9d:3d:d9:24:4f:79:91:35:d6:5f:04:eb:80:83:ab:9a:02: +# 2d:b5:10:f4:d8:90:c7:04:73:40:ed:72:25:a0:a9:9f:ec:9e: +# ab:68:12:99:57:c6:8f:12:3a:09:a4:bd:44:fd:06:15:37:c1: +# 9b:e4:32:a3:ed:38:e8:d8:64:f3:2c:7e:14:fc:02:ea:9f:cd: +# ff:07:68:17:db:22:90:38:2d:7a:8d:d1:54:f1:69:e3:5f:33: +# ca:7a:3d:7b:0a:e3:ca:7f:5f:39:e5:e2:75:ba:c5:76:18:33: +# ce:2c:f0:2f:4c:ad:f7:b1:e7:ce:4f:a8:c4:9b:4a:54:06:c5: +# 7f:7d:d5:08:0f:e2:1c:fe:7e:17:b8:ac:5e:f6:d4:16:b2:43: +# 09:0c:4d:f6:a7:6b:b4:99:84:65:ca:7a:88:e2:e2:44:be:5c: +# f7:ea:1c:f5 +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- +# Go Daddy Secure Certification Authority serialNumber=07969287.pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 769 (0x301) +# Signature Algorithm: sha1WithRSAEncryption +# Issuer: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority +# Validity +# Not Before: Nov 16 01:54:37 2006 GMT +# Not After : Nov 16 01:54:37 2026 GMT +# Subject: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., OU=http://certificates.godaddy.com/repository, CN=Go Daddy Secure Certification Authority/serialNumber=07969287 +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:c4:2d:d5:15:8c:9c:26:4c:ec:32:35:eb:5f:b8: +# 59:01:5a:a6:61:81:59:3b:70:63:ab:e3:dc:3d:c7: +# 2a:b8:c9:33:d3:79:e4:3a:ed:3c:30:23:84:8e:b3: +# 30:14:b6:b2:87:c3:3d:95:54:04:9e:df:99:dd:0b: +# 25:1e:21:de:65:29:7e:35:a8:a9:54:eb:f6:f7:32: +# 39:d4:26:55:95:ad:ef:fb:fe:58:86:d7:9e:f4:00: +# 8d:8c:2a:0c:bd:42:04:ce:a7:3f:04:f6:ee:80:f2: +# aa:ef:52:a1:69:66:da:be:1a:ad:5d:da:2c:66:ea: +# 1a:6b:bb:e5:1a:51:4a:00:2f:48:c7:98:75:d8:b9: +# 29:c8:ee:f8:66:6d:0a:9c:b3:f3:fc:78:7c:a2:f8: +# a3:f2:b5:c3:f3:b9:7a:91:c1:a7:e6:25:2e:9c:a8: +# ed:12:65:6e:6a:f6:12:44:53:70:30:95:c3:9c:2b: +# 58:2b:3d:08:74:4a:f2:be:51:b0:bf:87:d0:4c:27: +# 58:6b:b5:35:c5:9d:af:17:31:f8:0b:8f:ee:ad:81: +# 36:05:89:08:98:cf:3a:af:25:87:c0:49:ea:a7:fd: +# 67:f7:45:8e:97:cc:14:39:e2:36:85:b5:7e:1a:37: +# fd:16:f6:71:11:9a:74:30:16:fe:13:94:a3:3f:84: +# 0d:4f +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Subject Key Identifier: +# FD:AC:61:32:93:6C:45:D6:E2:EE:85:5F:9A:BA:E7:76:99:68:CC:E7 +# X509v3 Authority Key Identifier: +# keyid:D2:C4:B0:D2:91:D4:4C:11:71:B3:61:CB:3D:A1:FE:DD:A8:6A:D4:E3 +# +# X509v3 Basic Constraints: critical +# CA:TRUE, pathlen:0 +# Authority Information Access: +# OCSP - URI:http://ocsp.godaddy.com +# +# X509v3 CRL Distribution Points: +# +# Full Name: +# URI:http://certificates.godaddy.com/repository/gdroot.crl +# +# X509v3 Certificate Policies: +# Policy: X509v3 Any Policy +# CPS: http://certificates.godaddy.com/repository +# +# X509v3 Key Usage: critical +# Certificate Sign, CRL Sign +# Signature Algorithm: sha1WithRSAEncryption +# d2:86:c0:ec:bd:f9:a1:b6:67:ee:66:0b:a2:06:3a:04:50:8e: +# 15:72:ac:4a:74:95:53:cb:37:cb:44:49:ef:07:90:6b:33:d9: +# 96:f0:94:56:a5:13:30:05:3c:85:32:21:7b:c9:c7:0a:a8:24: +# a4:90:de:46:d3:25:23:14:03:67:c2:10:d6:6f:0f:5d:7b:7a: +# cc:9f:c5:58:2a:c1:c4:9e:21:a8:5a:f3:ac:a4:46:f3:9e:e4: +# 63:cb:2f:90:a4:29:29:01:d9:72:2c:29:df:37:01:27:bc:4f: +# ee:68:d3:21:8f:c0:b3:e4:f5:09:ed:d2:10:aa:53:b4:be:f0: +# cc:59:0b:d6:3b:96:1c:95:24:49:df:ce:ec:fd:a7:48:91:14: +# 45:0e:3a:36:6f:da:45:b3:45:a2:41:c9:d4:d7:44:4e:3e:b9: +# 74:76:d5:a2:13:55:2c:c6:87:a3:b5:99:ac:06:84:87:7f:75: +# 06:fc:bf:14:4c:0e:cc:6e:c4:df:3d:b7:12:71:f4:e8:f1:51: +# 40:22:28:49:e0:1d:4b:87:a8:34:cc:06:a2:dd:12:5a:d1:86: +# 36:64:03:35:6f:6f:77:6e:eb:f2:85:50:98:5e:ab:03:53:ad: +# 91:23:63:1f:16:9c:cd:b9:b2:05:63:3a:e1:f4:68:1b:17:05: +# 35:95:53:ee +-----BEGIN CERTIFICATE----- +MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx +ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw +MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH +QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j +b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j +b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H +KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm +VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR +SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT +cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ +6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu +MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS +kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB +BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f +BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv +c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH +AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO +BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG +OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU +A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o +0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX +RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH +qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV +U+4= +-----END CERTIFICATE----- +# Thawte Premium Server CA.pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: 1 (0x1) +# Signature Algorithm: md5WithRSAEncryption +# Issuer: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Premium Server CA/emailAddress=premium-server@thawte.com +# Validity +# Not Before: Aug 1 00:00:00 1996 GMT +# Not After : Dec 31 23:59:59 2020 GMT +# Subject: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Premium Server CA/emailAddress=premium-server@thawte.com +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (1024 bit) +# Modulus: +# 00:d2:36:36:6a:8b:d7:c2:5b:9e:da:81:41:62:8f: +# 38:ee:49:04:55:d6:d0:ef:1c:1b:95:16:47:ef:18: +# 48:35:3a:52:f4:2b:6a:06:8f:3b:2f:ea:56:e3:af: +# 86:8d:9e:17:f7:9e:b4:65:75:02:4d:ef:cb:09:a2: +# 21:51:d8:9b:d0:67:d0:ba:0d:92:06:14:73:d4:93: +# cb:97:2a:00:9c:5c:4e:0c:bc:fa:15:52:fc:f2:44: +# 6e:da:11:4a:6e:08:9f:2f:2d:e3:f9:aa:3a:86:73: +# b6:46:53:58:c8:89:05:bd:83:11:b8:73:3f:aa:07: +# 8d:f4:42:4d:e7:40:9d:1c:37 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Basic Constraints: critical +# CA:TRUE +# Signature Algorithm: md5WithRSAEncryption +# 26:48:2c:16:c2:58:fa:e8:16:74:0c:aa:aa:5f:54:3f:f2:d7: +# c9:78:60:5e:5e:6e:37:63:22:77:36:7e:b2:17:c4:34:b9:f5: +# 08:85:fc:c9:01:38:ff:4d:be:f2:16:42:43:e7:bb:5a:46:fb: +# c1:c6:11:1f:f1:4a:b0:28:46:c9:c3:c4:42:7d:bc:fa:ab:59: +# 6e:d5:b7:51:88:11:e3:a4:85:19:6b:82:4c:a4:0c:12:ad:e9: +# a4:ae:3f:f1:c3:49:65:9a:8c:c5:c8:3e:25:b7:94:99:bb:92: +# 32:71:07:f0:86:5e:ed:50:27:a6:0d:a6:23:f9:bb:cb:a6:07: +# 14:42 +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- +# Thawte Primary Root CA - G2.pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: +# 35:fc:26:5c:d9:84:4f:c9:3d:26:3d:57:9b:ae:d7:56 +# Signature Algorithm: ecdsa-with-SHA384 +# Issuer: C=US, O=thawte, Inc., OU=(c) 2007 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA - G2 +# Validity +# Not Before: Nov 5 00:00:00 2007 GMT +# Not After : Jan 18 23:59:59 2038 GMT +# Subject: C=US, O=thawte, Inc., OU=(c) 2007 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA - G2 +# Subject Public Key Info: +# Public Key Algorithm: id-ecPublicKey +# Public-Key: (384 bit) +# pub: +# 04:a2:d5:9c:82:7b:95:9d:f1:52:78:87:fe:8a:16: +# bf:05:e6:df:a3:02:4f:0d:07:c6:00:51:ba:0c:02: +# 52:2d:22:a4:42:39:c4:fe:8f:ea:c9:c1:be:d4:4d: +# ff:9f:7a:9e:e2:b1:7c:9a:ad:a7:86:09:73:87:d1: +# e7:9a:e3:7a:a5:aa:6e:fb:ba:b3:70:c0:67:88:a2: +# 35:d4:a3:9a:b1:fd:ad:c2:ef:31:fa:a8:b9:f3:fb: +# 08:c6:91:d1:fb:29:95 +# ASN1 OID: secp384r1 +# X509v3 extensions: +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Key Usage: critical +# Certificate Sign, CRL Sign +# X509v3 Subject Key Identifier: +# 9A:D8:00:30:00:E7:6B:7F:85:18:EE:8B:B6:CE:8A:0C:F8:11:E1:BB +# Signature Algorithm: ecdsa-with-SHA384 +# 30:66:02:31:00:dd:f8:e0:57:47:5b:a7:e6:0a:c3:bd:f5:80: +# 8a:97:35:0d:1b:89:3c:54:86:77:28:ca:a1:f4:79:de:b5:e6: +# 38:b0:f0:65:70:8c:7f:02:54:c2:bf:ff:d8:a1:3e:d9:cf:02: +# 31:00:c4:8d:94:fc:dc:53:d2:dc:9d:78:16:1f:15:33:23:53: +# 52:e3:5a:31:5d:9d:ca:ae:bd:13:29:44:0d:27:5b:a8:e7:68: +# 9c:12:f7:58:3f:2e:72:02:57:a3:8f:a1:14:2e +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- +# Thawte Primary Root CA - G3.pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: +# 60:01:97:b7:46:a7:ea:b4:b4:9a:d6:4b:2f:f7:90:fb +# Signature Algorithm: sha256WithRSAEncryption +# Issuer: C=US, O=thawte, Inc., OU=Certification Services Division, OU=(c) 2008 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA - G3 +# Validity +# Not Before: Apr 2 00:00:00 2008 GMT +# Not After : Dec 1 23:59:59 2037 GMT +# Subject: C=US, O=thawte, Inc., OU=Certification Services Division, OU=(c) 2008 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA - G3 +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:b2:bf:27:2c:fb:db:d8:5b:dd:78:7b:1b:9e:77: +# 66:81:cb:3e:bc:7c:ae:f3:a6:27:9a:34:a3:68:31: +# 71:38:33:62:e4:f3:71:66:79:b1:a9:65:a3:a5:8b: +# d5:8f:60:2d:3f:42:cc:aa:6b:32:c0:23:cb:2c:41: +# dd:e4:df:fc:61:9c:e2:73:b2:22:95:11:43:18:5f: +# c4:b6:1f:57:6c:0a:05:58:22:c8:36:4c:3a:7c:a5: +# d1:cf:86:af:88:a7:44:02:13:74:71:73:0a:42:59: +# 02:f8:1b:14:6b:42:df:6f:5f:ba:6b:82:a2:9d:5b: +# e7:4a:bd:1e:01:72:db:4b:74:e8:3b:7f:7f:7d:1f: +# 04:b4:26:9b:e0:b4:5a:ac:47:3d:55:b8:d7:b0:26: +# 52:28:01:31:40:66:d8:d9:24:bd:f6:2a:d8:ec:21: +# 49:5c:9b:f6:7a:e9:7f:55:35:7e:96:6b:8d:93:93: +# 27:cb:92:bb:ea:ac:40:c0:9f:c2:f8:80:cf:5d:f4: +# 5a:dc:ce:74:86:a6:3e:6c:0b:53:ca:bd:92:ce:19: +# 06:72:e6:0c:5c:38:69:c7:04:d6:bc:6c:ce:5b:f6: +# f7:68:9c:dc:25:15:48:88:a1:e9:a9:f8:98:9c:e0: +# f3:d5:31:28:61:11:6c:67:96:8d:39:99:cb:c2:45: +# 24:39 +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Key Usage: critical +# Certificate Sign, CRL Sign +# X509v3 Subject Key Identifier: +# AD:6C:AA:94:60:9C:ED:E4:FF:FA:3E:0A:74:2B:63:03:F7:B6:59:BF +# Signature Algorithm: sha256WithRSAEncryption +# 1a:40:d8:95:65:ac:09:92:89:c6:39:f4:10:e5:a9:0e:66:53: +# 5d:78:de:fa:24:91:bb:e7:44:51:df:c6:16:34:0a:ef:6a:44: +# 51:ea:2b:07:8a:03:7a:c3:eb:3f:0a:2c:52:16:a0:2b:43:b9: +# 25:90:3f:70:a9:33:25:6d:45:1a:28:3b:27:cf:aa:c3:29:42: +# 1b:df:3b:4c:c0:33:34:5b:41:88:bf:6b:2b:65:af:28:ef:b2: +# f5:c3:aa:66:ce:7b:56:ee:b7:c8:cb:67:c1:c9:9c:1a:18:b8: +# c4:c3:49:03:f1:60:0e:50:cd:46:c5:f3:77:79:f7:b6:15:e0: +# 38:db:c7:2f:28:a0:0c:3f:77:26:74:d9:25:12:da:31:da:1a: +# 1e:dc:29:41:91:22:3c:69:a7:bb:02:f2:b6:5c:27:03:89:f4: +# 06:ea:9b:e4:72:82:e3:a1:09:c1:e9:00:19:d3:3e:d4:70:6b: +# ba:71:a6:aa:58:ae:f4:bb:e9:6c:b6:ef:87:cc:9b:bb:ff:39: +# e6:56:61:d3:0a:a7:c4:5c:4c:60:7b:05:77:26:7a:bf:d8:07: +# 52:2c:62:f7:70:63:d9:39:bc:6f:1c:c2:79:dc:76:29:af:ce: +# c5:2c:64:04:5e:88:36:6e:31:d4:40:1a:62:34:36:3f:35:01: +# ae:ac:63:a0 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- +# Thawte Primary Root CA.pem +# Certificate: +# Data: +# Version: 3 (0x2) +# Serial Number: +# 34:4e:d5:57:20:d5:ed:ec:49:f4:2f:ce:37:db:2b:6d +# Signature Algorithm: sha1WithRSAEncryption +# Issuer: C=US, O=thawte, Inc., OU=Certification Services Division, OU=(c) 2006 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA +# Validity +# Not Before: Nov 17 00:00:00 2006 GMT +# Not After : Jul 16 23:59:59 2036 GMT +# Subject: C=US, O=thawte, Inc., OU=Certification Services Division, OU=(c) 2006 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA +# Subject Public Key Info: +# Public Key Algorithm: rsaEncryption +# Public-Key: (2048 bit) +# Modulus: +# 00:ac:a0:f0:fb:80:59:d4:9c:c7:a4:cf:9d:a1:59: +# 73:09:10:45:0c:0d:2c:6e:68:f1:6c:5b:48:68:49: +# 59:37:fc:0b:33:19:c2:77:7f:cc:10:2d:95:34:1c: +# e6:eb:4d:09:a7:1c:d2:b8:c9:97:36:02:b7:89:d4: +# 24:5f:06:c0:cc:44:94:94:8d:02:62:6f:eb:5a:dd: +# 11:8d:28:9a:5c:84:90:10:7a:0d:bd:74:66:2f:6a: +# 38:a0:e2:d5:54:44:eb:1d:07:9f:07:ba:6f:ee:e9: +# fd:4e:0b:29:f5:3e:84:a0:01:f1:9c:ab:f8:1c:7e: +# 89:a4:e8:a1:d8:71:65:0d:a3:51:7b:ee:bc:d2:22: +# 60:0d:b9:5b:9d:df:ba:fc:51:5b:0b:af:98:b2:e9: +# 2e:e9:04:e8:62:87:de:2b:c8:d7:4e:c1:4c:64:1e: +# dd:cf:87:58:ba:4a:4f:ca:68:07:1d:1c:9d:4a:c6: +# d5:2f:91:cc:7c:71:72:1c:c5:c0:67:eb:32:fd:c9: +# 92:5c:94:da:85:c0:9b:bf:53:7d:2b:09:f4:8c:9d: +# 91:1f:97:6a:52:cb:de:09:36:a4:77:d8:7b:87:50: +# 44:d5:3e:6e:29:69:fb:39:49:26:1e:09:a5:80:7b: +# 40:2d:eb:e8:27:85:c9:fe:61:fd:7e:e6:7c:97:1d: +# d5:9d +# Exponent: 65537 (0x10001) +# X509v3 extensions: +# X509v3 Basic Constraints: critical +# CA:TRUE +# X509v3 Key Usage: critical +# Certificate Sign, CRL Sign +# X509v3 Subject Key Identifier: +# 7B:5B:45:CF:AF:CE:CB:7A:FD:31:92:1A:6A:B6:F3:46:EB:57:48:50 +# Signature Algorithm: sha1WithRSAEncryption +# 79:11:c0:4b:b3:91:b6:fc:f0:e9:67:d4:0d:6e:45:be:55:e8: +# 93:d2:ce:03:3f:ed:da:25:b0:1d:57:cb:1e:3a:76:a0:4c:ec: +# 50:76:e8:64:72:0c:a4:a9:f1:b8:8b:d6:d6:87:84:bb:32:e5: +# 41:11:c0:77:d9:b3:60:9d:eb:1b:d5:d1:6e:44:44:a9:a6:01: +# ec:55:62:1d:77:b8:5c:8e:48:49:7c:9c:3b:57:11:ac:ad:73: +# 37:8e:2f:78:5c:90:68:47:d9:60:60:e6:fc:07:3d:22:20:17: +# c4:f7:16:e9:c4:d8:72:f9:c8:73:7c:df:16:2f:15:a9:3e:fd: +# 6a:27:b6:a1:eb:5a:ba:98:1f:d5:e3:4d:64:0a:9d:13:c8:61: +# ba:f5:39:1c:87:ba:b8:bd:7b:22:7f:f6:fe:ac:40:79:e5:ac: +# 10:6f:3d:8f:1b:79:76:8b:c4:37:b3:21:18:84:e5:36:00:eb: +# 63:20:99:b9:e9:fe:33:04:bb:41:c8:c1:02:f9:44:63:20:9e: +# 81:ce:42:d3:d6:3f:2c:76:d3:63:9c:59:dd:8f:a6:e1:0e:a0: +# 2e:41:f7:2e:95:47:cf:bc:fd:33:f3:f6:0b:61:7e:7e:91:2b: +# 81:47:c2:27:30:ee:a7:10:5d:37:8f:5c:39:2b:e4:04:f0:7b: +# 8d:56:8c:68 +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- diff --git a/dropbox-script/dropbox/users.py b/dropbox-script/dropbox/users.py new file mode 100644 index 0000000..4bebb3c --- /dev/null +++ b/dropbox-script/dropbox/users.py @@ -0,0 +1,1872 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# @generated +# flake8: noqa +# pylint: skip-file +""" +This namespace contains endpoints and data types for user management. +""" + +try: + from . import stone_validators as bv + from . import stone_base as bb +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bv + import stone_base as bb + +try: + from . import ( + common, + team_common, + team_policies, + users_common, + ) +except (ImportError, SystemError, ValueError): + import common + import team_common + import team_policies + import users_common + +class Account(bb.Struct): + """ + The amount of detail revealed about an account depends on the user being + queried and the user making the query. + + :ivar account_id: The user's unique Dropbox ID. + :ivar name: Details of a user's name. + :ivar email: The user's e-mail address. Do not rely on this without checking + the ``email_verified`` field. Even then, it's possible that the user has + since lost access to their e-mail. + :ivar email_verified: Whether the user has verified their e-mail address. + :ivar profile_photo_url: URL for the photo representing the user, if one is + set. + :ivar disabled: Whether the user has been disabled. + """ + + __slots__ = [ + '_account_id_value', + '_account_id_present', + '_name_value', + '_name_present', + '_email_value', + '_email_present', + '_email_verified_value', + '_email_verified_present', + '_profile_photo_url_value', + '_profile_photo_url_present', + '_disabled_value', + '_disabled_present', + ] + + _has_required_fields = True + + def __init__(self, + account_id=None, + name=None, + email=None, + email_verified=None, + disabled=None, + profile_photo_url=None): + self._account_id_value = None + self._account_id_present = False + self._name_value = None + self._name_present = False + self._email_value = None + self._email_present = False + self._email_verified_value = None + self._email_verified_present = False + self._profile_photo_url_value = None + self._profile_photo_url_present = False + self._disabled_value = None + self._disabled_present = False + if account_id is not None: + self.account_id = account_id + if name is not None: + self.name = name + if email is not None: + self.email = email + if email_verified is not None: + self.email_verified = email_verified + if profile_photo_url is not None: + self.profile_photo_url = profile_photo_url + if disabled is not None: + self.disabled = disabled + + @property + def account_id(self): + """ + The user's unique Dropbox ID. + + :rtype: str + """ + if self._account_id_present: + return self._account_id_value + else: + raise AttributeError("missing required field 'account_id'") + + @account_id.setter + def account_id(self, val): + val = self._account_id_validator.validate(val) + self._account_id_value = val + self._account_id_present = True + + @account_id.deleter + def account_id(self): + self._account_id_value = None + self._account_id_present = False + + @property + def name(self): + """ + Details of a user's name. + + :rtype: Name + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + self._name_validator.validate_type_only(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + @property + def email(self): + """ + The user's e-mail address. Do not rely on this without checking the + ``email_verified`` field. Even then, it's possible that the user has + since lost access to their e-mail. + + :rtype: str + """ + if self._email_present: + return self._email_value + else: + raise AttributeError("missing required field 'email'") + + @email.setter + def email(self, val): + val = self._email_validator.validate(val) + self._email_value = val + self._email_present = True + + @email.deleter + def email(self): + self._email_value = None + self._email_present = False + + @property + def email_verified(self): + """ + Whether the user has verified their e-mail address. + + :rtype: bool + """ + if self._email_verified_present: + return self._email_verified_value + else: + raise AttributeError("missing required field 'email_verified'") + + @email_verified.setter + def email_verified(self, val): + val = self._email_verified_validator.validate(val) + self._email_verified_value = val + self._email_verified_present = True + + @email_verified.deleter + def email_verified(self): + self._email_verified_value = None + self._email_verified_present = False + + @property + def profile_photo_url(self): + """ + URL for the photo representing the user, if one is set. + + :rtype: str + """ + if self._profile_photo_url_present: + return self._profile_photo_url_value + else: + return None + + @profile_photo_url.setter + def profile_photo_url(self, val): + if val is None: + del self.profile_photo_url + return + val = self._profile_photo_url_validator.validate(val) + self._profile_photo_url_value = val + self._profile_photo_url_present = True + + @profile_photo_url.deleter + def profile_photo_url(self): + self._profile_photo_url_value = None + self._profile_photo_url_present = False + + @property + def disabled(self): + """ + Whether the user has been disabled. + + :rtype: bool + """ + if self._disabled_present: + return self._disabled_value + else: + raise AttributeError("missing required field 'disabled'") + + @disabled.setter + def disabled(self, val): + val = self._disabled_validator.validate(val) + self._disabled_value = val + self._disabled_present = True + + @disabled.deleter + def disabled(self): + self._disabled_value = None + self._disabled_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(Account, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'Account(account_id={!r}, name={!r}, email={!r}, email_verified={!r}, disabled={!r}, profile_photo_url={!r})'.format( + self._account_id_value, + self._name_value, + self._email_value, + self._email_verified_value, + self._disabled_value, + self._profile_photo_url_value, + ) + +Account_validator = bv.Struct(Account) + +class BasicAccount(Account): + """ + Basic information about any account. + + :ivar is_teammate: Whether this user is a teammate of the current user. If + this account is the current user's account, then this will be ``True``. + :ivar team_member_id: The user's unique team member id. This field will only + be present if the user is part of a team and ``is_teammate`` is + ``True``. + """ + + __slots__ = [ + '_is_teammate_value', + '_is_teammate_present', + '_team_member_id_value', + '_team_member_id_present', + ] + + _has_required_fields = True + + def __init__(self, + account_id=None, + name=None, + email=None, + email_verified=None, + disabled=None, + is_teammate=None, + profile_photo_url=None, + team_member_id=None): + super(BasicAccount, self).__init__(account_id, + name, + email, + email_verified, + disabled, + profile_photo_url) + self._is_teammate_value = None + self._is_teammate_present = False + self._team_member_id_value = None + self._team_member_id_present = False + if is_teammate is not None: + self.is_teammate = is_teammate + if team_member_id is not None: + self.team_member_id = team_member_id + + @property + def is_teammate(self): + """ + Whether this user is a teammate of the current user. If this account is + the current user's account, then this will be ``True``. + + :rtype: bool + """ + if self._is_teammate_present: + return self._is_teammate_value + else: + raise AttributeError("missing required field 'is_teammate'") + + @is_teammate.setter + def is_teammate(self, val): + val = self._is_teammate_validator.validate(val) + self._is_teammate_value = val + self._is_teammate_present = True + + @is_teammate.deleter + def is_teammate(self): + self._is_teammate_value = None + self._is_teammate_present = False + + @property + def team_member_id(self): + """ + The user's unique team member id. This field will only be present if the + user is part of a team and ``is_teammate`` is ``True``. + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + return None + + @team_member_id.setter + def team_member_id(self, val): + if val is None: + del self.team_member_id + return + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(BasicAccount, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'BasicAccount(account_id={!r}, name={!r}, email={!r}, email_verified={!r}, disabled={!r}, is_teammate={!r}, profile_photo_url={!r}, team_member_id={!r})'.format( + self._account_id_value, + self._name_value, + self._email_value, + self._email_verified_value, + self._disabled_value, + self._is_teammate_value, + self._profile_photo_url_value, + self._team_member_id_value, + ) + +BasicAccount_validator = bv.Struct(BasicAccount) + +class FullAccount(Account): + """ + Detailed information about the current user's account. + + :ivar country: The user's two-letter country code, if available. Country + codes are based on `ISO 3166-1 + `_. + :ivar locale: The language that the user specified. Locale tags will be + `IETF language tags `_. + :ivar referral_link: The user's `referral link + `_. + :ivar team: If this account is a member of a team, information about that + team. + :ivar team_member_id: This account's unique team member id. This field will + only be present if ``team`` is present. + :ivar is_paired: Whether the user has a personal and work account. If the + current account is personal, then ``team`` will always be None, but + ``is_paired`` will indicate if a work account is linked. + :ivar account_type: What type of account this user has. + :ivar root_info: The root info for this account. + """ + + __slots__ = [ + '_country_value', + '_country_present', + '_locale_value', + '_locale_present', + '_referral_link_value', + '_referral_link_present', + '_team_value', + '_team_present', + '_team_member_id_value', + '_team_member_id_present', + '_is_paired_value', + '_is_paired_present', + '_account_type_value', + '_account_type_present', + '_root_info_value', + '_root_info_present', + ] + + _has_required_fields = True + + def __init__(self, + account_id=None, + name=None, + email=None, + email_verified=None, + disabled=None, + locale=None, + referral_link=None, + is_paired=None, + account_type=None, + root_info=None, + profile_photo_url=None, + country=None, + team=None, + team_member_id=None): + super(FullAccount, self).__init__(account_id, + name, + email, + email_verified, + disabled, + profile_photo_url) + self._country_value = None + self._country_present = False + self._locale_value = None + self._locale_present = False + self._referral_link_value = None + self._referral_link_present = False + self._team_value = None + self._team_present = False + self._team_member_id_value = None + self._team_member_id_present = False + self._is_paired_value = None + self._is_paired_present = False + self._account_type_value = None + self._account_type_present = False + self._root_info_value = None + self._root_info_present = False + if country is not None: + self.country = country + if locale is not None: + self.locale = locale + if referral_link is not None: + self.referral_link = referral_link + if team is not None: + self.team = team + if team_member_id is not None: + self.team_member_id = team_member_id + if is_paired is not None: + self.is_paired = is_paired + if account_type is not None: + self.account_type = account_type + if root_info is not None: + self.root_info = root_info + + @property + def country(self): + """ + The user's two-letter country code, if available. Country codes are + based on `ISO 3166-1 `_. + + :rtype: str + """ + if self._country_present: + return self._country_value + else: + return None + + @country.setter + def country(self, val): + if val is None: + del self.country + return + val = self._country_validator.validate(val) + self._country_value = val + self._country_present = True + + @country.deleter + def country(self): + self._country_value = None + self._country_present = False + + @property + def locale(self): + """ + The language that the user specified. Locale tags will be `IETF language + tags `_. + + :rtype: str + """ + if self._locale_present: + return self._locale_value + else: + raise AttributeError("missing required field 'locale'") + + @locale.setter + def locale(self, val): + val = self._locale_validator.validate(val) + self._locale_value = val + self._locale_present = True + + @locale.deleter + def locale(self): + self._locale_value = None + self._locale_present = False + + @property + def referral_link(self): + """ + The user's `referral link `_. + + :rtype: str + """ + if self._referral_link_present: + return self._referral_link_value + else: + raise AttributeError("missing required field 'referral_link'") + + @referral_link.setter + def referral_link(self, val): + val = self._referral_link_validator.validate(val) + self._referral_link_value = val + self._referral_link_present = True + + @referral_link.deleter + def referral_link(self): + self._referral_link_value = None + self._referral_link_present = False + + @property + def team(self): + """ + If this account is a member of a team, information about that team. + + :rtype: FullTeam + """ + if self._team_present: + return self._team_value + else: + return None + + @team.setter + def team(self, val): + if val is None: + del self.team + return + self._team_validator.validate_type_only(val) + self._team_value = val + self._team_present = True + + @team.deleter + def team(self): + self._team_value = None + self._team_present = False + + @property + def team_member_id(self): + """ + This account's unique team member id. This field will only be present if + ``team`` is present. + + :rtype: str + """ + if self._team_member_id_present: + return self._team_member_id_value + else: + return None + + @team_member_id.setter + def team_member_id(self, val): + if val is None: + del self.team_member_id + return + val = self._team_member_id_validator.validate(val) + self._team_member_id_value = val + self._team_member_id_present = True + + @team_member_id.deleter + def team_member_id(self): + self._team_member_id_value = None + self._team_member_id_present = False + + @property + def is_paired(self): + """ + Whether the user has a personal and work account. If the current account + is personal, then ``team`` will always be None, but ``is_paired`` will + indicate if a work account is linked. + + :rtype: bool + """ + if self._is_paired_present: + return self._is_paired_value + else: + raise AttributeError("missing required field 'is_paired'") + + @is_paired.setter + def is_paired(self, val): + val = self._is_paired_validator.validate(val) + self._is_paired_value = val + self._is_paired_present = True + + @is_paired.deleter + def is_paired(self): + self._is_paired_value = None + self._is_paired_present = False + + @property + def account_type(self): + """ + What type of account this user has. + + :rtype: users_common.AccountType + """ + if self._account_type_present: + return self._account_type_value + else: + raise AttributeError("missing required field 'account_type'") + + @account_type.setter + def account_type(self, val): + self._account_type_validator.validate_type_only(val) + self._account_type_value = val + self._account_type_present = True + + @account_type.deleter + def account_type(self): + self._account_type_value = None + self._account_type_present = False + + @property + def root_info(self): + """ + The root info for this account. + + :rtype: common.RootInfo + """ + if self._root_info_present: + return self._root_info_value + else: + raise AttributeError("missing required field 'root_info'") + + @root_info.setter + def root_info(self, val): + self._root_info_validator.validate_type_only(val) + self._root_info_value = val + self._root_info_present = True + + @root_info.deleter + def root_info(self): + self._root_info_value = None + self._root_info_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FullAccount, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FullAccount(account_id={!r}, name={!r}, email={!r}, email_verified={!r}, disabled={!r}, locale={!r}, referral_link={!r}, is_paired={!r}, account_type={!r}, root_info={!r}, profile_photo_url={!r}, country={!r}, team={!r}, team_member_id={!r})'.format( + self._account_id_value, + self._name_value, + self._email_value, + self._email_verified_value, + self._disabled_value, + self._locale_value, + self._referral_link_value, + self._is_paired_value, + self._account_type_value, + self._root_info_value, + self._profile_photo_url_value, + self._country_value, + self._team_value, + self._team_member_id_value, + ) + +FullAccount_validator = bv.Struct(FullAccount) + +class Team(bb.Struct): + """ + Information about a team. + + :ivar id: The team's unique ID. + :ivar name: The name of the team. + """ + + __slots__ = [ + '_id_value', + '_id_present', + '_name_value', + '_name_present', + ] + + _has_required_fields = True + + def __init__(self, + id=None, + name=None): + self._id_value = None + self._id_present = False + self._name_value = None + self._name_present = False + if id is not None: + self.id = id + if name is not None: + self.name = name + + @property + def id(self): + """ + The team's unique ID. + + :rtype: str + """ + if self._id_present: + return self._id_value + else: + raise AttributeError("missing required field 'id'") + + @id.setter + def id(self, val): + val = self._id_validator.validate(val) + self._id_value = val + self._id_present = True + + @id.deleter + def id(self): + self._id_value = None + self._id_present = False + + @property + def name(self): + """ + The name of the team. + + :rtype: str + """ + if self._name_present: + return self._name_value + else: + raise AttributeError("missing required field 'name'") + + @name.setter + def name(self, val): + val = self._name_validator.validate(val) + self._name_value = val + self._name_present = True + + @name.deleter + def name(self): + self._name_value = None + self._name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(Team, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'Team(id={!r}, name={!r})'.format( + self._id_value, + self._name_value, + ) + +Team_validator = bv.Struct(Team) + +class FullTeam(Team): + """ + Detailed information about a team. + + :ivar sharing_policies: Team policies governing sharing. + :ivar office_addin_policy: Team policy governing the use of the Office + Add-In. + """ + + __slots__ = [ + '_sharing_policies_value', + '_sharing_policies_present', + '_office_addin_policy_value', + '_office_addin_policy_present', + ] + + _has_required_fields = True + + def __init__(self, + id=None, + name=None, + sharing_policies=None, + office_addin_policy=None): + super(FullTeam, self).__init__(id, + name) + self._sharing_policies_value = None + self._sharing_policies_present = False + self._office_addin_policy_value = None + self._office_addin_policy_present = False + if sharing_policies is not None: + self.sharing_policies = sharing_policies + if office_addin_policy is not None: + self.office_addin_policy = office_addin_policy + + @property + def sharing_policies(self): + """ + Team policies governing sharing. + + :rtype: team_policies.TeamSharingPolicies + """ + if self._sharing_policies_present: + return self._sharing_policies_value + else: + raise AttributeError("missing required field 'sharing_policies'") + + @sharing_policies.setter + def sharing_policies(self, val): + self._sharing_policies_validator.validate_type_only(val) + self._sharing_policies_value = val + self._sharing_policies_present = True + + @sharing_policies.deleter + def sharing_policies(self): + self._sharing_policies_value = None + self._sharing_policies_present = False + + @property + def office_addin_policy(self): + """ + Team policy governing the use of the Office Add-In. + + :rtype: team_policies.OfficeAddInPolicy + """ + if self._office_addin_policy_present: + return self._office_addin_policy_value + else: + raise AttributeError("missing required field 'office_addin_policy'") + + @office_addin_policy.setter + def office_addin_policy(self, val): + self._office_addin_policy_validator.validate_type_only(val) + self._office_addin_policy_value = val + self._office_addin_policy_present = True + + @office_addin_policy.deleter + def office_addin_policy(self): + self._office_addin_policy_value = None + self._office_addin_policy_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(FullTeam, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'FullTeam(id={!r}, name={!r}, sharing_policies={!r}, office_addin_policy={!r})'.format( + self._id_value, + self._name_value, + self._sharing_policies_value, + self._office_addin_policy_value, + ) + +FullTeam_validator = bv.Struct(FullTeam) + +class GetAccountArg(bb.Struct): + """ + :ivar account_id: A user's account identifier. + """ + + __slots__ = [ + '_account_id_value', + '_account_id_present', + ] + + _has_required_fields = True + + def __init__(self, + account_id=None): + self._account_id_value = None + self._account_id_present = False + if account_id is not None: + self.account_id = account_id + + @property + def account_id(self): + """ + A user's account identifier. + + :rtype: str + """ + if self._account_id_present: + return self._account_id_value + else: + raise AttributeError("missing required field 'account_id'") + + @account_id.setter + def account_id(self, val): + val = self._account_id_validator.validate(val) + self._account_id_value = val + self._account_id_present = True + + @account_id.deleter + def account_id(self): + self._account_id_value = None + self._account_id_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetAccountArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetAccountArg(account_id={!r})'.format( + self._account_id_value, + ) + +GetAccountArg_validator = bv.Struct(GetAccountArg) + +class GetAccountBatchArg(bb.Struct): + """ + :ivar account_ids: List of user account identifiers. Should not contain any + duplicate account IDs. + """ + + __slots__ = [ + '_account_ids_value', + '_account_ids_present', + ] + + _has_required_fields = True + + def __init__(self, + account_ids=None): + self._account_ids_value = None + self._account_ids_present = False + if account_ids is not None: + self.account_ids = account_ids + + @property + def account_ids(self): + """ + List of user account identifiers. Should not contain any duplicate + account IDs. + + :rtype: list of [str] + """ + if self._account_ids_present: + return self._account_ids_value + else: + raise AttributeError("missing required field 'account_ids'") + + @account_ids.setter + def account_ids(self, val): + val = self._account_ids_validator.validate(val) + self._account_ids_value = val + self._account_ids_present = True + + @account_ids.deleter + def account_ids(self): + self._account_ids_value = None + self._account_ids_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(GetAccountBatchArg, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetAccountBatchArg(account_ids={!r})'.format( + self._account_ids_value, + ) + +GetAccountBatchArg_validator = bv.Struct(GetAccountBatchArg) + +class GetAccountBatchError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar str no_account: The value is an account ID specified in + :field:`GetAccountBatchArg.account_ids` that does not exist. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def no_account(cls, val): + """ + Create an instance of this class set to the ``no_account`` tag with + value ``val``. + + :param str val: + :rtype: GetAccountBatchError + """ + return cls('no_account', val) + + def is_no_account(self): + """ + Check if the union tag is ``no_account``. + + :rtype: bool + """ + return self._tag == 'no_account' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_no_account(self): + """ + The value is an account ID specified in + ``GetAccountBatchArg.account_ids`` that does not exist. + + Only call this if :meth:`is_no_account` is true. + + :rtype: str + """ + if not self.is_no_account(): + raise AttributeError("tag 'no_account' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(GetAccountBatchError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetAccountBatchError(%r, %r)' % (self._tag, self._value) + +GetAccountBatchError_validator = bv.Union(GetAccountBatchError) + +class GetAccountError(bb.Union): + """ + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar no_account: The specified ``GetAccountArg.account_id`` does not exist. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + no_account = None + # Attribute is overwritten below the class definition + other = None + + def is_no_account(self): + """ + Check if the union tag is ``no_account``. + + :rtype: bool + """ + return self._tag == 'no_account' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def _process_custom_annotations(self, annotation_type, processor): + super(GetAccountError, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'GetAccountError(%r, %r)' % (self._tag, self._value) + +GetAccountError_validator = bv.Union(GetAccountError) + +class IndividualSpaceAllocation(bb.Struct): + """ + :ivar allocated: The total space allocated to the user's account (bytes). + """ + + __slots__ = [ + '_allocated_value', + '_allocated_present', + ] + + _has_required_fields = True + + def __init__(self, + allocated=None): + self._allocated_value = None + self._allocated_present = False + if allocated is not None: + self.allocated = allocated + + @property + def allocated(self): + """ + The total space allocated to the user's account (bytes). + + :rtype: int + """ + if self._allocated_present: + return self._allocated_value + else: + raise AttributeError("missing required field 'allocated'") + + @allocated.setter + def allocated(self, val): + val = self._allocated_validator.validate(val) + self._allocated_value = val + self._allocated_present = True + + @allocated.deleter + def allocated(self): + self._allocated_value = None + self._allocated_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(IndividualSpaceAllocation, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'IndividualSpaceAllocation(allocated={!r})'.format( + self._allocated_value, + ) + +IndividualSpaceAllocation_validator = bv.Struct(IndividualSpaceAllocation) + +class Name(bb.Struct): + """ + Representations for a person's name to assist with internationalization. + + :ivar given_name: Also known as a first name. + :ivar surname: Also known as a last name or family name. + :ivar familiar_name: Locale-dependent name. In the US, a person's familiar + name is their ``given_name``, but elsewhere, it could be any combination + of a person's ``given_name`` and ``surname``. + :ivar display_name: A name that can be used directly to represent the name + of a user's Dropbox account. + :ivar abbreviated_name: An abbreviated form of the person's name. Their + initials in most locales. + """ + + __slots__ = [ + '_given_name_value', + '_given_name_present', + '_surname_value', + '_surname_present', + '_familiar_name_value', + '_familiar_name_present', + '_display_name_value', + '_display_name_present', + '_abbreviated_name_value', + '_abbreviated_name_present', + ] + + _has_required_fields = True + + def __init__(self, + given_name=None, + surname=None, + familiar_name=None, + display_name=None, + abbreviated_name=None): + self._given_name_value = None + self._given_name_present = False + self._surname_value = None + self._surname_present = False + self._familiar_name_value = None + self._familiar_name_present = False + self._display_name_value = None + self._display_name_present = False + self._abbreviated_name_value = None + self._abbreviated_name_present = False + if given_name is not None: + self.given_name = given_name + if surname is not None: + self.surname = surname + if familiar_name is not None: + self.familiar_name = familiar_name + if display_name is not None: + self.display_name = display_name + if abbreviated_name is not None: + self.abbreviated_name = abbreviated_name + + @property + def given_name(self): + """ + Also known as a first name. + + :rtype: str + """ + if self._given_name_present: + return self._given_name_value + else: + raise AttributeError("missing required field 'given_name'") + + @given_name.setter + def given_name(self, val): + val = self._given_name_validator.validate(val) + self._given_name_value = val + self._given_name_present = True + + @given_name.deleter + def given_name(self): + self._given_name_value = None + self._given_name_present = False + + @property + def surname(self): + """ + Also known as a last name or family name. + + :rtype: str + """ + if self._surname_present: + return self._surname_value + else: + raise AttributeError("missing required field 'surname'") + + @surname.setter + def surname(self, val): + val = self._surname_validator.validate(val) + self._surname_value = val + self._surname_present = True + + @surname.deleter + def surname(self): + self._surname_value = None + self._surname_present = False + + @property + def familiar_name(self): + """ + Locale-dependent name. In the US, a person's familiar name is their + ``given_name``, but elsewhere, it could be any combination of a person's + ``given_name`` and ``surname``. + + :rtype: str + """ + if self._familiar_name_present: + return self._familiar_name_value + else: + raise AttributeError("missing required field 'familiar_name'") + + @familiar_name.setter + def familiar_name(self, val): + val = self._familiar_name_validator.validate(val) + self._familiar_name_value = val + self._familiar_name_present = True + + @familiar_name.deleter + def familiar_name(self): + self._familiar_name_value = None + self._familiar_name_present = False + + @property + def display_name(self): + """ + A name that can be used directly to represent the name of a user's + Dropbox account. + + :rtype: str + """ + if self._display_name_present: + return self._display_name_value + else: + raise AttributeError("missing required field 'display_name'") + + @display_name.setter + def display_name(self, val): + val = self._display_name_validator.validate(val) + self._display_name_value = val + self._display_name_present = True + + @display_name.deleter + def display_name(self): + self._display_name_value = None + self._display_name_present = False + + @property + def abbreviated_name(self): + """ + An abbreviated form of the person's name. Their initials in most + locales. + + :rtype: str + """ + if self._abbreviated_name_present: + return self._abbreviated_name_value + else: + raise AttributeError("missing required field 'abbreviated_name'") + + @abbreviated_name.setter + def abbreviated_name(self, val): + val = self._abbreviated_name_validator.validate(val) + self._abbreviated_name_value = val + self._abbreviated_name_present = True + + @abbreviated_name.deleter + def abbreviated_name(self): + self._abbreviated_name_value = None + self._abbreviated_name_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(Name, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'Name(given_name={!r}, surname={!r}, familiar_name={!r}, display_name={!r}, abbreviated_name={!r})'.format( + self._given_name_value, + self._surname_value, + self._familiar_name_value, + self._display_name_value, + self._abbreviated_name_value, + ) + +Name_validator = bv.Struct(Name) + +class SpaceAllocation(bb.Union): + """ + Space is allocated differently based on the type of account. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar IndividualSpaceAllocation individual: The user's space allocation + applies only to their individual account. + :ivar TeamSpaceAllocation team: The user shares space with other members of + their team. + """ + + _catch_all = 'other' + # Attribute is overwritten below the class definition + other = None + + @classmethod + def individual(cls, val): + """ + Create an instance of this class set to the ``individual`` tag with + value ``val``. + + :param IndividualSpaceAllocation val: + :rtype: SpaceAllocation + """ + return cls('individual', val) + + @classmethod + def team(cls, val): + """ + Create an instance of this class set to the ``team`` tag with value + ``val``. + + :param TeamSpaceAllocation val: + :rtype: SpaceAllocation + """ + return cls('team', val) + + def is_individual(self): + """ + Check if the union tag is ``individual``. + + :rtype: bool + """ + return self._tag == 'individual' + + def is_team(self): + """ + Check if the union tag is ``team``. + + :rtype: bool + """ + return self._tag == 'team' + + def is_other(self): + """ + Check if the union tag is ``other``. + + :rtype: bool + """ + return self._tag == 'other' + + def get_individual(self): + """ + The user's space allocation applies only to their individual account. + + Only call this if :meth:`is_individual` is true. + + :rtype: IndividualSpaceAllocation + """ + if not self.is_individual(): + raise AttributeError("tag 'individual' not set") + return self._value + + def get_team(self): + """ + The user shares space with other members of their team. + + Only call this if :meth:`is_team` is true. + + :rtype: TeamSpaceAllocation + """ + if not self.is_team(): + raise AttributeError("tag 'team' not set") + return self._value + + def _process_custom_annotations(self, annotation_type, processor): + super(SpaceAllocation, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SpaceAllocation(%r, %r)' % (self._tag, self._value) + +SpaceAllocation_validator = bv.Union(SpaceAllocation) + +class SpaceUsage(bb.Struct): + """ + Information about a user's space usage and quota. + + :ivar used: The user's total space usage (bytes). + :ivar allocation: The user's space allocation. + """ + + __slots__ = [ + '_used_value', + '_used_present', + '_allocation_value', + '_allocation_present', + ] + + _has_required_fields = True + + def __init__(self, + used=None, + allocation=None): + self._used_value = None + self._used_present = False + self._allocation_value = None + self._allocation_present = False + if used is not None: + self.used = used + if allocation is not None: + self.allocation = allocation + + @property + def used(self): + """ + The user's total space usage (bytes). + + :rtype: int + """ + if self._used_present: + return self._used_value + else: + raise AttributeError("missing required field 'used'") + + @used.setter + def used(self, val): + val = self._used_validator.validate(val) + self._used_value = val + self._used_present = True + + @used.deleter + def used(self): + self._used_value = None + self._used_present = False + + @property + def allocation(self): + """ + The user's space allocation. + + :rtype: SpaceAllocation + """ + if self._allocation_present: + return self._allocation_value + else: + raise AttributeError("missing required field 'allocation'") + + @allocation.setter + def allocation(self, val): + self._allocation_validator.validate_type_only(val) + self._allocation_value = val + self._allocation_present = True + + @allocation.deleter + def allocation(self): + self._allocation_value = None + self._allocation_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(SpaceUsage, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'SpaceUsage(used={!r}, allocation={!r})'.format( + self._used_value, + self._allocation_value, + ) + +SpaceUsage_validator = bv.Struct(SpaceUsage) + +class TeamSpaceAllocation(bb.Struct): + """ + :ivar used: The total space currently used by the user's team (bytes). + :ivar allocated: The total space allocated to the user's team (bytes). + :ivar user_within_team_space_allocated: The total space allocated to the + user within its team allocated space (0 means that no restriction is + imposed on the user's quota within its team). + :ivar user_within_team_space_limit_type: The type of the space limit imposed + on the team member (off, alert_only, stop_sync). + """ + + __slots__ = [ + '_used_value', + '_used_present', + '_allocated_value', + '_allocated_present', + '_user_within_team_space_allocated_value', + '_user_within_team_space_allocated_present', + '_user_within_team_space_limit_type_value', + '_user_within_team_space_limit_type_present', + ] + + _has_required_fields = True + + def __init__(self, + used=None, + allocated=None, + user_within_team_space_allocated=None, + user_within_team_space_limit_type=None): + self._used_value = None + self._used_present = False + self._allocated_value = None + self._allocated_present = False + self._user_within_team_space_allocated_value = None + self._user_within_team_space_allocated_present = False + self._user_within_team_space_limit_type_value = None + self._user_within_team_space_limit_type_present = False + if used is not None: + self.used = used + if allocated is not None: + self.allocated = allocated + if user_within_team_space_allocated is not None: + self.user_within_team_space_allocated = user_within_team_space_allocated + if user_within_team_space_limit_type is not None: + self.user_within_team_space_limit_type = user_within_team_space_limit_type + + @property + def used(self): + """ + The total space currently used by the user's team (bytes). + + :rtype: int + """ + if self._used_present: + return self._used_value + else: + raise AttributeError("missing required field 'used'") + + @used.setter + def used(self, val): + val = self._used_validator.validate(val) + self._used_value = val + self._used_present = True + + @used.deleter + def used(self): + self._used_value = None + self._used_present = False + + @property + def allocated(self): + """ + The total space allocated to the user's team (bytes). + + :rtype: int + """ + if self._allocated_present: + return self._allocated_value + else: + raise AttributeError("missing required field 'allocated'") + + @allocated.setter + def allocated(self, val): + val = self._allocated_validator.validate(val) + self._allocated_value = val + self._allocated_present = True + + @allocated.deleter + def allocated(self): + self._allocated_value = None + self._allocated_present = False + + @property + def user_within_team_space_allocated(self): + """ + The total space allocated to the user within its team allocated space (0 + means that no restriction is imposed on the user's quota within its + team). + + :rtype: int + """ + if self._user_within_team_space_allocated_present: + return self._user_within_team_space_allocated_value + else: + raise AttributeError("missing required field 'user_within_team_space_allocated'") + + @user_within_team_space_allocated.setter + def user_within_team_space_allocated(self, val): + val = self._user_within_team_space_allocated_validator.validate(val) + self._user_within_team_space_allocated_value = val + self._user_within_team_space_allocated_present = True + + @user_within_team_space_allocated.deleter + def user_within_team_space_allocated(self): + self._user_within_team_space_allocated_value = None + self._user_within_team_space_allocated_present = False + + @property + def user_within_team_space_limit_type(self): + """ + The type of the space limit imposed on the team member (off, alert_only, + stop_sync). + + :rtype: team_common.MemberSpaceLimitType + """ + if self._user_within_team_space_limit_type_present: + return self._user_within_team_space_limit_type_value + else: + raise AttributeError("missing required field 'user_within_team_space_limit_type'") + + @user_within_team_space_limit_type.setter + def user_within_team_space_limit_type(self, val): + self._user_within_team_space_limit_type_validator.validate_type_only(val) + self._user_within_team_space_limit_type_value = val + self._user_within_team_space_limit_type_present = True + + @user_within_team_space_limit_type.deleter + def user_within_team_space_limit_type(self): + self._user_within_team_space_limit_type_value = None + self._user_within_team_space_limit_type_present = False + + def _process_custom_annotations(self, annotation_type, processor): + super(TeamSpaceAllocation, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'TeamSpaceAllocation(used={!r}, allocated={!r}, user_within_team_space_allocated={!r}, user_within_team_space_limit_type={!r})'.format( + self._used_value, + self._allocated_value, + self._user_within_team_space_allocated_value, + self._user_within_team_space_limit_type_value, + ) + +TeamSpaceAllocation_validator = bv.Struct(TeamSpaceAllocation) + +GetAccountBatchResult_validator = bv.List(BasicAccount_validator) +Account._account_id_validator = users_common.AccountId_validator +Account._name_validator = Name_validator +Account._email_validator = bv.String() +Account._email_verified_validator = bv.Boolean() +Account._profile_photo_url_validator = bv.Nullable(bv.String()) +Account._disabled_validator = bv.Boolean() +Account._all_field_names_ = set([ + 'account_id', + 'name', + 'email', + 'email_verified', + 'profile_photo_url', + 'disabled', +]) +Account._all_fields_ = [ + ('account_id', Account._account_id_validator), + ('name', Account._name_validator), + ('email', Account._email_validator), + ('email_verified', Account._email_verified_validator), + ('profile_photo_url', Account._profile_photo_url_validator), + ('disabled', Account._disabled_validator), +] + +BasicAccount._is_teammate_validator = bv.Boolean() +BasicAccount._team_member_id_validator = bv.Nullable(bv.String()) +BasicAccount._all_field_names_ = Account._all_field_names_.union(set([ + 'is_teammate', + 'team_member_id', +])) +BasicAccount._all_fields_ = Account._all_fields_ + [ + ('is_teammate', BasicAccount._is_teammate_validator), + ('team_member_id', BasicAccount._team_member_id_validator), +] + +FullAccount._country_validator = bv.Nullable(bv.String(min_length=2, max_length=2)) +FullAccount._locale_validator = bv.String(min_length=2) +FullAccount._referral_link_validator = bv.String() +FullAccount._team_validator = bv.Nullable(FullTeam_validator) +FullAccount._team_member_id_validator = bv.Nullable(bv.String()) +FullAccount._is_paired_validator = bv.Boolean() +FullAccount._account_type_validator = users_common.AccountType_validator +FullAccount._root_info_validator = common.RootInfo_validator +FullAccount._all_field_names_ = Account._all_field_names_.union(set([ + 'country', + 'locale', + 'referral_link', + 'team', + 'team_member_id', + 'is_paired', + 'account_type', + 'root_info', +])) +FullAccount._all_fields_ = Account._all_fields_ + [ + ('country', FullAccount._country_validator), + ('locale', FullAccount._locale_validator), + ('referral_link', FullAccount._referral_link_validator), + ('team', FullAccount._team_validator), + ('team_member_id', FullAccount._team_member_id_validator), + ('is_paired', FullAccount._is_paired_validator), + ('account_type', FullAccount._account_type_validator), + ('root_info', FullAccount._root_info_validator), +] + +Team._id_validator = bv.String() +Team._name_validator = bv.String() +Team._all_field_names_ = set([ + 'id', + 'name', +]) +Team._all_fields_ = [ + ('id', Team._id_validator), + ('name', Team._name_validator), +] + +FullTeam._sharing_policies_validator = team_policies.TeamSharingPolicies_validator +FullTeam._office_addin_policy_validator = team_policies.OfficeAddInPolicy_validator +FullTeam._all_field_names_ = Team._all_field_names_.union(set([ + 'sharing_policies', + 'office_addin_policy', +])) +FullTeam._all_fields_ = Team._all_fields_ + [ + ('sharing_policies', FullTeam._sharing_policies_validator), + ('office_addin_policy', FullTeam._office_addin_policy_validator), +] + +GetAccountArg._account_id_validator = users_common.AccountId_validator +GetAccountArg._all_field_names_ = set(['account_id']) +GetAccountArg._all_fields_ = [('account_id', GetAccountArg._account_id_validator)] + +GetAccountBatchArg._account_ids_validator = bv.List(users_common.AccountId_validator, min_items=1) +GetAccountBatchArg._all_field_names_ = set(['account_ids']) +GetAccountBatchArg._all_fields_ = [('account_ids', GetAccountBatchArg._account_ids_validator)] + +GetAccountBatchError._no_account_validator = users_common.AccountId_validator +GetAccountBatchError._other_validator = bv.Void() +GetAccountBatchError._tagmap = { + 'no_account': GetAccountBatchError._no_account_validator, + 'other': GetAccountBatchError._other_validator, +} + +GetAccountBatchError.other = GetAccountBatchError('other') + +GetAccountError._no_account_validator = bv.Void() +GetAccountError._other_validator = bv.Void() +GetAccountError._tagmap = { + 'no_account': GetAccountError._no_account_validator, + 'other': GetAccountError._other_validator, +} + +GetAccountError.no_account = GetAccountError('no_account') +GetAccountError.other = GetAccountError('other') + +IndividualSpaceAllocation._allocated_validator = bv.UInt64() +IndividualSpaceAllocation._all_field_names_ = set(['allocated']) +IndividualSpaceAllocation._all_fields_ = [('allocated', IndividualSpaceAllocation._allocated_validator)] + +Name._given_name_validator = bv.String() +Name._surname_validator = bv.String() +Name._familiar_name_validator = bv.String() +Name._display_name_validator = bv.String() +Name._abbreviated_name_validator = bv.String() +Name._all_field_names_ = set([ + 'given_name', + 'surname', + 'familiar_name', + 'display_name', + 'abbreviated_name', +]) +Name._all_fields_ = [ + ('given_name', Name._given_name_validator), + ('surname', Name._surname_validator), + ('familiar_name', Name._familiar_name_validator), + ('display_name', Name._display_name_validator), + ('abbreviated_name', Name._abbreviated_name_validator), +] + +SpaceAllocation._individual_validator = IndividualSpaceAllocation_validator +SpaceAllocation._team_validator = TeamSpaceAllocation_validator +SpaceAllocation._other_validator = bv.Void() +SpaceAllocation._tagmap = { + 'individual': SpaceAllocation._individual_validator, + 'team': SpaceAllocation._team_validator, + 'other': SpaceAllocation._other_validator, +} + +SpaceAllocation.other = SpaceAllocation('other') + +SpaceUsage._used_validator = bv.UInt64() +SpaceUsage._allocation_validator = SpaceAllocation_validator +SpaceUsage._all_field_names_ = set([ + 'used', + 'allocation', +]) +SpaceUsage._all_fields_ = [ + ('used', SpaceUsage._used_validator), + ('allocation', SpaceUsage._allocation_validator), +] + +TeamSpaceAllocation._used_validator = bv.UInt64() +TeamSpaceAllocation._allocated_validator = bv.UInt64() +TeamSpaceAllocation._user_within_team_space_allocated_validator = bv.UInt64() +TeamSpaceAllocation._user_within_team_space_limit_type_validator = team_common.MemberSpaceLimitType_validator +TeamSpaceAllocation._all_field_names_ = set([ + 'used', + 'allocated', + 'user_within_team_space_allocated', + 'user_within_team_space_limit_type', +]) +TeamSpaceAllocation._all_fields_ = [ + ('used', TeamSpaceAllocation._used_validator), + ('allocated', TeamSpaceAllocation._allocated_validator), + ('user_within_team_space_allocated', TeamSpaceAllocation._user_within_team_space_allocated_validator), + ('user_within_team_space_limit_type', TeamSpaceAllocation._user_within_team_space_limit_type_validator), +] + +get_account = bb.Route( + 'get_account', + 1, + False, + GetAccountArg_validator, + BasicAccount_validator, + GetAccountError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +get_account_batch = bb.Route( + 'get_account_batch', + 1, + False, + GetAccountBatchArg_validator, + GetAccountBatchResult_validator, + GetAccountBatchError_validator, + {'host': u'api', + 'style': u'rpc'}, +) +get_current_account = bb.Route( + 'get_current_account', + 1, + False, + bv.Void(), + FullAccount_validator, + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) +get_space_usage = bb.Route( + 'get_space_usage', + 1, + False, + bv.Void(), + SpaceUsage_validator, + bv.Void(), + {'host': u'api', + 'style': u'rpc'}, +) + +ROUTES = { + 'get_account': get_account, + 'get_account_batch': get_account_batch, + 'get_current_account': get_current_account, + 'get_space_usage': get_space_usage, +} + diff --git a/dropbox-script/dropbox/users_common.py b/dropbox-script/dropbox/users_common.py new file mode 100644 index 0000000..d136252 --- /dev/null +++ b/dropbox-script/dropbox/users_common.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- +# Auto-generated by Stone, do not modify. +# @generated +# flake8: noqa +# pylint: skip-file +""" +This namespace contains common data types used within the users namespace. +""" + +try: + from . import stone_validators as bv + from . import stone_base as bb +except (ImportError, SystemError, ValueError): + # Catch errors raised when importing a relative module when not in a package. + # This makes testing this file directly (outside of a package) easier. + import stone_validators as bv + import stone_base as bb + +class AccountType(bb.Union): + """ + What type of account this user has. + + This class acts as a tagged union. Only one of the ``is_*`` methods will + return true. To get the associated value of a tag (if one exists), use the + corresponding ``get_*`` method. + + :ivar basic: The basic account type. + :ivar pro: The Dropbox Pro account type. + :ivar business: The Dropbox Business account type. + """ + + _catch_all = None + # Attribute is overwritten below the class definition + basic = None + # Attribute is overwritten below the class definition + pro = None + # Attribute is overwritten below the class definition + business = None + + def is_basic(self): + """ + Check if the union tag is ``basic``. + + :rtype: bool + """ + return self._tag == 'basic' + + def is_pro(self): + """ + Check if the union tag is ``pro``. + + :rtype: bool + """ + return self._tag == 'pro' + + def is_business(self): + """ + Check if the union tag is ``business``. + + :rtype: bool + """ + return self._tag == 'business' + + def _process_custom_annotations(self, annotation_type, processor): + super(AccountType, self)._process_custom_annotations(annotation_type, processor) + + def __repr__(self): + return 'AccountType(%r, %r)' % (self._tag, self._value) + +AccountType_validator = bv.Union(AccountType) + +AccountId_validator = bv.String(min_length=40, max_length=40) +AccountType._basic_validator = bv.Void() +AccountType._pro_validator = bv.Void() +AccountType._business_validator = bv.Void() +AccountType._tagmap = { + 'basic': AccountType._basic_validator, + 'pro': AccountType._pro_validator, + 'business': AccountType._business_validator, +} + +AccountType.basic = AccountType('basic') +AccountType.pro = AccountType('pro') +AccountType.business = AccountType('business') + +ROUTES = { +} + diff --git a/dropbox-script/idna/__init__.py b/dropbox-script/idna/__init__.py new file mode 100644 index 0000000..847bf93 --- /dev/null +++ b/dropbox-script/idna/__init__.py @@ -0,0 +1,2 @@ +from .package_data import __version__ +from .core import * diff --git a/dropbox-script/idna/codec.py b/dropbox-script/idna/codec.py new file mode 100644 index 0000000..98c65ea --- /dev/null +++ b/dropbox-script/idna/codec.py @@ -0,0 +1,118 @@ +from .core import encode, decode, alabel, ulabel, IDNAError +import codecs +import re + +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +class Codec(codecs.Codec): + + def encode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return "", 0 + + return encode(data), len(data) + + def decode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return u"", 0 + + return decode(data), len(data) + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return ("", 0) + + labels = _unicode_dots_re.split(data) + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = '.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = '.' + + result = [] + size = 0 + for label in labels: + result.append(alabel(label)) + if size: + size += 1 + size += len(label) + + # Join with U+002E + result = ".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return (u"", 0) + + # IDNA allows decoding to operate on Unicode strings, too. + if isinstance(data, unicode): + labels = _unicode_dots_re.split(data) + else: + # Must be ASCII string + data = str(data) + unicode(data, "ascii") + labels = data.split(".") + + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = u'.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = u'.' + + result = [] + size = 0 + for label in labels: + result.append(ulabel(label)) + if size: + size += 1 + size += len(label) + + result = u".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + +class StreamReader(Codec, codecs.StreamReader): + pass + +def getregentry(): + return codecs.CodecInfo( + name='idna', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/dropbox-script/idna/compat.py b/dropbox-script/idna/compat.py new file mode 100644 index 0000000..4d47f33 --- /dev/null +++ b/dropbox-script/idna/compat.py @@ -0,0 +1,12 @@ +from .core import * +from .codec import * + +def ToASCII(label): + return encode(label) + +def ToUnicode(label): + return decode(label) + +def nameprep(s): + raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") + diff --git a/dropbox-script/idna/core.py b/dropbox-script/idna/core.py new file mode 100644 index 0000000..104624a --- /dev/null +++ b/dropbox-script/idna/core.py @@ -0,0 +1,396 @@ +from . import idnadata +import bisect +import unicodedata +import re +import sys +from .intranges import intranges_contain + +_virama_combining_class = 9 +_alabel_prefix = b'xn--' +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +if sys.version_info[0] == 3: + unicode = str + unichr = chr + +class IDNAError(UnicodeError): + """ Base exception for all IDNA-encoding related problems """ + pass + + +class IDNABidiError(IDNAError): + """ Exception when bidirectional requirements are not satisfied """ + pass + + +class InvalidCodepoint(IDNAError): + """ Exception when a disallowed or unallocated codepoint is used """ + pass + + +class InvalidCodepointContext(IDNAError): + """ Exception when the codepoint is not valid in the context it is used """ + pass + + +def _combining_class(cp): + v = unicodedata.combining(unichr(cp)) + if v == 0: + if not unicodedata.name(unichr(cp)): + raise ValueError("Unknown character in unicodedata") + return v + +def _is_script(cp, script): + return intranges_contain(ord(cp), idnadata.scripts[script]) + +def _punycode(s): + return s.encode('punycode') + +def _unot(s): + return 'U+{0:04X}'.format(s) + + +def valid_label_length(label): + + if len(label) > 63: + return False + return True + + +def valid_string_length(label, trailing_dot): + + if len(label) > (254 if trailing_dot else 253): + return False + return True + + +def check_bidi(label, check_ltr=False): + + # Bidi rules should only be applied if string contains RTL characters + bidi_label = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + if direction == '': + # String likely comes from a newer version of Unicode + raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx)) + if direction in ['R', 'AL', 'AN']: + bidi_label = True + if not bidi_label and not check_ltr: + return True + + # Bidi rule 1 + direction = unicodedata.bidirectional(label[0]) + if direction in ['R', 'AL']: + rtl = True + elif direction == 'L': + rtl = False + else: + raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label))) + + valid_ending = False + number_type = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + + if rtl: + # Bidi rule 2 + if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx)) + # Bidi rule 3 + if direction in ['R', 'AL', 'EN', 'AN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + # Bidi rule 4 + if direction in ['AN', 'EN']: + if not number_type: + number_type = direction + else: + if number_type != direction: + raise IDNABidiError('Can not mix numeral types in a right-to-left label') + else: + # Bidi rule 5 + if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx)) + # Bidi rule 6 + if direction in ['L', 'EN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + + if not valid_ending: + raise IDNABidiError('Label ends with illegal codepoint directionality') + + return True + + +def check_initial_combiner(label): + + if unicodedata.category(label[0])[0] == 'M': + raise IDNAError('Label begins with an illegal combining character') + return True + + +def check_hyphen_ok(label): + + if label[2:4] == '--': + raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') + if label[0] == '-' or label[-1] == '-': + raise IDNAError('Label must not start or end with a hyphen') + return True + + +def check_nfc(label): + + if unicodedata.normalize('NFC', label) != label: + raise IDNAError('Label must be in Normalization Form C') + + +def valid_contextj(label, pos): + + cp_value = ord(label[pos]) + + if cp_value == 0x200c: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + + ok = False + for i in range(pos-1, -1, -1): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('L'), ord('D')]: + ok = True + break + + if not ok: + return False + + ok = False + for i in range(pos+1, len(label)): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('R'), ord('D')]: + ok = True + break + return ok + + if cp_value == 0x200d: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + return False + + else: + + return False + + +def valid_contexto(label, pos, exception=False): + + cp_value = ord(label[pos]) + + if cp_value == 0x00b7: + if 0 < pos < len(label)-1: + if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: + return True + return False + + elif cp_value == 0x0375: + if pos < len(label)-1 and len(label) > 1: + return _is_script(label[pos + 1], 'Greek') + return False + + elif cp_value == 0x05f3 or cp_value == 0x05f4: + if pos > 0: + return _is_script(label[pos - 1], 'Hebrew') + return False + + elif cp_value == 0x30fb: + for cp in label: + if cp == u'\u30fb': + continue + if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): + return True + return False + + elif 0x660 <= cp_value <= 0x669: + for cp in label: + if 0x6f0 <= ord(cp) <= 0x06f9: + return False + return True + + elif 0x6f0 <= cp_value <= 0x6f9: + for cp in label: + if 0x660 <= ord(cp) <= 0x0669: + return False + return True + + +def check_label(label): + + if isinstance(label, (bytes, bytearray)): + label = label.decode('utf-8') + if len(label) == 0: + raise IDNAError('Empty Label') + + check_nfc(label) + check_hyphen_ok(label) + check_initial_combiner(label) + + for (pos, cp) in enumerate(label): + cp_value = ord(cp) + if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): + continue + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): + try: + if not valid_contextj(label, pos): + raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format( + _unot(cp_value), pos+1, repr(label))) + except ValueError: + raise IDNAError('Unknown codepoint adjacent to joiner {0} at position {1} in {2}'.format( + _unot(cp_value), pos+1, repr(label))) + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): + if not valid_contexto(label, pos): + raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) + else: + raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label))) + + check_bidi(label) + + +def alabel(label): + + try: + label = label.encode('ascii') + ulabel(label) + if not valid_label_length(label): + raise IDNAError('Label too long') + return label + except UnicodeEncodeError: + pass + + if not label: + raise IDNAError('No Input') + + label = unicode(label) + check_label(label) + label = _punycode(label) + label = _alabel_prefix + label + + if not valid_label_length(label): + raise IDNAError('Label too long') + + return label + + +def ulabel(label): + + if not isinstance(label, (bytes, bytearray)): + try: + label = label.encode('ascii') + except UnicodeEncodeError: + check_label(label) + return label + + label = label.lower() + if label.startswith(_alabel_prefix): + label = label[len(_alabel_prefix):] + else: + check_label(label) + return label.decode('ascii') + + label = label.decode('punycode') + check_label(label) + return label + + +def uts46_remap(domain, std3_rules=True, transitional=False): + """Re-map the characters in the string according to UTS46 processing.""" + from .uts46data import uts46data + output = u"" + try: + for pos, char in enumerate(domain): + code_point = ord(char) + uts46row = uts46data[code_point if code_point < 256 else + bisect.bisect_left(uts46data, (code_point, "Z")) - 1] + status = uts46row[1] + replacement = uts46row[2] if len(uts46row) == 3 else None + if (status == "V" or + (status == "D" and not transitional) or + (status == "3" and not std3_rules and replacement is None)): + output += char + elif replacement is not None and (status == "M" or + (status == "3" and not std3_rules) or + (status == "D" and transitional)): + output += replacement + elif status != "I": + raise IndexError() + return unicodedata.normalize("NFC", output) + except IndexError: + raise InvalidCodepoint( + "Codepoint {0} not allowed at position {1} in {2}".format( + _unot(code_point), pos + 1, repr(domain))) + + +def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, transitional) + trailing_dot = False + result = [] + if strict: + labels = s.split('.') + else: + labels = _unicode_dots_re.split(s) + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if labels[-1] == '': + del labels[-1] + trailing_dot = True + for label in labels: + s = alabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append(b'') + s = b'.'.join(result) + if not valid_string_length(s, trailing_dot): + raise IDNAError('Domain too long') + return s + + +def decode(s, strict=False, uts46=False, std3_rules=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, False) + trailing_dot = False + result = [] + if not strict: + labels = _unicode_dots_re.split(s) + else: + labels = s.split(u'.') + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + s = ulabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append(u'') + return u'.'.join(result) diff --git a/dropbox-script/idna/idnadata.py b/dropbox-script/idna/idnadata.py new file mode 100644 index 0000000..a80c959 --- /dev/null +++ b/dropbox-script/idna/idnadata.py @@ -0,0 +1,1979 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "11.0.0" +scripts = { + 'Greek': ( + 0x37000000374, + 0x37500000378, + 0x37a0000037e, + 0x37f00000380, + 0x38400000385, + 0x38600000387, + 0x3880000038b, + 0x38c0000038d, + 0x38e000003a2, + 0x3a3000003e2, + 0x3f000000400, + 0x1d2600001d2b, + 0x1d5d00001d62, + 0x1d6600001d6b, + 0x1dbf00001dc0, + 0x1f0000001f16, + 0x1f1800001f1e, + 0x1f2000001f46, + 0x1f4800001f4e, + 0x1f5000001f58, + 0x1f5900001f5a, + 0x1f5b00001f5c, + 0x1f5d00001f5e, + 0x1f5f00001f7e, + 0x1f8000001fb5, + 0x1fb600001fc5, + 0x1fc600001fd4, + 0x1fd600001fdc, + 0x1fdd00001ff0, + 0x1ff200001ff5, + 0x1ff600001fff, + 0x212600002127, + 0xab650000ab66, + 0x101400001018f, + 0x101a0000101a1, + 0x1d2000001d246, + ), + 'Han': ( + 0x2e8000002e9a, + 0x2e9b00002ef4, + 0x2f0000002fd6, + 0x300500003006, + 0x300700003008, + 0x30210000302a, + 0x30380000303c, + 0x340000004db6, + 0x4e0000009ff0, + 0xf9000000fa6e, + 0xfa700000fada, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + 0x2f8000002fa1e, + ), + 'Hebrew': ( + 0x591000005c8, + 0x5d0000005eb, + 0x5ef000005f5, + 0xfb1d0000fb37, + 0xfb380000fb3d, + 0xfb3e0000fb3f, + 0xfb400000fb42, + 0xfb430000fb45, + 0xfb460000fb50, + ), + 'Hiragana': ( + 0x304100003097, + 0x309d000030a0, + 0x1b0010001b11f, + 0x1f2000001f201, + ), + 'Katakana': ( + 0x30a1000030fb, + 0x30fd00003100, + 0x31f000003200, + 0x32d0000032ff, + 0x330000003358, + 0xff660000ff70, + 0xff710000ff9e, + 0x1b0000001b001, + ), +} +joining_types = { + 0x600: 85, + 0x601: 85, + 0x602: 85, + 0x603: 85, + 0x604: 85, + 0x605: 85, + 0x608: 85, + 0x60b: 85, + 0x620: 68, + 0x621: 85, + 0x622: 82, + 0x623: 82, + 0x624: 82, + 0x625: 82, + 0x626: 68, + 0x627: 82, + 0x628: 68, + 0x629: 82, + 0x62a: 68, + 0x62b: 68, + 0x62c: 68, + 0x62d: 68, + 0x62e: 68, + 0x62f: 82, + 0x630: 82, + 0x631: 82, + 0x632: 82, + 0x633: 68, + 0x634: 68, + 0x635: 68, + 0x636: 68, + 0x637: 68, + 0x638: 68, + 0x639: 68, + 0x63a: 68, + 0x63b: 68, + 0x63c: 68, + 0x63d: 68, + 0x63e: 68, + 0x63f: 68, + 0x640: 67, + 0x641: 68, + 0x642: 68, + 0x643: 68, + 0x644: 68, + 0x645: 68, + 0x646: 68, + 0x647: 68, + 0x648: 82, + 0x649: 68, + 0x64a: 68, + 0x66e: 68, + 0x66f: 68, + 0x671: 82, + 0x672: 82, + 0x673: 82, + 0x674: 85, + 0x675: 82, + 0x676: 82, + 0x677: 82, + 0x678: 68, + 0x679: 68, + 0x67a: 68, + 0x67b: 68, + 0x67c: 68, + 0x67d: 68, + 0x67e: 68, + 0x67f: 68, + 0x680: 68, + 0x681: 68, + 0x682: 68, + 0x683: 68, + 0x684: 68, + 0x685: 68, + 0x686: 68, + 0x687: 68, + 0x688: 82, + 0x689: 82, + 0x68a: 82, + 0x68b: 82, + 0x68c: 82, + 0x68d: 82, + 0x68e: 82, + 0x68f: 82, + 0x690: 82, + 0x691: 82, + 0x692: 82, + 0x693: 82, + 0x694: 82, + 0x695: 82, + 0x696: 82, + 0x697: 82, + 0x698: 82, + 0x699: 82, + 0x69a: 68, + 0x69b: 68, + 0x69c: 68, + 0x69d: 68, + 0x69e: 68, + 0x69f: 68, + 0x6a0: 68, + 0x6a1: 68, + 0x6a2: 68, + 0x6a3: 68, + 0x6a4: 68, + 0x6a5: 68, + 0x6a6: 68, + 0x6a7: 68, + 0x6a8: 68, + 0x6a9: 68, + 0x6aa: 68, + 0x6ab: 68, + 0x6ac: 68, + 0x6ad: 68, + 0x6ae: 68, + 0x6af: 68, + 0x6b0: 68, + 0x6b1: 68, + 0x6b2: 68, + 0x6b3: 68, + 0x6b4: 68, + 0x6b5: 68, + 0x6b6: 68, + 0x6b7: 68, + 0x6b8: 68, + 0x6b9: 68, + 0x6ba: 68, + 0x6bb: 68, + 0x6bc: 68, + 0x6bd: 68, + 0x6be: 68, + 0x6bf: 68, + 0x6c0: 82, + 0x6c1: 68, + 0x6c2: 68, + 0x6c3: 82, + 0x6c4: 82, + 0x6c5: 82, + 0x6c6: 82, + 0x6c7: 82, + 0x6c8: 82, + 0x6c9: 82, + 0x6ca: 82, + 0x6cb: 82, + 0x6cc: 68, + 0x6cd: 82, + 0x6ce: 68, + 0x6cf: 82, + 0x6d0: 68, + 0x6d1: 68, + 0x6d2: 82, + 0x6d3: 82, + 0x6d5: 82, + 0x6dd: 85, + 0x6ee: 82, + 0x6ef: 82, + 0x6fa: 68, + 0x6fb: 68, + 0x6fc: 68, + 0x6ff: 68, + 0x70f: 84, + 0x710: 82, + 0x712: 68, + 0x713: 68, + 0x714: 68, + 0x715: 82, + 0x716: 82, + 0x717: 82, + 0x718: 82, + 0x719: 82, + 0x71a: 68, + 0x71b: 68, + 0x71c: 68, + 0x71d: 68, + 0x71e: 82, + 0x71f: 68, + 0x720: 68, + 0x721: 68, + 0x722: 68, + 0x723: 68, + 0x724: 68, + 0x725: 68, + 0x726: 68, + 0x727: 68, + 0x728: 82, + 0x729: 68, + 0x72a: 82, + 0x72b: 68, + 0x72c: 82, + 0x72d: 68, + 0x72e: 68, + 0x72f: 82, + 0x74d: 82, + 0x74e: 68, + 0x74f: 68, + 0x750: 68, + 0x751: 68, + 0x752: 68, + 0x753: 68, + 0x754: 68, + 0x755: 68, + 0x756: 68, + 0x757: 68, + 0x758: 68, + 0x759: 82, + 0x75a: 82, + 0x75b: 82, + 0x75c: 68, + 0x75d: 68, + 0x75e: 68, + 0x75f: 68, + 0x760: 68, + 0x761: 68, + 0x762: 68, + 0x763: 68, + 0x764: 68, + 0x765: 68, + 0x766: 68, + 0x767: 68, + 0x768: 68, + 0x769: 68, + 0x76a: 68, + 0x76b: 82, + 0x76c: 82, + 0x76d: 68, + 0x76e: 68, + 0x76f: 68, + 0x770: 68, + 0x771: 82, + 0x772: 68, + 0x773: 82, + 0x774: 82, + 0x775: 68, + 0x776: 68, + 0x777: 68, + 0x778: 82, + 0x779: 82, + 0x77a: 68, + 0x77b: 68, + 0x77c: 68, + 0x77d: 68, + 0x77e: 68, + 0x77f: 68, + 0x7ca: 68, + 0x7cb: 68, + 0x7cc: 68, + 0x7cd: 68, + 0x7ce: 68, + 0x7cf: 68, + 0x7d0: 68, + 0x7d1: 68, + 0x7d2: 68, + 0x7d3: 68, + 0x7d4: 68, + 0x7d5: 68, + 0x7d6: 68, + 0x7d7: 68, + 0x7d8: 68, + 0x7d9: 68, + 0x7da: 68, + 0x7db: 68, + 0x7dc: 68, + 0x7dd: 68, + 0x7de: 68, + 0x7df: 68, + 0x7e0: 68, + 0x7e1: 68, + 0x7e2: 68, + 0x7e3: 68, + 0x7e4: 68, + 0x7e5: 68, + 0x7e6: 68, + 0x7e7: 68, + 0x7e8: 68, + 0x7e9: 68, + 0x7ea: 68, + 0x7fa: 67, + 0x840: 82, + 0x841: 68, + 0x842: 68, + 0x843: 68, + 0x844: 68, + 0x845: 68, + 0x846: 82, + 0x847: 82, + 0x848: 68, + 0x849: 82, + 0x84a: 68, + 0x84b: 68, + 0x84c: 68, + 0x84d: 68, + 0x84e: 68, + 0x84f: 68, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 85, + 0x857: 85, + 0x858: 85, + 0x860: 68, + 0x861: 85, + 0x862: 68, + 0x863: 68, + 0x864: 68, + 0x865: 68, + 0x866: 85, + 0x867: 82, + 0x868: 68, + 0x869: 82, + 0x86a: 82, + 0x8a0: 68, + 0x8a1: 68, + 0x8a2: 68, + 0x8a3: 68, + 0x8a4: 68, + 0x8a5: 68, + 0x8a6: 68, + 0x8a7: 68, + 0x8a8: 68, + 0x8a9: 68, + 0x8aa: 82, + 0x8ab: 82, + 0x8ac: 82, + 0x8ad: 85, + 0x8ae: 82, + 0x8af: 68, + 0x8b0: 68, + 0x8b1: 82, + 0x8b2: 82, + 0x8b3: 68, + 0x8b4: 68, + 0x8b6: 68, + 0x8b7: 68, + 0x8b8: 68, + 0x8b9: 82, + 0x8ba: 68, + 0x8bb: 68, + 0x8bc: 68, + 0x8bd: 68, + 0x8e2: 85, + 0x1806: 85, + 0x1807: 68, + 0x180a: 67, + 0x180e: 85, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, + 0x1823: 68, + 0x1824: 68, + 0x1825: 68, + 0x1826: 68, + 0x1827: 68, + 0x1828: 68, + 0x1829: 68, + 0x182a: 68, + 0x182b: 68, + 0x182c: 68, + 0x182d: 68, + 0x182e: 68, + 0x182f: 68, + 0x1830: 68, + 0x1831: 68, + 0x1832: 68, + 0x1833: 68, + 0x1834: 68, + 0x1835: 68, + 0x1836: 68, + 0x1837: 68, + 0x1838: 68, + 0x1839: 68, + 0x183a: 68, + 0x183b: 68, + 0x183c: 68, + 0x183d: 68, + 0x183e: 68, + 0x183f: 68, + 0x1840: 68, + 0x1841: 68, + 0x1842: 68, + 0x1843: 68, + 0x1844: 68, + 0x1845: 68, + 0x1846: 68, + 0x1847: 68, + 0x1848: 68, + 0x1849: 68, + 0x184a: 68, + 0x184b: 68, + 0x184c: 68, + 0x184d: 68, + 0x184e: 68, + 0x184f: 68, + 0x1850: 68, + 0x1851: 68, + 0x1852: 68, + 0x1853: 68, + 0x1854: 68, + 0x1855: 68, + 0x1856: 68, + 0x1857: 68, + 0x1858: 68, + 0x1859: 68, + 0x185a: 68, + 0x185b: 68, + 0x185c: 68, + 0x185d: 68, + 0x185e: 68, + 0x185f: 68, + 0x1860: 68, + 0x1861: 68, + 0x1862: 68, + 0x1863: 68, + 0x1864: 68, + 0x1865: 68, + 0x1866: 68, + 0x1867: 68, + 0x1868: 68, + 0x1869: 68, + 0x186a: 68, + 0x186b: 68, + 0x186c: 68, + 0x186d: 68, + 0x186e: 68, + 0x186f: 68, + 0x1870: 68, + 0x1871: 68, + 0x1872: 68, + 0x1873: 68, + 0x1874: 68, + 0x1875: 68, + 0x1876: 68, + 0x1877: 68, + 0x1878: 68, + 0x1880: 85, + 0x1881: 85, + 0x1882: 85, + 0x1883: 85, + 0x1884: 85, + 0x1885: 84, + 0x1886: 84, + 0x1887: 68, + 0x1888: 68, + 0x1889: 68, + 0x188a: 68, + 0x188b: 68, + 0x188c: 68, + 0x188d: 68, + 0x188e: 68, + 0x188f: 68, + 0x1890: 68, + 0x1891: 68, + 0x1892: 68, + 0x1893: 68, + 0x1894: 68, + 0x1895: 68, + 0x1896: 68, + 0x1897: 68, + 0x1898: 68, + 0x1899: 68, + 0x189a: 68, + 0x189b: 68, + 0x189c: 68, + 0x189d: 68, + 0x189e: 68, + 0x189f: 68, + 0x18a0: 68, + 0x18a1: 68, + 0x18a2: 68, + 0x18a3: 68, + 0x18a4: 68, + 0x18a5: 68, + 0x18a6: 68, + 0x18a7: 68, + 0x18a8: 68, + 0x18aa: 68, + 0x200c: 85, + 0x200d: 67, + 0x202f: 85, + 0x2066: 85, + 0x2067: 85, + 0x2068: 85, + 0x2069: 85, + 0xa840: 68, + 0xa841: 68, + 0xa842: 68, + 0xa843: 68, + 0xa844: 68, + 0xa845: 68, + 0xa846: 68, + 0xa847: 68, + 0xa848: 68, + 0xa849: 68, + 0xa84a: 68, + 0xa84b: 68, + 0xa84c: 68, + 0xa84d: 68, + 0xa84e: 68, + 0xa84f: 68, + 0xa850: 68, + 0xa851: 68, + 0xa852: 68, + 0xa853: 68, + 0xa854: 68, + 0xa855: 68, + 0xa856: 68, + 0xa857: 68, + 0xa858: 68, + 0xa859: 68, + 0xa85a: 68, + 0xa85b: 68, + 0xa85c: 68, + 0xa85d: 68, + 0xa85e: 68, + 0xa85f: 68, + 0xa860: 68, + 0xa861: 68, + 0xa862: 68, + 0xa863: 68, + 0xa864: 68, + 0xa865: 68, + 0xa866: 68, + 0xa867: 68, + 0xa868: 68, + 0xa869: 68, + 0xa86a: 68, + 0xa86b: 68, + 0xa86c: 68, + 0xa86d: 68, + 0xa86e: 68, + 0xa86f: 68, + 0xa870: 68, + 0xa871: 68, + 0xa872: 76, + 0xa873: 85, + 0x10ac0: 68, + 0x10ac1: 68, + 0x10ac2: 68, + 0x10ac3: 68, + 0x10ac4: 68, + 0x10ac5: 82, + 0x10ac6: 85, + 0x10ac7: 82, + 0x10ac8: 85, + 0x10ac9: 82, + 0x10aca: 82, + 0x10acb: 85, + 0x10acc: 85, + 0x10acd: 76, + 0x10ace: 82, + 0x10acf: 82, + 0x10ad0: 82, + 0x10ad1: 82, + 0x10ad2: 82, + 0x10ad3: 68, + 0x10ad4: 68, + 0x10ad5: 68, + 0x10ad6: 68, + 0x10ad7: 76, + 0x10ad8: 68, + 0x10ad9: 68, + 0x10ada: 68, + 0x10adb: 68, + 0x10adc: 68, + 0x10add: 82, + 0x10ade: 68, + 0x10adf: 68, + 0x10ae0: 68, + 0x10ae1: 82, + 0x10ae2: 85, + 0x10ae3: 85, + 0x10ae4: 82, + 0x10aeb: 68, + 0x10aec: 68, + 0x10aed: 68, + 0x10aee: 68, + 0x10aef: 82, + 0x10b80: 68, + 0x10b81: 82, + 0x10b82: 68, + 0x10b83: 82, + 0x10b84: 82, + 0x10b85: 82, + 0x10b86: 68, + 0x10b87: 68, + 0x10b88: 68, + 0x10b89: 82, + 0x10b8a: 68, + 0x10b8b: 68, + 0x10b8c: 82, + 0x10b8d: 68, + 0x10b8e: 82, + 0x10b8f: 82, + 0x10b90: 68, + 0x10b91: 82, + 0x10ba9: 82, + 0x10baa: 82, + 0x10bab: 82, + 0x10bac: 82, + 0x10bad: 68, + 0x10bae: 68, + 0x10baf: 85, + 0x10d00: 76, + 0x10d01: 68, + 0x10d02: 68, + 0x10d03: 68, + 0x10d04: 68, + 0x10d05: 68, + 0x10d06: 68, + 0x10d07: 68, + 0x10d08: 68, + 0x10d09: 68, + 0x10d0a: 68, + 0x10d0b: 68, + 0x10d0c: 68, + 0x10d0d: 68, + 0x10d0e: 68, + 0x10d0f: 68, + 0x10d10: 68, + 0x10d11: 68, + 0x10d12: 68, + 0x10d13: 68, + 0x10d14: 68, + 0x10d15: 68, + 0x10d16: 68, + 0x10d17: 68, + 0x10d18: 68, + 0x10d19: 68, + 0x10d1a: 68, + 0x10d1b: 68, + 0x10d1c: 68, + 0x10d1d: 68, + 0x10d1e: 68, + 0x10d1f: 68, + 0x10d20: 68, + 0x10d21: 68, + 0x10d22: 82, + 0x10d23: 68, + 0x10f30: 68, + 0x10f31: 68, + 0x10f32: 68, + 0x10f33: 82, + 0x10f34: 68, + 0x10f35: 68, + 0x10f36: 68, + 0x10f37: 68, + 0x10f38: 68, + 0x10f39: 68, + 0x10f3a: 68, + 0x10f3b: 68, + 0x10f3c: 68, + 0x10f3d: 68, + 0x10f3e: 68, + 0x10f3f: 68, + 0x10f40: 68, + 0x10f41: 68, + 0x10f42: 68, + 0x10f43: 68, + 0x10f44: 68, + 0x10f45: 85, + 0x10f51: 68, + 0x10f52: 68, + 0x10f53: 68, + 0x10f54: 82, + 0x110bd: 85, + 0x110cd: 85, + 0x1e900: 68, + 0x1e901: 68, + 0x1e902: 68, + 0x1e903: 68, + 0x1e904: 68, + 0x1e905: 68, + 0x1e906: 68, + 0x1e907: 68, + 0x1e908: 68, + 0x1e909: 68, + 0x1e90a: 68, + 0x1e90b: 68, + 0x1e90c: 68, + 0x1e90d: 68, + 0x1e90e: 68, + 0x1e90f: 68, + 0x1e910: 68, + 0x1e911: 68, + 0x1e912: 68, + 0x1e913: 68, + 0x1e914: 68, + 0x1e915: 68, + 0x1e916: 68, + 0x1e917: 68, + 0x1e918: 68, + 0x1e919: 68, + 0x1e91a: 68, + 0x1e91b: 68, + 0x1e91c: 68, + 0x1e91d: 68, + 0x1e91e: 68, + 0x1e91f: 68, + 0x1e920: 68, + 0x1e921: 68, + 0x1e922: 68, + 0x1e923: 68, + 0x1e924: 68, + 0x1e925: 68, + 0x1e926: 68, + 0x1e927: 68, + 0x1e928: 68, + 0x1e929: 68, + 0x1e92a: 68, + 0x1e92b: 68, + 0x1e92c: 68, + 0x1e92d: 68, + 0x1e92e: 68, + 0x1e92f: 68, + 0x1e930: 68, + 0x1e931: 68, + 0x1e932: 68, + 0x1e933: 68, + 0x1e934: 68, + 0x1e935: 68, + 0x1e936: 68, + 0x1e937: 68, + 0x1e938: 68, + 0x1e939: 68, + 0x1e93a: 68, + 0x1e93b: 68, + 0x1e93c: 68, + 0x1e93d: 68, + 0x1e93e: 68, + 0x1e93f: 68, + 0x1e940: 68, + 0x1e941: 68, + 0x1e942: 68, + 0x1e943: 68, +} +codepoint_classes = { + 'PVALID': ( + 0x2d0000002e, + 0x300000003a, + 0x610000007b, + 0xdf000000f7, + 0xf800000100, + 0x10100000102, + 0x10300000104, + 0x10500000106, + 0x10700000108, + 0x1090000010a, + 0x10b0000010c, + 0x10d0000010e, + 0x10f00000110, + 0x11100000112, + 0x11300000114, + 0x11500000116, + 0x11700000118, + 0x1190000011a, + 0x11b0000011c, + 0x11d0000011e, + 0x11f00000120, + 0x12100000122, + 0x12300000124, + 0x12500000126, + 0x12700000128, + 0x1290000012a, + 0x12b0000012c, + 0x12d0000012e, + 0x12f00000130, + 0x13100000132, + 0x13500000136, + 0x13700000139, + 0x13a0000013b, + 0x13c0000013d, + 0x13e0000013f, + 0x14200000143, + 0x14400000145, + 0x14600000147, + 0x14800000149, + 0x14b0000014c, + 0x14d0000014e, + 0x14f00000150, + 0x15100000152, + 0x15300000154, + 0x15500000156, + 0x15700000158, + 0x1590000015a, + 0x15b0000015c, + 0x15d0000015e, + 0x15f00000160, + 0x16100000162, + 0x16300000164, + 0x16500000166, + 0x16700000168, + 0x1690000016a, + 0x16b0000016c, + 0x16d0000016e, + 0x16f00000170, + 0x17100000172, + 0x17300000174, + 0x17500000176, + 0x17700000178, + 0x17a0000017b, + 0x17c0000017d, + 0x17e0000017f, + 0x18000000181, + 0x18300000184, + 0x18500000186, + 0x18800000189, + 0x18c0000018e, + 0x19200000193, + 0x19500000196, + 0x1990000019c, + 0x19e0000019f, + 0x1a1000001a2, + 0x1a3000001a4, + 0x1a5000001a6, + 0x1a8000001a9, + 0x1aa000001ac, + 0x1ad000001ae, + 0x1b0000001b1, + 0x1b4000001b5, + 0x1b6000001b7, + 0x1b9000001bc, + 0x1bd000001c4, + 0x1ce000001cf, + 0x1d0000001d1, + 0x1d2000001d3, + 0x1d4000001d5, + 0x1d6000001d7, + 0x1d8000001d9, + 0x1da000001db, + 0x1dc000001de, + 0x1df000001e0, + 0x1e1000001e2, + 0x1e3000001e4, + 0x1e5000001e6, + 0x1e7000001e8, + 0x1e9000001ea, + 0x1eb000001ec, + 0x1ed000001ee, + 0x1ef000001f1, + 0x1f5000001f6, + 0x1f9000001fa, + 0x1fb000001fc, + 0x1fd000001fe, + 0x1ff00000200, + 0x20100000202, + 0x20300000204, + 0x20500000206, + 0x20700000208, + 0x2090000020a, + 0x20b0000020c, + 0x20d0000020e, + 0x20f00000210, + 0x21100000212, + 0x21300000214, + 0x21500000216, + 0x21700000218, + 0x2190000021a, + 0x21b0000021c, + 0x21d0000021e, + 0x21f00000220, + 0x22100000222, + 0x22300000224, + 0x22500000226, + 0x22700000228, + 0x2290000022a, + 0x22b0000022c, + 0x22d0000022e, + 0x22f00000230, + 0x23100000232, + 0x2330000023a, + 0x23c0000023d, + 0x23f00000241, + 0x24200000243, + 0x24700000248, + 0x2490000024a, + 0x24b0000024c, + 0x24d0000024e, + 0x24f000002b0, + 0x2b9000002c2, + 0x2c6000002d2, + 0x2ec000002ed, + 0x2ee000002ef, + 0x30000000340, + 0x34200000343, + 0x3460000034f, + 0x35000000370, + 0x37100000372, + 0x37300000374, + 0x37700000378, + 0x37b0000037e, + 0x39000000391, + 0x3ac000003cf, + 0x3d7000003d8, + 0x3d9000003da, + 0x3db000003dc, + 0x3dd000003de, + 0x3df000003e0, + 0x3e1000003e2, + 0x3e3000003e4, + 0x3e5000003e6, + 0x3e7000003e8, + 0x3e9000003ea, + 0x3eb000003ec, + 0x3ed000003ee, + 0x3ef000003f0, + 0x3f3000003f4, + 0x3f8000003f9, + 0x3fb000003fd, + 0x43000000460, + 0x46100000462, + 0x46300000464, + 0x46500000466, + 0x46700000468, + 0x4690000046a, + 0x46b0000046c, + 0x46d0000046e, + 0x46f00000470, + 0x47100000472, + 0x47300000474, + 0x47500000476, + 0x47700000478, + 0x4790000047a, + 0x47b0000047c, + 0x47d0000047e, + 0x47f00000480, + 0x48100000482, + 0x48300000488, + 0x48b0000048c, + 0x48d0000048e, + 0x48f00000490, + 0x49100000492, + 0x49300000494, + 0x49500000496, + 0x49700000498, + 0x4990000049a, + 0x49b0000049c, + 0x49d0000049e, + 0x49f000004a0, + 0x4a1000004a2, + 0x4a3000004a4, + 0x4a5000004a6, + 0x4a7000004a8, + 0x4a9000004aa, + 0x4ab000004ac, + 0x4ad000004ae, + 0x4af000004b0, + 0x4b1000004b2, + 0x4b3000004b4, + 0x4b5000004b6, + 0x4b7000004b8, + 0x4b9000004ba, + 0x4bb000004bc, + 0x4bd000004be, + 0x4bf000004c0, + 0x4c2000004c3, + 0x4c4000004c5, + 0x4c6000004c7, + 0x4c8000004c9, + 0x4ca000004cb, + 0x4cc000004cd, + 0x4ce000004d0, + 0x4d1000004d2, + 0x4d3000004d4, + 0x4d5000004d6, + 0x4d7000004d8, + 0x4d9000004da, + 0x4db000004dc, + 0x4dd000004de, + 0x4df000004e0, + 0x4e1000004e2, + 0x4e3000004e4, + 0x4e5000004e6, + 0x4e7000004e8, + 0x4e9000004ea, + 0x4eb000004ec, + 0x4ed000004ee, + 0x4ef000004f0, + 0x4f1000004f2, + 0x4f3000004f4, + 0x4f5000004f6, + 0x4f7000004f8, + 0x4f9000004fa, + 0x4fb000004fc, + 0x4fd000004fe, + 0x4ff00000500, + 0x50100000502, + 0x50300000504, + 0x50500000506, + 0x50700000508, + 0x5090000050a, + 0x50b0000050c, + 0x50d0000050e, + 0x50f00000510, + 0x51100000512, + 0x51300000514, + 0x51500000516, + 0x51700000518, + 0x5190000051a, + 0x51b0000051c, + 0x51d0000051e, + 0x51f00000520, + 0x52100000522, + 0x52300000524, + 0x52500000526, + 0x52700000528, + 0x5290000052a, + 0x52b0000052c, + 0x52d0000052e, + 0x52f00000530, + 0x5590000055a, + 0x56000000587, + 0x58800000589, + 0x591000005be, + 0x5bf000005c0, + 0x5c1000005c3, + 0x5c4000005c6, + 0x5c7000005c8, + 0x5d0000005eb, + 0x5ef000005f3, + 0x6100000061b, + 0x62000000640, + 0x64100000660, + 0x66e00000675, + 0x679000006d4, + 0x6d5000006dd, + 0x6df000006e9, + 0x6ea000006f0, + 0x6fa00000700, + 0x7100000074b, + 0x74d000007b2, + 0x7c0000007f6, + 0x7fd000007fe, + 0x8000000082e, + 0x8400000085c, + 0x8600000086b, + 0x8a0000008b5, + 0x8b6000008be, + 0x8d3000008e2, + 0x8e300000958, + 0x96000000964, + 0x96600000970, + 0x97100000984, + 0x9850000098d, + 0x98f00000991, + 0x993000009a9, + 0x9aa000009b1, + 0x9b2000009b3, + 0x9b6000009ba, + 0x9bc000009c5, + 0x9c7000009c9, + 0x9cb000009cf, + 0x9d7000009d8, + 0x9e0000009e4, + 0x9e6000009f2, + 0x9fc000009fd, + 0x9fe000009ff, + 0xa0100000a04, + 0xa0500000a0b, + 0xa0f00000a11, + 0xa1300000a29, + 0xa2a00000a31, + 0xa3200000a33, + 0xa3500000a36, + 0xa3800000a3a, + 0xa3c00000a3d, + 0xa3e00000a43, + 0xa4700000a49, + 0xa4b00000a4e, + 0xa5100000a52, + 0xa5c00000a5d, + 0xa6600000a76, + 0xa8100000a84, + 0xa8500000a8e, + 0xa8f00000a92, + 0xa9300000aa9, + 0xaaa00000ab1, + 0xab200000ab4, + 0xab500000aba, + 0xabc00000ac6, + 0xac700000aca, + 0xacb00000ace, + 0xad000000ad1, + 0xae000000ae4, + 0xae600000af0, + 0xaf900000b00, + 0xb0100000b04, + 0xb0500000b0d, + 0xb0f00000b11, + 0xb1300000b29, + 0xb2a00000b31, + 0xb3200000b34, + 0xb3500000b3a, + 0xb3c00000b45, + 0xb4700000b49, + 0xb4b00000b4e, + 0xb5600000b58, + 0xb5f00000b64, + 0xb6600000b70, + 0xb7100000b72, + 0xb8200000b84, + 0xb8500000b8b, + 0xb8e00000b91, + 0xb9200000b96, + 0xb9900000b9b, + 0xb9c00000b9d, + 0xb9e00000ba0, + 0xba300000ba5, + 0xba800000bab, + 0xbae00000bba, + 0xbbe00000bc3, + 0xbc600000bc9, + 0xbca00000bce, + 0xbd000000bd1, + 0xbd700000bd8, + 0xbe600000bf0, + 0xc0000000c0d, + 0xc0e00000c11, + 0xc1200000c29, + 0xc2a00000c3a, + 0xc3d00000c45, + 0xc4600000c49, + 0xc4a00000c4e, + 0xc5500000c57, + 0xc5800000c5b, + 0xc6000000c64, + 0xc6600000c70, + 0xc8000000c84, + 0xc8500000c8d, + 0xc8e00000c91, + 0xc9200000ca9, + 0xcaa00000cb4, + 0xcb500000cba, + 0xcbc00000cc5, + 0xcc600000cc9, + 0xcca00000cce, + 0xcd500000cd7, + 0xcde00000cdf, + 0xce000000ce4, + 0xce600000cf0, + 0xcf100000cf3, + 0xd0000000d04, + 0xd0500000d0d, + 0xd0e00000d11, + 0xd1200000d45, + 0xd4600000d49, + 0xd4a00000d4f, + 0xd5400000d58, + 0xd5f00000d64, + 0xd6600000d70, + 0xd7a00000d80, + 0xd8200000d84, + 0xd8500000d97, + 0xd9a00000db2, + 0xdb300000dbc, + 0xdbd00000dbe, + 0xdc000000dc7, + 0xdca00000dcb, + 0xdcf00000dd5, + 0xdd600000dd7, + 0xdd800000de0, + 0xde600000df0, + 0xdf200000df4, + 0xe0100000e33, + 0xe3400000e3b, + 0xe4000000e4f, + 0xe5000000e5a, + 0xe8100000e83, + 0xe8400000e85, + 0xe8700000e89, + 0xe8a00000e8b, + 0xe8d00000e8e, + 0xe9400000e98, + 0xe9900000ea0, + 0xea100000ea4, + 0xea500000ea6, + 0xea700000ea8, + 0xeaa00000eac, + 0xead00000eb3, + 0xeb400000eba, + 0xebb00000ebe, + 0xec000000ec5, + 0xec600000ec7, + 0xec800000ece, + 0xed000000eda, + 0xede00000ee0, + 0xf0000000f01, + 0xf0b00000f0c, + 0xf1800000f1a, + 0xf2000000f2a, + 0xf3500000f36, + 0xf3700000f38, + 0xf3900000f3a, + 0xf3e00000f43, + 0xf4400000f48, + 0xf4900000f4d, + 0xf4e00000f52, + 0xf5300000f57, + 0xf5800000f5c, + 0xf5d00000f69, + 0xf6a00000f6d, + 0xf7100000f73, + 0xf7400000f75, + 0xf7a00000f81, + 0xf8200000f85, + 0xf8600000f93, + 0xf9400000f98, + 0xf9900000f9d, + 0xf9e00000fa2, + 0xfa300000fa7, + 0xfa800000fac, + 0xfad00000fb9, + 0xfba00000fbd, + 0xfc600000fc7, + 0x10000000104a, + 0x10500000109e, + 0x10d0000010fb, + 0x10fd00001100, + 0x120000001249, + 0x124a0000124e, + 0x125000001257, + 0x125800001259, + 0x125a0000125e, + 0x126000001289, + 0x128a0000128e, + 0x1290000012b1, + 0x12b2000012b6, + 0x12b8000012bf, + 0x12c0000012c1, + 0x12c2000012c6, + 0x12c8000012d7, + 0x12d800001311, + 0x131200001316, + 0x13180000135b, + 0x135d00001360, + 0x138000001390, + 0x13a0000013f6, + 0x14010000166d, + 0x166f00001680, + 0x16810000169b, + 0x16a0000016eb, + 0x16f1000016f9, + 0x17000000170d, + 0x170e00001715, + 0x172000001735, + 0x174000001754, + 0x17600000176d, + 0x176e00001771, + 0x177200001774, + 0x1780000017b4, + 0x17b6000017d4, + 0x17d7000017d8, + 0x17dc000017de, + 0x17e0000017ea, + 0x18100000181a, + 0x182000001879, + 0x1880000018ab, + 0x18b0000018f6, + 0x19000000191f, + 0x19200000192c, + 0x19300000193c, + 0x19460000196e, + 0x197000001975, + 0x1980000019ac, + 0x19b0000019ca, + 0x19d0000019da, + 0x1a0000001a1c, + 0x1a2000001a5f, + 0x1a6000001a7d, + 0x1a7f00001a8a, + 0x1a9000001a9a, + 0x1aa700001aa8, + 0x1ab000001abe, + 0x1b0000001b4c, + 0x1b5000001b5a, + 0x1b6b00001b74, + 0x1b8000001bf4, + 0x1c0000001c38, + 0x1c4000001c4a, + 0x1c4d00001c7e, + 0x1cd000001cd3, + 0x1cd400001cfa, + 0x1d0000001d2c, + 0x1d2f00001d30, + 0x1d3b00001d3c, + 0x1d4e00001d4f, + 0x1d6b00001d78, + 0x1d7900001d9b, + 0x1dc000001dfa, + 0x1dfb00001e00, + 0x1e0100001e02, + 0x1e0300001e04, + 0x1e0500001e06, + 0x1e0700001e08, + 0x1e0900001e0a, + 0x1e0b00001e0c, + 0x1e0d00001e0e, + 0x1e0f00001e10, + 0x1e1100001e12, + 0x1e1300001e14, + 0x1e1500001e16, + 0x1e1700001e18, + 0x1e1900001e1a, + 0x1e1b00001e1c, + 0x1e1d00001e1e, + 0x1e1f00001e20, + 0x1e2100001e22, + 0x1e2300001e24, + 0x1e2500001e26, + 0x1e2700001e28, + 0x1e2900001e2a, + 0x1e2b00001e2c, + 0x1e2d00001e2e, + 0x1e2f00001e30, + 0x1e3100001e32, + 0x1e3300001e34, + 0x1e3500001e36, + 0x1e3700001e38, + 0x1e3900001e3a, + 0x1e3b00001e3c, + 0x1e3d00001e3e, + 0x1e3f00001e40, + 0x1e4100001e42, + 0x1e4300001e44, + 0x1e4500001e46, + 0x1e4700001e48, + 0x1e4900001e4a, + 0x1e4b00001e4c, + 0x1e4d00001e4e, + 0x1e4f00001e50, + 0x1e5100001e52, + 0x1e5300001e54, + 0x1e5500001e56, + 0x1e5700001e58, + 0x1e5900001e5a, + 0x1e5b00001e5c, + 0x1e5d00001e5e, + 0x1e5f00001e60, + 0x1e6100001e62, + 0x1e6300001e64, + 0x1e6500001e66, + 0x1e6700001e68, + 0x1e6900001e6a, + 0x1e6b00001e6c, + 0x1e6d00001e6e, + 0x1e6f00001e70, + 0x1e7100001e72, + 0x1e7300001e74, + 0x1e7500001e76, + 0x1e7700001e78, + 0x1e7900001e7a, + 0x1e7b00001e7c, + 0x1e7d00001e7e, + 0x1e7f00001e80, + 0x1e8100001e82, + 0x1e8300001e84, + 0x1e8500001e86, + 0x1e8700001e88, + 0x1e8900001e8a, + 0x1e8b00001e8c, + 0x1e8d00001e8e, + 0x1e8f00001e90, + 0x1e9100001e92, + 0x1e9300001e94, + 0x1e9500001e9a, + 0x1e9c00001e9e, + 0x1e9f00001ea0, + 0x1ea100001ea2, + 0x1ea300001ea4, + 0x1ea500001ea6, + 0x1ea700001ea8, + 0x1ea900001eaa, + 0x1eab00001eac, + 0x1ead00001eae, + 0x1eaf00001eb0, + 0x1eb100001eb2, + 0x1eb300001eb4, + 0x1eb500001eb6, + 0x1eb700001eb8, + 0x1eb900001eba, + 0x1ebb00001ebc, + 0x1ebd00001ebe, + 0x1ebf00001ec0, + 0x1ec100001ec2, + 0x1ec300001ec4, + 0x1ec500001ec6, + 0x1ec700001ec8, + 0x1ec900001eca, + 0x1ecb00001ecc, + 0x1ecd00001ece, + 0x1ecf00001ed0, + 0x1ed100001ed2, + 0x1ed300001ed4, + 0x1ed500001ed6, + 0x1ed700001ed8, + 0x1ed900001eda, + 0x1edb00001edc, + 0x1edd00001ede, + 0x1edf00001ee0, + 0x1ee100001ee2, + 0x1ee300001ee4, + 0x1ee500001ee6, + 0x1ee700001ee8, + 0x1ee900001eea, + 0x1eeb00001eec, + 0x1eed00001eee, + 0x1eef00001ef0, + 0x1ef100001ef2, + 0x1ef300001ef4, + 0x1ef500001ef6, + 0x1ef700001ef8, + 0x1ef900001efa, + 0x1efb00001efc, + 0x1efd00001efe, + 0x1eff00001f08, + 0x1f1000001f16, + 0x1f2000001f28, + 0x1f3000001f38, + 0x1f4000001f46, + 0x1f5000001f58, + 0x1f6000001f68, + 0x1f7000001f71, + 0x1f7200001f73, + 0x1f7400001f75, + 0x1f7600001f77, + 0x1f7800001f79, + 0x1f7a00001f7b, + 0x1f7c00001f7d, + 0x1fb000001fb2, + 0x1fb600001fb7, + 0x1fc600001fc7, + 0x1fd000001fd3, + 0x1fd600001fd8, + 0x1fe000001fe3, + 0x1fe400001fe8, + 0x1ff600001ff7, + 0x214e0000214f, + 0x218400002185, + 0x2c3000002c5f, + 0x2c6100002c62, + 0x2c6500002c67, + 0x2c6800002c69, + 0x2c6a00002c6b, + 0x2c6c00002c6d, + 0x2c7100002c72, + 0x2c7300002c75, + 0x2c7600002c7c, + 0x2c8100002c82, + 0x2c8300002c84, + 0x2c8500002c86, + 0x2c8700002c88, + 0x2c8900002c8a, + 0x2c8b00002c8c, + 0x2c8d00002c8e, + 0x2c8f00002c90, + 0x2c9100002c92, + 0x2c9300002c94, + 0x2c9500002c96, + 0x2c9700002c98, + 0x2c9900002c9a, + 0x2c9b00002c9c, + 0x2c9d00002c9e, + 0x2c9f00002ca0, + 0x2ca100002ca2, + 0x2ca300002ca4, + 0x2ca500002ca6, + 0x2ca700002ca8, + 0x2ca900002caa, + 0x2cab00002cac, + 0x2cad00002cae, + 0x2caf00002cb0, + 0x2cb100002cb2, + 0x2cb300002cb4, + 0x2cb500002cb6, + 0x2cb700002cb8, + 0x2cb900002cba, + 0x2cbb00002cbc, + 0x2cbd00002cbe, + 0x2cbf00002cc0, + 0x2cc100002cc2, + 0x2cc300002cc4, + 0x2cc500002cc6, + 0x2cc700002cc8, + 0x2cc900002cca, + 0x2ccb00002ccc, + 0x2ccd00002cce, + 0x2ccf00002cd0, + 0x2cd100002cd2, + 0x2cd300002cd4, + 0x2cd500002cd6, + 0x2cd700002cd8, + 0x2cd900002cda, + 0x2cdb00002cdc, + 0x2cdd00002cde, + 0x2cdf00002ce0, + 0x2ce100002ce2, + 0x2ce300002ce5, + 0x2cec00002ced, + 0x2cee00002cf2, + 0x2cf300002cf4, + 0x2d0000002d26, + 0x2d2700002d28, + 0x2d2d00002d2e, + 0x2d3000002d68, + 0x2d7f00002d97, + 0x2da000002da7, + 0x2da800002daf, + 0x2db000002db7, + 0x2db800002dbf, + 0x2dc000002dc7, + 0x2dc800002dcf, + 0x2dd000002dd7, + 0x2dd800002ddf, + 0x2de000002e00, + 0x2e2f00002e30, + 0x300500003008, + 0x302a0000302e, + 0x303c0000303d, + 0x304100003097, + 0x30990000309b, + 0x309d0000309f, + 0x30a1000030fb, + 0x30fc000030ff, + 0x310500003130, + 0x31a0000031bb, + 0x31f000003200, + 0x340000004db6, + 0x4e0000009ff0, + 0xa0000000a48d, + 0xa4d00000a4fe, + 0xa5000000a60d, + 0xa6100000a62c, + 0xa6410000a642, + 0xa6430000a644, + 0xa6450000a646, + 0xa6470000a648, + 0xa6490000a64a, + 0xa64b0000a64c, + 0xa64d0000a64e, + 0xa64f0000a650, + 0xa6510000a652, + 0xa6530000a654, + 0xa6550000a656, + 0xa6570000a658, + 0xa6590000a65a, + 0xa65b0000a65c, + 0xa65d0000a65e, + 0xa65f0000a660, + 0xa6610000a662, + 0xa6630000a664, + 0xa6650000a666, + 0xa6670000a668, + 0xa6690000a66a, + 0xa66b0000a66c, + 0xa66d0000a670, + 0xa6740000a67e, + 0xa67f0000a680, + 0xa6810000a682, + 0xa6830000a684, + 0xa6850000a686, + 0xa6870000a688, + 0xa6890000a68a, + 0xa68b0000a68c, + 0xa68d0000a68e, + 0xa68f0000a690, + 0xa6910000a692, + 0xa6930000a694, + 0xa6950000a696, + 0xa6970000a698, + 0xa6990000a69a, + 0xa69b0000a69c, + 0xa69e0000a6e6, + 0xa6f00000a6f2, + 0xa7170000a720, + 0xa7230000a724, + 0xa7250000a726, + 0xa7270000a728, + 0xa7290000a72a, + 0xa72b0000a72c, + 0xa72d0000a72e, + 0xa72f0000a732, + 0xa7330000a734, + 0xa7350000a736, + 0xa7370000a738, + 0xa7390000a73a, + 0xa73b0000a73c, + 0xa73d0000a73e, + 0xa73f0000a740, + 0xa7410000a742, + 0xa7430000a744, + 0xa7450000a746, + 0xa7470000a748, + 0xa7490000a74a, + 0xa74b0000a74c, + 0xa74d0000a74e, + 0xa74f0000a750, + 0xa7510000a752, + 0xa7530000a754, + 0xa7550000a756, + 0xa7570000a758, + 0xa7590000a75a, + 0xa75b0000a75c, + 0xa75d0000a75e, + 0xa75f0000a760, + 0xa7610000a762, + 0xa7630000a764, + 0xa7650000a766, + 0xa7670000a768, + 0xa7690000a76a, + 0xa76b0000a76c, + 0xa76d0000a76e, + 0xa76f0000a770, + 0xa7710000a779, + 0xa77a0000a77b, + 0xa77c0000a77d, + 0xa77f0000a780, + 0xa7810000a782, + 0xa7830000a784, + 0xa7850000a786, + 0xa7870000a789, + 0xa78c0000a78d, + 0xa78e0000a790, + 0xa7910000a792, + 0xa7930000a796, + 0xa7970000a798, + 0xa7990000a79a, + 0xa79b0000a79c, + 0xa79d0000a79e, + 0xa79f0000a7a0, + 0xa7a10000a7a2, + 0xa7a30000a7a4, + 0xa7a50000a7a6, + 0xa7a70000a7a8, + 0xa7a90000a7aa, + 0xa7af0000a7b0, + 0xa7b50000a7b6, + 0xa7b70000a7b8, + 0xa7b90000a7ba, + 0xa7f70000a7f8, + 0xa7fa0000a828, + 0xa8400000a874, + 0xa8800000a8c6, + 0xa8d00000a8da, + 0xa8e00000a8f8, + 0xa8fb0000a8fc, + 0xa8fd0000a92e, + 0xa9300000a954, + 0xa9800000a9c1, + 0xa9cf0000a9da, + 0xa9e00000a9ff, + 0xaa000000aa37, + 0xaa400000aa4e, + 0xaa500000aa5a, + 0xaa600000aa77, + 0xaa7a0000aac3, + 0xaadb0000aade, + 0xaae00000aaf0, + 0xaaf20000aaf7, + 0xab010000ab07, + 0xab090000ab0f, + 0xab110000ab17, + 0xab200000ab27, + 0xab280000ab2f, + 0xab300000ab5b, + 0xab600000ab66, + 0xabc00000abeb, + 0xabec0000abee, + 0xabf00000abfa, + 0xac000000d7a4, + 0xfa0e0000fa10, + 0xfa110000fa12, + 0xfa130000fa15, + 0xfa1f0000fa20, + 0xfa210000fa22, + 0xfa230000fa25, + 0xfa270000fa2a, + 0xfb1e0000fb1f, + 0xfe200000fe30, + 0xfe730000fe74, + 0x100000001000c, + 0x1000d00010027, + 0x100280001003b, + 0x1003c0001003e, + 0x1003f0001004e, + 0x100500001005e, + 0x10080000100fb, + 0x101fd000101fe, + 0x102800001029d, + 0x102a0000102d1, + 0x102e0000102e1, + 0x1030000010320, + 0x1032d00010341, + 0x103420001034a, + 0x103500001037b, + 0x103800001039e, + 0x103a0000103c4, + 0x103c8000103d0, + 0x104280001049e, + 0x104a0000104aa, + 0x104d8000104fc, + 0x1050000010528, + 0x1053000010564, + 0x1060000010737, + 0x1074000010756, + 0x1076000010768, + 0x1080000010806, + 0x1080800010809, + 0x1080a00010836, + 0x1083700010839, + 0x1083c0001083d, + 0x1083f00010856, + 0x1086000010877, + 0x108800001089f, + 0x108e0000108f3, + 0x108f4000108f6, + 0x1090000010916, + 0x109200001093a, + 0x10980000109b8, + 0x109be000109c0, + 0x10a0000010a04, + 0x10a0500010a07, + 0x10a0c00010a14, + 0x10a1500010a18, + 0x10a1900010a36, + 0x10a3800010a3b, + 0x10a3f00010a40, + 0x10a6000010a7d, + 0x10a8000010a9d, + 0x10ac000010ac8, + 0x10ac900010ae7, + 0x10b0000010b36, + 0x10b4000010b56, + 0x10b6000010b73, + 0x10b8000010b92, + 0x10c0000010c49, + 0x10cc000010cf3, + 0x10d0000010d28, + 0x10d3000010d3a, + 0x10f0000010f1d, + 0x10f2700010f28, + 0x10f3000010f51, + 0x1100000011047, + 0x1106600011070, + 0x1107f000110bb, + 0x110d0000110e9, + 0x110f0000110fa, + 0x1110000011135, + 0x1113600011140, + 0x1114400011147, + 0x1115000011174, + 0x1117600011177, + 0x11180000111c5, + 0x111c9000111cd, + 0x111d0000111db, + 0x111dc000111dd, + 0x1120000011212, + 0x1121300011238, + 0x1123e0001123f, + 0x1128000011287, + 0x1128800011289, + 0x1128a0001128e, + 0x1128f0001129e, + 0x1129f000112a9, + 0x112b0000112eb, + 0x112f0000112fa, + 0x1130000011304, + 0x113050001130d, + 0x1130f00011311, + 0x1131300011329, + 0x1132a00011331, + 0x1133200011334, + 0x113350001133a, + 0x1133b00011345, + 0x1134700011349, + 0x1134b0001134e, + 0x1135000011351, + 0x1135700011358, + 0x1135d00011364, + 0x113660001136d, + 0x1137000011375, + 0x114000001144b, + 0x114500001145a, + 0x1145e0001145f, + 0x11480000114c6, + 0x114c7000114c8, + 0x114d0000114da, + 0x11580000115b6, + 0x115b8000115c1, + 0x115d8000115de, + 0x1160000011641, + 0x1164400011645, + 0x116500001165a, + 0x11680000116b8, + 0x116c0000116ca, + 0x117000001171b, + 0x1171d0001172c, + 0x117300001173a, + 0x118000001183b, + 0x118c0000118ea, + 0x118ff00011900, + 0x11a0000011a3f, + 0x11a4700011a48, + 0x11a5000011a84, + 0x11a8600011a9a, + 0x11a9d00011a9e, + 0x11ac000011af9, + 0x11c0000011c09, + 0x11c0a00011c37, + 0x11c3800011c41, + 0x11c5000011c5a, + 0x11c7200011c90, + 0x11c9200011ca8, + 0x11ca900011cb7, + 0x11d0000011d07, + 0x11d0800011d0a, + 0x11d0b00011d37, + 0x11d3a00011d3b, + 0x11d3c00011d3e, + 0x11d3f00011d48, + 0x11d5000011d5a, + 0x11d6000011d66, + 0x11d6700011d69, + 0x11d6a00011d8f, + 0x11d9000011d92, + 0x11d9300011d99, + 0x11da000011daa, + 0x11ee000011ef7, + 0x120000001239a, + 0x1248000012544, + 0x130000001342f, + 0x1440000014647, + 0x1680000016a39, + 0x16a4000016a5f, + 0x16a6000016a6a, + 0x16ad000016aee, + 0x16af000016af5, + 0x16b0000016b37, + 0x16b4000016b44, + 0x16b5000016b5a, + 0x16b6300016b78, + 0x16b7d00016b90, + 0x16e6000016e80, + 0x16f0000016f45, + 0x16f5000016f7f, + 0x16f8f00016fa0, + 0x16fe000016fe2, + 0x17000000187f2, + 0x1880000018af3, + 0x1b0000001b11f, + 0x1b1700001b2fc, + 0x1bc000001bc6b, + 0x1bc700001bc7d, + 0x1bc800001bc89, + 0x1bc900001bc9a, + 0x1bc9d0001bc9f, + 0x1da000001da37, + 0x1da3b0001da6d, + 0x1da750001da76, + 0x1da840001da85, + 0x1da9b0001daa0, + 0x1daa10001dab0, + 0x1e0000001e007, + 0x1e0080001e019, + 0x1e01b0001e022, + 0x1e0230001e025, + 0x1e0260001e02b, + 0x1e8000001e8c5, + 0x1e8d00001e8d7, + 0x1e9220001e94b, + 0x1e9500001e95a, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + ), + 'CONTEXTJ': ( + 0x200c0000200e, + ), + 'CONTEXTO': ( + 0xb7000000b8, + 0x37500000376, + 0x5f3000005f5, + 0x6600000066a, + 0x6f0000006fa, + 0x30fb000030fc, + ), +} diff --git a/dropbox-script/idna/intranges.py b/dropbox-script/idna/intranges.py new file mode 100644 index 0000000..fa8a735 --- /dev/null +++ b/dropbox-script/idna/intranges.py @@ -0,0 +1,53 @@ +""" +Given a list of integers, made up of (hopefully) a small number of long runs +of consecutive integers, compute a representation of the form +((start1, end1), (start2, end2) ...). Then answer the question "was x present +in the original list?" in time O(log(# runs)). +""" + +import bisect + +def intranges_from_list(list_): + """Represent a list of integers as a sequence of ranges: + ((start_0, end_0), (start_1, end_1), ...), such that the original + integers are exactly those x such that start_i <= x < end_i for some i. + + Ranges are encoded as single integers (start << 32 | end), not as tuples. + """ + + sorted_list = sorted(list_) + ranges = [] + last_write = -1 + for i in range(len(sorted_list)): + if i+1 < len(sorted_list): + if sorted_list[i] == sorted_list[i+1]-1: + continue + current_range = sorted_list[last_write+1:i+1] + ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) + last_write = i + + return tuple(ranges) + +def _encode_range(start, end): + return (start << 32) | end + +def _decode_range(r): + return (r >> 32), (r & ((1 << 32) - 1)) + + +def intranges_contain(int_, ranges): + """Determine if `int_` falls into one of the ranges in `ranges`.""" + tuple_ = _encode_range(int_, 0) + pos = bisect.bisect_left(ranges, tuple_) + # we could be immediately ahead of a tuple (start, end) + # with start < int_ <= end + if pos > 0: + left, right = _decode_range(ranges[pos-1]) + if left <= int_ < right: + return True + # or we could be immediately behind a tuple (int_, end) + if pos < len(ranges): + left, _ = _decode_range(ranges[pos]) + if left == int_: + return True + return False diff --git a/dropbox-script/idna/package_data.py b/dropbox-script/idna/package_data.py new file mode 100644 index 0000000..257e898 --- /dev/null +++ b/dropbox-script/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '2.8' + diff --git a/dropbox-script/idna/uts46data.py b/dropbox-script/idna/uts46data.py new file mode 100644 index 0000000..a68ed4c --- /dev/null +++ b/dropbox-script/idna/uts46data.py @@ -0,0 +1,8205 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = "11.0.0" +def _seg_0(): + return [ + (0x0, '3'), + (0x1, '3'), + (0x2, '3'), + (0x3, '3'), + (0x4, '3'), + (0x5, '3'), + (0x6, '3'), + (0x7, '3'), + (0x8, '3'), + (0x9, '3'), + (0xA, '3'), + (0xB, '3'), + (0xC, '3'), + (0xD, '3'), + (0xE, '3'), + (0xF, '3'), + (0x10, '3'), + (0x11, '3'), + (0x12, '3'), + (0x13, '3'), + (0x14, '3'), + (0x15, '3'), + (0x16, '3'), + (0x17, '3'), + (0x18, '3'), + (0x19, '3'), + (0x1A, '3'), + (0x1B, '3'), + (0x1C, '3'), + (0x1D, '3'), + (0x1E, '3'), + (0x1F, '3'), + (0x20, '3'), + (0x21, '3'), + (0x22, '3'), + (0x23, '3'), + (0x24, '3'), + (0x25, '3'), + (0x26, '3'), + (0x27, '3'), + (0x28, '3'), + (0x29, '3'), + (0x2A, '3'), + (0x2B, '3'), + (0x2C, '3'), + (0x2D, 'V'), + (0x2E, 'V'), + (0x2F, '3'), + (0x30, 'V'), + (0x31, 'V'), + (0x32, 'V'), + (0x33, 'V'), + (0x34, 'V'), + (0x35, 'V'), + (0x36, 'V'), + (0x37, 'V'), + (0x38, 'V'), + (0x39, 'V'), + (0x3A, '3'), + (0x3B, '3'), + (0x3C, '3'), + (0x3D, '3'), + (0x3E, '3'), + (0x3F, '3'), + (0x40, '3'), + (0x41, 'M', u'a'), + (0x42, 'M', u'b'), + (0x43, 'M', u'c'), + (0x44, 'M', u'd'), + (0x45, 'M', u'e'), + (0x46, 'M', u'f'), + (0x47, 'M', u'g'), + (0x48, 'M', u'h'), + (0x49, 'M', u'i'), + (0x4A, 'M', u'j'), + (0x4B, 'M', u'k'), + (0x4C, 'M', u'l'), + (0x4D, 'M', u'm'), + (0x4E, 'M', u'n'), + (0x4F, 'M', u'o'), + (0x50, 'M', u'p'), + (0x51, 'M', u'q'), + (0x52, 'M', u'r'), + (0x53, 'M', u's'), + (0x54, 'M', u't'), + (0x55, 'M', u'u'), + (0x56, 'M', u'v'), + (0x57, 'M', u'w'), + (0x58, 'M', u'x'), + (0x59, 'M', u'y'), + (0x5A, 'M', u'z'), + (0x5B, '3'), + (0x5C, '3'), + (0x5D, '3'), + (0x5E, '3'), + (0x5F, '3'), + (0x60, '3'), + (0x61, 'V'), + (0x62, 'V'), + (0x63, 'V'), + ] + +def _seg_1(): + return [ + (0x64, 'V'), + (0x65, 'V'), + (0x66, 'V'), + (0x67, 'V'), + (0x68, 'V'), + (0x69, 'V'), + (0x6A, 'V'), + (0x6B, 'V'), + (0x6C, 'V'), + (0x6D, 'V'), + (0x6E, 'V'), + (0x6F, 'V'), + (0x70, 'V'), + (0x71, 'V'), + (0x72, 'V'), + (0x73, 'V'), + (0x74, 'V'), + (0x75, 'V'), + (0x76, 'V'), + (0x77, 'V'), + (0x78, 'V'), + (0x79, 'V'), + (0x7A, 'V'), + (0x7B, '3'), + (0x7C, '3'), + (0x7D, '3'), + (0x7E, '3'), + (0x7F, '3'), + (0x80, 'X'), + (0x81, 'X'), + (0x82, 'X'), + (0x83, 'X'), + (0x84, 'X'), + (0x85, 'X'), + (0x86, 'X'), + (0x87, 'X'), + (0x88, 'X'), + (0x89, 'X'), + (0x8A, 'X'), + (0x8B, 'X'), + (0x8C, 'X'), + (0x8D, 'X'), + (0x8E, 'X'), + (0x8F, 'X'), + (0x90, 'X'), + (0x91, 'X'), + (0x92, 'X'), + (0x93, 'X'), + (0x94, 'X'), + (0x95, 'X'), + (0x96, 'X'), + (0x97, 'X'), + (0x98, 'X'), + (0x99, 'X'), + (0x9A, 'X'), + (0x9B, 'X'), + (0x9C, 'X'), + (0x9D, 'X'), + (0x9E, 'X'), + (0x9F, 'X'), + (0xA0, '3', u' '), + (0xA1, 'V'), + (0xA2, 'V'), + (0xA3, 'V'), + (0xA4, 'V'), + (0xA5, 'V'), + (0xA6, 'V'), + (0xA7, 'V'), + (0xA8, '3', u' ̈'), + (0xA9, 'V'), + (0xAA, 'M', u'a'), + (0xAB, 'V'), + (0xAC, 'V'), + (0xAD, 'I'), + (0xAE, 'V'), + (0xAF, '3', u' ̄'), + (0xB0, 'V'), + (0xB1, 'V'), + (0xB2, 'M', u'2'), + (0xB3, 'M', u'3'), + (0xB4, '3', u' ́'), + (0xB5, 'M', u'μ'), + (0xB6, 'V'), + (0xB7, 'V'), + (0xB8, '3', u' ̧'), + (0xB9, 'M', u'1'), + (0xBA, 'M', u'o'), + (0xBB, 'V'), + (0xBC, 'M', u'1⁄4'), + (0xBD, 'M', u'1⁄2'), + (0xBE, 'M', u'3⁄4'), + (0xBF, 'V'), + (0xC0, 'M', u'à'), + (0xC1, 'M', u'á'), + (0xC2, 'M', u'â'), + (0xC3, 'M', u'ã'), + (0xC4, 'M', u'ä'), + (0xC5, 'M', u'å'), + (0xC6, 'M', u'æ'), + (0xC7, 'M', u'ç'), + ] + +def _seg_2(): + return [ + (0xC8, 'M', u'è'), + (0xC9, 'M', u'é'), + (0xCA, 'M', u'ê'), + (0xCB, 'M', u'ë'), + (0xCC, 'M', u'ì'), + (0xCD, 'M', u'í'), + (0xCE, 'M', u'î'), + (0xCF, 'M', u'ï'), + (0xD0, 'M', u'ð'), + (0xD1, 'M', u'ñ'), + (0xD2, 'M', u'ò'), + (0xD3, 'M', u'ó'), + (0xD4, 'M', u'ô'), + (0xD5, 'M', u'õ'), + (0xD6, 'M', u'ö'), + (0xD7, 'V'), + (0xD8, 'M', u'ø'), + (0xD9, 'M', u'ù'), + (0xDA, 'M', u'ú'), + (0xDB, 'M', u'û'), + (0xDC, 'M', u'ü'), + (0xDD, 'M', u'ý'), + (0xDE, 'M', u'þ'), + (0xDF, 'D', u'ss'), + (0xE0, 'V'), + (0xE1, 'V'), + (0xE2, 'V'), + (0xE3, 'V'), + (0xE4, 'V'), + (0xE5, 'V'), + (0xE6, 'V'), + (0xE7, 'V'), + (0xE8, 'V'), + (0xE9, 'V'), + (0xEA, 'V'), + (0xEB, 'V'), + (0xEC, 'V'), + (0xED, 'V'), + (0xEE, 'V'), + (0xEF, 'V'), + (0xF0, 'V'), + (0xF1, 'V'), + (0xF2, 'V'), + (0xF3, 'V'), + (0xF4, 'V'), + (0xF5, 'V'), + (0xF6, 'V'), + (0xF7, 'V'), + (0xF8, 'V'), + (0xF9, 'V'), + (0xFA, 'V'), + (0xFB, 'V'), + (0xFC, 'V'), + (0xFD, 'V'), + (0xFE, 'V'), + (0xFF, 'V'), + (0x100, 'M', u'ā'), + (0x101, 'V'), + (0x102, 'M', u'ă'), + (0x103, 'V'), + (0x104, 'M', u'ą'), + (0x105, 'V'), + (0x106, 'M', u'ć'), + (0x107, 'V'), + (0x108, 'M', u'ĉ'), + (0x109, 'V'), + (0x10A, 'M', u'ċ'), + (0x10B, 'V'), + (0x10C, 'M', u'č'), + (0x10D, 'V'), + (0x10E, 'M', u'ď'), + (0x10F, 'V'), + (0x110, 'M', u'đ'), + (0x111, 'V'), + (0x112, 'M', u'ē'), + (0x113, 'V'), + (0x114, 'M', u'ĕ'), + (0x115, 'V'), + (0x116, 'M', u'ė'), + (0x117, 'V'), + (0x118, 'M', u'ę'), + (0x119, 'V'), + (0x11A, 'M', u'ě'), + (0x11B, 'V'), + (0x11C, 'M', u'ĝ'), + (0x11D, 'V'), + (0x11E, 'M', u'ğ'), + (0x11F, 'V'), + (0x120, 'M', u'ġ'), + (0x121, 'V'), + (0x122, 'M', u'ģ'), + (0x123, 'V'), + (0x124, 'M', u'ĥ'), + (0x125, 'V'), + (0x126, 'M', u'ħ'), + (0x127, 'V'), + (0x128, 'M', u'ĩ'), + (0x129, 'V'), + (0x12A, 'M', u'ī'), + (0x12B, 'V'), + ] + +def _seg_3(): + return [ + (0x12C, 'M', u'ĭ'), + (0x12D, 'V'), + (0x12E, 'M', u'į'), + (0x12F, 'V'), + (0x130, 'M', u'i̇'), + (0x131, 'V'), + (0x132, 'M', u'ij'), + (0x134, 'M', u'ĵ'), + (0x135, 'V'), + (0x136, 'M', u'ķ'), + (0x137, 'V'), + (0x139, 'M', u'ĺ'), + (0x13A, 'V'), + (0x13B, 'M', u'ļ'), + (0x13C, 'V'), + (0x13D, 'M', u'ľ'), + (0x13E, 'V'), + (0x13F, 'M', u'l·'), + (0x141, 'M', u'ł'), + (0x142, 'V'), + (0x143, 'M', u'ń'), + (0x144, 'V'), + (0x145, 'M', u'ņ'), + (0x146, 'V'), + (0x147, 'M', u'ň'), + (0x148, 'V'), + (0x149, 'M', u'ʼn'), + (0x14A, 'M', u'ŋ'), + (0x14B, 'V'), + (0x14C, 'M', u'ō'), + (0x14D, 'V'), + (0x14E, 'M', u'ŏ'), + (0x14F, 'V'), + (0x150, 'M', u'ő'), + (0x151, 'V'), + (0x152, 'M', u'œ'), + (0x153, 'V'), + (0x154, 'M', u'ŕ'), + (0x155, 'V'), + (0x156, 'M', u'ŗ'), + (0x157, 'V'), + (0x158, 'M', u'ř'), + (0x159, 'V'), + (0x15A, 'M', u'ś'), + (0x15B, 'V'), + (0x15C, 'M', u'ŝ'), + (0x15D, 'V'), + (0x15E, 'M', u'ş'), + (0x15F, 'V'), + (0x160, 'M', u'š'), + (0x161, 'V'), + (0x162, 'M', u'ţ'), + (0x163, 'V'), + (0x164, 'M', u'ť'), + (0x165, 'V'), + (0x166, 'M', u'ŧ'), + (0x167, 'V'), + (0x168, 'M', u'ũ'), + (0x169, 'V'), + (0x16A, 'M', u'ū'), + (0x16B, 'V'), + (0x16C, 'M', u'ŭ'), + (0x16D, 'V'), + (0x16E, 'M', u'ů'), + (0x16F, 'V'), + (0x170, 'M', u'ű'), + (0x171, 'V'), + (0x172, 'M', u'ų'), + (0x173, 'V'), + (0x174, 'M', u'ŵ'), + (0x175, 'V'), + (0x176, 'M', u'ŷ'), + (0x177, 'V'), + (0x178, 'M', u'ÿ'), + (0x179, 'M', u'ź'), + (0x17A, 'V'), + (0x17B, 'M', u'ż'), + (0x17C, 'V'), + (0x17D, 'M', u'ž'), + (0x17E, 'V'), + (0x17F, 'M', u's'), + (0x180, 'V'), + (0x181, 'M', u'ɓ'), + (0x182, 'M', u'ƃ'), + (0x183, 'V'), + (0x184, 'M', u'ƅ'), + (0x185, 'V'), + (0x186, 'M', u'ɔ'), + (0x187, 'M', u'ƈ'), + (0x188, 'V'), + (0x189, 'M', u'ɖ'), + (0x18A, 'M', u'ɗ'), + (0x18B, 'M', u'ƌ'), + (0x18C, 'V'), + (0x18E, 'M', u'ǝ'), + (0x18F, 'M', u'ə'), + (0x190, 'M', u'ɛ'), + (0x191, 'M', u'ƒ'), + (0x192, 'V'), + (0x193, 'M', u'ɠ'), + ] + +def _seg_4(): + return [ + (0x194, 'M', u'ɣ'), + (0x195, 'V'), + (0x196, 'M', u'ɩ'), + (0x197, 'M', u'ɨ'), + (0x198, 'M', u'ƙ'), + (0x199, 'V'), + (0x19C, 'M', u'ɯ'), + (0x19D, 'M', u'ɲ'), + (0x19E, 'V'), + (0x19F, 'M', u'ɵ'), + (0x1A0, 'M', u'ơ'), + (0x1A1, 'V'), + (0x1A2, 'M', u'ƣ'), + (0x1A3, 'V'), + (0x1A4, 'M', u'ƥ'), + (0x1A5, 'V'), + (0x1A6, 'M', u'ʀ'), + (0x1A7, 'M', u'ƨ'), + (0x1A8, 'V'), + (0x1A9, 'M', u'ʃ'), + (0x1AA, 'V'), + (0x1AC, 'M', u'ƭ'), + (0x1AD, 'V'), + (0x1AE, 'M', u'ʈ'), + (0x1AF, 'M', u'ư'), + (0x1B0, 'V'), + (0x1B1, 'M', u'ʊ'), + (0x1B2, 'M', u'ʋ'), + (0x1B3, 'M', u'ƴ'), + (0x1B4, 'V'), + (0x1B5, 'M', u'ƶ'), + (0x1B6, 'V'), + (0x1B7, 'M', u'ʒ'), + (0x1B8, 'M', u'ƹ'), + (0x1B9, 'V'), + (0x1BC, 'M', u'ƽ'), + (0x1BD, 'V'), + (0x1C4, 'M', u'dž'), + (0x1C7, 'M', u'lj'), + (0x1CA, 'M', u'nj'), + (0x1CD, 'M', u'ǎ'), + (0x1CE, 'V'), + (0x1CF, 'M', u'ǐ'), + (0x1D0, 'V'), + (0x1D1, 'M', u'ǒ'), + (0x1D2, 'V'), + (0x1D3, 'M', u'ǔ'), + (0x1D4, 'V'), + (0x1D5, 'M', u'ǖ'), + (0x1D6, 'V'), + (0x1D7, 'M', u'ǘ'), + (0x1D8, 'V'), + (0x1D9, 'M', u'ǚ'), + (0x1DA, 'V'), + (0x1DB, 'M', u'ǜ'), + (0x1DC, 'V'), + (0x1DE, 'M', u'ǟ'), + (0x1DF, 'V'), + (0x1E0, 'M', u'ǡ'), + (0x1E1, 'V'), + (0x1E2, 'M', u'ǣ'), + (0x1E3, 'V'), + (0x1E4, 'M', u'ǥ'), + (0x1E5, 'V'), + (0x1E6, 'M', u'ǧ'), + (0x1E7, 'V'), + (0x1E8, 'M', u'ǩ'), + (0x1E9, 'V'), + (0x1EA, 'M', u'ǫ'), + (0x1EB, 'V'), + (0x1EC, 'M', u'ǭ'), + (0x1ED, 'V'), + (0x1EE, 'M', u'ǯ'), + (0x1EF, 'V'), + (0x1F1, 'M', u'dz'), + (0x1F4, 'M', u'ǵ'), + (0x1F5, 'V'), + (0x1F6, 'M', u'ƕ'), + (0x1F7, 'M', u'ƿ'), + (0x1F8, 'M', u'ǹ'), + (0x1F9, 'V'), + (0x1FA, 'M', u'ǻ'), + (0x1FB, 'V'), + (0x1FC, 'M', u'ǽ'), + (0x1FD, 'V'), + (0x1FE, 'M', u'ǿ'), + (0x1FF, 'V'), + (0x200, 'M', u'ȁ'), + (0x201, 'V'), + (0x202, 'M', u'ȃ'), + (0x203, 'V'), + (0x204, 'M', u'ȅ'), + (0x205, 'V'), + (0x206, 'M', u'ȇ'), + (0x207, 'V'), + (0x208, 'M', u'ȉ'), + (0x209, 'V'), + (0x20A, 'M', u'ȋ'), + (0x20B, 'V'), + (0x20C, 'M', u'ȍ'), + ] + +def _seg_5(): + return [ + (0x20D, 'V'), + (0x20E, 'M', u'ȏ'), + (0x20F, 'V'), + (0x210, 'M', u'ȑ'), + (0x211, 'V'), + (0x212, 'M', u'ȓ'), + (0x213, 'V'), + (0x214, 'M', u'ȕ'), + (0x215, 'V'), + (0x216, 'M', u'ȗ'), + (0x217, 'V'), + (0x218, 'M', u'ș'), + (0x219, 'V'), + (0x21A, 'M', u'ț'), + (0x21B, 'V'), + (0x21C, 'M', u'ȝ'), + (0x21D, 'V'), + (0x21E, 'M', u'ȟ'), + (0x21F, 'V'), + (0x220, 'M', u'ƞ'), + (0x221, 'V'), + (0x222, 'M', u'ȣ'), + (0x223, 'V'), + (0x224, 'M', u'ȥ'), + (0x225, 'V'), + (0x226, 'M', u'ȧ'), + (0x227, 'V'), + (0x228, 'M', u'ȩ'), + (0x229, 'V'), + (0x22A, 'M', u'ȫ'), + (0x22B, 'V'), + (0x22C, 'M', u'ȭ'), + (0x22D, 'V'), + (0x22E, 'M', u'ȯ'), + (0x22F, 'V'), + (0x230, 'M', u'ȱ'), + (0x231, 'V'), + (0x232, 'M', u'ȳ'), + (0x233, 'V'), + (0x23A, 'M', u'ⱥ'), + (0x23B, 'M', u'ȼ'), + (0x23C, 'V'), + (0x23D, 'M', u'ƚ'), + (0x23E, 'M', u'ⱦ'), + (0x23F, 'V'), + (0x241, 'M', u'ɂ'), + (0x242, 'V'), + (0x243, 'M', u'ƀ'), + (0x244, 'M', u'ʉ'), + (0x245, 'M', u'ʌ'), + (0x246, 'M', u'ɇ'), + (0x247, 'V'), + (0x248, 'M', u'ɉ'), + (0x249, 'V'), + (0x24A, 'M', u'ɋ'), + (0x24B, 'V'), + (0x24C, 'M', u'ɍ'), + (0x24D, 'V'), + (0x24E, 'M', u'ɏ'), + (0x24F, 'V'), + (0x2B0, 'M', u'h'), + (0x2B1, 'M', u'ɦ'), + (0x2B2, 'M', u'j'), + (0x2B3, 'M', u'r'), + (0x2B4, 'M', u'ɹ'), + (0x2B5, 'M', u'ɻ'), + (0x2B6, 'M', u'ʁ'), + (0x2B7, 'M', u'w'), + (0x2B8, 'M', u'y'), + (0x2B9, 'V'), + (0x2D8, '3', u' ̆'), + (0x2D9, '3', u' ̇'), + (0x2DA, '3', u' ̊'), + (0x2DB, '3', u' ̨'), + (0x2DC, '3', u' ̃'), + (0x2DD, '3', u' ̋'), + (0x2DE, 'V'), + (0x2E0, 'M', u'ɣ'), + (0x2E1, 'M', u'l'), + (0x2E2, 'M', u's'), + (0x2E3, 'M', u'x'), + (0x2E4, 'M', u'ʕ'), + (0x2E5, 'V'), + (0x340, 'M', u'̀'), + (0x341, 'M', u'́'), + (0x342, 'V'), + (0x343, 'M', u'̓'), + (0x344, 'M', u'̈́'), + (0x345, 'M', u'ι'), + (0x346, 'V'), + (0x34F, 'I'), + (0x350, 'V'), + (0x370, 'M', u'ͱ'), + (0x371, 'V'), + (0x372, 'M', u'ͳ'), + (0x373, 'V'), + (0x374, 'M', u'ʹ'), + (0x375, 'V'), + (0x376, 'M', u'ͷ'), + (0x377, 'V'), + ] + +def _seg_6(): + return [ + (0x378, 'X'), + (0x37A, '3', u' ι'), + (0x37B, 'V'), + (0x37E, '3', u';'), + (0x37F, 'M', u'ϳ'), + (0x380, 'X'), + (0x384, '3', u' ́'), + (0x385, '3', u' ̈́'), + (0x386, 'M', u'ά'), + (0x387, 'M', u'·'), + (0x388, 'M', u'έ'), + (0x389, 'M', u'ή'), + (0x38A, 'M', u'ί'), + (0x38B, 'X'), + (0x38C, 'M', u'ό'), + (0x38D, 'X'), + (0x38E, 'M', u'ύ'), + (0x38F, 'M', u'ώ'), + (0x390, 'V'), + (0x391, 'M', u'α'), + (0x392, 'M', u'β'), + (0x393, 'M', u'γ'), + (0x394, 'M', u'δ'), + (0x395, 'M', u'ε'), + (0x396, 'M', u'ζ'), + (0x397, 'M', u'η'), + (0x398, 'M', u'θ'), + (0x399, 'M', u'ι'), + (0x39A, 'M', u'κ'), + (0x39B, 'M', u'λ'), + (0x39C, 'M', u'μ'), + (0x39D, 'M', u'ν'), + (0x39E, 'M', u'ξ'), + (0x39F, 'M', u'ο'), + (0x3A0, 'M', u'π'), + (0x3A1, 'M', u'ρ'), + (0x3A2, 'X'), + (0x3A3, 'M', u'σ'), + (0x3A4, 'M', u'τ'), + (0x3A5, 'M', u'υ'), + (0x3A6, 'M', u'φ'), + (0x3A7, 'M', u'χ'), + (0x3A8, 'M', u'ψ'), + (0x3A9, 'M', u'ω'), + (0x3AA, 'M', u'ϊ'), + (0x3AB, 'M', u'ϋ'), + (0x3AC, 'V'), + (0x3C2, 'D', u'σ'), + (0x3C3, 'V'), + (0x3CF, 'M', u'ϗ'), + (0x3D0, 'M', u'β'), + (0x3D1, 'M', u'θ'), + (0x3D2, 'M', u'υ'), + (0x3D3, 'M', u'ύ'), + (0x3D4, 'M', u'ϋ'), + (0x3D5, 'M', u'φ'), + (0x3D6, 'M', u'π'), + (0x3D7, 'V'), + (0x3D8, 'M', u'ϙ'), + (0x3D9, 'V'), + (0x3DA, 'M', u'ϛ'), + (0x3DB, 'V'), + (0x3DC, 'M', u'ϝ'), + (0x3DD, 'V'), + (0x3DE, 'M', u'ϟ'), + (0x3DF, 'V'), + (0x3E0, 'M', u'ϡ'), + (0x3E1, 'V'), + (0x3E2, 'M', u'ϣ'), + (0x3E3, 'V'), + (0x3E4, 'M', u'ϥ'), + (0x3E5, 'V'), + (0x3E6, 'M', u'ϧ'), + (0x3E7, 'V'), + (0x3E8, 'M', u'ϩ'), + (0x3E9, 'V'), + (0x3EA, 'M', u'ϫ'), + (0x3EB, 'V'), + (0x3EC, 'M', u'ϭ'), + (0x3ED, 'V'), + (0x3EE, 'M', u'ϯ'), + (0x3EF, 'V'), + (0x3F0, 'M', u'κ'), + (0x3F1, 'M', u'ρ'), + (0x3F2, 'M', u'σ'), + (0x3F3, 'V'), + (0x3F4, 'M', u'θ'), + (0x3F5, 'M', u'ε'), + (0x3F6, 'V'), + (0x3F7, 'M', u'ϸ'), + (0x3F8, 'V'), + (0x3F9, 'M', u'σ'), + (0x3FA, 'M', u'ϻ'), + (0x3FB, 'V'), + (0x3FD, 'M', u'ͻ'), + (0x3FE, 'M', u'ͼ'), + (0x3FF, 'M', u'ͽ'), + (0x400, 'M', u'ѐ'), + (0x401, 'M', u'ё'), + (0x402, 'M', u'ђ'), + ] + +def _seg_7(): + return [ + (0x403, 'M', u'ѓ'), + (0x404, 'M', u'є'), + (0x405, 'M', u'ѕ'), + (0x406, 'M', u'і'), + (0x407, 'M', u'ї'), + (0x408, 'M', u'ј'), + (0x409, 'M', u'љ'), + (0x40A, 'M', u'њ'), + (0x40B, 'M', u'ћ'), + (0x40C, 'M', u'ќ'), + (0x40D, 'M', u'ѝ'), + (0x40E, 'M', u'ў'), + (0x40F, 'M', u'џ'), + (0x410, 'M', u'а'), + (0x411, 'M', u'б'), + (0x412, 'M', u'в'), + (0x413, 'M', u'г'), + (0x414, 'M', u'д'), + (0x415, 'M', u'е'), + (0x416, 'M', u'ж'), + (0x417, 'M', u'з'), + (0x418, 'M', u'и'), + (0x419, 'M', u'й'), + (0x41A, 'M', u'к'), + (0x41B, 'M', u'л'), + (0x41C, 'M', u'м'), + (0x41D, 'M', u'н'), + (0x41E, 'M', u'о'), + (0x41F, 'M', u'п'), + (0x420, 'M', u'р'), + (0x421, 'M', u'с'), + (0x422, 'M', u'т'), + (0x423, 'M', u'у'), + (0x424, 'M', u'ф'), + (0x425, 'M', u'х'), + (0x426, 'M', u'ц'), + (0x427, 'M', u'ч'), + (0x428, 'M', u'ш'), + (0x429, 'M', u'щ'), + (0x42A, 'M', u'ъ'), + (0x42B, 'M', u'ы'), + (0x42C, 'M', u'ь'), + (0x42D, 'M', u'э'), + (0x42E, 'M', u'ю'), + (0x42F, 'M', u'я'), + (0x430, 'V'), + (0x460, 'M', u'ѡ'), + (0x461, 'V'), + (0x462, 'M', u'ѣ'), + (0x463, 'V'), + (0x464, 'M', u'ѥ'), + (0x465, 'V'), + (0x466, 'M', u'ѧ'), + (0x467, 'V'), + (0x468, 'M', u'ѩ'), + (0x469, 'V'), + (0x46A, 'M', u'ѫ'), + (0x46B, 'V'), + (0x46C, 'M', u'ѭ'), + (0x46D, 'V'), + (0x46E, 'M', u'ѯ'), + (0x46F, 'V'), + (0x470, 'M', u'ѱ'), + (0x471, 'V'), + (0x472, 'M', u'ѳ'), + (0x473, 'V'), + (0x474, 'M', u'ѵ'), + (0x475, 'V'), + (0x476, 'M', u'ѷ'), + (0x477, 'V'), + (0x478, 'M', u'ѹ'), + (0x479, 'V'), + (0x47A, 'M', u'ѻ'), + (0x47B, 'V'), + (0x47C, 'M', u'ѽ'), + (0x47D, 'V'), + (0x47E, 'M', u'ѿ'), + (0x47F, 'V'), + (0x480, 'M', u'ҁ'), + (0x481, 'V'), + (0x48A, 'M', u'ҋ'), + (0x48B, 'V'), + (0x48C, 'M', u'ҍ'), + (0x48D, 'V'), + (0x48E, 'M', u'ҏ'), + (0x48F, 'V'), + (0x490, 'M', u'ґ'), + (0x491, 'V'), + (0x492, 'M', u'ғ'), + (0x493, 'V'), + (0x494, 'M', u'ҕ'), + (0x495, 'V'), + (0x496, 'M', u'җ'), + (0x497, 'V'), + (0x498, 'M', u'ҙ'), + (0x499, 'V'), + (0x49A, 'M', u'қ'), + (0x49B, 'V'), + (0x49C, 'M', u'ҝ'), + (0x49D, 'V'), + ] + +def _seg_8(): + return [ + (0x49E, 'M', u'ҟ'), + (0x49F, 'V'), + (0x4A0, 'M', u'ҡ'), + (0x4A1, 'V'), + (0x4A2, 'M', u'ң'), + (0x4A3, 'V'), + (0x4A4, 'M', u'ҥ'), + (0x4A5, 'V'), + (0x4A6, 'M', u'ҧ'), + (0x4A7, 'V'), + (0x4A8, 'M', u'ҩ'), + (0x4A9, 'V'), + (0x4AA, 'M', u'ҫ'), + (0x4AB, 'V'), + (0x4AC, 'M', u'ҭ'), + (0x4AD, 'V'), + (0x4AE, 'M', u'ү'), + (0x4AF, 'V'), + (0x4B0, 'M', u'ұ'), + (0x4B1, 'V'), + (0x4B2, 'M', u'ҳ'), + (0x4B3, 'V'), + (0x4B4, 'M', u'ҵ'), + (0x4B5, 'V'), + (0x4B6, 'M', u'ҷ'), + (0x4B7, 'V'), + (0x4B8, 'M', u'ҹ'), + (0x4B9, 'V'), + (0x4BA, 'M', u'һ'), + (0x4BB, 'V'), + (0x4BC, 'M', u'ҽ'), + (0x4BD, 'V'), + (0x4BE, 'M', u'ҿ'), + (0x4BF, 'V'), + (0x4C0, 'X'), + (0x4C1, 'M', u'ӂ'), + (0x4C2, 'V'), + (0x4C3, 'M', u'ӄ'), + (0x4C4, 'V'), + (0x4C5, 'M', u'ӆ'), + (0x4C6, 'V'), + (0x4C7, 'M', u'ӈ'), + (0x4C8, 'V'), + (0x4C9, 'M', u'ӊ'), + (0x4CA, 'V'), + (0x4CB, 'M', u'ӌ'), + (0x4CC, 'V'), + (0x4CD, 'M', u'ӎ'), + (0x4CE, 'V'), + (0x4D0, 'M', u'ӑ'), + (0x4D1, 'V'), + (0x4D2, 'M', u'ӓ'), + (0x4D3, 'V'), + (0x4D4, 'M', u'ӕ'), + (0x4D5, 'V'), + (0x4D6, 'M', u'ӗ'), + (0x4D7, 'V'), + (0x4D8, 'M', u'ә'), + (0x4D9, 'V'), + (0x4DA, 'M', u'ӛ'), + (0x4DB, 'V'), + (0x4DC, 'M', u'ӝ'), + (0x4DD, 'V'), + (0x4DE, 'M', u'ӟ'), + (0x4DF, 'V'), + (0x4E0, 'M', u'ӡ'), + (0x4E1, 'V'), + (0x4E2, 'M', u'ӣ'), + (0x4E3, 'V'), + (0x4E4, 'M', u'ӥ'), + (0x4E5, 'V'), + (0x4E6, 'M', u'ӧ'), + (0x4E7, 'V'), + (0x4E8, 'M', u'ө'), + (0x4E9, 'V'), + (0x4EA, 'M', u'ӫ'), + (0x4EB, 'V'), + (0x4EC, 'M', u'ӭ'), + (0x4ED, 'V'), + (0x4EE, 'M', u'ӯ'), + (0x4EF, 'V'), + (0x4F0, 'M', u'ӱ'), + (0x4F1, 'V'), + (0x4F2, 'M', u'ӳ'), + (0x4F3, 'V'), + (0x4F4, 'M', u'ӵ'), + (0x4F5, 'V'), + (0x4F6, 'M', u'ӷ'), + (0x4F7, 'V'), + (0x4F8, 'M', u'ӹ'), + (0x4F9, 'V'), + (0x4FA, 'M', u'ӻ'), + (0x4FB, 'V'), + (0x4FC, 'M', u'ӽ'), + (0x4FD, 'V'), + (0x4FE, 'M', u'ӿ'), + (0x4FF, 'V'), + (0x500, 'M', u'ԁ'), + (0x501, 'V'), + (0x502, 'M', u'ԃ'), + ] + +def _seg_9(): + return [ + (0x503, 'V'), + (0x504, 'M', u'ԅ'), + (0x505, 'V'), + (0x506, 'M', u'ԇ'), + (0x507, 'V'), + (0x508, 'M', u'ԉ'), + (0x509, 'V'), + (0x50A, 'M', u'ԋ'), + (0x50B, 'V'), + (0x50C, 'M', u'ԍ'), + (0x50D, 'V'), + (0x50E, 'M', u'ԏ'), + (0x50F, 'V'), + (0x510, 'M', u'ԑ'), + (0x511, 'V'), + (0x512, 'M', u'ԓ'), + (0x513, 'V'), + (0x514, 'M', u'ԕ'), + (0x515, 'V'), + (0x516, 'M', u'ԗ'), + (0x517, 'V'), + (0x518, 'M', u'ԙ'), + (0x519, 'V'), + (0x51A, 'M', u'ԛ'), + (0x51B, 'V'), + (0x51C, 'M', u'ԝ'), + (0x51D, 'V'), + (0x51E, 'M', u'ԟ'), + (0x51F, 'V'), + (0x520, 'M', u'ԡ'), + (0x521, 'V'), + (0x522, 'M', u'ԣ'), + (0x523, 'V'), + (0x524, 'M', u'ԥ'), + (0x525, 'V'), + (0x526, 'M', u'ԧ'), + (0x527, 'V'), + (0x528, 'M', u'ԩ'), + (0x529, 'V'), + (0x52A, 'M', u'ԫ'), + (0x52B, 'V'), + (0x52C, 'M', u'ԭ'), + (0x52D, 'V'), + (0x52E, 'M', u'ԯ'), + (0x52F, 'V'), + (0x530, 'X'), + (0x531, 'M', u'ա'), + (0x532, 'M', u'բ'), + (0x533, 'M', u'գ'), + (0x534, 'M', u'դ'), + (0x535, 'M', u'ե'), + (0x536, 'M', u'զ'), + (0x537, 'M', u'է'), + (0x538, 'M', u'ը'), + (0x539, 'M', u'թ'), + (0x53A, 'M', u'ժ'), + (0x53B, 'M', u'ի'), + (0x53C, 'M', u'լ'), + (0x53D, 'M', u'խ'), + (0x53E, 'M', u'ծ'), + (0x53F, 'M', u'կ'), + (0x540, 'M', u'հ'), + (0x541, 'M', u'ձ'), + (0x542, 'M', u'ղ'), + (0x543, 'M', u'ճ'), + (0x544, 'M', u'մ'), + (0x545, 'M', u'յ'), + (0x546, 'M', u'ն'), + (0x547, 'M', u'շ'), + (0x548, 'M', u'ո'), + (0x549, 'M', u'չ'), + (0x54A, 'M', u'պ'), + (0x54B, 'M', u'ջ'), + (0x54C, 'M', u'ռ'), + (0x54D, 'M', u'ս'), + (0x54E, 'M', u'վ'), + (0x54F, 'M', u'տ'), + (0x550, 'M', u'ր'), + (0x551, 'M', u'ց'), + (0x552, 'M', u'ւ'), + (0x553, 'M', u'փ'), + (0x554, 'M', u'ք'), + (0x555, 'M', u'օ'), + (0x556, 'M', u'ֆ'), + (0x557, 'X'), + (0x559, 'V'), + (0x587, 'M', u'եւ'), + (0x588, 'V'), + (0x58B, 'X'), + (0x58D, 'V'), + (0x590, 'X'), + (0x591, 'V'), + (0x5C8, 'X'), + (0x5D0, 'V'), + (0x5EB, 'X'), + (0x5EF, 'V'), + (0x5F5, 'X'), + (0x606, 'V'), + (0x61C, 'X'), + (0x61E, 'V'), + ] + +def _seg_10(): + return [ + (0x675, 'M', u'اٴ'), + (0x676, 'M', u'وٴ'), + (0x677, 'M', u'ۇٴ'), + (0x678, 'M', u'يٴ'), + (0x679, 'V'), + (0x6DD, 'X'), + (0x6DE, 'V'), + (0x70E, 'X'), + (0x710, 'V'), + (0x74B, 'X'), + (0x74D, 'V'), + (0x7B2, 'X'), + (0x7C0, 'V'), + (0x7FB, 'X'), + (0x7FD, 'V'), + (0x82E, 'X'), + (0x830, 'V'), + (0x83F, 'X'), + (0x840, 'V'), + (0x85C, 'X'), + (0x85E, 'V'), + (0x85F, 'X'), + (0x860, 'V'), + (0x86B, 'X'), + (0x8A0, 'V'), + (0x8B5, 'X'), + (0x8B6, 'V'), + (0x8BE, 'X'), + (0x8D3, 'V'), + (0x8E2, 'X'), + (0x8E3, 'V'), + (0x958, 'M', u'क़'), + (0x959, 'M', u'ख़'), + (0x95A, 'M', u'ग़'), + (0x95B, 'M', u'ज़'), + (0x95C, 'M', u'ड़'), + (0x95D, 'M', u'ढ़'), + (0x95E, 'M', u'फ़'), + (0x95F, 'M', u'य़'), + (0x960, 'V'), + (0x984, 'X'), + (0x985, 'V'), + (0x98D, 'X'), + (0x98F, 'V'), + (0x991, 'X'), + (0x993, 'V'), + (0x9A9, 'X'), + (0x9AA, 'V'), + (0x9B1, 'X'), + (0x9B2, 'V'), + (0x9B3, 'X'), + (0x9B6, 'V'), + (0x9BA, 'X'), + (0x9BC, 'V'), + (0x9C5, 'X'), + (0x9C7, 'V'), + (0x9C9, 'X'), + (0x9CB, 'V'), + (0x9CF, 'X'), + (0x9D7, 'V'), + (0x9D8, 'X'), + (0x9DC, 'M', u'ড়'), + (0x9DD, 'M', u'ঢ়'), + (0x9DE, 'X'), + (0x9DF, 'M', u'য়'), + (0x9E0, 'V'), + (0x9E4, 'X'), + (0x9E6, 'V'), + (0x9FF, 'X'), + (0xA01, 'V'), + (0xA04, 'X'), + (0xA05, 'V'), + (0xA0B, 'X'), + (0xA0F, 'V'), + (0xA11, 'X'), + (0xA13, 'V'), + (0xA29, 'X'), + (0xA2A, 'V'), + (0xA31, 'X'), + (0xA32, 'V'), + (0xA33, 'M', u'ਲ਼'), + (0xA34, 'X'), + (0xA35, 'V'), + (0xA36, 'M', u'ਸ਼'), + (0xA37, 'X'), + (0xA38, 'V'), + (0xA3A, 'X'), + (0xA3C, 'V'), + (0xA3D, 'X'), + (0xA3E, 'V'), + (0xA43, 'X'), + (0xA47, 'V'), + (0xA49, 'X'), + (0xA4B, 'V'), + (0xA4E, 'X'), + (0xA51, 'V'), + (0xA52, 'X'), + (0xA59, 'M', u'ਖ਼'), + (0xA5A, 'M', u'ਗ਼'), + (0xA5B, 'M', u'ਜ਼'), + ] + +def _seg_11(): + return [ + (0xA5C, 'V'), + (0xA5D, 'X'), + (0xA5E, 'M', u'ਫ਼'), + (0xA5F, 'X'), + (0xA66, 'V'), + (0xA77, 'X'), + (0xA81, 'V'), + (0xA84, 'X'), + (0xA85, 'V'), + (0xA8E, 'X'), + (0xA8F, 'V'), + (0xA92, 'X'), + (0xA93, 'V'), + (0xAA9, 'X'), + (0xAAA, 'V'), + (0xAB1, 'X'), + (0xAB2, 'V'), + (0xAB4, 'X'), + (0xAB5, 'V'), + (0xABA, 'X'), + (0xABC, 'V'), + (0xAC6, 'X'), + (0xAC7, 'V'), + (0xACA, 'X'), + (0xACB, 'V'), + (0xACE, 'X'), + (0xAD0, 'V'), + (0xAD1, 'X'), + (0xAE0, 'V'), + (0xAE4, 'X'), + (0xAE6, 'V'), + (0xAF2, 'X'), + (0xAF9, 'V'), + (0xB00, 'X'), + (0xB01, 'V'), + (0xB04, 'X'), + (0xB05, 'V'), + (0xB0D, 'X'), + (0xB0F, 'V'), + (0xB11, 'X'), + (0xB13, 'V'), + (0xB29, 'X'), + (0xB2A, 'V'), + (0xB31, 'X'), + (0xB32, 'V'), + (0xB34, 'X'), + (0xB35, 'V'), + (0xB3A, 'X'), + (0xB3C, 'V'), + (0xB45, 'X'), + (0xB47, 'V'), + (0xB49, 'X'), + (0xB4B, 'V'), + (0xB4E, 'X'), + (0xB56, 'V'), + (0xB58, 'X'), + (0xB5C, 'M', u'ଡ଼'), + (0xB5D, 'M', u'ଢ଼'), + (0xB5E, 'X'), + (0xB5F, 'V'), + (0xB64, 'X'), + (0xB66, 'V'), + (0xB78, 'X'), + (0xB82, 'V'), + (0xB84, 'X'), + (0xB85, 'V'), + (0xB8B, 'X'), + (0xB8E, 'V'), + (0xB91, 'X'), + (0xB92, 'V'), + (0xB96, 'X'), + (0xB99, 'V'), + (0xB9B, 'X'), + (0xB9C, 'V'), + (0xB9D, 'X'), + (0xB9E, 'V'), + (0xBA0, 'X'), + (0xBA3, 'V'), + (0xBA5, 'X'), + (0xBA8, 'V'), + (0xBAB, 'X'), + (0xBAE, 'V'), + (0xBBA, 'X'), + (0xBBE, 'V'), + (0xBC3, 'X'), + (0xBC6, 'V'), + (0xBC9, 'X'), + (0xBCA, 'V'), + (0xBCE, 'X'), + (0xBD0, 'V'), + (0xBD1, 'X'), + (0xBD7, 'V'), + (0xBD8, 'X'), + (0xBE6, 'V'), + (0xBFB, 'X'), + (0xC00, 'V'), + (0xC0D, 'X'), + (0xC0E, 'V'), + (0xC11, 'X'), + (0xC12, 'V'), + ] + +def _seg_12(): + return [ + (0xC29, 'X'), + (0xC2A, 'V'), + (0xC3A, 'X'), + (0xC3D, 'V'), + (0xC45, 'X'), + (0xC46, 'V'), + (0xC49, 'X'), + (0xC4A, 'V'), + (0xC4E, 'X'), + (0xC55, 'V'), + (0xC57, 'X'), + (0xC58, 'V'), + (0xC5B, 'X'), + (0xC60, 'V'), + (0xC64, 'X'), + (0xC66, 'V'), + (0xC70, 'X'), + (0xC78, 'V'), + (0xC8D, 'X'), + (0xC8E, 'V'), + (0xC91, 'X'), + (0xC92, 'V'), + (0xCA9, 'X'), + (0xCAA, 'V'), + (0xCB4, 'X'), + (0xCB5, 'V'), + (0xCBA, 'X'), + (0xCBC, 'V'), + (0xCC5, 'X'), + (0xCC6, 'V'), + (0xCC9, 'X'), + (0xCCA, 'V'), + (0xCCE, 'X'), + (0xCD5, 'V'), + (0xCD7, 'X'), + (0xCDE, 'V'), + (0xCDF, 'X'), + (0xCE0, 'V'), + (0xCE4, 'X'), + (0xCE6, 'V'), + (0xCF0, 'X'), + (0xCF1, 'V'), + (0xCF3, 'X'), + (0xD00, 'V'), + (0xD04, 'X'), + (0xD05, 'V'), + (0xD0D, 'X'), + (0xD0E, 'V'), + (0xD11, 'X'), + (0xD12, 'V'), + (0xD45, 'X'), + (0xD46, 'V'), + (0xD49, 'X'), + (0xD4A, 'V'), + (0xD50, 'X'), + (0xD54, 'V'), + (0xD64, 'X'), + (0xD66, 'V'), + (0xD80, 'X'), + (0xD82, 'V'), + (0xD84, 'X'), + (0xD85, 'V'), + (0xD97, 'X'), + (0xD9A, 'V'), + (0xDB2, 'X'), + (0xDB3, 'V'), + (0xDBC, 'X'), + (0xDBD, 'V'), + (0xDBE, 'X'), + (0xDC0, 'V'), + (0xDC7, 'X'), + (0xDCA, 'V'), + (0xDCB, 'X'), + (0xDCF, 'V'), + (0xDD5, 'X'), + (0xDD6, 'V'), + (0xDD7, 'X'), + (0xDD8, 'V'), + (0xDE0, 'X'), + (0xDE6, 'V'), + (0xDF0, 'X'), + (0xDF2, 'V'), + (0xDF5, 'X'), + (0xE01, 'V'), + (0xE33, 'M', u'ํา'), + (0xE34, 'V'), + (0xE3B, 'X'), + (0xE3F, 'V'), + (0xE5C, 'X'), + (0xE81, 'V'), + (0xE83, 'X'), + (0xE84, 'V'), + (0xE85, 'X'), + (0xE87, 'V'), + (0xE89, 'X'), + (0xE8A, 'V'), + (0xE8B, 'X'), + (0xE8D, 'V'), + (0xE8E, 'X'), + (0xE94, 'V'), + ] + +def _seg_13(): + return [ + (0xE98, 'X'), + (0xE99, 'V'), + (0xEA0, 'X'), + (0xEA1, 'V'), + (0xEA4, 'X'), + (0xEA5, 'V'), + (0xEA6, 'X'), + (0xEA7, 'V'), + (0xEA8, 'X'), + (0xEAA, 'V'), + (0xEAC, 'X'), + (0xEAD, 'V'), + (0xEB3, 'M', u'ໍາ'), + (0xEB4, 'V'), + (0xEBA, 'X'), + (0xEBB, 'V'), + (0xEBE, 'X'), + (0xEC0, 'V'), + (0xEC5, 'X'), + (0xEC6, 'V'), + (0xEC7, 'X'), + (0xEC8, 'V'), + (0xECE, 'X'), + (0xED0, 'V'), + (0xEDA, 'X'), + (0xEDC, 'M', u'ຫນ'), + (0xEDD, 'M', u'ຫມ'), + (0xEDE, 'V'), + (0xEE0, 'X'), + (0xF00, 'V'), + (0xF0C, 'M', u'་'), + (0xF0D, 'V'), + (0xF43, 'M', u'གྷ'), + (0xF44, 'V'), + (0xF48, 'X'), + (0xF49, 'V'), + (0xF4D, 'M', u'ཌྷ'), + (0xF4E, 'V'), + (0xF52, 'M', u'དྷ'), + (0xF53, 'V'), + (0xF57, 'M', u'བྷ'), + (0xF58, 'V'), + (0xF5C, 'M', u'ཛྷ'), + (0xF5D, 'V'), + (0xF69, 'M', u'ཀྵ'), + (0xF6A, 'V'), + (0xF6D, 'X'), + (0xF71, 'V'), + (0xF73, 'M', u'ཱི'), + (0xF74, 'V'), + (0xF75, 'M', u'ཱུ'), + (0xF76, 'M', u'ྲྀ'), + (0xF77, 'M', u'ྲཱྀ'), + (0xF78, 'M', u'ླྀ'), + (0xF79, 'M', u'ླཱྀ'), + (0xF7A, 'V'), + (0xF81, 'M', u'ཱྀ'), + (0xF82, 'V'), + (0xF93, 'M', u'ྒྷ'), + (0xF94, 'V'), + (0xF98, 'X'), + (0xF99, 'V'), + (0xF9D, 'M', u'ྜྷ'), + (0xF9E, 'V'), + (0xFA2, 'M', u'ྡྷ'), + (0xFA3, 'V'), + (0xFA7, 'M', u'ྦྷ'), + (0xFA8, 'V'), + (0xFAC, 'M', u'ྫྷ'), + (0xFAD, 'V'), + (0xFB9, 'M', u'ྐྵ'), + (0xFBA, 'V'), + (0xFBD, 'X'), + (0xFBE, 'V'), + (0xFCD, 'X'), + (0xFCE, 'V'), + (0xFDB, 'X'), + (0x1000, 'V'), + (0x10A0, 'X'), + (0x10C7, 'M', u'ⴧ'), + (0x10C8, 'X'), + (0x10CD, 'M', u'ⴭ'), + (0x10CE, 'X'), + (0x10D0, 'V'), + (0x10FC, 'M', u'ნ'), + (0x10FD, 'V'), + (0x115F, 'X'), + (0x1161, 'V'), + (0x1249, 'X'), + (0x124A, 'V'), + (0x124E, 'X'), + (0x1250, 'V'), + (0x1257, 'X'), + (0x1258, 'V'), + (0x1259, 'X'), + (0x125A, 'V'), + (0x125E, 'X'), + (0x1260, 'V'), + (0x1289, 'X'), + (0x128A, 'V'), + ] + +def _seg_14(): + return [ + (0x128E, 'X'), + (0x1290, 'V'), + (0x12B1, 'X'), + (0x12B2, 'V'), + (0x12B6, 'X'), + (0x12B8, 'V'), + (0x12BF, 'X'), + (0x12C0, 'V'), + (0x12C1, 'X'), + (0x12C2, 'V'), + (0x12C6, 'X'), + (0x12C8, 'V'), + (0x12D7, 'X'), + (0x12D8, 'V'), + (0x1311, 'X'), + (0x1312, 'V'), + (0x1316, 'X'), + (0x1318, 'V'), + (0x135B, 'X'), + (0x135D, 'V'), + (0x137D, 'X'), + (0x1380, 'V'), + (0x139A, 'X'), + (0x13A0, 'V'), + (0x13F6, 'X'), + (0x13F8, 'M', u'Ᏸ'), + (0x13F9, 'M', u'Ᏹ'), + (0x13FA, 'M', u'Ᏺ'), + (0x13FB, 'M', u'Ᏻ'), + (0x13FC, 'M', u'Ᏼ'), + (0x13FD, 'M', u'Ᏽ'), + (0x13FE, 'X'), + (0x1400, 'V'), + (0x1680, 'X'), + (0x1681, 'V'), + (0x169D, 'X'), + (0x16A0, 'V'), + (0x16F9, 'X'), + (0x1700, 'V'), + (0x170D, 'X'), + (0x170E, 'V'), + (0x1715, 'X'), + (0x1720, 'V'), + (0x1737, 'X'), + (0x1740, 'V'), + (0x1754, 'X'), + (0x1760, 'V'), + (0x176D, 'X'), + (0x176E, 'V'), + (0x1771, 'X'), + (0x1772, 'V'), + (0x1774, 'X'), + (0x1780, 'V'), + (0x17B4, 'X'), + (0x17B6, 'V'), + (0x17DE, 'X'), + (0x17E0, 'V'), + (0x17EA, 'X'), + (0x17F0, 'V'), + (0x17FA, 'X'), + (0x1800, 'V'), + (0x1806, 'X'), + (0x1807, 'V'), + (0x180B, 'I'), + (0x180E, 'X'), + (0x1810, 'V'), + (0x181A, 'X'), + (0x1820, 'V'), + (0x1879, 'X'), + (0x1880, 'V'), + (0x18AB, 'X'), + (0x18B0, 'V'), + (0x18F6, 'X'), + (0x1900, 'V'), + (0x191F, 'X'), + (0x1920, 'V'), + (0x192C, 'X'), + (0x1930, 'V'), + (0x193C, 'X'), + (0x1940, 'V'), + (0x1941, 'X'), + (0x1944, 'V'), + (0x196E, 'X'), + (0x1970, 'V'), + (0x1975, 'X'), + (0x1980, 'V'), + (0x19AC, 'X'), + (0x19B0, 'V'), + (0x19CA, 'X'), + (0x19D0, 'V'), + (0x19DB, 'X'), + (0x19DE, 'V'), + (0x1A1C, 'X'), + (0x1A1E, 'V'), + (0x1A5F, 'X'), + (0x1A60, 'V'), + (0x1A7D, 'X'), + (0x1A7F, 'V'), + (0x1A8A, 'X'), + (0x1A90, 'V'), + ] + +def _seg_15(): + return [ + (0x1A9A, 'X'), + (0x1AA0, 'V'), + (0x1AAE, 'X'), + (0x1AB0, 'V'), + (0x1ABF, 'X'), + (0x1B00, 'V'), + (0x1B4C, 'X'), + (0x1B50, 'V'), + (0x1B7D, 'X'), + (0x1B80, 'V'), + (0x1BF4, 'X'), + (0x1BFC, 'V'), + (0x1C38, 'X'), + (0x1C3B, 'V'), + (0x1C4A, 'X'), + (0x1C4D, 'V'), + (0x1C80, 'M', u'в'), + (0x1C81, 'M', u'д'), + (0x1C82, 'M', u'о'), + (0x1C83, 'M', u'с'), + (0x1C84, 'M', u'т'), + (0x1C86, 'M', u'ъ'), + (0x1C87, 'M', u'ѣ'), + (0x1C88, 'M', u'ꙋ'), + (0x1C89, 'X'), + (0x1CC0, 'V'), + (0x1CC8, 'X'), + (0x1CD0, 'V'), + (0x1CFA, 'X'), + (0x1D00, 'V'), + (0x1D2C, 'M', u'a'), + (0x1D2D, 'M', u'æ'), + (0x1D2E, 'M', u'b'), + (0x1D2F, 'V'), + (0x1D30, 'M', u'd'), + (0x1D31, 'M', u'e'), + (0x1D32, 'M', u'ǝ'), + (0x1D33, 'M', u'g'), + (0x1D34, 'M', u'h'), + (0x1D35, 'M', u'i'), + (0x1D36, 'M', u'j'), + (0x1D37, 'M', u'k'), + (0x1D38, 'M', u'l'), + (0x1D39, 'M', u'm'), + (0x1D3A, 'M', u'n'), + (0x1D3B, 'V'), + (0x1D3C, 'M', u'o'), + (0x1D3D, 'M', u'ȣ'), + (0x1D3E, 'M', u'p'), + (0x1D3F, 'M', u'r'), + (0x1D40, 'M', u't'), + (0x1D41, 'M', u'u'), + (0x1D42, 'M', u'w'), + (0x1D43, 'M', u'a'), + (0x1D44, 'M', u'ɐ'), + (0x1D45, 'M', u'ɑ'), + (0x1D46, 'M', u'ᴂ'), + (0x1D47, 'M', u'b'), + (0x1D48, 'M', u'd'), + (0x1D49, 'M', u'e'), + (0x1D4A, 'M', u'ə'), + (0x1D4B, 'M', u'ɛ'), + (0x1D4C, 'M', u'ɜ'), + (0x1D4D, 'M', u'g'), + (0x1D4E, 'V'), + (0x1D4F, 'M', u'k'), + (0x1D50, 'M', u'm'), + (0x1D51, 'M', u'ŋ'), + (0x1D52, 'M', u'o'), + (0x1D53, 'M', u'ɔ'), + (0x1D54, 'M', u'ᴖ'), + (0x1D55, 'M', u'ᴗ'), + (0x1D56, 'M', u'p'), + (0x1D57, 'M', u't'), + (0x1D58, 'M', u'u'), + (0x1D59, 'M', u'ᴝ'), + (0x1D5A, 'M', u'ɯ'), + (0x1D5B, 'M', u'v'), + (0x1D5C, 'M', u'ᴥ'), + (0x1D5D, 'M', u'β'), + (0x1D5E, 'M', u'γ'), + (0x1D5F, 'M', u'δ'), + (0x1D60, 'M', u'φ'), + (0x1D61, 'M', u'χ'), + (0x1D62, 'M', u'i'), + (0x1D63, 'M', u'r'), + (0x1D64, 'M', u'u'), + (0x1D65, 'M', u'v'), + (0x1D66, 'M', u'β'), + (0x1D67, 'M', u'γ'), + (0x1D68, 'M', u'ρ'), + (0x1D69, 'M', u'φ'), + (0x1D6A, 'M', u'χ'), + (0x1D6B, 'V'), + (0x1D78, 'M', u'н'), + (0x1D79, 'V'), + (0x1D9B, 'M', u'ɒ'), + (0x1D9C, 'M', u'c'), + (0x1D9D, 'M', u'ɕ'), + (0x1D9E, 'M', u'ð'), + ] + +def _seg_16(): + return [ + (0x1D9F, 'M', u'ɜ'), + (0x1DA0, 'M', u'f'), + (0x1DA1, 'M', u'ɟ'), + (0x1DA2, 'M', u'ɡ'), + (0x1DA3, 'M', u'ɥ'), + (0x1DA4, 'M', u'ɨ'), + (0x1DA5, 'M', u'ɩ'), + (0x1DA6, 'M', u'ɪ'), + (0x1DA7, 'M', u'ᵻ'), + (0x1DA8, 'M', u'ʝ'), + (0x1DA9, 'M', u'ɭ'), + (0x1DAA, 'M', u'ᶅ'), + (0x1DAB, 'M', u'ʟ'), + (0x1DAC, 'M', u'ɱ'), + (0x1DAD, 'M', u'ɰ'), + (0x1DAE, 'M', u'ɲ'), + (0x1DAF, 'M', u'ɳ'), + (0x1DB0, 'M', u'ɴ'), + (0x1DB1, 'M', u'ɵ'), + (0x1DB2, 'M', u'ɸ'), + (0x1DB3, 'M', u'ʂ'), + (0x1DB4, 'M', u'ʃ'), + (0x1DB5, 'M', u'ƫ'), + (0x1DB6, 'M', u'ʉ'), + (0x1DB7, 'M', u'ʊ'), + (0x1DB8, 'M', u'ᴜ'), + (0x1DB9, 'M', u'ʋ'), + (0x1DBA, 'M', u'ʌ'), + (0x1DBB, 'M', u'z'), + (0x1DBC, 'M', u'ʐ'), + (0x1DBD, 'M', u'ʑ'), + (0x1DBE, 'M', u'ʒ'), + (0x1DBF, 'M', u'θ'), + (0x1DC0, 'V'), + (0x1DFA, 'X'), + (0x1DFB, 'V'), + (0x1E00, 'M', u'ḁ'), + (0x1E01, 'V'), + (0x1E02, 'M', u'ḃ'), + (0x1E03, 'V'), + (0x1E04, 'M', u'ḅ'), + (0x1E05, 'V'), + (0x1E06, 'M', u'ḇ'), + (0x1E07, 'V'), + (0x1E08, 'M', u'ḉ'), + (0x1E09, 'V'), + (0x1E0A, 'M', u'ḋ'), + (0x1E0B, 'V'), + (0x1E0C, 'M', u'ḍ'), + (0x1E0D, 'V'), + (0x1E0E, 'M', u'ḏ'), + (0x1E0F, 'V'), + (0x1E10, 'M', u'ḑ'), + (0x1E11, 'V'), + (0x1E12, 'M', u'ḓ'), + (0x1E13, 'V'), + (0x1E14, 'M', u'ḕ'), + (0x1E15, 'V'), + (0x1E16, 'M', u'ḗ'), + (0x1E17, 'V'), + (0x1E18, 'M', u'ḙ'), + (0x1E19, 'V'), + (0x1E1A, 'M', u'ḛ'), + (0x1E1B, 'V'), + (0x1E1C, 'M', u'ḝ'), + (0x1E1D, 'V'), + (0x1E1E, 'M', u'ḟ'), + (0x1E1F, 'V'), + (0x1E20, 'M', u'ḡ'), + (0x1E21, 'V'), + (0x1E22, 'M', u'ḣ'), + (0x1E23, 'V'), + (0x1E24, 'M', u'ḥ'), + (0x1E25, 'V'), + (0x1E26, 'M', u'ḧ'), + (0x1E27, 'V'), + (0x1E28, 'M', u'ḩ'), + (0x1E29, 'V'), + (0x1E2A, 'M', u'ḫ'), + (0x1E2B, 'V'), + (0x1E2C, 'M', u'ḭ'), + (0x1E2D, 'V'), + (0x1E2E, 'M', u'ḯ'), + (0x1E2F, 'V'), + (0x1E30, 'M', u'ḱ'), + (0x1E31, 'V'), + (0x1E32, 'M', u'ḳ'), + (0x1E33, 'V'), + (0x1E34, 'M', u'ḵ'), + (0x1E35, 'V'), + (0x1E36, 'M', u'ḷ'), + (0x1E37, 'V'), + (0x1E38, 'M', u'ḹ'), + (0x1E39, 'V'), + (0x1E3A, 'M', u'ḻ'), + (0x1E3B, 'V'), + (0x1E3C, 'M', u'ḽ'), + (0x1E3D, 'V'), + (0x1E3E, 'M', u'ḿ'), + (0x1E3F, 'V'), + ] + +def _seg_17(): + return [ + (0x1E40, 'M', u'ṁ'), + (0x1E41, 'V'), + (0x1E42, 'M', u'ṃ'), + (0x1E43, 'V'), + (0x1E44, 'M', u'ṅ'), + (0x1E45, 'V'), + (0x1E46, 'M', u'ṇ'), + (0x1E47, 'V'), + (0x1E48, 'M', u'ṉ'), + (0x1E49, 'V'), + (0x1E4A, 'M', u'ṋ'), + (0x1E4B, 'V'), + (0x1E4C, 'M', u'ṍ'), + (0x1E4D, 'V'), + (0x1E4E, 'M', u'ṏ'), + (0x1E4F, 'V'), + (0x1E50, 'M', u'ṑ'), + (0x1E51, 'V'), + (0x1E52, 'M', u'ṓ'), + (0x1E53, 'V'), + (0x1E54, 'M', u'ṕ'), + (0x1E55, 'V'), + (0x1E56, 'M', u'ṗ'), + (0x1E57, 'V'), + (0x1E58, 'M', u'ṙ'), + (0x1E59, 'V'), + (0x1E5A, 'M', u'ṛ'), + (0x1E5B, 'V'), + (0x1E5C, 'M', u'ṝ'), + (0x1E5D, 'V'), + (0x1E5E, 'M', u'ṟ'), + (0x1E5F, 'V'), + (0x1E60, 'M', u'ṡ'), + (0x1E61, 'V'), + (0x1E62, 'M', u'ṣ'), + (0x1E63, 'V'), + (0x1E64, 'M', u'ṥ'), + (0x1E65, 'V'), + (0x1E66, 'M', u'ṧ'), + (0x1E67, 'V'), + (0x1E68, 'M', u'ṩ'), + (0x1E69, 'V'), + (0x1E6A, 'M', u'ṫ'), + (0x1E6B, 'V'), + (0x1E6C, 'M', u'ṭ'), + (0x1E6D, 'V'), + (0x1E6E, 'M', u'ṯ'), + (0x1E6F, 'V'), + (0x1E70, 'M', u'ṱ'), + (0x1E71, 'V'), + (0x1E72, 'M', u'ṳ'), + (0x1E73, 'V'), + (0x1E74, 'M', u'ṵ'), + (0x1E75, 'V'), + (0x1E76, 'M', u'ṷ'), + (0x1E77, 'V'), + (0x1E78, 'M', u'ṹ'), + (0x1E79, 'V'), + (0x1E7A, 'M', u'ṻ'), + (0x1E7B, 'V'), + (0x1E7C, 'M', u'ṽ'), + (0x1E7D, 'V'), + (0x1E7E, 'M', u'ṿ'), + (0x1E7F, 'V'), + (0x1E80, 'M', u'ẁ'), + (0x1E81, 'V'), + (0x1E82, 'M', u'ẃ'), + (0x1E83, 'V'), + (0x1E84, 'M', u'ẅ'), + (0x1E85, 'V'), + (0x1E86, 'M', u'ẇ'), + (0x1E87, 'V'), + (0x1E88, 'M', u'ẉ'), + (0x1E89, 'V'), + (0x1E8A, 'M', u'ẋ'), + (0x1E8B, 'V'), + (0x1E8C, 'M', u'ẍ'), + (0x1E8D, 'V'), + (0x1E8E, 'M', u'ẏ'), + (0x1E8F, 'V'), + (0x1E90, 'M', u'ẑ'), + (0x1E91, 'V'), + (0x1E92, 'M', u'ẓ'), + (0x1E93, 'V'), + (0x1E94, 'M', u'ẕ'), + (0x1E95, 'V'), + (0x1E9A, 'M', u'aʾ'), + (0x1E9B, 'M', u'ṡ'), + (0x1E9C, 'V'), + (0x1E9E, 'M', u'ss'), + (0x1E9F, 'V'), + (0x1EA0, 'M', u'ạ'), + (0x1EA1, 'V'), + (0x1EA2, 'M', u'ả'), + (0x1EA3, 'V'), + (0x1EA4, 'M', u'ấ'), + (0x1EA5, 'V'), + (0x1EA6, 'M', u'ầ'), + (0x1EA7, 'V'), + (0x1EA8, 'M', u'ẩ'), + ] + +def _seg_18(): + return [ + (0x1EA9, 'V'), + (0x1EAA, 'M', u'ẫ'), + (0x1EAB, 'V'), + (0x1EAC, 'M', u'ậ'), + (0x1EAD, 'V'), + (0x1EAE, 'M', u'ắ'), + (0x1EAF, 'V'), + (0x1EB0, 'M', u'ằ'), + (0x1EB1, 'V'), + (0x1EB2, 'M', u'ẳ'), + (0x1EB3, 'V'), + (0x1EB4, 'M', u'ẵ'), + (0x1EB5, 'V'), + (0x1EB6, 'M', u'ặ'), + (0x1EB7, 'V'), + (0x1EB8, 'M', u'ẹ'), + (0x1EB9, 'V'), + (0x1EBA, 'M', u'ẻ'), + (0x1EBB, 'V'), + (0x1EBC, 'M', u'ẽ'), + (0x1EBD, 'V'), + (0x1EBE, 'M', u'ế'), + (0x1EBF, 'V'), + (0x1EC0, 'M', u'ề'), + (0x1EC1, 'V'), + (0x1EC2, 'M', u'ể'), + (0x1EC3, 'V'), + (0x1EC4, 'M', u'ễ'), + (0x1EC5, 'V'), + (0x1EC6, 'M', u'ệ'), + (0x1EC7, 'V'), + (0x1EC8, 'M', u'ỉ'), + (0x1EC9, 'V'), + (0x1ECA, 'M', u'ị'), + (0x1ECB, 'V'), + (0x1ECC, 'M', u'ọ'), + (0x1ECD, 'V'), + (0x1ECE, 'M', u'ỏ'), + (0x1ECF, 'V'), + (0x1ED0, 'M', u'ố'), + (0x1ED1, 'V'), + (0x1ED2, 'M', u'ồ'), + (0x1ED3, 'V'), + (0x1ED4, 'M', u'ổ'), + (0x1ED5, 'V'), + (0x1ED6, 'M', u'ỗ'), + (0x1ED7, 'V'), + (0x1ED8, 'M', u'ộ'), + (0x1ED9, 'V'), + (0x1EDA, 'M', u'ớ'), + (0x1EDB, 'V'), + (0x1EDC, 'M', u'ờ'), + (0x1EDD, 'V'), + (0x1EDE, 'M', u'ở'), + (0x1EDF, 'V'), + (0x1EE0, 'M', u'ỡ'), + (0x1EE1, 'V'), + (0x1EE2, 'M', u'ợ'), + (0x1EE3, 'V'), + (0x1EE4, 'M', u'ụ'), + (0x1EE5, 'V'), + (0x1EE6, 'M', u'ủ'), + (0x1EE7, 'V'), + (0x1EE8, 'M', u'ứ'), + (0x1EE9, 'V'), + (0x1EEA, 'M', u'ừ'), + (0x1EEB, 'V'), + (0x1EEC, 'M', u'ử'), + (0x1EED, 'V'), + (0x1EEE, 'M', u'ữ'), + (0x1EEF, 'V'), + (0x1EF0, 'M', u'ự'), + (0x1EF1, 'V'), + (0x1EF2, 'M', u'ỳ'), + (0x1EF3, 'V'), + (0x1EF4, 'M', u'ỵ'), + (0x1EF5, 'V'), + (0x1EF6, 'M', u'ỷ'), + (0x1EF7, 'V'), + (0x1EF8, 'M', u'ỹ'), + (0x1EF9, 'V'), + (0x1EFA, 'M', u'ỻ'), + (0x1EFB, 'V'), + (0x1EFC, 'M', u'ỽ'), + (0x1EFD, 'V'), + (0x1EFE, 'M', u'ỿ'), + (0x1EFF, 'V'), + (0x1F08, 'M', u'ἀ'), + (0x1F09, 'M', u'ἁ'), + (0x1F0A, 'M', u'ἂ'), + (0x1F0B, 'M', u'ἃ'), + (0x1F0C, 'M', u'ἄ'), + (0x1F0D, 'M', u'ἅ'), + (0x1F0E, 'M', u'ἆ'), + (0x1F0F, 'M', u'ἇ'), + (0x1F10, 'V'), + (0x1F16, 'X'), + (0x1F18, 'M', u'ἐ'), + (0x1F19, 'M', u'ἑ'), + (0x1F1A, 'M', u'ἒ'), + ] + +def _seg_19(): + return [ + (0x1F1B, 'M', u'ἓ'), + (0x1F1C, 'M', u'ἔ'), + (0x1F1D, 'M', u'ἕ'), + (0x1F1E, 'X'), + (0x1F20, 'V'), + (0x1F28, 'M', u'ἠ'), + (0x1F29, 'M', u'ἡ'), + (0x1F2A, 'M', u'ἢ'), + (0x1F2B, 'M', u'ἣ'), + (0x1F2C, 'M', u'ἤ'), + (0x1F2D, 'M', u'ἥ'), + (0x1F2E, 'M', u'ἦ'), + (0x1F2F, 'M', u'ἧ'), + (0x1F30, 'V'), + (0x1F38, 'M', u'ἰ'), + (0x1F39, 'M', u'ἱ'), + (0x1F3A, 'M', u'ἲ'), + (0x1F3B, 'M', u'ἳ'), + (0x1F3C, 'M', u'ἴ'), + (0x1F3D, 'M', u'ἵ'), + (0x1F3E, 'M', u'ἶ'), + (0x1F3F, 'M', u'ἷ'), + (0x1F40, 'V'), + (0x1F46, 'X'), + (0x1F48, 'M', u'ὀ'), + (0x1F49, 'M', u'ὁ'), + (0x1F4A, 'M', u'ὂ'), + (0x1F4B, 'M', u'ὃ'), + (0x1F4C, 'M', u'ὄ'), + (0x1F4D, 'M', u'ὅ'), + (0x1F4E, 'X'), + (0x1F50, 'V'), + (0x1F58, 'X'), + (0x1F59, 'M', u'ὑ'), + (0x1F5A, 'X'), + (0x1F5B, 'M', u'ὓ'), + (0x1F5C, 'X'), + (0x1F5D, 'M', u'ὕ'), + (0x1F5E, 'X'), + (0x1F5F, 'M', u'ὗ'), + (0x1F60, 'V'), + (0x1F68, 'M', u'ὠ'), + (0x1F69, 'M', u'ὡ'), + (0x1F6A, 'M', u'ὢ'), + (0x1F6B, 'M', u'ὣ'), + (0x1F6C, 'M', u'ὤ'), + (0x1F6D, 'M', u'ὥ'), + (0x1F6E, 'M', u'ὦ'), + (0x1F6F, 'M', u'ὧ'), + (0x1F70, 'V'), + (0x1F71, 'M', u'ά'), + (0x1F72, 'V'), + (0x1F73, 'M', u'έ'), + (0x1F74, 'V'), + (0x1F75, 'M', u'ή'), + (0x1F76, 'V'), + (0x1F77, 'M', u'ί'), + (0x1F78, 'V'), + (0x1F79, 'M', u'ό'), + (0x1F7A, 'V'), + (0x1F7B, 'M', u'ύ'), + (0x1F7C, 'V'), + (0x1F7D, 'M', u'ώ'), + (0x1F7E, 'X'), + (0x1F80, 'M', u'ἀι'), + (0x1F81, 'M', u'ἁι'), + (0x1F82, 'M', u'ἂι'), + (0x1F83, 'M', u'ἃι'), + (0x1F84, 'M', u'ἄι'), + (0x1F85, 'M', u'ἅι'), + (0x1F86, 'M', u'ἆι'), + (0x1F87, 'M', u'ἇι'), + (0x1F88, 'M', u'ἀι'), + (0x1F89, 'M', u'ἁι'), + (0x1F8A, 'M', u'ἂι'), + (0x1F8B, 'M', u'ἃι'), + (0x1F8C, 'M', u'ἄι'), + (0x1F8D, 'M', u'ἅι'), + (0x1F8E, 'M', u'ἆι'), + (0x1F8F, 'M', u'ἇι'), + (0x1F90, 'M', u'ἠι'), + (0x1F91, 'M', u'ἡι'), + (0x1F92, 'M', u'ἢι'), + (0x1F93, 'M', u'ἣι'), + (0x1F94, 'M', u'ἤι'), + (0x1F95, 'M', u'ἥι'), + (0x1F96, 'M', u'ἦι'), + (0x1F97, 'M', u'ἧι'), + (0x1F98, 'M', u'ἠι'), + (0x1F99, 'M', u'ἡι'), + (0x1F9A, 'M', u'ἢι'), + (0x1F9B, 'M', u'ἣι'), + (0x1F9C, 'M', u'ἤι'), + (0x1F9D, 'M', u'ἥι'), + (0x1F9E, 'M', u'ἦι'), + (0x1F9F, 'M', u'ἧι'), + (0x1FA0, 'M', u'ὠι'), + (0x1FA1, 'M', u'ὡι'), + (0x1FA2, 'M', u'ὢι'), + (0x1FA3, 'M', u'ὣι'), + ] + +def _seg_20(): + return [ + (0x1FA4, 'M', u'ὤι'), + (0x1FA5, 'M', u'ὥι'), + (0x1FA6, 'M', u'ὦι'), + (0x1FA7, 'M', u'ὧι'), + (0x1FA8, 'M', u'ὠι'), + (0x1FA9, 'M', u'ὡι'), + (0x1FAA, 'M', u'ὢι'), + (0x1FAB, 'M', u'ὣι'), + (0x1FAC, 'M', u'ὤι'), + (0x1FAD, 'M', u'ὥι'), + (0x1FAE, 'M', u'ὦι'), + (0x1FAF, 'M', u'ὧι'), + (0x1FB0, 'V'), + (0x1FB2, 'M', u'ὰι'), + (0x1FB3, 'M', u'αι'), + (0x1FB4, 'M', u'άι'), + (0x1FB5, 'X'), + (0x1FB6, 'V'), + (0x1FB7, 'M', u'ᾶι'), + (0x1FB8, 'M', u'ᾰ'), + (0x1FB9, 'M', u'ᾱ'), + (0x1FBA, 'M', u'ὰ'), + (0x1FBB, 'M', u'ά'), + (0x1FBC, 'M', u'αι'), + (0x1FBD, '3', u' ̓'), + (0x1FBE, 'M', u'ι'), + (0x1FBF, '3', u' ̓'), + (0x1FC0, '3', u' ͂'), + (0x1FC1, '3', u' ̈͂'), + (0x1FC2, 'M', u'ὴι'), + (0x1FC3, 'M', u'ηι'), + (0x1FC4, 'M', u'ήι'), + (0x1FC5, 'X'), + (0x1FC6, 'V'), + (0x1FC7, 'M', u'ῆι'), + (0x1FC8, 'M', u'ὲ'), + (0x1FC9, 'M', u'έ'), + (0x1FCA, 'M', u'ὴ'), + (0x1FCB, 'M', u'ή'), + (0x1FCC, 'M', u'ηι'), + (0x1FCD, '3', u' ̓̀'), + (0x1FCE, '3', u' ̓́'), + (0x1FCF, '3', u' ̓͂'), + (0x1FD0, 'V'), + (0x1FD3, 'M', u'ΐ'), + (0x1FD4, 'X'), + (0x1FD6, 'V'), + (0x1FD8, 'M', u'ῐ'), + (0x1FD9, 'M', u'ῑ'), + (0x1FDA, 'M', u'ὶ'), + (0x1FDB, 'M', u'ί'), + (0x1FDC, 'X'), + (0x1FDD, '3', u' ̔̀'), + (0x1FDE, '3', u' ̔́'), + (0x1FDF, '3', u' ̔͂'), + (0x1FE0, 'V'), + (0x1FE3, 'M', u'ΰ'), + (0x1FE4, 'V'), + (0x1FE8, 'M', u'ῠ'), + (0x1FE9, 'M', u'ῡ'), + (0x1FEA, 'M', u'ὺ'), + (0x1FEB, 'M', u'ύ'), + (0x1FEC, 'M', u'ῥ'), + (0x1FED, '3', u' ̈̀'), + (0x1FEE, '3', u' ̈́'), + (0x1FEF, '3', u'`'), + (0x1FF0, 'X'), + (0x1FF2, 'M', u'ὼι'), + (0x1FF3, 'M', u'ωι'), + (0x1FF4, 'M', u'ώι'), + (0x1FF5, 'X'), + (0x1FF6, 'V'), + (0x1FF7, 'M', u'ῶι'), + (0x1FF8, 'M', u'ὸ'), + (0x1FF9, 'M', u'ό'), + (0x1FFA, 'M', u'ὼ'), + (0x1FFB, 'M', u'ώ'), + (0x1FFC, 'M', u'ωι'), + (0x1FFD, '3', u' ́'), + (0x1FFE, '3', u' ̔'), + (0x1FFF, 'X'), + (0x2000, '3', u' '), + (0x200B, 'I'), + (0x200C, 'D', u''), + (0x200E, 'X'), + (0x2010, 'V'), + (0x2011, 'M', u'‐'), + (0x2012, 'V'), + (0x2017, '3', u' ̳'), + (0x2018, 'V'), + (0x2024, 'X'), + (0x2027, 'V'), + (0x2028, 'X'), + (0x202F, '3', u' '), + (0x2030, 'V'), + (0x2033, 'M', u'′′'), + (0x2034, 'M', u'′′′'), + (0x2035, 'V'), + (0x2036, 'M', u'‵‵'), + (0x2037, 'M', u'‵‵‵'), + ] + +def _seg_21(): + return [ + (0x2038, 'V'), + (0x203C, '3', u'!!'), + (0x203D, 'V'), + (0x203E, '3', u' ̅'), + (0x203F, 'V'), + (0x2047, '3', u'??'), + (0x2048, '3', u'?!'), + (0x2049, '3', u'!?'), + (0x204A, 'V'), + (0x2057, 'M', u'′′′′'), + (0x2058, 'V'), + (0x205F, '3', u' '), + (0x2060, 'I'), + (0x2061, 'X'), + (0x2064, 'I'), + (0x2065, 'X'), + (0x2070, 'M', u'0'), + (0x2071, 'M', u'i'), + (0x2072, 'X'), + (0x2074, 'M', u'4'), + (0x2075, 'M', u'5'), + (0x2076, 'M', u'6'), + (0x2077, 'M', u'7'), + (0x2078, 'M', u'8'), + (0x2079, 'M', u'9'), + (0x207A, '3', u'+'), + (0x207B, 'M', u'−'), + (0x207C, '3', u'='), + (0x207D, '3', u'('), + (0x207E, '3', u')'), + (0x207F, 'M', u'n'), + (0x2080, 'M', u'0'), + (0x2081, 'M', u'1'), + (0x2082, 'M', u'2'), + (0x2083, 'M', u'3'), + (0x2084, 'M', u'4'), + (0x2085, 'M', u'5'), + (0x2086, 'M', u'6'), + (0x2087, 'M', u'7'), + (0x2088, 'M', u'8'), + (0x2089, 'M', u'9'), + (0x208A, '3', u'+'), + (0x208B, 'M', u'−'), + (0x208C, '3', u'='), + (0x208D, '3', u'('), + (0x208E, '3', u')'), + (0x208F, 'X'), + (0x2090, 'M', u'a'), + (0x2091, 'M', u'e'), + (0x2092, 'M', u'o'), + (0x2093, 'M', u'x'), + (0x2094, 'M', u'ə'), + (0x2095, 'M', u'h'), + (0x2096, 'M', u'k'), + (0x2097, 'M', u'l'), + (0x2098, 'M', u'm'), + (0x2099, 'M', u'n'), + (0x209A, 'M', u'p'), + (0x209B, 'M', u's'), + (0x209C, 'M', u't'), + (0x209D, 'X'), + (0x20A0, 'V'), + (0x20A8, 'M', u'rs'), + (0x20A9, 'V'), + (0x20C0, 'X'), + (0x20D0, 'V'), + (0x20F1, 'X'), + (0x2100, '3', u'a/c'), + (0x2101, '3', u'a/s'), + (0x2102, 'M', u'c'), + (0x2103, 'M', u'°c'), + (0x2104, 'V'), + (0x2105, '3', u'c/o'), + (0x2106, '3', u'c/u'), + (0x2107, 'M', u'ɛ'), + (0x2108, 'V'), + (0x2109, 'M', u'°f'), + (0x210A, 'M', u'g'), + (0x210B, 'M', u'h'), + (0x210F, 'M', u'ħ'), + (0x2110, 'M', u'i'), + (0x2112, 'M', u'l'), + (0x2114, 'V'), + (0x2115, 'M', u'n'), + (0x2116, 'M', u'no'), + (0x2117, 'V'), + (0x2119, 'M', u'p'), + (0x211A, 'M', u'q'), + (0x211B, 'M', u'r'), + (0x211E, 'V'), + (0x2120, 'M', u'sm'), + (0x2121, 'M', u'tel'), + (0x2122, 'M', u'tm'), + (0x2123, 'V'), + (0x2124, 'M', u'z'), + (0x2125, 'V'), + (0x2126, 'M', u'ω'), + (0x2127, 'V'), + (0x2128, 'M', u'z'), + (0x2129, 'V'), + ] + +def _seg_22(): + return [ + (0x212A, 'M', u'k'), + (0x212B, 'M', u'å'), + (0x212C, 'M', u'b'), + (0x212D, 'M', u'c'), + (0x212E, 'V'), + (0x212F, 'M', u'e'), + (0x2131, 'M', u'f'), + (0x2132, 'X'), + (0x2133, 'M', u'm'), + (0x2134, 'M', u'o'), + (0x2135, 'M', u'א'), + (0x2136, 'M', u'ב'), + (0x2137, 'M', u'ג'), + (0x2138, 'M', u'ד'), + (0x2139, 'M', u'i'), + (0x213A, 'V'), + (0x213B, 'M', u'fax'), + (0x213C, 'M', u'π'), + (0x213D, 'M', u'γ'), + (0x213F, 'M', u'π'), + (0x2140, 'M', u'∑'), + (0x2141, 'V'), + (0x2145, 'M', u'd'), + (0x2147, 'M', u'e'), + (0x2148, 'M', u'i'), + (0x2149, 'M', u'j'), + (0x214A, 'V'), + (0x2150, 'M', u'1⁄7'), + (0x2151, 'M', u'1⁄9'), + (0x2152, 'M', u'1⁄10'), + (0x2153, 'M', u'1⁄3'), + (0x2154, 'M', u'2⁄3'), + (0x2155, 'M', u'1⁄5'), + (0x2156, 'M', u'2⁄5'), + (0x2157, 'M', u'3⁄5'), + (0x2158, 'M', u'4⁄5'), + (0x2159, 'M', u'1⁄6'), + (0x215A, 'M', u'5⁄6'), + (0x215B, 'M', u'1⁄8'), + (0x215C, 'M', u'3⁄8'), + (0x215D, 'M', u'5⁄8'), + (0x215E, 'M', u'7⁄8'), + (0x215F, 'M', u'1⁄'), + (0x2160, 'M', u'i'), + (0x2161, 'M', u'ii'), + (0x2162, 'M', u'iii'), + (0x2163, 'M', u'iv'), + (0x2164, 'M', u'v'), + (0x2165, 'M', u'vi'), + (0x2166, 'M', u'vii'), + (0x2167, 'M', u'viii'), + (0x2168, 'M', u'ix'), + (0x2169, 'M', u'x'), + (0x216A, 'M', u'xi'), + (0x216B, 'M', u'xii'), + (0x216C, 'M', u'l'), + (0x216D, 'M', u'c'), + (0x216E, 'M', u'd'), + (0x216F, 'M', u'm'), + (0x2170, 'M', u'i'), + (0x2171, 'M', u'ii'), + (0x2172, 'M', u'iii'), + (0x2173, 'M', u'iv'), + (0x2174, 'M', u'v'), + (0x2175, 'M', u'vi'), + (0x2176, 'M', u'vii'), + (0x2177, 'M', u'viii'), + (0x2178, 'M', u'ix'), + (0x2179, 'M', u'x'), + (0x217A, 'M', u'xi'), + (0x217B, 'M', u'xii'), + (0x217C, 'M', u'l'), + (0x217D, 'M', u'c'), + (0x217E, 'M', u'd'), + (0x217F, 'M', u'm'), + (0x2180, 'V'), + (0x2183, 'X'), + (0x2184, 'V'), + (0x2189, 'M', u'0⁄3'), + (0x218A, 'V'), + (0x218C, 'X'), + (0x2190, 'V'), + (0x222C, 'M', u'∫∫'), + (0x222D, 'M', u'∫∫∫'), + (0x222E, 'V'), + (0x222F, 'M', u'∮∮'), + (0x2230, 'M', u'∮∮∮'), + (0x2231, 'V'), + (0x2260, '3'), + (0x2261, 'V'), + (0x226E, '3'), + (0x2270, 'V'), + (0x2329, 'M', u'〈'), + (0x232A, 'M', u'〉'), + (0x232B, 'V'), + (0x2427, 'X'), + (0x2440, 'V'), + (0x244B, 'X'), + (0x2460, 'M', u'1'), + (0x2461, 'M', u'2'), + ] + +def _seg_23(): + return [ + (0x2462, 'M', u'3'), + (0x2463, 'M', u'4'), + (0x2464, 'M', u'5'), + (0x2465, 'M', u'6'), + (0x2466, 'M', u'7'), + (0x2467, 'M', u'8'), + (0x2468, 'M', u'9'), + (0x2469, 'M', u'10'), + (0x246A, 'M', u'11'), + (0x246B, 'M', u'12'), + (0x246C, 'M', u'13'), + (0x246D, 'M', u'14'), + (0x246E, 'M', u'15'), + (0x246F, 'M', u'16'), + (0x2470, 'M', u'17'), + (0x2471, 'M', u'18'), + (0x2472, 'M', u'19'), + (0x2473, 'M', u'20'), + (0x2474, '3', u'(1)'), + (0x2475, '3', u'(2)'), + (0x2476, '3', u'(3)'), + (0x2477, '3', u'(4)'), + (0x2478, '3', u'(5)'), + (0x2479, '3', u'(6)'), + (0x247A, '3', u'(7)'), + (0x247B, '3', u'(8)'), + (0x247C, '3', u'(9)'), + (0x247D, '3', u'(10)'), + (0x247E, '3', u'(11)'), + (0x247F, '3', u'(12)'), + (0x2480, '3', u'(13)'), + (0x2481, '3', u'(14)'), + (0x2482, '3', u'(15)'), + (0x2483, '3', u'(16)'), + (0x2484, '3', u'(17)'), + (0x2485, '3', u'(18)'), + (0x2486, '3', u'(19)'), + (0x2487, '3', u'(20)'), + (0x2488, 'X'), + (0x249C, '3', u'(a)'), + (0x249D, '3', u'(b)'), + (0x249E, '3', u'(c)'), + (0x249F, '3', u'(d)'), + (0x24A0, '3', u'(e)'), + (0x24A1, '3', u'(f)'), + (0x24A2, '3', u'(g)'), + (0x24A3, '3', u'(h)'), + (0x24A4, '3', u'(i)'), + (0x24A5, '3', u'(j)'), + (0x24A6, '3', u'(k)'), + (0x24A7, '3', u'(l)'), + (0x24A8, '3', u'(m)'), + (0x24A9, '3', u'(n)'), + (0x24AA, '3', u'(o)'), + (0x24AB, '3', u'(p)'), + (0x24AC, '3', u'(q)'), + (0x24AD, '3', u'(r)'), + (0x24AE, '3', u'(s)'), + (0x24AF, '3', u'(t)'), + (0x24B0, '3', u'(u)'), + (0x24B1, '3', u'(v)'), + (0x24B2, '3', u'(w)'), + (0x24B3, '3', u'(x)'), + (0x24B4, '3', u'(y)'), + (0x24B5, '3', u'(z)'), + (0x24B6, 'M', u'a'), + (0x24B7, 'M', u'b'), + (0x24B8, 'M', u'c'), + (0x24B9, 'M', u'd'), + (0x24BA, 'M', u'e'), + (0x24BB, 'M', u'f'), + (0x24BC, 'M', u'g'), + (0x24BD, 'M', u'h'), + (0x24BE, 'M', u'i'), + (0x24BF, 'M', u'j'), + (0x24C0, 'M', u'k'), + (0x24C1, 'M', u'l'), + (0x24C2, 'M', u'm'), + (0x24C3, 'M', u'n'), + (0x24C4, 'M', u'o'), + (0x24C5, 'M', u'p'), + (0x24C6, 'M', u'q'), + (0x24C7, 'M', u'r'), + (0x24C8, 'M', u's'), + (0x24C9, 'M', u't'), + (0x24CA, 'M', u'u'), + (0x24CB, 'M', u'v'), + (0x24CC, 'M', u'w'), + (0x24CD, 'M', u'x'), + (0x24CE, 'M', u'y'), + (0x24CF, 'M', u'z'), + (0x24D0, 'M', u'a'), + (0x24D1, 'M', u'b'), + (0x24D2, 'M', u'c'), + (0x24D3, 'M', u'd'), + (0x24D4, 'M', u'e'), + (0x24D5, 'M', u'f'), + (0x24D6, 'M', u'g'), + (0x24D7, 'M', u'h'), + (0x24D8, 'M', u'i'), + ] + +def _seg_24(): + return [ + (0x24D9, 'M', u'j'), + (0x24DA, 'M', u'k'), + (0x24DB, 'M', u'l'), + (0x24DC, 'M', u'm'), + (0x24DD, 'M', u'n'), + (0x24DE, 'M', u'o'), + (0x24DF, 'M', u'p'), + (0x24E0, 'M', u'q'), + (0x24E1, 'M', u'r'), + (0x24E2, 'M', u's'), + (0x24E3, 'M', u't'), + (0x24E4, 'M', u'u'), + (0x24E5, 'M', u'v'), + (0x24E6, 'M', u'w'), + (0x24E7, 'M', u'x'), + (0x24E8, 'M', u'y'), + (0x24E9, 'M', u'z'), + (0x24EA, 'M', u'0'), + (0x24EB, 'V'), + (0x2A0C, 'M', u'∫∫∫∫'), + (0x2A0D, 'V'), + (0x2A74, '3', u'::='), + (0x2A75, '3', u'=='), + (0x2A76, '3', u'==='), + (0x2A77, 'V'), + (0x2ADC, 'M', u'⫝̸'), + (0x2ADD, 'V'), + (0x2B74, 'X'), + (0x2B76, 'V'), + (0x2B96, 'X'), + (0x2B98, 'V'), + (0x2BC9, 'X'), + (0x2BCA, 'V'), + (0x2BFF, 'X'), + (0x2C00, 'M', u'ⰰ'), + (0x2C01, 'M', u'ⰱ'), + (0x2C02, 'M', u'ⰲ'), + (0x2C03, 'M', u'ⰳ'), + (0x2C04, 'M', u'ⰴ'), + (0x2C05, 'M', u'ⰵ'), + (0x2C06, 'M', u'ⰶ'), + (0x2C07, 'M', u'ⰷ'), + (0x2C08, 'M', u'ⰸ'), + (0x2C09, 'M', u'ⰹ'), + (0x2C0A, 'M', u'ⰺ'), + (0x2C0B, 'M', u'ⰻ'), + (0x2C0C, 'M', u'ⰼ'), + (0x2C0D, 'M', u'ⰽ'), + (0x2C0E, 'M', u'ⰾ'), + (0x2C0F, 'M', u'ⰿ'), + (0x2C10, 'M', u'ⱀ'), + (0x2C11, 'M', u'ⱁ'), + (0x2C12, 'M', u'ⱂ'), + (0x2C13, 'M', u'ⱃ'), + (0x2C14, 'M', u'ⱄ'), + (0x2C15, 'M', u'ⱅ'), + (0x2C16, 'M', u'ⱆ'), + (0x2C17, 'M', u'ⱇ'), + (0x2C18, 'M', u'ⱈ'), + (0x2C19, 'M', u'ⱉ'), + (0x2C1A, 'M', u'ⱊ'), + (0x2C1B, 'M', u'ⱋ'), + (0x2C1C, 'M', u'ⱌ'), + (0x2C1D, 'M', u'ⱍ'), + (0x2C1E, 'M', u'ⱎ'), + (0x2C1F, 'M', u'ⱏ'), + (0x2C20, 'M', u'ⱐ'), + (0x2C21, 'M', u'ⱑ'), + (0x2C22, 'M', u'ⱒ'), + (0x2C23, 'M', u'ⱓ'), + (0x2C24, 'M', u'ⱔ'), + (0x2C25, 'M', u'ⱕ'), + (0x2C26, 'M', u'ⱖ'), + (0x2C27, 'M', u'ⱗ'), + (0x2C28, 'M', u'ⱘ'), + (0x2C29, 'M', u'ⱙ'), + (0x2C2A, 'M', u'ⱚ'), + (0x2C2B, 'M', u'ⱛ'), + (0x2C2C, 'M', u'ⱜ'), + (0x2C2D, 'M', u'ⱝ'), + (0x2C2E, 'M', u'ⱞ'), + (0x2C2F, 'X'), + (0x2C30, 'V'), + (0x2C5F, 'X'), + (0x2C60, 'M', u'ⱡ'), + (0x2C61, 'V'), + (0x2C62, 'M', u'ɫ'), + (0x2C63, 'M', u'ᵽ'), + (0x2C64, 'M', u'ɽ'), + (0x2C65, 'V'), + (0x2C67, 'M', u'ⱨ'), + (0x2C68, 'V'), + (0x2C69, 'M', u'ⱪ'), + (0x2C6A, 'V'), + (0x2C6B, 'M', u'ⱬ'), + (0x2C6C, 'V'), + (0x2C6D, 'M', u'ɑ'), + (0x2C6E, 'M', u'ɱ'), + (0x2C6F, 'M', u'ɐ'), + (0x2C70, 'M', u'ɒ'), + ] + +def _seg_25(): + return [ + (0x2C71, 'V'), + (0x2C72, 'M', u'ⱳ'), + (0x2C73, 'V'), + (0x2C75, 'M', u'ⱶ'), + (0x2C76, 'V'), + (0x2C7C, 'M', u'j'), + (0x2C7D, 'M', u'v'), + (0x2C7E, 'M', u'ȿ'), + (0x2C7F, 'M', u'ɀ'), + (0x2C80, 'M', u'ⲁ'), + (0x2C81, 'V'), + (0x2C82, 'M', u'ⲃ'), + (0x2C83, 'V'), + (0x2C84, 'M', u'ⲅ'), + (0x2C85, 'V'), + (0x2C86, 'M', u'ⲇ'), + (0x2C87, 'V'), + (0x2C88, 'M', u'ⲉ'), + (0x2C89, 'V'), + (0x2C8A, 'M', u'ⲋ'), + (0x2C8B, 'V'), + (0x2C8C, 'M', u'ⲍ'), + (0x2C8D, 'V'), + (0x2C8E, 'M', u'ⲏ'), + (0x2C8F, 'V'), + (0x2C90, 'M', u'ⲑ'), + (0x2C91, 'V'), + (0x2C92, 'M', u'ⲓ'), + (0x2C93, 'V'), + (0x2C94, 'M', u'ⲕ'), + (0x2C95, 'V'), + (0x2C96, 'M', u'ⲗ'), + (0x2C97, 'V'), + (0x2C98, 'M', u'ⲙ'), + (0x2C99, 'V'), + (0x2C9A, 'M', u'ⲛ'), + (0x2C9B, 'V'), + (0x2C9C, 'M', u'ⲝ'), + (0x2C9D, 'V'), + (0x2C9E, 'M', u'ⲟ'), + (0x2C9F, 'V'), + (0x2CA0, 'M', u'ⲡ'), + (0x2CA1, 'V'), + (0x2CA2, 'M', u'ⲣ'), + (0x2CA3, 'V'), + (0x2CA4, 'M', u'ⲥ'), + (0x2CA5, 'V'), + (0x2CA6, 'M', u'ⲧ'), + (0x2CA7, 'V'), + (0x2CA8, 'M', u'ⲩ'), + (0x2CA9, 'V'), + (0x2CAA, 'M', u'ⲫ'), + (0x2CAB, 'V'), + (0x2CAC, 'M', u'ⲭ'), + (0x2CAD, 'V'), + (0x2CAE, 'M', u'ⲯ'), + (0x2CAF, 'V'), + (0x2CB0, 'M', u'ⲱ'), + (0x2CB1, 'V'), + (0x2CB2, 'M', u'ⲳ'), + (0x2CB3, 'V'), + (0x2CB4, 'M', u'ⲵ'), + (0x2CB5, 'V'), + (0x2CB6, 'M', u'ⲷ'), + (0x2CB7, 'V'), + (0x2CB8, 'M', u'ⲹ'), + (0x2CB9, 'V'), + (0x2CBA, 'M', u'ⲻ'), + (0x2CBB, 'V'), + (0x2CBC, 'M', u'ⲽ'), + (0x2CBD, 'V'), + (0x2CBE, 'M', u'ⲿ'), + (0x2CBF, 'V'), + (0x2CC0, 'M', u'ⳁ'), + (0x2CC1, 'V'), + (0x2CC2, 'M', u'ⳃ'), + (0x2CC3, 'V'), + (0x2CC4, 'M', u'ⳅ'), + (0x2CC5, 'V'), + (0x2CC6, 'M', u'ⳇ'), + (0x2CC7, 'V'), + (0x2CC8, 'M', u'ⳉ'), + (0x2CC9, 'V'), + (0x2CCA, 'M', u'ⳋ'), + (0x2CCB, 'V'), + (0x2CCC, 'M', u'ⳍ'), + (0x2CCD, 'V'), + (0x2CCE, 'M', u'ⳏ'), + (0x2CCF, 'V'), + (0x2CD0, 'M', u'ⳑ'), + (0x2CD1, 'V'), + (0x2CD2, 'M', u'ⳓ'), + (0x2CD3, 'V'), + (0x2CD4, 'M', u'ⳕ'), + (0x2CD5, 'V'), + (0x2CD6, 'M', u'ⳗ'), + (0x2CD7, 'V'), + (0x2CD8, 'M', u'ⳙ'), + (0x2CD9, 'V'), + (0x2CDA, 'M', u'ⳛ'), + ] + +def _seg_26(): + return [ + (0x2CDB, 'V'), + (0x2CDC, 'M', u'ⳝ'), + (0x2CDD, 'V'), + (0x2CDE, 'M', u'ⳟ'), + (0x2CDF, 'V'), + (0x2CE0, 'M', u'ⳡ'), + (0x2CE1, 'V'), + (0x2CE2, 'M', u'ⳣ'), + (0x2CE3, 'V'), + (0x2CEB, 'M', u'ⳬ'), + (0x2CEC, 'V'), + (0x2CED, 'M', u'ⳮ'), + (0x2CEE, 'V'), + (0x2CF2, 'M', u'ⳳ'), + (0x2CF3, 'V'), + (0x2CF4, 'X'), + (0x2CF9, 'V'), + (0x2D26, 'X'), + (0x2D27, 'V'), + (0x2D28, 'X'), + (0x2D2D, 'V'), + (0x2D2E, 'X'), + (0x2D30, 'V'), + (0x2D68, 'X'), + (0x2D6F, 'M', u'ⵡ'), + (0x2D70, 'V'), + (0x2D71, 'X'), + (0x2D7F, 'V'), + (0x2D97, 'X'), + (0x2DA0, 'V'), + (0x2DA7, 'X'), + (0x2DA8, 'V'), + (0x2DAF, 'X'), + (0x2DB0, 'V'), + (0x2DB7, 'X'), + (0x2DB8, 'V'), + (0x2DBF, 'X'), + (0x2DC0, 'V'), + (0x2DC7, 'X'), + (0x2DC8, 'V'), + (0x2DCF, 'X'), + (0x2DD0, 'V'), + (0x2DD7, 'X'), + (0x2DD8, 'V'), + (0x2DDF, 'X'), + (0x2DE0, 'V'), + (0x2E4F, 'X'), + (0x2E80, 'V'), + (0x2E9A, 'X'), + (0x2E9B, 'V'), + (0x2E9F, 'M', u'母'), + (0x2EA0, 'V'), + (0x2EF3, 'M', u'龟'), + (0x2EF4, 'X'), + (0x2F00, 'M', u'一'), + (0x2F01, 'M', u'丨'), + (0x2F02, 'M', u'丶'), + (0x2F03, 'M', u'丿'), + (0x2F04, 'M', u'乙'), + (0x2F05, 'M', u'亅'), + (0x2F06, 'M', u'二'), + (0x2F07, 'M', u'亠'), + (0x2F08, 'M', u'人'), + (0x2F09, 'M', u'儿'), + (0x2F0A, 'M', u'入'), + (0x2F0B, 'M', u'八'), + (0x2F0C, 'M', u'冂'), + (0x2F0D, 'M', u'冖'), + (0x2F0E, 'M', u'冫'), + (0x2F0F, 'M', u'几'), + (0x2F10, 'M', u'凵'), + (0x2F11, 'M', u'刀'), + (0x2F12, 'M', u'力'), + (0x2F13, 'M', u'勹'), + (0x2F14, 'M', u'匕'), + (0x2F15, 'M', u'匚'), + (0x2F16, 'M', u'匸'), + (0x2F17, 'M', u'十'), + (0x2F18, 'M', u'卜'), + (0x2F19, 'M', u'卩'), + (0x2F1A, 'M', u'厂'), + (0x2F1B, 'M', u'厶'), + (0x2F1C, 'M', u'又'), + (0x2F1D, 'M', u'口'), + (0x2F1E, 'M', u'囗'), + (0x2F1F, 'M', u'土'), + (0x2F20, 'M', u'士'), + (0x2F21, 'M', u'夂'), + (0x2F22, 'M', u'夊'), + (0x2F23, 'M', u'夕'), + (0x2F24, 'M', u'大'), + (0x2F25, 'M', u'女'), + (0x2F26, 'M', u'子'), + (0x2F27, 'M', u'宀'), + (0x2F28, 'M', u'寸'), + (0x2F29, 'M', u'小'), + (0x2F2A, 'M', u'尢'), + (0x2F2B, 'M', u'尸'), + (0x2F2C, 'M', u'屮'), + (0x2F2D, 'M', u'山'), + ] + +def _seg_27(): + return [ + (0x2F2E, 'M', u'巛'), + (0x2F2F, 'M', u'工'), + (0x2F30, 'M', u'己'), + (0x2F31, 'M', u'巾'), + (0x2F32, 'M', u'干'), + (0x2F33, 'M', u'幺'), + (0x2F34, 'M', u'广'), + (0x2F35, 'M', u'廴'), + (0x2F36, 'M', u'廾'), + (0x2F37, 'M', u'弋'), + (0x2F38, 'M', u'弓'), + (0x2F39, 'M', u'彐'), + (0x2F3A, 'M', u'彡'), + (0x2F3B, 'M', u'彳'), + (0x2F3C, 'M', u'心'), + (0x2F3D, 'M', u'戈'), + (0x2F3E, 'M', u'戶'), + (0x2F3F, 'M', u'手'), + (0x2F40, 'M', u'支'), + (0x2F41, 'M', u'攴'), + (0x2F42, 'M', u'文'), + (0x2F43, 'M', u'斗'), + (0x2F44, 'M', u'斤'), + (0x2F45, 'M', u'方'), + (0x2F46, 'M', u'无'), + (0x2F47, 'M', u'日'), + (0x2F48, 'M', u'曰'), + (0x2F49, 'M', u'月'), + (0x2F4A, 'M', u'木'), + (0x2F4B, 'M', u'欠'), + (0x2F4C, 'M', u'止'), + (0x2F4D, 'M', u'歹'), + (0x2F4E, 'M', u'殳'), + (0x2F4F, 'M', u'毋'), + (0x2F50, 'M', u'比'), + (0x2F51, 'M', u'毛'), + (0x2F52, 'M', u'氏'), + (0x2F53, 'M', u'气'), + (0x2F54, 'M', u'水'), + (0x2F55, 'M', u'火'), + (0x2F56, 'M', u'爪'), + (0x2F57, 'M', u'父'), + (0x2F58, 'M', u'爻'), + (0x2F59, 'M', u'爿'), + (0x2F5A, 'M', u'片'), + (0x2F5B, 'M', u'牙'), + (0x2F5C, 'M', u'牛'), + (0x2F5D, 'M', u'犬'), + (0x2F5E, 'M', u'玄'), + (0x2F5F, 'M', u'玉'), + (0x2F60, 'M', u'瓜'), + (0x2F61, 'M', u'瓦'), + (0x2F62, 'M', u'甘'), + (0x2F63, 'M', u'生'), + (0x2F64, 'M', u'用'), + (0x2F65, 'M', u'田'), + (0x2F66, 'M', u'疋'), + (0x2F67, 'M', u'疒'), + (0x2F68, 'M', u'癶'), + (0x2F69, 'M', u'白'), + (0x2F6A, 'M', u'皮'), + (0x2F6B, 'M', u'皿'), + (0x2F6C, 'M', u'目'), + (0x2F6D, 'M', u'矛'), + (0x2F6E, 'M', u'矢'), + (0x2F6F, 'M', u'石'), + (0x2F70, 'M', u'示'), + (0x2F71, 'M', u'禸'), + (0x2F72, 'M', u'禾'), + (0x2F73, 'M', u'穴'), + (0x2F74, 'M', u'立'), + (0x2F75, 'M', u'竹'), + (0x2F76, 'M', u'米'), + (0x2F77, 'M', u'糸'), + (0x2F78, 'M', u'缶'), + (0x2F79, 'M', u'网'), + (0x2F7A, 'M', u'羊'), + (0x2F7B, 'M', u'羽'), + (0x2F7C, 'M', u'老'), + (0x2F7D, 'M', u'而'), + (0x2F7E, 'M', u'耒'), + (0x2F7F, 'M', u'耳'), + (0x2F80, 'M', u'聿'), + (0x2F81, 'M', u'肉'), + (0x2F82, 'M', u'臣'), + (0x2F83, 'M', u'自'), + (0x2F84, 'M', u'至'), + (0x2F85, 'M', u'臼'), + (0x2F86, 'M', u'舌'), + (0x2F87, 'M', u'舛'), + (0x2F88, 'M', u'舟'), + (0x2F89, 'M', u'艮'), + (0x2F8A, 'M', u'色'), + (0x2F8B, 'M', u'艸'), + (0x2F8C, 'M', u'虍'), + (0x2F8D, 'M', u'虫'), + (0x2F8E, 'M', u'血'), + (0x2F8F, 'M', u'行'), + (0x2F90, 'M', u'衣'), + (0x2F91, 'M', u'襾'), + ] + +def _seg_28(): + return [ + (0x2F92, 'M', u'見'), + (0x2F93, 'M', u'角'), + (0x2F94, 'M', u'言'), + (0x2F95, 'M', u'谷'), + (0x2F96, 'M', u'豆'), + (0x2F97, 'M', u'豕'), + (0x2F98, 'M', u'豸'), + (0x2F99, 'M', u'貝'), + (0x2F9A, 'M', u'赤'), + (0x2F9B, 'M', u'走'), + (0x2F9C, 'M', u'足'), + (0x2F9D, 'M', u'身'), + (0x2F9E, 'M', u'車'), + (0x2F9F, 'M', u'辛'), + (0x2FA0, 'M', u'辰'), + (0x2FA1, 'M', u'辵'), + (0x2FA2, 'M', u'邑'), + (0x2FA3, 'M', u'酉'), + (0x2FA4, 'M', u'釆'), + (0x2FA5, 'M', u'里'), + (0x2FA6, 'M', u'金'), + (0x2FA7, 'M', u'長'), + (0x2FA8, 'M', u'門'), + (0x2FA9, 'M', u'阜'), + (0x2FAA, 'M', u'隶'), + (0x2FAB, 'M', u'隹'), + (0x2FAC, 'M', u'雨'), + (0x2FAD, 'M', u'靑'), + (0x2FAE, 'M', u'非'), + (0x2FAF, 'M', u'面'), + (0x2FB0, 'M', u'革'), + (0x2FB1, 'M', u'韋'), + (0x2FB2, 'M', u'韭'), + (0x2FB3, 'M', u'音'), + (0x2FB4, 'M', u'頁'), + (0x2FB5, 'M', u'風'), + (0x2FB6, 'M', u'飛'), + (0x2FB7, 'M', u'食'), + (0x2FB8, 'M', u'首'), + (0x2FB9, 'M', u'香'), + (0x2FBA, 'M', u'馬'), + (0x2FBB, 'M', u'骨'), + (0x2FBC, 'M', u'高'), + (0x2FBD, 'M', u'髟'), + (0x2FBE, 'M', u'鬥'), + (0x2FBF, 'M', u'鬯'), + (0x2FC0, 'M', u'鬲'), + (0x2FC1, 'M', u'鬼'), + (0x2FC2, 'M', u'魚'), + (0x2FC3, 'M', u'鳥'), + (0x2FC4, 'M', u'鹵'), + (0x2FC5, 'M', u'鹿'), + (0x2FC6, 'M', u'麥'), + (0x2FC7, 'M', u'麻'), + (0x2FC8, 'M', u'黃'), + (0x2FC9, 'M', u'黍'), + (0x2FCA, 'M', u'黑'), + (0x2FCB, 'M', u'黹'), + (0x2FCC, 'M', u'黽'), + (0x2FCD, 'M', u'鼎'), + (0x2FCE, 'M', u'鼓'), + (0x2FCF, 'M', u'鼠'), + (0x2FD0, 'M', u'鼻'), + (0x2FD1, 'M', u'齊'), + (0x2FD2, 'M', u'齒'), + (0x2FD3, 'M', u'龍'), + (0x2FD4, 'M', u'龜'), + (0x2FD5, 'M', u'龠'), + (0x2FD6, 'X'), + (0x3000, '3', u' '), + (0x3001, 'V'), + (0x3002, 'M', u'.'), + (0x3003, 'V'), + (0x3036, 'M', u'〒'), + (0x3037, 'V'), + (0x3038, 'M', u'十'), + (0x3039, 'M', u'卄'), + (0x303A, 'M', u'卅'), + (0x303B, 'V'), + (0x3040, 'X'), + (0x3041, 'V'), + (0x3097, 'X'), + (0x3099, 'V'), + (0x309B, '3', u' ゙'), + (0x309C, '3', u' ゚'), + (0x309D, 'V'), + (0x309F, 'M', u'より'), + (0x30A0, 'V'), + (0x30FF, 'M', u'コト'), + (0x3100, 'X'), + (0x3105, 'V'), + (0x3130, 'X'), + (0x3131, 'M', u'ᄀ'), + (0x3132, 'M', u'ᄁ'), + (0x3133, 'M', u'ᆪ'), + (0x3134, 'M', u'ᄂ'), + (0x3135, 'M', u'ᆬ'), + (0x3136, 'M', u'ᆭ'), + (0x3137, 'M', u'ᄃ'), + (0x3138, 'M', u'ᄄ'), + ] + +def _seg_29(): + return [ + (0x3139, 'M', u'ᄅ'), + (0x313A, 'M', u'ᆰ'), + (0x313B, 'M', u'ᆱ'), + (0x313C, 'M', u'ᆲ'), + (0x313D, 'M', u'ᆳ'), + (0x313E, 'M', u'ᆴ'), + (0x313F, 'M', u'ᆵ'), + (0x3140, 'M', u'ᄚ'), + (0x3141, 'M', u'ᄆ'), + (0x3142, 'M', u'ᄇ'), + (0x3143, 'M', u'ᄈ'), + (0x3144, 'M', u'ᄡ'), + (0x3145, 'M', u'ᄉ'), + (0x3146, 'M', u'ᄊ'), + (0x3147, 'M', u'ᄋ'), + (0x3148, 'M', u'ᄌ'), + (0x3149, 'M', u'ᄍ'), + (0x314A, 'M', u'ᄎ'), + (0x314B, 'M', u'ᄏ'), + (0x314C, 'M', u'ᄐ'), + (0x314D, 'M', u'ᄑ'), + (0x314E, 'M', u'ᄒ'), + (0x314F, 'M', u'ᅡ'), + (0x3150, 'M', u'ᅢ'), + (0x3151, 'M', u'ᅣ'), + (0x3152, 'M', u'ᅤ'), + (0x3153, 'M', u'ᅥ'), + (0x3154, 'M', u'ᅦ'), + (0x3155, 'M', u'ᅧ'), + (0x3156, 'M', u'ᅨ'), + (0x3157, 'M', u'ᅩ'), + (0x3158, 'M', u'ᅪ'), + (0x3159, 'M', u'ᅫ'), + (0x315A, 'M', u'ᅬ'), + (0x315B, 'M', u'ᅭ'), + (0x315C, 'M', u'ᅮ'), + (0x315D, 'M', u'ᅯ'), + (0x315E, 'M', u'ᅰ'), + (0x315F, 'M', u'ᅱ'), + (0x3160, 'M', u'ᅲ'), + (0x3161, 'M', u'ᅳ'), + (0x3162, 'M', u'ᅴ'), + (0x3163, 'M', u'ᅵ'), + (0x3164, 'X'), + (0x3165, 'M', u'ᄔ'), + (0x3166, 'M', u'ᄕ'), + (0x3167, 'M', u'ᇇ'), + (0x3168, 'M', u'ᇈ'), + (0x3169, 'M', u'ᇌ'), + (0x316A, 'M', u'ᇎ'), + (0x316B, 'M', u'ᇓ'), + (0x316C, 'M', u'ᇗ'), + (0x316D, 'M', u'ᇙ'), + (0x316E, 'M', u'ᄜ'), + (0x316F, 'M', u'ᇝ'), + (0x3170, 'M', u'ᇟ'), + (0x3171, 'M', u'ᄝ'), + (0x3172, 'M', u'ᄞ'), + (0x3173, 'M', u'ᄠ'), + (0x3174, 'M', u'ᄢ'), + (0x3175, 'M', u'ᄣ'), + (0x3176, 'M', u'ᄧ'), + (0x3177, 'M', u'ᄩ'), + (0x3178, 'M', u'ᄫ'), + (0x3179, 'M', u'ᄬ'), + (0x317A, 'M', u'ᄭ'), + (0x317B, 'M', u'ᄮ'), + (0x317C, 'M', u'ᄯ'), + (0x317D, 'M', u'ᄲ'), + (0x317E, 'M', u'ᄶ'), + (0x317F, 'M', u'ᅀ'), + (0x3180, 'M', u'ᅇ'), + (0x3181, 'M', u'ᅌ'), + (0x3182, 'M', u'ᇱ'), + (0x3183, 'M', u'ᇲ'), + (0x3184, 'M', u'ᅗ'), + (0x3185, 'M', u'ᅘ'), + (0x3186, 'M', u'ᅙ'), + (0x3187, 'M', u'ᆄ'), + (0x3188, 'M', u'ᆅ'), + (0x3189, 'M', u'ᆈ'), + (0x318A, 'M', u'ᆑ'), + (0x318B, 'M', u'ᆒ'), + (0x318C, 'M', u'ᆔ'), + (0x318D, 'M', u'ᆞ'), + (0x318E, 'M', u'ᆡ'), + (0x318F, 'X'), + (0x3190, 'V'), + (0x3192, 'M', u'一'), + (0x3193, 'M', u'二'), + (0x3194, 'M', u'三'), + (0x3195, 'M', u'四'), + (0x3196, 'M', u'上'), + (0x3197, 'M', u'中'), + (0x3198, 'M', u'下'), + (0x3199, 'M', u'甲'), + (0x319A, 'M', u'乙'), + (0x319B, 'M', u'丙'), + (0x319C, 'M', u'丁'), + (0x319D, 'M', u'天'), + ] + +def _seg_30(): + return [ + (0x319E, 'M', u'地'), + (0x319F, 'M', u'人'), + (0x31A0, 'V'), + (0x31BB, 'X'), + (0x31C0, 'V'), + (0x31E4, 'X'), + (0x31F0, 'V'), + (0x3200, '3', u'(ᄀ)'), + (0x3201, '3', u'(ᄂ)'), + (0x3202, '3', u'(ᄃ)'), + (0x3203, '3', u'(ᄅ)'), + (0x3204, '3', u'(ᄆ)'), + (0x3205, '3', u'(ᄇ)'), + (0x3206, '3', u'(ᄉ)'), + (0x3207, '3', u'(ᄋ)'), + (0x3208, '3', u'(ᄌ)'), + (0x3209, '3', u'(ᄎ)'), + (0x320A, '3', u'(ᄏ)'), + (0x320B, '3', u'(ᄐ)'), + (0x320C, '3', u'(ᄑ)'), + (0x320D, '3', u'(ᄒ)'), + (0x320E, '3', u'(가)'), + (0x320F, '3', u'(나)'), + (0x3210, '3', u'(다)'), + (0x3211, '3', u'(라)'), + (0x3212, '3', u'(마)'), + (0x3213, '3', u'(바)'), + (0x3214, '3', u'(사)'), + (0x3215, '3', u'(아)'), + (0x3216, '3', u'(자)'), + (0x3217, '3', u'(차)'), + (0x3218, '3', u'(카)'), + (0x3219, '3', u'(타)'), + (0x321A, '3', u'(파)'), + (0x321B, '3', u'(하)'), + (0x321C, '3', u'(주)'), + (0x321D, '3', u'(오전)'), + (0x321E, '3', u'(오후)'), + (0x321F, 'X'), + (0x3220, '3', u'(一)'), + (0x3221, '3', u'(二)'), + (0x3222, '3', u'(三)'), + (0x3223, '3', u'(四)'), + (0x3224, '3', u'(五)'), + (0x3225, '3', u'(六)'), + (0x3226, '3', u'(七)'), + (0x3227, '3', u'(八)'), + (0x3228, '3', u'(九)'), + (0x3229, '3', u'(十)'), + (0x322A, '3', u'(月)'), + (0x322B, '3', u'(火)'), + (0x322C, '3', u'(水)'), + (0x322D, '3', u'(木)'), + (0x322E, '3', u'(金)'), + (0x322F, '3', u'(土)'), + (0x3230, '3', u'(日)'), + (0x3231, '3', u'(株)'), + (0x3232, '3', u'(有)'), + (0x3233, '3', u'(社)'), + (0x3234, '3', u'(名)'), + (0x3235, '3', u'(特)'), + (0x3236, '3', u'(財)'), + (0x3237, '3', u'(祝)'), + (0x3238, '3', u'(労)'), + (0x3239, '3', u'(代)'), + (0x323A, '3', u'(呼)'), + (0x323B, '3', u'(学)'), + (0x323C, '3', u'(監)'), + (0x323D, '3', u'(企)'), + (0x323E, '3', u'(資)'), + (0x323F, '3', u'(協)'), + (0x3240, '3', u'(祭)'), + (0x3241, '3', u'(休)'), + (0x3242, '3', u'(自)'), + (0x3243, '3', u'(至)'), + (0x3244, 'M', u'問'), + (0x3245, 'M', u'幼'), + (0x3246, 'M', u'文'), + (0x3247, 'M', u'箏'), + (0x3248, 'V'), + (0x3250, 'M', u'pte'), + (0x3251, 'M', u'21'), + (0x3252, 'M', u'22'), + (0x3253, 'M', u'23'), + (0x3254, 'M', u'24'), + (0x3255, 'M', u'25'), + (0x3256, 'M', u'26'), + (0x3257, 'M', u'27'), + (0x3258, 'M', u'28'), + (0x3259, 'M', u'29'), + (0x325A, 'M', u'30'), + (0x325B, 'M', u'31'), + (0x325C, 'M', u'32'), + (0x325D, 'M', u'33'), + (0x325E, 'M', u'34'), + (0x325F, 'M', u'35'), + (0x3260, 'M', u'ᄀ'), + (0x3261, 'M', u'ᄂ'), + (0x3262, 'M', u'ᄃ'), + (0x3263, 'M', u'ᄅ'), + ] + +def _seg_31(): + return [ + (0x3264, 'M', u'ᄆ'), + (0x3265, 'M', u'ᄇ'), + (0x3266, 'M', u'ᄉ'), + (0x3267, 'M', u'ᄋ'), + (0x3268, 'M', u'ᄌ'), + (0x3269, 'M', u'ᄎ'), + (0x326A, 'M', u'ᄏ'), + (0x326B, 'M', u'ᄐ'), + (0x326C, 'M', u'ᄑ'), + (0x326D, 'M', u'ᄒ'), + (0x326E, 'M', u'가'), + (0x326F, 'M', u'나'), + (0x3270, 'M', u'다'), + (0x3271, 'M', u'라'), + (0x3272, 'M', u'마'), + (0x3273, 'M', u'바'), + (0x3274, 'M', u'사'), + (0x3275, 'M', u'아'), + (0x3276, 'M', u'자'), + (0x3277, 'M', u'차'), + (0x3278, 'M', u'카'), + (0x3279, 'M', u'타'), + (0x327A, 'M', u'파'), + (0x327B, 'M', u'하'), + (0x327C, 'M', u'참고'), + (0x327D, 'M', u'주의'), + (0x327E, 'M', u'우'), + (0x327F, 'V'), + (0x3280, 'M', u'一'), + (0x3281, 'M', u'二'), + (0x3282, 'M', u'三'), + (0x3283, 'M', u'四'), + (0x3284, 'M', u'五'), + (0x3285, 'M', u'六'), + (0x3286, 'M', u'七'), + (0x3287, 'M', u'八'), + (0x3288, 'M', u'九'), + (0x3289, 'M', u'十'), + (0x328A, 'M', u'月'), + (0x328B, 'M', u'火'), + (0x328C, 'M', u'水'), + (0x328D, 'M', u'木'), + (0x328E, 'M', u'金'), + (0x328F, 'M', u'土'), + (0x3290, 'M', u'日'), + (0x3291, 'M', u'株'), + (0x3292, 'M', u'有'), + (0x3293, 'M', u'社'), + (0x3294, 'M', u'名'), + (0x3295, 'M', u'特'), + (0x3296, 'M', u'財'), + (0x3297, 'M', u'祝'), + (0x3298, 'M', u'労'), + (0x3299, 'M', u'秘'), + (0x329A, 'M', u'男'), + (0x329B, 'M', u'女'), + (0x329C, 'M', u'適'), + (0x329D, 'M', u'優'), + (0x329E, 'M', u'印'), + (0x329F, 'M', u'注'), + (0x32A0, 'M', u'項'), + (0x32A1, 'M', u'休'), + (0x32A2, 'M', u'写'), + (0x32A3, 'M', u'正'), + (0x32A4, 'M', u'上'), + (0x32A5, 'M', u'中'), + (0x32A6, 'M', u'下'), + (0x32A7, 'M', u'左'), + (0x32A8, 'M', u'右'), + (0x32A9, 'M', u'医'), + (0x32AA, 'M', u'宗'), + (0x32AB, 'M', u'学'), + (0x32AC, 'M', u'監'), + (0x32AD, 'M', u'企'), + (0x32AE, 'M', u'資'), + (0x32AF, 'M', u'協'), + (0x32B0, 'M', u'夜'), + (0x32B1, 'M', u'36'), + (0x32B2, 'M', u'37'), + (0x32B3, 'M', u'38'), + (0x32B4, 'M', u'39'), + (0x32B5, 'M', u'40'), + (0x32B6, 'M', u'41'), + (0x32B7, 'M', u'42'), + (0x32B8, 'M', u'43'), + (0x32B9, 'M', u'44'), + (0x32BA, 'M', u'45'), + (0x32BB, 'M', u'46'), + (0x32BC, 'M', u'47'), + (0x32BD, 'M', u'48'), + (0x32BE, 'M', u'49'), + (0x32BF, 'M', u'50'), + (0x32C0, 'M', u'1月'), + (0x32C1, 'M', u'2月'), + (0x32C2, 'M', u'3月'), + (0x32C3, 'M', u'4月'), + (0x32C4, 'M', u'5月'), + (0x32C5, 'M', u'6月'), + (0x32C6, 'M', u'7月'), + (0x32C7, 'M', u'8月'), + ] + +def _seg_32(): + return [ + (0x32C8, 'M', u'9月'), + (0x32C9, 'M', u'10月'), + (0x32CA, 'M', u'11月'), + (0x32CB, 'M', u'12月'), + (0x32CC, 'M', u'hg'), + (0x32CD, 'M', u'erg'), + (0x32CE, 'M', u'ev'), + (0x32CF, 'M', u'ltd'), + (0x32D0, 'M', u'ア'), + (0x32D1, 'M', u'イ'), + (0x32D2, 'M', u'ウ'), + (0x32D3, 'M', u'エ'), + (0x32D4, 'M', u'オ'), + (0x32D5, 'M', u'カ'), + (0x32D6, 'M', u'キ'), + (0x32D7, 'M', u'ク'), + (0x32D8, 'M', u'ケ'), + (0x32D9, 'M', u'コ'), + (0x32DA, 'M', u'サ'), + (0x32DB, 'M', u'シ'), + (0x32DC, 'M', u'ス'), + (0x32DD, 'M', u'セ'), + (0x32DE, 'M', u'ソ'), + (0x32DF, 'M', u'タ'), + (0x32E0, 'M', u'チ'), + (0x32E1, 'M', u'ツ'), + (0x32E2, 'M', u'テ'), + (0x32E3, 'M', u'ト'), + (0x32E4, 'M', u'ナ'), + (0x32E5, 'M', u'ニ'), + (0x32E6, 'M', u'ヌ'), + (0x32E7, 'M', u'ネ'), + (0x32E8, 'M', u'ノ'), + (0x32E9, 'M', u'ハ'), + (0x32EA, 'M', u'ヒ'), + (0x32EB, 'M', u'フ'), + (0x32EC, 'M', u'ヘ'), + (0x32ED, 'M', u'ホ'), + (0x32EE, 'M', u'マ'), + (0x32EF, 'M', u'ミ'), + (0x32F0, 'M', u'ム'), + (0x32F1, 'M', u'メ'), + (0x32F2, 'M', u'モ'), + (0x32F3, 'M', u'ヤ'), + (0x32F4, 'M', u'ユ'), + (0x32F5, 'M', u'ヨ'), + (0x32F6, 'M', u'ラ'), + (0x32F7, 'M', u'リ'), + (0x32F8, 'M', u'ル'), + (0x32F9, 'M', u'レ'), + (0x32FA, 'M', u'ロ'), + (0x32FB, 'M', u'ワ'), + (0x32FC, 'M', u'ヰ'), + (0x32FD, 'M', u'ヱ'), + (0x32FE, 'M', u'ヲ'), + (0x32FF, 'X'), + (0x3300, 'M', u'アパート'), + (0x3301, 'M', u'アルファ'), + (0x3302, 'M', u'アンペア'), + (0x3303, 'M', u'アール'), + (0x3304, 'M', u'イニング'), + (0x3305, 'M', u'インチ'), + (0x3306, 'M', u'ウォン'), + (0x3307, 'M', u'エスクード'), + (0x3308, 'M', u'エーカー'), + (0x3309, 'M', u'オンス'), + (0x330A, 'M', u'オーム'), + (0x330B, 'M', u'カイリ'), + (0x330C, 'M', u'カラット'), + (0x330D, 'M', u'カロリー'), + (0x330E, 'M', u'ガロン'), + (0x330F, 'M', u'ガンマ'), + (0x3310, 'M', u'ギガ'), + (0x3311, 'M', u'ギニー'), + (0x3312, 'M', u'キュリー'), + (0x3313, 'M', u'ギルダー'), + (0x3314, 'M', u'キロ'), + (0x3315, 'M', u'キログラム'), + (0x3316, 'M', u'キロメートル'), + (0x3317, 'M', u'キロワット'), + (0x3318, 'M', u'グラム'), + (0x3319, 'M', u'グラムトン'), + (0x331A, 'M', u'クルゼイロ'), + (0x331B, 'M', u'クローネ'), + (0x331C, 'M', u'ケース'), + (0x331D, 'M', u'コルナ'), + (0x331E, 'M', u'コーポ'), + (0x331F, 'M', u'サイクル'), + (0x3320, 'M', u'サンチーム'), + (0x3321, 'M', u'シリング'), + (0x3322, 'M', u'センチ'), + (0x3323, 'M', u'セント'), + (0x3324, 'M', u'ダース'), + (0x3325, 'M', u'デシ'), + (0x3326, 'M', u'ドル'), + (0x3327, 'M', u'トン'), + (0x3328, 'M', u'ナノ'), + (0x3329, 'M', u'ノット'), + (0x332A, 'M', u'ハイツ'), + (0x332B, 'M', u'パーセント'), + ] + +def _seg_33(): + return [ + (0x332C, 'M', u'パーツ'), + (0x332D, 'M', u'バーレル'), + (0x332E, 'M', u'ピアストル'), + (0x332F, 'M', u'ピクル'), + (0x3330, 'M', u'ピコ'), + (0x3331, 'M', u'ビル'), + (0x3332, 'M', u'ファラッド'), + (0x3333, 'M', u'フィート'), + (0x3334, 'M', u'ブッシェル'), + (0x3335, 'M', u'フラン'), + (0x3336, 'M', u'ヘクタール'), + (0x3337, 'M', u'ペソ'), + (0x3338, 'M', u'ペニヒ'), + (0x3339, 'M', u'ヘルツ'), + (0x333A, 'M', u'ペンス'), + (0x333B, 'M', u'ページ'), + (0x333C, 'M', u'ベータ'), + (0x333D, 'M', u'ポイント'), + (0x333E, 'M', u'ボルト'), + (0x333F, 'M', u'ホン'), + (0x3340, 'M', u'ポンド'), + (0x3341, 'M', u'ホール'), + (0x3342, 'M', u'ホーン'), + (0x3343, 'M', u'マイクロ'), + (0x3344, 'M', u'マイル'), + (0x3345, 'M', u'マッハ'), + (0x3346, 'M', u'マルク'), + (0x3347, 'M', u'マンション'), + (0x3348, 'M', u'ミクロン'), + (0x3349, 'M', u'ミリ'), + (0x334A, 'M', u'ミリバール'), + (0x334B, 'M', u'メガ'), + (0x334C, 'M', u'メガトン'), + (0x334D, 'M', u'メートル'), + (0x334E, 'M', u'ヤード'), + (0x334F, 'M', u'ヤール'), + (0x3350, 'M', u'ユアン'), + (0x3351, 'M', u'リットル'), + (0x3352, 'M', u'リラ'), + (0x3353, 'M', u'ルピー'), + (0x3354, 'M', u'ルーブル'), + (0x3355, 'M', u'レム'), + (0x3356, 'M', u'レントゲン'), + (0x3357, 'M', u'ワット'), + (0x3358, 'M', u'0点'), + (0x3359, 'M', u'1点'), + (0x335A, 'M', u'2点'), + (0x335B, 'M', u'3点'), + (0x335C, 'M', u'4点'), + (0x335D, 'M', u'5点'), + (0x335E, 'M', u'6点'), + (0x335F, 'M', u'7点'), + (0x3360, 'M', u'8点'), + (0x3361, 'M', u'9点'), + (0x3362, 'M', u'10点'), + (0x3363, 'M', u'11点'), + (0x3364, 'M', u'12点'), + (0x3365, 'M', u'13点'), + (0x3366, 'M', u'14点'), + (0x3367, 'M', u'15点'), + (0x3368, 'M', u'16点'), + (0x3369, 'M', u'17点'), + (0x336A, 'M', u'18点'), + (0x336B, 'M', u'19点'), + (0x336C, 'M', u'20点'), + (0x336D, 'M', u'21点'), + (0x336E, 'M', u'22点'), + (0x336F, 'M', u'23点'), + (0x3370, 'M', u'24点'), + (0x3371, 'M', u'hpa'), + (0x3372, 'M', u'da'), + (0x3373, 'M', u'au'), + (0x3374, 'M', u'bar'), + (0x3375, 'M', u'ov'), + (0x3376, 'M', u'pc'), + (0x3377, 'M', u'dm'), + (0x3378, 'M', u'dm2'), + (0x3379, 'M', u'dm3'), + (0x337A, 'M', u'iu'), + (0x337B, 'M', u'平成'), + (0x337C, 'M', u'昭和'), + (0x337D, 'M', u'大正'), + (0x337E, 'M', u'明治'), + (0x337F, 'M', u'株式会社'), + (0x3380, 'M', u'pa'), + (0x3381, 'M', u'na'), + (0x3382, 'M', u'μa'), + (0x3383, 'M', u'ma'), + (0x3384, 'M', u'ka'), + (0x3385, 'M', u'kb'), + (0x3386, 'M', u'mb'), + (0x3387, 'M', u'gb'), + (0x3388, 'M', u'cal'), + (0x3389, 'M', u'kcal'), + (0x338A, 'M', u'pf'), + (0x338B, 'M', u'nf'), + (0x338C, 'M', u'μf'), + (0x338D, 'M', u'μg'), + (0x338E, 'M', u'mg'), + (0x338F, 'M', u'kg'), + ] + +def _seg_34(): + return [ + (0x3390, 'M', u'hz'), + (0x3391, 'M', u'khz'), + (0x3392, 'M', u'mhz'), + (0x3393, 'M', u'ghz'), + (0x3394, 'M', u'thz'), + (0x3395, 'M', u'μl'), + (0x3396, 'M', u'ml'), + (0x3397, 'M', u'dl'), + (0x3398, 'M', u'kl'), + (0x3399, 'M', u'fm'), + (0x339A, 'M', u'nm'), + (0x339B, 'M', u'μm'), + (0x339C, 'M', u'mm'), + (0x339D, 'M', u'cm'), + (0x339E, 'M', u'km'), + (0x339F, 'M', u'mm2'), + (0x33A0, 'M', u'cm2'), + (0x33A1, 'M', u'm2'), + (0x33A2, 'M', u'km2'), + (0x33A3, 'M', u'mm3'), + (0x33A4, 'M', u'cm3'), + (0x33A5, 'M', u'm3'), + (0x33A6, 'M', u'km3'), + (0x33A7, 'M', u'm∕s'), + (0x33A8, 'M', u'm∕s2'), + (0x33A9, 'M', u'pa'), + (0x33AA, 'M', u'kpa'), + (0x33AB, 'M', u'mpa'), + (0x33AC, 'M', u'gpa'), + (0x33AD, 'M', u'rad'), + (0x33AE, 'M', u'rad∕s'), + (0x33AF, 'M', u'rad∕s2'), + (0x33B0, 'M', u'ps'), + (0x33B1, 'M', u'ns'), + (0x33B2, 'M', u'μs'), + (0x33B3, 'M', u'ms'), + (0x33B4, 'M', u'pv'), + (0x33B5, 'M', u'nv'), + (0x33B6, 'M', u'μv'), + (0x33B7, 'M', u'mv'), + (0x33B8, 'M', u'kv'), + (0x33B9, 'M', u'mv'), + (0x33BA, 'M', u'pw'), + (0x33BB, 'M', u'nw'), + (0x33BC, 'M', u'μw'), + (0x33BD, 'M', u'mw'), + (0x33BE, 'M', u'kw'), + (0x33BF, 'M', u'mw'), + (0x33C0, 'M', u'kω'), + (0x33C1, 'M', u'mω'), + (0x33C2, 'X'), + (0x33C3, 'M', u'bq'), + (0x33C4, 'M', u'cc'), + (0x33C5, 'M', u'cd'), + (0x33C6, 'M', u'c∕kg'), + (0x33C7, 'X'), + (0x33C8, 'M', u'db'), + (0x33C9, 'M', u'gy'), + (0x33CA, 'M', u'ha'), + (0x33CB, 'M', u'hp'), + (0x33CC, 'M', u'in'), + (0x33CD, 'M', u'kk'), + (0x33CE, 'M', u'km'), + (0x33CF, 'M', u'kt'), + (0x33D0, 'M', u'lm'), + (0x33D1, 'M', u'ln'), + (0x33D2, 'M', u'log'), + (0x33D3, 'M', u'lx'), + (0x33D4, 'M', u'mb'), + (0x33D5, 'M', u'mil'), + (0x33D6, 'M', u'mol'), + (0x33D7, 'M', u'ph'), + (0x33D8, 'X'), + (0x33D9, 'M', u'ppm'), + (0x33DA, 'M', u'pr'), + (0x33DB, 'M', u'sr'), + (0x33DC, 'M', u'sv'), + (0x33DD, 'M', u'wb'), + (0x33DE, 'M', u'v∕m'), + (0x33DF, 'M', u'a∕m'), + (0x33E0, 'M', u'1日'), + (0x33E1, 'M', u'2日'), + (0x33E2, 'M', u'3日'), + (0x33E3, 'M', u'4日'), + (0x33E4, 'M', u'5日'), + (0x33E5, 'M', u'6日'), + (0x33E6, 'M', u'7日'), + (0x33E7, 'M', u'8日'), + (0x33E8, 'M', u'9日'), + (0x33E9, 'M', u'10日'), + (0x33EA, 'M', u'11日'), + (0x33EB, 'M', u'12日'), + (0x33EC, 'M', u'13日'), + (0x33ED, 'M', u'14日'), + (0x33EE, 'M', u'15日'), + (0x33EF, 'M', u'16日'), + (0x33F0, 'M', u'17日'), + (0x33F1, 'M', u'18日'), + (0x33F2, 'M', u'19日'), + (0x33F3, 'M', u'20日'), + ] + +def _seg_35(): + return [ + (0x33F4, 'M', u'21日'), + (0x33F5, 'M', u'22日'), + (0x33F6, 'M', u'23日'), + (0x33F7, 'M', u'24日'), + (0x33F8, 'M', u'25日'), + (0x33F9, 'M', u'26日'), + (0x33FA, 'M', u'27日'), + (0x33FB, 'M', u'28日'), + (0x33FC, 'M', u'29日'), + (0x33FD, 'M', u'30日'), + (0x33FE, 'M', u'31日'), + (0x33FF, 'M', u'gal'), + (0x3400, 'V'), + (0x4DB6, 'X'), + (0x4DC0, 'V'), + (0x9FF0, 'X'), + (0xA000, 'V'), + (0xA48D, 'X'), + (0xA490, 'V'), + (0xA4C7, 'X'), + (0xA4D0, 'V'), + (0xA62C, 'X'), + (0xA640, 'M', u'ꙁ'), + (0xA641, 'V'), + (0xA642, 'M', u'ꙃ'), + (0xA643, 'V'), + (0xA644, 'M', u'ꙅ'), + (0xA645, 'V'), + (0xA646, 'M', u'ꙇ'), + (0xA647, 'V'), + (0xA648, 'M', u'ꙉ'), + (0xA649, 'V'), + (0xA64A, 'M', u'ꙋ'), + (0xA64B, 'V'), + (0xA64C, 'M', u'ꙍ'), + (0xA64D, 'V'), + (0xA64E, 'M', u'ꙏ'), + (0xA64F, 'V'), + (0xA650, 'M', u'ꙑ'), + (0xA651, 'V'), + (0xA652, 'M', u'ꙓ'), + (0xA653, 'V'), + (0xA654, 'M', u'ꙕ'), + (0xA655, 'V'), + (0xA656, 'M', u'ꙗ'), + (0xA657, 'V'), + (0xA658, 'M', u'ꙙ'), + (0xA659, 'V'), + (0xA65A, 'M', u'ꙛ'), + (0xA65B, 'V'), + (0xA65C, 'M', u'ꙝ'), + (0xA65D, 'V'), + (0xA65E, 'M', u'ꙟ'), + (0xA65F, 'V'), + (0xA660, 'M', u'ꙡ'), + (0xA661, 'V'), + (0xA662, 'M', u'ꙣ'), + (0xA663, 'V'), + (0xA664, 'M', u'ꙥ'), + (0xA665, 'V'), + (0xA666, 'M', u'ꙧ'), + (0xA667, 'V'), + (0xA668, 'M', u'ꙩ'), + (0xA669, 'V'), + (0xA66A, 'M', u'ꙫ'), + (0xA66B, 'V'), + (0xA66C, 'M', u'ꙭ'), + (0xA66D, 'V'), + (0xA680, 'M', u'ꚁ'), + (0xA681, 'V'), + (0xA682, 'M', u'ꚃ'), + (0xA683, 'V'), + (0xA684, 'M', u'ꚅ'), + (0xA685, 'V'), + (0xA686, 'M', u'ꚇ'), + (0xA687, 'V'), + (0xA688, 'M', u'ꚉ'), + (0xA689, 'V'), + (0xA68A, 'M', u'ꚋ'), + (0xA68B, 'V'), + (0xA68C, 'M', u'ꚍ'), + (0xA68D, 'V'), + (0xA68E, 'M', u'ꚏ'), + (0xA68F, 'V'), + (0xA690, 'M', u'ꚑ'), + (0xA691, 'V'), + (0xA692, 'M', u'ꚓ'), + (0xA693, 'V'), + (0xA694, 'M', u'ꚕ'), + (0xA695, 'V'), + (0xA696, 'M', u'ꚗ'), + (0xA697, 'V'), + (0xA698, 'M', u'ꚙ'), + (0xA699, 'V'), + (0xA69A, 'M', u'ꚛ'), + (0xA69B, 'V'), + (0xA69C, 'M', u'ъ'), + (0xA69D, 'M', u'ь'), + (0xA69E, 'V'), + (0xA6F8, 'X'), + ] + +def _seg_36(): + return [ + (0xA700, 'V'), + (0xA722, 'M', u'ꜣ'), + (0xA723, 'V'), + (0xA724, 'M', u'ꜥ'), + (0xA725, 'V'), + (0xA726, 'M', u'ꜧ'), + (0xA727, 'V'), + (0xA728, 'M', u'ꜩ'), + (0xA729, 'V'), + (0xA72A, 'M', u'ꜫ'), + (0xA72B, 'V'), + (0xA72C, 'M', u'ꜭ'), + (0xA72D, 'V'), + (0xA72E, 'M', u'ꜯ'), + (0xA72F, 'V'), + (0xA732, 'M', u'ꜳ'), + (0xA733, 'V'), + (0xA734, 'M', u'ꜵ'), + (0xA735, 'V'), + (0xA736, 'M', u'ꜷ'), + (0xA737, 'V'), + (0xA738, 'M', u'ꜹ'), + (0xA739, 'V'), + (0xA73A, 'M', u'ꜻ'), + (0xA73B, 'V'), + (0xA73C, 'M', u'ꜽ'), + (0xA73D, 'V'), + (0xA73E, 'M', u'ꜿ'), + (0xA73F, 'V'), + (0xA740, 'M', u'ꝁ'), + (0xA741, 'V'), + (0xA742, 'M', u'ꝃ'), + (0xA743, 'V'), + (0xA744, 'M', u'ꝅ'), + (0xA745, 'V'), + (0xA746, 'M', u'ꝇ'), + (0xA747, 'V'), + (0xA748, 'M', u'ꝉ'), + (0xA749, 'V'), + (0xA74A, 'M', u'ꝋ'), + (0xA74B, 'V'), + (0xA74C, 'M', u'ꝍ'), + (0xA74D, 'V'), + (0xA74E, 'M', u'ꝏ'), + (0xA74F, 'V'), + (0xA750, 'M', u'ꝑ'), + (0xA751, 'V'), + (0xA752, 'M', u'ꝓ'), + (0xA753, 'V'), + (0xA754, 'M', u'ꝕ'), + (0xA755, 'V'), + (0xA756, 'M', u'ꝗ'), + (0xA757, 'V'), + (0xA758, 'M', u'ꝙ'), + (0xA759, 'V'), + (0xA75A, 'M', u'ꝛ'), + (0xA75B, 'V'), + (0xA75C, 'M', u'ꝝ'), + (0xA75D, 'V'), + (0xA75E, 'M', u'ꝟ'), + (0xA75F, 'V'), + (0xA760, 'M', u'ꝡ'), + (0xA761, 'V'), + (0xA762, 'M', u'ꝣ'), + (0xA763, 'V'), + (0xA764, 'M', u'ꝥ'), + (0xA765, 'V'), + (0xA766, 'M', u'ꝧ'), + (0xA767, 'V'), + (0xA768, 'M', u'ꝩ'), + (0xA769, 'V'), + (0xA76A, 'M', u'ꝫ'), + (0xA76B, 'V'), + (0xA76C, 'M', u'ꝭ'), + (0xA76D, 'V'), + (0xA76E, 'M', u'ꝯ'), + (0xA76F, 'V'), + (0xA770, 'M', u'ꝯ'), + (0xA771, 'V'), + (0xA779, 'M', u'ꝺ'), + (0xA77A, 'V'), + (0xA77B, 'M', u'ꝼ'), + (0xA77C, 'V'), + (0xA77D, 'M', u'ᵹ'), + (0xA77E, 'M', u'ꝿ'), + (0xA77F, 'V'), + (0xA780, 'M', u'ꞁ'), + (0xA781, 'V'), + (0xA782, 'M', u'ꞃ'), + (0xA783, 'V'), + (0xA784, 'M', u'ꞅ'), + (0xA785, 'V'), + (0xA786, 'M', u'ꞇ'), + (0xA787, 'V'), + (0xA78B, 'M', u'ꞌ'), + (0xA78C, 'V'), + (0xA78D, 'M', u'ɥ'), + (0xA78E, 'V'), + (0xA790, 'M', u'ꞑ'), + (0xA791, 'V'), + ] + +def _seg_37(): + return [ + (0xA792, 'M', u'ꞓ'), + (0xA793, 'V'), + (0xA796, 'M', u'ꞗ'), + (0xA797, 'V'), + (0xA798, 'M', u'ꞙ'), + (0xA799, 'V'), + (0xA79A, 'M', u'ꞛ'), + (0xA79B, 'V'), + (0xA79C, 'M', u'ꞝ'), + (0xA79D, 'V'), + (0xA79E, 'M', u'ꞟ'), + (0xA79F, 'V'), + (0xA7A0, 'M', u'ꞡ'), + (0xA7A1, 'V'), + (0xA7A2, 'M', u'ꞣ'), + (0xA7A3, 'V'), + (0xA7A4, 'M', u'ꞥ'), + (0xA7A5, 'V'), + (0xA7A6, 'M', u'ꞧ'), + (0xA7A7, 'V'), + (0xA7A8, 'M', u'ꞩ'), + (0xA7A9, 'V'), + (0xA7AA, 'M', u'ɦ'), + (0xA7AB, 'M', u'ɜ'), + (0xA7AC, 'M', u'ɡ'), + (0xA7AD, 'M', u'ɬ'), + (0xA7AE, 'M', u'ɪ'), + (0xA7AF, 'V'), + (0xA7B0, 'M', u'ʞ'), + (0xA7B1, 'M', u'ʇ'), + (0xA7B2, 'M', u'ʝ'), + (0xA7B3, 'M', u'ꭓ'), + (0xA7B4, 'M', u'ꞵ'), + (0xA7B5, 'V'), + (0xA7B6, 'M', u'ꞷ'), + (0xA7B7, 'V'), + (0xA7B8, 'X'), + (0xA7B9, 'V'), + (0xA7BA, 'X'), + (0xA7F7, 'V'), + (0xA7F8, 'M', u'ħ'), + (0xA7F9, 'M', u'œ'), + (0xA7FA, 'V'), + (0xA82C, 'X'), + (0xA830, 'V'), + (0xA83A, 'X'), + (0xA840, 'V'), + (0xA878, 'X'), + (0xA880, 'V'), + (0xA8C6, 'X'), + (0xA8CE, 'V'), + (0xA8DA, 'X'), + (0xA8E0, 'V'), + (0xA954, 'X'), + (0xA95F, 'V'), + (0xA97D, 'X'), + (0xA980, 'V'), + (0xA9CE, 'X'), + (0xA9CF, 'V'), + (0xA9DA, 'X'), + (0xA9DE, 'V'), + (0xA9FF, 'X'), + (0xAA00, 'V'), + (0xAA37, 'X'), + (0xAA40, 'V'), + (0xAA4E, 'X'), + (0xAA50, 'V'), + (0xAA5A, 'X'), + (0xAA5C, 'V'), + (0xAAC3, 'X'), + (0xAADB, 'V'), + (0xAAF7, 'X'), + (0xAB01, 'V'), + (0xAB07, 'X'), + (0xAB09, 'V'), + (0xAB0F, 'X'), + (0xAB11, 'V'), + (0xAB17, 'X'), + (0xAB20, 'V'), + (0xAB27, 'X'), + (0xAB28, 'V'), + (0xAB2F, 'X'), + (0xAB30, 'V'), + (0xAB5C, 'M', u'ꜧ'), + (0xAB5D, 'M', u'ꬷ'), + (0xAB5E, 'M', u'ɫ'), + (0xAB5F, 'M', u'ꭒ'), + (0xAB60, 'V'), + (0xAB66, 'X'), + (0xAB70, 'M', u'Ꭰ'), + (0xAB71, 'M', u'Ꭱ'), + (0xAB72, 'M', u'Ꭲ'), + (0xAB73, 'M', u'Ꭳ'), + (0xAB74, 'M', u'Ꭴ'), + (0xAB75, 'M', u'Ꭵ'), + (0xAB76, 'M', u'Ꭶ'), + (0xAB77, 'M', u'Ꭷ'), + (0xAB78, 'M', u'Ꭸ'), + (0xAB79, 'M', u'Ꭹ'), + (0xAB7A, 'M', u'Ꭺ'), + ] + +def _seg_38(): + return [ + (0xAB7B, 'M', u'Ꭻ'), + (0xAB7C, 'M', u'Ꭼ'), + (0xAB7D, 'M', u'Ꭽ'), + (0xAB7E, 'M', u'Ꭾ'), + (0xAB7F, 'M', u'Ꭿ'), + (0xAB80, 'M', u'Ꮀ'), + (0xAB81, 'M', u'Ꮁ'), + (0xAB82, 'M', u'Ꮂ'), + (0xAB83, 'M', u'Ꮃ'), + (0xAB84, 'M', u'Ꮄ'), + (0xAB85, 'M', u'Ꮅ'), + (0xAB86, 'M', u'Ꮆ'), + (0xAB87, 'M', u'Ꮇ'), + (0xAB88, 'M', u'Ꮈ'), + (0xAB89, 'M', u'Ꮉ'), + (0xAB8A, 'M', u'Ꮊ'), + (0xAB8B, 'M', u'Ꮋ'), + (0xAB8C, 'M', u'Ꮌ'), + (0xAB8D, 'M', u'Ꮍ'), + (0xAB8E, 'M', u'Ꮎ'), + (0xAB8F, 'M', u'Ꮏ'), + (0xAB90, 'M', u'Ꮐ'), + (0xAB91, 'M', u'Ꮑ'), + (0xAB92, 'M', u'Ꮒ'), + (0xAB93, 'M', u'Ꮓ'), + (0xAB94, 'M', u'Ꮔ'), + (0xAB95, 'M', u'Ꮕ'), + (0xAB96, 'M', u'Ꮖ'), + (0xAB97, 'M', u'Ꮗ'), + (0xAB98, 'M', u'Ꮘ'), + (0xAB99, 'M', u'Ꮙ'), + (0xAB9A, 'M', u'Ꮚ'), + (0xAB9B, 'M', u'Ꮛ'), + (0xAB9C, 'M', u'Ꮜ'), + (0xAB9D, 'M', u'Ꮝ'), + (0xAB9E, 'M', u'Ꮞ'), + (0xAB9F, 'M', u'Ꮟ'), + (0xABA0, 'M', u'Ꮠ'), + (0xABA1, 'M', u'Ꮡ'), + (0xABA2, 'M', u'Ꮢ'), + (0xABA3, 'M', u'Ꮣ'), + (0xABA4, 'M', u'Ꮤ'), + (0xABA5, 'M', u'Ꮥ'), + (0xABA6, 'M', u'Ꮦ'), + (0xABA7, 'M', u'Ꮧ'), + (0xABA8, 'M', u'Ꮨ'), + (0xABA9, 'M', u'Ꮩ'), + (0xABAA, 'M', u'Ꮪ'), + (0xABAB, 'M', u'Ꮫ'), + (0xABAC, 'M', u'Ꮬ'), + (0xABAD, 'M', u'Ꮭ'), + (0xABAE, 'M', u'Ꮮ'), + (0xABAF, 'M', u'Ꮯ'), + (0xABB0, 'M', u'Ꮰ'), + (0xABB1, 'M', u'Ꮱ'), + (0xABB2, 'M', u'Ꮲ'), + (0xABB3, 'M', u'Ꮳ'), + (0xABB4, 'M', u'Ꮴ'), + (0xABB5, 'M', u'Ꮵ'), + (0xABB6, 'M', u'Ꮶ'), + (0xABB7, 'M', u'Ꮷ'), + (0xABB8, 'M', u'Ꮸ'), + (0xABB9, 'M', u'Ꮹ'), + (0xABBA, 'M', u'Ꮺ'), + (0xABBB, 'M', u'Ꮻ'), + (0xABBC, 'M', u'Ꮼ'), + (0xABBD, 'M', u'Ꮽ'), + (0xABBE, 'M', u'Ꮾ'), + (0xABBF, 'M', u'Ꮿ'), + (0xABC0, 'V'), + (0xABEE, 'X'), + (0xABF0, 'V'), + (0xABFA, 'X'), + (0xAC00, 'V'), + (0xD7A4, 'X'), + (0xD7B0, 'V'), + (0xD7C7, 'X'), + (0xD7CB, 'V'), + (0xD7FC, 'X'), + (0xF900, 'M', u'豈'), + (0xF901, 'M', u'更'), + (0xF902, 'M', u'車'), + (0xF903, 'M', u'賈'), + (0xF904, 'M', u'滑'), + (0xF905, 'M', u'串'), + (0xF906, 'M', u'句'), + (0xF907, 'M', u'龜'), + (0xF909, 'M', u'契'), + (0xF90A, 'M', u'金'), + (0xF90B, 'M', u'喇'), + (0xF90C, 'M', u'奈'), + (0xF90D, 'M', u'懶'), + (0xF90E, 'M', u'癩'), + (0xF90F, 'M', u'羅'), + (0xF910, 'M', u'蘿'), + (0xF911, 'M', u'螺'), + (0xF912, 'M', u'裸'), + (0xF913, 'M', u'邏'), + (0xF914, 'M', u'樂'), + (0xF915, 'M', u'洛'), + ] + +def _seg_39(): + return [ + (0xF916, 'M', u'烙'), + (0xF917, 'M', u'珞'), + (0xF918, 'M', u'落'), + (0xF919, 'M', u'酪'), + (0xF91A, 'M', u'駱'), + (0xF91B, 'M', u'亂'), + (0xF91C, 'M', u'卵'), + (0xF91D, 'M', u'欄'), + (0xF91E, 'M', u'爛'), + (0xF91F, 'M', u'蘭'), + (0xF920, 'M', u'鸞'), + (0xF921, 'M', u'嵐'), + (0xF922, 'M', u'濫'), + (0xF923, 'M', u'藍'), + (0xF924, 'M', u'襤'), + (0xF925, 'M', u'拉'), + (0xF926, 'M', u'臘'), + (0xF927, 'M', u'蠟'), + (0xF928, 'M', u'廊'), + (0xF929, 'M', u'朗'), + (0xF92A, 'M', u'浪'), + (0xF92B, 'M', u'狼'), + (0xF92C, 'M', u'郎'), + (0xF92D, 'M', u'來'), + (0xF92E, 'M', u'冷'), + (0xF92F, 'M', u'勞'), + (0xF930, 'M', u'擄'), + (0xF931, 'M', u'櫓'), + (0xF932, 'M', u'爐'), + (0xF933, 'M', u'盧'), + (0xF934, 'M', u'老'), + (0xF935, 'M', u'蘆'), + (0xF936, 'M', u'虜'), + (0xF937, 'M', u'路'), + (0xF938, 'M', u'露'), + (0xF939, 'M', u'魯'), + (0xF93A, 'M', u'鷺'), + (0xF93B, 'M', u'碌'), + (0xF93C, 'M', u'祿'), + (0xF93D, 'M', u'綠'), + (0xF93E, 'M', u'菉'), + (0xF93F, 'M', u'錄'), + (0xF940, 'M', u'鹿'), + (0xF941, 'M', u'論'), + (0xF942, 'M', u'壟'), + (0xF943, 'M', u'弄'), + (0xF944, 'M', u'籠'), + (0xF945, 'M', u'聾'), + (0xF946, 'M', u'牢'), + (0xF947, 'M', u'磊'), + (0xF948, 'M', u'賂'), + (0xF949, 'M', u'雷'), + (0xF94A, 'M', u'壘'), + (0xF94B, 'M', u'屢'), + (0xF94C, 'M', u'樓'), + (0xF94D, 'M', u'淚'), + (0xF94E, 'M', u'漏'), + (0xF94F, 'M', u'累'), + (0xF950, 'M', u'縷'), + (0xF951, 'M', u'陋'), + (0xF952, 'M', u'勒'), + (0xF953, 'M', u'肋'), + (0xF954, 'M', u'凜'), + (0xF955, 'M', u'凌'), + (0xF956, 'M', u'稜'), + (0xF957, 'M', u'綾'), + (0xF958, 'M', u'菱'), + (0xF959, 'M', u'陵'), + (0xF95A, 'M', u'讀'), + (0xF95B, 'M', u'拏'), + (0xF95C, 'M', u'樂'), + (0xF95D, 'M', u'諾'), + (0xF95E, 'M', u'丹'), + (0xF95F, 'M', u'寧'), + (0xF960, 'M', u'怒'), + (0xF961, 'M', u'率'), + (0xF962, 'M', u'異'), + (0xF963, 'M', u'北'), + (0xF964, 'M', u'磻'), + (0xF965, 'M', u'便'), + (0xF966, 'M', u'復'), + (0xF967, 'M', u'不'), + (0xF968, 'M', u'泌'), + (0xF969, 'M', u'數'), + (0xF96A, 'M', u'索'), + (0xF96B, 'M', u'參'), + (0xF96C, 'M', u'塞'), + (0xF96D, 'M', u'省'), + (0xF96E, 'M', u'葉'), + (0xF96F, 'M', u'說'), + (0xF970, 'M', u'殺'), + (0xF971, 'M', u'辰'), + (0xF972, 'M', u'沈'), + (0xF973, 'M', u'拾'), + (0xF974, 'M', u'若'), + (0xF975, 'M', u'掠'), + (0xF976, 'M', u'略'), + (0xF977, 'M', u'亮'), + (0xF978, 'M', u'兩'), + (0xF979, 'M', u'凉'), + ] + +def _seg_40(): + return [ + (0xF97A, 'M', u'梁'), + (0xF97B, 'M', u'糧'), + (0xF97C, 'M', u'良'), + (0xF97D, 'M', u'諒'), + (0xF97E, 'M', u'量'), + (0xF97F, 'M', u'勵'), + (0xF980, 'M', u'呂'), + (0xF981, 'M', u'女'), + (0xF982, 'M', u'廬'), + (0xF983, 'M', u'旅'), + (0xF984, 'M', u'濾'), + (0xF985, 'M', u'礪'), + (0xF986, 'M', u'閭'), + (0xF987, 'M', u'驪'), + (0xF988, 'M', u'麗'), + (0xF989, 'M', u'黎'), + (0xF98A, 'M', u'力'), + (0xF98B, 'M', u'曆'), + (0xF98C, 'M', u'歷'), + (0xF98D, 'M', u'轢'), + (0xF98E, 'M', u'年'), + (0xF98F, 'M', u'憐'), + (0xF990, 'M', u'戀'), + (0xF991, 'M', u'撚'), + (0xF992, 'M', u'漣'), + (0xF993, 'M', u'煉'), + (0xF994, 'M', u'璉'), + (0xF995, 'M', u'秊'), + (0xF996, 'M', u'練'), + (0xF997, 'M', u'聯'), + (0xF998, 'M', u'輦'), + (0xF999, 'M', u'蓮'), + (0xF99A, 'M', u'連'), + (0xF99B, 'M', u'鍊'), + (0xF99C, 'M', u'列'), + (0xF99D, 'M', u'劣'), + (0xF99E, 'M', u'咽'), + (0xF99F, 'M', u'烈'), + (0xF9A0, 'M', u'裂'), + (0xF9A1, 'M', u'說'), + (0xF9A2, 'M', u'廉'), + (0xF9A3, 'M', u'念'), + (0xF9A4, 'M', u'捻'), + (0xF9A5, 'M', u'殮'), + (0xF9A6, 'M', u'簾'), + (0xF9A7, 'M', u'獵'), + (0xF9A8, 'M', u'令'), + (0xF9A9, 'M', u'囹'), + (0xF9AA, 'M', u'寧'), + (0xF9AB, 'M', u'嶺'), + (0xF9AC, 'M', u'怜'), + (0xF9AD, 'M', u'玲'), + (0xF9AE, 'M', u'瑩'), + (0xF9AF, 'M', u'羚'), + (0xF9B0, 'M', u'聆'), + (0xF9B1, 'M', u'鈴'), + (0xF9B2, 'M', u'零'), + (0xF9B3, 'M', u'靈'), + (0xF9B4, 'M', u'領'), + (0xF9B5, 'M', u'例'), + (0xF9B6, 'M', u'禮'), + (0xF9B7, 'M', u'醴'), + (0xF9B8, 'M', u'隸'), + (0xF9B9, 'M', u'惡'), + (0xF9BA, 'M', u'了'), + (0xF9BB, 'M', u'僚'), + (0xF9BC, 'M', u'寮'), + (0xF9BD, 'M', u'尿'), + (0xF9BE, 'M', u'料'), + (0xF9BF, 'M', u'樂'), + (0xF9C0, 'M', u'燎'), + (0xF9C1, 'M', u'療'), + (0xF9C2, 'M', u'蓼'), + (0xF9C3, 'M', u'遼'), + (0xF9C4, 'M', u'龍'), + (0xF9C5, 'M', u'暈'), + (0xF9C6, 'M', u'阮'), + (0xF9C7, 'M', u'劉'), + (0xF9C8, 'M', u'杻'), + (0xF9C9, 'M', u'柳'), + (0xF9CA, 'M', u'流'), + (0xF9CB, 'M', u'溜'), + (0xF9CC, 'M', u'琉'), + (0xF9CD, 'M', u'留'), + (0xF9CE, 'M', u'硫'), + (0xF9CF, 'M', u'紐'), + (0xF9D0, 'M', u'類'), + (0xF9D1, 'M', u'六'), + (0xF9D2, 'M', u'戮'), + (0xF9D3, 'M', u'陸'), + (0xF9D4, 'M', u'倫'), + (0xF9D5, 'M', u'崙'), + (0xF9D6, 'M', u'淪'), + (0xF9D7, 'M', u'輪'), + (0xF9D8, 'M', u'律'), + (0xF9D9, 'M', u'慄'), + (0xF9DA, 'M', u'栗'), + (0xF9DB, 'M', u'率'), + (0xF9DC, 'M', u'隆'), + (0xF9DD, 'M', u'利'), + ] + +def _seg_41(): + return [ + (0xF9DE, 'M', u'吏'), + (0xF9DF, 'M', u'履'), + (0xF9E0, 'M', u'易'), + (0xF9E1, 'M', u'李'), + (0xF9E2, 'M', u'梨'), + (0xF9E3, 'M', u'泥'), + (0xF9E4, 'M', u'理'), + (0xF9E5, 'M', u'痢'), + (0xF9E6, 'M', u'罹'), + (0xF9E7, 'M', u'裏'), + (0xF9E8, 'M', u'裡'), + (0xF9E9, 'M', u'里'), + (0xF9EA, 'M', u'離'), + (0xF9EB, 'M', u'匿'), + (0xF9EC, 'M', u'溺'), + (0xF9ED, 'M', u'吝'), + (0xF9EE, 'M', u'燐'), + (0xF9EF, 'M', u'璘'), + (0xF9F0, 'M', u'藺'), + (0xF9F1, 'M', u'隣'), + (0xF9F2, 'M', u'鱗'), + (0xF9F3, 'M', u'麟'), + (0xF9F4, 'M', u'林'), + (0xF9F5, 'M', u'淋'), + (0xF9F6, 'M', u'臨'), + (0xF9F7, 'M', u'立'), + (0xF9F8, 'M', u'笠'), + (0xF9F9, 'M', u'粒'), + (0xF9FA, 'M', u'狀'), + (0xF9FB, 'M', u'炙'), + (0xF9FC, 'M', u'識'), + (0xF9FD, 'M', u'什'), + (0xF9FE, 'M', u'茶'), + (0xF9FF, 'M', u'刺'), + (0xFA00, 'M', u'切'), + (0xFA01, 'M', u'度'), + (0xFA02, 'M', u'拓'), + (0xFA03, 'M', u'糖'), + (0xFA04, 'M', u'宅'), + (0xFA05, 'M', u'洞'), + (0xFA06, 'M', u'暴'), + (0xFA07, 'M', u'輻'), + (0xFA08, 'M', u'行'), + (0xFA09, 'M', u'降'), + (0xFA0A, 'M', u'見'), + (0xFA0B, 'M', u'廓'), + (0xFA0C, 'M', u'兀'), + (0xFA0D, 'M', u'嗀'), + (0xFA0E, 'V'), + (0xFA10, 'M', u'塚'), + (0xFA11, 'V'), + (0xFA12, 'M', u'晴'), + (0xFA13, 'V'), + (0xFA15, 'M', u'凞'), + (0xFA16, 'M', u'猪'), + (0xFA17, 'M', u'益'), + (0xFA18, 'M', u'礼'), + (0xFA19, 'M', u'神'), + (0xFA1A, 'M', u'祥'), + (0xFA1B, 'M', u'福'), + (0xFA1C, 'M', u'靖'), + (0xFA1D, 'M', u'精'), + (0xFA1E, 'M', u'羽'), + (0xFA1F, 'V'), + (0xFA20, 'M', u'蘒'), + (0xFA21, 'V'), + (0xFA22, 'M', u'諸'), + (0xFA23, 'V'), + (0xFA25, 'M', u'逸'), + (0xFA26, 'M', u'都'), + (0xFA27, 'V'), + (0xFA2A, 'M', u'飯'), + (0xFA2B, 'M', u'飼'), + (0xFA2C, 'M', u'館'), + (0xFA2D, 'M', u'鶴'), + (0xFA2E, 'M', u'郞'), + (0xFA2F, 'M', u'隷'), + (0xFA30, 'M', u'侮'), + (0xFA31, 'M', u'僧'), + (0xFA32, 'M', u'免'), + (0xFA33, 'M', u'勉'), + (0xFA34, 'M', u'勤'), + (0xFA35, 'M', u'卑'), + (0xFA36, 'M', u'喝'), + (0xFA37, 'M', u'嘆'), + (0xFA38, 'M', u'器'), + (0xFA39, 'M', u'塀'), + (0xFA3A, 'M', u'墨'), + (0xFA3B, 'M', u'層'), + (0xFA3C, 'M', u'屮'), + (0xFA3D, 'M', u'悔'), + (0xFA3E, 'M', u'慨'), + (0xFA3F, 'M', u'憎'), + (0xFA40, 'M', u'懲'), + (0xFA41, 'M', u'敏'), + (0xFA42, 'M', u'既'), + (0xFA43, 'M', u'暑'), + (0xFA44, 'M', u'梅'), + (0xFA45, 'M', u'海'), + (0xFA46, 'M', u'渚'), + ] + +def _seg_42(): + return [ + (0xFA47, 'M', u'漢'), + (0xFA48, 'M', u'煮'), + (0xFA49, 'M', u'爫'), + (0xFA4A, 'M', u'琢'), + (0xFA4B, 'M', u'碑'), + (0xFA4C, 'M', u'社'), + (0xFA4D, 'M', u'祉'), + (0xFA4E, 'M', u'祈'), + (0xFA4F, 'M', u'祐'), + (0xFA50, 'M', u'祖'), + (0xFA51, 'M', u'祝'), + (0xFA52, 'M', u'禍'), + (0xFA53, 'M', u'禎'), + (0xFA54, 'M', u'穀'), + (0xFA55, 'M', u'突'), + (0xFA56, 'M', u'節'), + (0xFA57, 'M', u'練'), + (0xFA58, 'M', u'縉'), + (0xFA59, 'M', u'繁'), + (0xFA5A, 'M', u'署'), + (0xFA5B, 'M', u'者'), + (0xFA5C, 'M', u'臭'), + (0xFA5D, 'M', u'艹'), + (0xFA5F, 'M', u'著'), + (0xFA60, 'M', u'褐'), + (0xFA61, 'M', u'視'), + (0xFA62, 'M', u'謁'), + (0xFA63, 'M', u'謹'), + (0xFA64, 'M', u'賓'), + (0xFA65, 'M', u'贈'), + (0xFA66, 'M', u'辶'), + (0xFA67, 'M', u'逸'), + (0xFA68, 'M', u'難'), + (0xFA69, 'M', u'響'), + (0xFA6A, 'M', u'頻'), + (0xFA6B, 'M', u'恵'), + (0xFA6C, 'M', u'𤋮'), + (0xFA6D, 'M', u'舘'), + (0xFA6E, 'X'), + (0xFA70, 'M', u'並'), + (0xFA71, 'M', u'况'), + (0xFA72, 'M', u'全'), + (0xFA73, 'M', u'侀'), + (0xFA74, 'M', u'充'), + (0xFA75, 'M', u'冀'), + (0xFA76, 'M', u'勇'), + (0xFA77, 'M', u'勺'), + (0xFA78, 'M', u'喝'), + (0xFA79, 'M', u'啕'), + (0xFA7A, 'M', u'喙'), + (0xFA7B, 'M', u'嗢'), + (0xFA7C, 'M', u'塚'), + (0xFA7D, 'M', u'墳'), + (0xFA7E, 'M', u'奄'), + (0xFA7F, 'M', u'奔'), + (0xFA80, 'M', u'婢'), + (0xFA81, 'M', u'嬨'), + (0xFA82, 'M', u'廒'), + (0xFA83, 'M', u'廙'), + (0xFA84, 'M', u'彩'), + (0xFA85, 'M', u'徭'), + (0xFA86, 'M', u'惘'), + (0xFA87, 'M', u'慎'), + (0xFA88, 'M', u'愈'), + (0xFA89, 'M', u'憎'), + (0xFA8A, 'M', u'慠'), + (0xFA8B, 'M', u'懲'), + (0xFA8C, 'M', u'戴'), + (0xFA8D, 'M', u'揄'), + (0xFA8E, 'M', u'搜'), + (0xFA8F, 'M', u'摒'), + (0xFA90, 'M', u'敖'), + (0xFA91, 'M', u'晴'), + (0xFA92, 'M', u'朗'), + (0xFA93, 'M', u'望'), + (0xFA94, 'M', u'杖'), + (0xFA95, 'M', u'歹'), + (0xFA96, 'M', u'殺'), + (0xFA97, 'M', u'流'), + (0xFA98, 'M', u'滛'), + (0xFA99, 'M', u'滋'), + (0xFA9A, 'M', u'漢'), + (0xFA9B, 'M', u'瀞'), + (0xFA9C, 'M', u'煮'), + (0xFA9D, 'M', u'瞧'), + (0xFA9E, 'M', u'爵'), + (0xFA9F, 'M', u'犯'), + (0xFAA0, 'M', u'猪'), + (0xFAA1, 'M', u'瑱'), + (0xFAA2, 'M', u'甆'), + (0xFAA3, 'M', u'画'), + (0xFAA4, 'M', u'瘝'), + (0xFAA5, 'M', u'瘟'), + (0xFAA6, 'M', u'益'), + (0xFAA7, 'M', u'盛'), + (0xFAA8, 'M', u'直'), + (0xFAA9, 'M', u'睊'), + (0xFAAA, 'M', u'着'), + (0xFAAB, 'M', u'磌'), + (0xFAAC, 'M', u'窱'), + ] + +def _seg_43(): + return [ + (0xFAAD, 'M', u'節'), + (0xFAAE, 'M', u'类'), + (0xFAAF, 'M', u'絛'), + (0xFAB0, 'M', u'練'), + (0xFAB1, 'M', u'缾'), + (0xFAB2, 'M', u'者'), + (0xFAB3, 'M', u'荒'), + (0xFAB4, 'M', u'華'), + (0xFAB5, 'M', u'蝹'), + (0xFAB6, 'M', u'襁'), + (0xFAB7, 'M', u'覆'), + (0xFAB8, 'M', u'視'), + (0xFAB9, 'M', u'調'), + (0xFABA, 'M', u'諸'), + (0xFABB, 'M', u'請'), + (0xFABC, 'M', u'謁'), + (0xFABD, 'M', u'諾'), + (0xFABE, 'M', u'諭'), + (0xFABF, 'M', u'謹'), + (0xFAC0, 'M', u'變'), + (0xFAC1, 'M', u'贈'), + (0xFAC2, 'M', u'輸'), + (0xFAC3, 'M', u'遲'), + (0xFAC4, 'M', u'醙'), + (0xFAC5, 'M', u'鉶'), + (0xFAC6, 'M', u'陼'), + (0xFAC7, 'M', u'難'), + (0xFAC8, 'M', u'靖'), + (0xFAC9, 'M', u'韛'), + (0xFACA, 'M', u'響'), + (0xFACB, 'M', u'頋'), + (0xFACC, 'M', u'頻'), + (0xFACD, 'M', u'鬒'), + (0xFACE, 'M', u'龜'), + (0xFACF, 'M', u'𢡊'), + (0xFAD0, 'M', u'𢡄'), + (0xFAD1, 'M', u'𣏕'), + (0xFAD2, 'M', u'㮝'), + (0xFAD3, 'M', u'䀘'), + (0xFAD4, 'M', u'䀹'), + (0xFAD5, 'M', u'𥉉'), + (0xFAD6, 'M', u'𥳐'), + (0xFAD7, 'M', u'𧻓'), + (0xFAD8, 'M', u'齃'), + (0xFAD9, 'M', u'龎'), + (0xFADA, 'X'), + (0xFB00, 'M', u'ff'), + (0xFB01, 'M', u'fi'), + (0xFB02, 'M', u'fl'), + (0xFB03, 'M', u'ffi'), + (0xFB04, 'M', u'ffl'), + (0xFB05, 'M', u'st'), + (0xFB07, 'X'), + (0xFB13, 'M', u'մն'), + (0xFB14, 'M', u'մե'), + (0xFB15, 'M', u'մի'), + (0xFB16, 'M', u'վն'), + (0xFB17, 'M', u'մխ'), + (0xFB18, 'X'), + (0xFB1D, 'M', u'יִ'), + (0xFB1E, 'V'), + (0xFB1F, 'M', u'ײַ'), + (0xFB20, 'M', u'ע'), + (0xFB21, 'M', u'א'), + (0xFB22, 'M', u'ד'), + (0xFB23, 'M', u'ה'), + (0xFB24, 'M', u'כ'), + (0xFB25, 'M', u'ל'), + (0xFB26, 'M', u'ם'), + (0xFB27, 'M', u'ר'), + (0xFB28, 'M', u'ת'), + (0xFB29, '3', u'+'), + (0xFB2A, 'M', u'שׁ'), + (0xFB2B, 'M', u'שׂ'), + (0xFB2C, 'M', u'שּׁ'), + (0xFB2D, 'M', u'שּׂ'), + (0xFB2E, 'M', u'אַ'), + (0xFB2F, 'M', u'אָ'), + (0xFB30, 'M', u'אּ'), + (0xFB31, 'M', u'בּ'), + (0xFB32, 'M', u'גּ'), + (0xFB33, 'M', u'דּ'), + (0xFB34, 'M', u'הּ'), + (0xFB35, 'M', u'וּ'), + (0xFB36, 'M', u'זּ'), + (0xFB37, 'X'), + (0xFB38, 'M', u'טּ'), + (0xFB39, 'M', u'יּ'), + (0xFB3A, 'M', u'ךּ'), + (0xFB3B, 'M', u'כּ'), + (0xFB3C, 'M', u'לּ'), + (0xFB3D, 'X'), + (0xFB3E, 'M', u'מּ'), + (0xFB3F, 'X'), + (0xFB40, 'M', u'נּ'), + (0xFB41, 'M', u'סּ'), + (0xFB42, 'X'), + (0xFB43, 'M', u'ףּ'), + (0xFB44, 'M', u'פּ'), + (0xFB45, 'X'), + ] + +def _seg_44(): + return [ + (0xFB46, 'M', u'צּ'), + (0xFB47, 'M', u'קּ'), + (0xFB48, 'M', u'רּ'), + (0xFB49, 'M', u'שּ'), + (0xFB4A, 'M', u'תּ'), + (0xFB4B, 'M', u'וֹ'), + (0xFB4C, 'M', u'בֿ'), + (0xFB4D, 'M', u'כֿ'), + (0xFB4E, 'M', u'פֿ'), + (0xFB4F, 'M', u'אל'), + (0xFB50, 'M', u'ٱ'), + (0xFB52, 'M', u'ٻ'), + (0xFB56, 'M', u'پ'), + (0xFB5A, 'M', u'ڀ'), + (0xFB5E, 'M', u'ٺ'), + (0xFB62, 'M', u'ٿ'), + (0xFB66, 'M', u'ٹ'), + (0xFB6A, 'M', u'ڤ'), + (0xFB6E, 'M', u'ڦ'), + (0xFB72, 'M', u'ڄ'), + (0xFB76, 'M', u'ڃ'), + (0xFB7A, 'M', u'چ'), + (0xFB7E, 'M', u'ڇ'), + (0xFB82, 'M', u'ڍ'), + (0xFB84, 'M', u'ڌ'), + (0xFB86, 'M', u'ڎ'), + (0xFB88, 'M', u'ڈ'), + (0xFB8A, 'M', u'ژ'), + (0xFB8C, 'M', u'ڑ'), + (0xFB8E, 'M', u'ک'), + (0xFB92, 'M', u'گ'), + (0xFB96, 'M', u'ڳ'), + (0xFB9A, 'M', u'ڱ'), + (0xFB9E, 'M', u'ں'), + (0xFBA0, 'M', u'ڻ'), + (0xFBA4, 'M', u'ۀ'), + (0xFBA6, 'M', u'ہ'), + (0xFBAA, 'M', u'ھ'), + (0xFBAE, 'M', u'ے'), + (0xFBB0, 'M', u'ۓ'), + (0xFBB2, 'V'), + (0xFBC2, 'X'), + (0xFBD3, 'M', u'ڭ'), + (0xFBD7, 'M', u'ۇ'), + (0xFBD9, 'M', u'ۆ'), + (0xFBDB, 'M', u'ۈ'), + (0xFBDD, 'M', u'ۇٴ'), + (0xFBDE, 'M', u'ۋ'), + (0xFBE0, 'M', u'ۅ'), + (0xFBE2, 'M', u'ۉ'), + (0xFBE4, 'M', u'ې'), + (0xFBE8, 'M', u'ى'), + (0xFBEA, 'M', u'ئا'), + (0xFBEC, 'M', u'ئە'), + (0xFBEE, 'M', u'ئو'), + (0xFBF0, 'M', u'ئۇ'), + (0xFBF2, 'M', u'ئۆ'), + (0xFBF4, 'M', u'ئۈ'), + (0xFBF6, 'M', u'ئې'), + (0xFBF9, 'M', u'ئى'), + (0xFBFC, 'M', u'ی'), + (0xFC00, 'M', u'ئج'), + (0xFC01, 'M', u'ئح'), + (0xFC02, 'M', u'ئم'), + (0xFC03, 'M', u'ئى'), + (0xFC04, 'M', u'ئي'), + (0xFC05, 'M', u'بج'), + (0xFC06, 'M', u'بح'), + (0xFC07, 'M', u'بخ'), + (0xFC08, 'M', u'بم'), + (0xFC09, 'M', u'بى'), + (0xFC0A, 'M', u'بي'), + (0xFC0B, 'M', u'تج'), + (0xFC0C, 'M', u'تح'), + (0xFC0D, 'M', u'تخ'), + (0xFC0E, 'M', u'تم'), + (0xFC0F, 'M', u'تى'), + (0xFC10, 'M', u'تي'), + (0xFC11, 'M', u'ثج'), + (0xFC12, 'M', u'ثم'), + (0xFC13, 'M', u'ثى'), + (0xFC14, 'M', u'ثي'), + (0xFC15, 'M', u'جح'), + (0xFC16, 'M', u'جم'), + (0xFC17, 'M', u'حج'), + (0xFC18, 'M', u'حم'), + (0xFC19, 'M', u'خج'), + (0xFC1A, 'M', u'خح'), + (0xFC1B, 'M', u'خم'), + (0xFC1C, 'M', u'سج'), + (0xFC1D, 'M', u'سح'), + (0xFC1E, 'M', u'سخ'), + (0xFC1F, 'M', u'سم'), + (0xFC20, 'M', u'صح'), + (0xFC21, 'M', u'صم'), + (0xFC22, 'M', u'ضج'), + (0xFC23, 'M', u'ضح'), + (0xFC24, 'M', u'ضخ'), + (0xFC25, 'M', u'ضم'), + (0xFC26, 'M', u'طح'), + ] + +def _seg_45(): + return [ + (0xFC27, 'M', u'طم'), + (0xFC28, 'M', u'ظم'), + (0xFC29, 'M', u'عج'), + (0xFC2A, 'M', u'عم'), + (0xFC2B, 'M', u'غج'), + (0xFC2C, 'M', u'غم'), + (0xFC2D, 'M', u'فج'), + (0xFC2E, 'M', u'فح'), + (0xFC2F, 'M', u'فخ'), + (0xFC30, 'M', u'فم'), + (0xFC31, 'M', u'فى'), + (0xFC32, 'M', u'في'), + (0xFC33, 'M', u'قح'), + (0xFC34, 'M', u'قم'), + (0xFC35, 'M', u'قى'), + (0xFC36, 'M', u'قي'), + (0xFC37, 'M', u'كا'), + (0xFC38, 'M', u'كج'), + (0xFC39, 'M', u'كح'), + (0xFC3A, 'M', u'كخ'), + (0xFC3B, 'M', u'كل'), + (0xFC3C, 'M', u'كم'), + (0xFC3D, 'M', u'كى'), + (0xFC3E, 'M', u'كي'), + (0xFC3F, 'M', u'لج'), + (0xFC40, 'M', u'لح'), + (0xFC41, 'M', u'لخ'), + (0xFC42, 'M', u'لم'), + (0xFC43, 'M', u'لى'), + (0xFC44, 'M', u'لي'), + (0xFC45, 'M', u'مج'), + (0xFC46, 'M', u'مح'), + (0xFC47, 'M', u'مخ'), + (0xFC48, 'M', u'مم'), + (0xFC49, 'M', u'مى'), + (0xFC4A, 'M', u'مي'), + (0xFC4B, 'M', u'نج'), + (0xFC4C, 'M', u'نح'), + (0xFC4D, 'M', u'نخ'), + (0xFC4E, 'M', u'نم'), + (0xFC4F, 'M', u'نى'), + (0xFC50, 'M', u'ني'), + (0xFC51, 'M', u'هج'), + (0xFC52, 'M', u'هم'), + (0xFC53, 'M', u'هى'), + (0xFC54, 'M', u'هي'), + (0xFC55, 'M', u'يج'), + (0xFC56, 'M', u'يح'), + (0xFC57, 'M', u'يخ'), + (0xFC58, 'M', u'يم'), + (0xFC59, 'M', u'يى'), + (0xFC5A, 'M', u'يي'), + (0xFC5B, 'M', u'ذٰ'), + (0xFC5C, 'M', u'رٰ'), + (0xFC5D, 'M', u'ىٰ'), + (0xFC5E, '3', u' ٌّ'), + (0xFC5F, '3', u' ٍّ'), + (0xFC60, '3', u' َّ'), + (0xFC61, '3', u' ُّ'), + (0xFC62, '3', u' ِّ'), + (0xFC63, '3', u' ّٰ'), + (0xFC64, 'M', u'ئر'), + (0xFC65, 'M', u'ئز'), + (0xFC66, 'M', u'ئم'), + (0xFC67, 'M', u'ئن'), + (0xFC68, 'M', u'ئى'), + (0xFC69, 'M', u'ئي'), + (0xFC6A, 'M', u'بر'), + (0xFC6B, 'M', u'بز'), + (0xFC6C, 'M', u'بم'), + (0xFC6D, 'M', u'بن'), + (0xFC6E, 'M', u'بى'), + (0xFC6F, 'M', u'بي'), + (0xFC70, 'M', u'تر'), + (0xFC71, 'M', u'تز'), + (0xFC72, 'M', u'تم'), + (0xFC73, 'M', u'تن'), + (0xFC74, 'M', u'تى'), + (0xFC75, 'M', u'تي'), + (0xFC76, 'M', u'ثر'), + (0xFC77, 'M', u'ثز'), + (0xFC78, 'M', u'ثم'), + (0xFC79, 'M', u'ثن'), + (0xFC7A, 'M', u'ثى'), + (0xFC7B, 'M', u'ثي'), + (0xFC7C, 'M', u'فى'), + (0xFC7D, 'M', u'في'), + (0xFC7E, 'M', u'قى'), + (0xFC7F, 'M', u'قي'), + (0xFC80, 'M', u'كا'), + (0xFC81, 'M', u'كل'), + (0xFC82, 'M', u'كم'), + (0xFC83, 'M', u'كى'), + (0xFC84, 'M', u'كي'), + (0xFC85, 'M', u'لم'), + (0xFC86, 'M', u'لى'), + (0xFC87, 'M', u'لي'), + (0xFC88, 'M', u'ما'), + (0xFC89, 'M', u'مم'), + (0xFC8A, 'M', u'نر'), + ] + +def _seg_46(): + return [ + (0xFC8B, 'M', u'نز'), + (0xFC8C, 'M', u'نم'), + (0xFC8D, 'M', u'نن'), + (0xFC8E, 'M', u'نى'), + (0xFC8F, 'M', u'ني'), + (0xFC90, 'M', u'ىٰ'), + (0xFC91, 'M', u'ير'), + (0xFC92, 'M', u'يز'), + (0xFC93, 'M', u'يم'), + (0xFC94, 'M', u'ين'), + (0xFC95, 'M', u'يى'), + (0xFC96, 'M', u'يي'), + (0xFC97, 'M', u'ئج'), + (0xFC98, 'M', u'ئح'), + (0xFC99, 'M', u'ئخ'), + (0xFC9A, 'M', u'ئم'), + (0xFC9B, 'M', u'ئه'), + (0xFC9C, 'M', u'بج'), + (0xFC9D, 'M', u'بح'), + (0xFC9E, 'M', u'بخ'), + (0xFC9F, 'M', u'بم'), + (0xFCA0, 'M', u'به'), + (0xFCA1, 'M', u'تج'), + (0xFCA2, 'M', u'تح'), + (0xFCA3, 'M', u'تخ'), + (0xFCA4, 'M', u'تم'), + (0xFCA5, 'M', u'ته'), + (0xFCA6, 'M', u'ثم'), + (0xFCA7, 'M', u'جح'), + (0xFCA8, 'M', u'جم'), + (0xFCA9, 'M', u'حج'), + (0xFCAA, 'M', u'حم'), + (0xFCAB, 'M', u'خج'), + (0xFCAC, 'M', u'خم'), + (0xFCAD, 'M', u'سج'), + (0xFCAE, 'M', u'سح'), + (0xFCAF, 'M', u'سخ'), + (0xFCB0, 'M', u'سم'), + (0xFCB1, 'M', u'صح'), + (0xFCB2, 'M', u'صخ'), + (0xFCB3, 'M', u'صم'), + (0xFCB4, 'M', u'ضج'), + (0xFCB5, 'M', u'ضح'), + (0xFCB6, 'M', u'ضخ'), + (0xFCB7, 'M', u'ضم'), + (0xFCB8, 'M', u'طح'), + (0xFCB9, 'M', u'ظم'), + (0xFCBA, 'M', u'عج'), + (0xFCBB, 'M', u'عم'), + (0xFCBC, 'M', u'غج'), + (0xFCBD, 'M', u'غم'), + (0xFCBE, 'M', u'فج'), + (0xFCBF, 'M', u'فح'), + (0xFCC0, 'M', u'فخ'), + (0xFCC1, 'M', u'فم'), + (0xFCC2, 'M', u'قح'), + (0xFCC3, 'M', u'قم'), + (0xFCC4, 'M', u'كج'), + (0xFCC5, 'M', u'كح'), + (0xFCC6, 'M', u'كخ'), + (0xFCC7, 'M', u'كل'), + (0xFCC8, 'M', u'كم'), + (0xFCC9, 'M', u'لج'), + (0xFCCA, 'M', u'لح'), + (0xFCCB, 'M', u'لخ'), + (0xFCCC, 'M', u'لم'), + (0xFCCD, 'M', u'له'), + (0xFCCE, 'M', u'مج'), + (0xFCCF, 'M', u'مح'), + (0xFCD0, 'M', u'مخ'), + (0xFCD1, 'M', u'مم'), + (0xFCD2, 'M', u'نج'), + (0xFCD3, 'M', u'نح'), + (0xFCD4, 'M', u'نخ'), + (0xFCD5, 'M', u'نم'), + (0xFCD6, 'M', u'نه'), + (0xFCD7, 'M', u'هج'), + (0xFCD8, 'M', u'هم'), + (0xFCD9, 'M', u'هٰ'), + (0xFCDA, 'M', u'يج'), + (0xFCDB, 'M', u'يح'), + (0xFCDC, 'M', u'يخ'), + (0xFCDD, 'M', u'يم'), + (0xFCDE, 'M', u'يه'), + (0xFCDF, 'M', u'ئم'), + (0xFCE0, 'M', u'ئه'), + (0xFCE1, 'M', u'بم'), + (0xFCE2, 'M', u'به'), + (0xFCE3, 'M', u'تم'), + (0xFCE4, 'M', u'ته'), + (0xFCE5, 'M', u'ثم'), + (0xFCE6, 'M', u'ثه'), + (0xFCE7, 'M', u'سم'), + (0xFCE8, 'M', u'سه'), + (0xFCE9, 'M', u'شم'), + (0xFCEA, 'M', u'شه'), + (0xFCEB, 'M', u'كل'), + (0xFCEC, 'M', u'كم'), + (0xFCED, 'M', u'لم'), + (0xFCEE, 'M', u'نم'), + ] + +def _seg_47(): + return [ + (0xFCEF, 'M', u'نه'), + (0xFCF0, 'M', u'يم'), + (0xFCF1, 'M', u'يه'), + (0xFCF2, 'M', u'ـَّ'), + (0xFCF3, 'M', u'ـُّ'), + (0xFCF4, 'M', u'ـِّ'), + (0xFCF5, 'M', u'طى'), + (0xFCF6, 'M', u'طي'), + (0xFCF7, 'M', u'عى'), + (0xFCF8, 'M', u'عي'), + (0xFCF9, 'M', u'غى'), + (0xFCFA, 'M', u'غي'), + (0xFCFB, 'M', u'سى'), + (0xFCFC, 'M', u'سي'), + (0xFCFD, 'M', u'شى'), + (0xFCFE, 'M', u'شي'), + (0xFCFF, 'M', u'حى'), + (0xFD00, 'M', u'حي'), + (0xFD01, 'M', u'جى'), + (0xFD02, 'M', u'جي'), + (0xFD03, 'M', u'خى'), + (0xFD04, 'M', u'خي'), + (0xFD05, 'M', u'صى'), + (0xFD06, 'M', u'صي'), + (0xFD07, 'M', u'ضى'), + (0xFD08, 'M', u'ضي'), + (0xFD09, 'M', u'شج'), + (0xFD0A, 'M', u'شح'), + (0xFD0B, 'M', u'شخ'), + (0xFD0C, 'M', u'شم'), + (0xFD0D, 'M', u'شر'), + (0xFD0E, 'M', u'سر'), + (0xFD0F, 'M', u'صر'), + (0xFD10, 'M', u'ضر'), + (0xFD11, 'M', u'طى'), + (0xFD12, 'M', u'طي'), + (0xFD13, 'M', u'عى'), + (0xFD14, 'M', u'عي'), + (0xFD15, 'M', u'غى'), + (0xFD16, 'M', u'غي'), + (0xFD17, 'M', u'سى'), + (0xFD18, 'M', u'سي'), + (0xFD19, 'M', u'شى'), + (0xFD1A, 'M', u'شي'), + (0xFD1B, 'M', u'حى'), + (0xFD1C, 'M', u'حي'), + (0xFD1D, 'M', u'جى'), + (0xFD1E, 'M', u'جي'), + (0xFD1F, 'M', u'خى'), + (0xFD20, 'M', u'خي'), + (0xFD21, 'M', u'صى'), + (0xFD22, 'M', u'صي'), + (0xFD23, 'M', u'ضى'), + (0xFD24, 'M', u'ضي'), + (0xFD25, 'M', u'شج'), + (0xFD26, 'M', u'شح'), + (0xFD27, 'M', u'شخ'), + (0xFD28, 'M', u'شم'), + (0xFD29, 'M', u'شر'), + (0xFD2A, 'M', u'سر'), + (0xFD2B, 'M', u'صر'), + (0xFD2C, 'M', u'ضر'), + (0xFD2D, 'M', u'شج'), + (0xFD2E, 'M', u'شح'), + (0xFD2F, 'M', u'شخ'), + (0xFD30, 'M', u'شم'), + (0xFD31, 'M', u'سه'), + (0xFD32, 'M', u'شه'), + (0xFD33, 'M', u'طم'), + (0xFD34, 'M', u'سج'), + (0xFD35, 'M', u'سح'), + (0xFD36, 'M', u'سخ'), + (0xFD37, 'M', u'شج'), + (0xFD38, 'M', u'شح'), + (0xFD39, 'M', u'شخ'), + (0xFD3A, 'M', u'طم'), + (0xFD3B, 'M', u'ظم'), + (0xFD3C, 'M', u'اً'), + (0xFD3E, 'V'), + (0xFD40, 'X'), + (0xFD50, 'M', u'تجم'), + (0xFD51, 'M', u'تحج'), + (0xFD53, 'M', u'تحم'), + (0xFD54, 'M', u'تخم'), + (0xFD55, 'M', u'تمج'), + (0xFD56, 'M', u'تمح'), + (0xFD57, 'M', u'تمخ'), + (0xFD58, 'M', u'جمح'), + (0xFD5A, 'M', u'حمي'), + (0xFD5B, 'M', u'حمى'), + (0xFD5C, 'M', u'سحج'), + (0xFD5D, 'M', u'سجح'), + (0xFD5E, 'M', u'سجى'), + (0xFD5F, 'M', u'سمح'), + (0xFD61, 'M', u'سمج'), + (0xFD62, 'M', u'سمم'), + (0xFD64, 'M', u'صحح'), + (0xFD66, 'M', u'صمم'), + (0xFD67, 'M', u'شحم'), + (0xFD69, 'M', u'شجي'), + ] + +def _seg_48(): + return [ + (0xFD6A, 'M', u'شمخ'), + (0xFD6C, 'M', u'شمم'), + (0xFD6E, 'M', u'ضحى'), + (0xFD6F, 'M', u'ضخم'), + (0xFD71, 'M', u'طمح'), + (0xFD73, 'M', u'طمم'), + (0xFD74, 'M', u'طمي'), + (0xFD75, 'M', u'عجم'), + (0xFD76, 'M', u'عمم'), + (0xFD78, 'M', u'عمى'), + (0xFD79, 'M', u'غمم'), + (0xFD7A, 'M', u'غمي'), + (0xFD7B, 'M', u'غمى'), + (0xFD7C, 'M', u'فخم'), + (0xFD7E, 'M', u'قمح'), + (0xFD7F, 'M', u'قمم'), + (0xFD80, 'M', u'لحم'), + (0xFD81, 'M', u'لحي'), + (0xFD82, 'M', u'لحى'), + (0xFD83, 'M', u'لجج'), + (0xFD85, 'M', u'لخم'), + (0xFD87, 'M', u'لمح'), + (0xFD89, 'M', u'محج'), + (0xFD8A, 'M', u'محم'), + (0xFD8B, 'M', u'محي'), + (0xFD8C, 'M', u'مجح'), + (0xFD8D, 'M', u'مجم'), + (0xFD8E, 'M', u'مخج'), + (0xFD8F, 'M', u'مخم'), + (0xFD90, 'X'), + (0xFD92, 'M', u'مجخ'), + (0xFD93, 'M', u'همج'), + (0xFD94, 'M', u'همم'), + (0xFD95, 'M', u'نحم'), + (0xFD96, 'M', u'نحى'), + (0xFD97, 'M', u'نجم'), + (0xFD99, 'M', u'نجى'), + (0xFD9A, 'M', u'نمي'), + (0xFD9B, 'M', u'نمى'), + (0xFD9C, 'M', u'يمم'), + (0xFD9E, 'M', u'بخي'), + (0xFD9F, 'M', u'تجي'), + (0xFDA0, 'M', u'تجى'), + (0xFDA1, 'M', u'تخي'), + (0xFDA2, 'M', u'تخى'), + (0xFDA3, 'M', u'تمي'), + (0xFDA4, 'M', u'تمى'), + (0xFDA5, 'M', u'جمي'), + (0xFDA6, 'M', u'جحى'), + (0xFDA7, 'M', u'جمى'), + (0xFDA8, 'M', u'سخى'), + (0xFDA9, 'M', u'صحي'), + (0xFDAA, 'M', u'شحي'), + (0xFDAB, 'M', u'ضحي'), + (0xFDAC, 'M', u'لجي'), + (0xFDAD, 'M', u'لمي'), + (0xFDAE, 'M', u'يحي'), + (0xFDAF, 'M', u'يجي'), + (0xFDB0, 'M', u'يمي'), + (0xFDB1, 'M', u'ممي'), + (0xFDB2, 'M', u'قمي'), + (0xFDB3, 'M', u'نحي'), + (0xFDB4, 'M', u'قمح'), + (0xFDB5, 'M', u'لحم'), + (0xFDB6, 'M', u'عمي'), + (0xFDB7, 'M', u'كمي'), + (0xFDB8, 'M', u'نجح'), + (0xFDB9, 'M', u'مخي'), + (0xFDBA, 'M', u'لجم'), + (0xFDBB, 'M', u'كمم'), + (0xFDBC, 'M', u'لجم'), + (0xFDBD, 'M', u'نجح'), + (0xFDBE, 'M', u'جحي'), + (0xFDBF, 'M', u'حجي'), + (0xFDC0, 'M', u'مجي'), + (0xFDC1, 'M', u'فمي'), + (0xFDC2, 'M', u'بحي'), + (0xFDC3, 'M', u'كمم'), + (0xFDC4, 'M', u'عجم'), + (0xFDC5, 'M', u'صمم'), + (0xFDC6, 'M', u'سخي'), + (0xFDC7, 'M', u'نجي'), + (0xFDC8, 'X'), + (0xFDF0, 'M', u'صلے'), + (0xFDF1, 'M', u'قلے'), + (0xFDF2, 'M', u'الله'), + (0xFDF3, 'M', u'اكبر'), + (0xFDF4, 'M', u'محمد'), + (0xFDF5, 'M', u'صلعم'), + (0xFDF6, 'M', u'رسول'), + (0xFDF7, 'M', u'عليه'), + (0xFDF8, 'M', u'وسلم'), + (0xFDF9, 'M', u'صلى'), + (0xFDFA, '3', u'صلى الله عليه وسلم'), + (0xFDFB, '3', u'جل جلاله'), + (0xFDFC, 'M', u'ریال'), + (0xFDFD, 'V'), + (0xFDFE, 'X'), + (0xFE00, 'I'), + (0xFE10, '3', u','), + ] + +def _seg_49(): + return [ + (0xFE11, 'M', u'、'), + (0xFE12, 'X'), + (0xFE13, '3', u':'), + (0xFE14, '3', u';'), + (0xFE15, '3', u'!'), + (0xFE16, '3', u'?'), + (0xFE17, 'M', u'〖'), + (0xFE18, 'M', u'〗'), + (0xFE19, 'X'), + (0xFE20, 'V'), + (0xFE30, 'X'), + (0xFE31, 'M', u'—'), + (0xFE32, 'M', u'–'), + (0xFE33, '3', u'_'), + (0xFE35, '3', u'('), + (0xFE36, '3', u')'), + (0xFE37, '3', u'{'), + (0xFE38, '3', u'}'), + (0xFE39, 'M', u'〔'), + (0xFE3A, 'M', u'〕'), + (0xFE3B, 'M', u'【'), + (0xFE3C, 'M', u'】'), + (0xFE3D, 'M', u'《'), + (0xFE3E, 'M', u'》'), + (0xFE3F, 'M', u'〈'), + (0xFE40, 'M', u'〉'), + (0xFE41, 'M', u'「'), + (0xFE42, 'M', u'」'), + (0xFE43, 'M', u'『'), + (0xFE44, 'M', u'』'), + (0xFE45, 'V'), + (0xFE47, '3', u'['), + (0xFE48, '3', u']'), + (0xFE49, '3', u' ̅'), + (0xFE4D, '3', u'_'), + (0xFE50, '3', u','), + (0xFE51, 'M', u'、'), + (0xFE52, 'X'), + (0xFE54, '3', u';'), + (0xFE55, '3', u':'), + (0xFE56, '3', u'?'), + (0xFE57, '3', u'!'), + (0xFE58, 'M', u'—'), + (0xFE59, '3', u'('), + (0xFE5A, '3', u')'), + (0xFE5B, '3', u'{'), + (0xFE5C, '3', u'}'), + (0xFE5D, 'M', u'〔'), + (0xFE5E, 'M', u'〕'), + (0xFE5F, '3', u'#'), + (0xFE60, '3', u'&'), + (0xFE61, '3', u'*'), + (0xFE62, '3', u'+'), + (0xFE63, 'M', u'-'), + (0xFE64, '3', u'<'), + (0xFE65, '3', u'>'), + (0xFE66, '3', u'='), + (0xFE67, 'X'), + (0xFE68, '3', u'\\'), + (0xFE69, '3', u'$'), + (0xFE6A, '3', u'%'), + (0xFE6B, '3', u'@'), + (0xFE6C, 'X'), + (0xFE70, '3', u' ً'), + (0xFE71, 'M', u'ـً'), + (0xFE72, '3', u' ٌ'), + (0xFE73, 'V'), + (0xFE74, '3', u' ٍ'), + (0xFE75, 'X'), + (0xFE76, '3', u' َ'), + (0xFE77, 'M', u'ـَ'), + (0xFE78, '3', u' ُ'), + (0xFE79, 'M', u'ـُ'), + (0xFE7A, '3', u' ِ'), + (0xFE7B, 'M', u'ـِ'), + (0xFE7C, '3', u' ّ'), + (0xFE7D, 'M', u'ـّ'), + (0xFE7E, '3', u' ْ'), + (0xFE7F, 'M', u'ـْ'), + (0xFE80, 'M', u'ء'), + (0xFE81, 'M', u'آ'), + (0xFE83, 'M', u'أ'), + (0xFE85, 'M', u'ؤ'), + (0xFE87, 'M', u'إ'), + (0xFE89, 'M', u'ئ'), + (0xFE8D, 'M', u'ا'), + (0xFE8F, 'M', u'ب'), + (0xFE93, 'M', u'ة'), + (0xFE95, 'M', u'ت'), + (0xFE99, 'M', u'ث'), + (0xFE9D, 'M', u'ج'), + (0xFEA1, 'M', u'ح'), + (0xFEA5, 'M', u'خ'), + (0xFEA9, 'M', u'د'), + (0xFEAB, 'M', u'ذ'), + (0xFEAD, 'M', u'ر'), + (0xFEAF, 'M', u'ز'), + (0xFEB1, 'M', u'س'), + (0xFEB5, 'M', u'ش'), + (0xFEB9, 'M', u'ص'), + ] + +def _seg_50(): + return [ + (0xFEBD, 'M', u'ض'), + (0xFEC1, 'M', u'ط'), + (0xFEC5, 'M', u'ظ'), + (0xFEC9, 'M', u'ع'), + (0xFECD, 'M', u'غ'), + (0xFED1, 'M', u'ف'), + (0xFED5, 'M', u'ق'), + (0xFED9, 'M', u'ك'), + (0xFEDD, 'M', u'ل'), + (0xFEE1, 'M', u'م'), + (0xFEE5, 'M', u'ن'), + (0xFEE9, 'M', u'ه'), + (0xFEED, 'M', u'و'), + (0xFEEF, 'M', u'ى'), + (0xFEF1, 'M', u'ي'), + (0xFEF5, 'M', u'لآ'), + (0xFEF7, 'M', u'لأ'), + (0xFEF9, 'M', u'لإ'), + (0xFEFB, 'M', u'لا'), + (0xFEFD, 'X'), + (0xFEFF, 'I'), + (0xFF00, 'X'), + (0xFF01, '3', u'!'), + (0xFF02, '3', u'"'), + (0xFF03, '3', u'#'), + (0xFF04, '3', u'$'), + (0xFF05, '3', u'%'), + (0xFF06, '3', u'&'), + (0xFF07, '3', u'\''), + (0xFF08, '3', u'('), + (0xFF09, '3', u')'), + (0xFF0A, '3', u'*'), + (0xFF0B, '3', u'+'), + (0xFF0C, '3', u','), + (0xFF0D, 'M', u'-'), + (0xFF0E, 'M', u'.'), + (0xFF0F, '3', u'/'), + (0xFF10, 'M', u'0'), + (0xFF11, 'M', u'1'), + (0xFF12, 'M', u'2'), + (0xFF13, 'M', u'3'), + (0xFF14, 'M', u'4'), + (0xFF15, 'M', u'5'), + (0xFF16, 'M', u'6'), + (0xFF17, 'M', u'7'), + (0xFF18, 'M', u'8'), + (0xFF19, 'M', u'9'), + (0xFF1A, '3', u':'), + (0xFF1B, '3', u';'), + (0xFF1C, '3', u'<'), + (0xFF1D, '3', u'='), + (0xFF1E, '3', u'>'), + (0xFF1F, '3', u'?'), + (0xFF20, '3', u'@'), + (0xFF21, 'M', u'a'), + (0xFF22, 'M', u'b'), + (0xFF23, 'M', u'c'), + (0xFF24, 'M', u'd'), + (0xFF25, 'M', u'e'), + (0xFF26, 'M', u'f'), + (0xFF27, 'M', u'g'), + (0xFF28, 'M', u'h'), + (0xFF29, 'M', u'i'), + (0xFF2A, 'M', u'j'), + (0xFF2B, 'M', u'k'), + (0xFF2C, 'M', u'l'), + (0xFF2D, 'M', u'm'), + (0xFF2E, 'M', u'n'), + (0xFF2F, 'M', u'o'), + (0xFF30, 'M', u'p'), + (0xFF31, 'M', u'q'), + (0xFF32, 'M', u'r'), + (0xFF33, 'M', u's'), + (0xFF34, 'M', u't'), + (0xFF35, 'M', u'u'), + (0xFF36, 'M', u'v'), + (0xFF37, 'M', u'w'), + (0xFF38, 'M', u'x'), + (0xFF39, 'M', u'y'), + (0xFF3A, 'M', u'z'), + (0xFF3B, '3', u'['), + (0xFF3C, '3', u'\\'), + (0xFF3D, '3', u']'), + (0xFF3E, '3', u'^'), + (0xFF3F, '3', u'_'), + (0xFF40, '3', u'`'), + (0xFF41, 'M', u'a'), + (0xFF42, 'M', u'b'), + (0xFF43, 'M', u'c'), + (0xFF44, 'M', u'd'), + (0xFF45, 'M', u'e'), + (0xFF46, 'M', u'f'), + (0xFF47, 'M', u'g'), + (0xFF48, 'M', u'h'), + (0xFF49, 'M', u'i'), + (0xFF4A, 'M', u'j'), + (0xFF4B, 'M', u'k'), + (0xFF4C, 'M', u'l'), + (0xFF4D, 'M', u'm'), + (0xFF4E, 'M', u'n'), + ] + +def _seg_51(): + return [ + (0xFF4F, 'M', u'o'), + (0xFF50, 'M', u'p'), + (0xFF51, 'M', u'q'), + (0xFF52, 'M', u'r'), + (0xFF53, 'M', u's'), + (0xFF54, 'M', u't'), + (0xFF55, 'M', u'u'), + (0xFF56, 'M', u'v'), + (0xFF57, 'M', u'w'), + (0xFF58, 'M', u'x'), + (0xFF59, 'M', u'y'), + (0xFF5A, 'M', u'z'), + (0xFF5B, '3', u'{'), + (0xFF5C, '3', u'|'), + (0xFF5D, '3', u'}'), + (0xFF5E, '3', u'~'), + (0xFF5F, 'M', u'⦅'), + (0xFF60, 'M', u'⦆'), + (0xFF61, 'M', u'.'), + (0xFF62, 'M', u'「'), + (0xFF63, 'M', u'」'), + (0xFF64, 'M', u'、'), + (0xFF65, 'M', u'・'), + (0xFF66, 'M', u'ヲ'), + (0xFF67, 'M', u'ァ'), + (0xFF68, 'M', u'ィ'), + (0xFF69, 'M', u'ゥ'), + (0xFF6A, 'M', u'ェ'), + (0xFF6B, 'M', u'ォ'), + (0xFF6C, 'M', u'ャ'), + (0xFF6D, 'M', u'ュ'), + (0xFF6E, 'M', u'ョ'), + (0xFF6F, 'M', u'ッ'), + (0xFF70, 'M', u'ー'), + (0xFF71, 'M', u'ア'), + (0xFF72, 'M', u'イ'), + (0xFF73, 'M', u'ウ'), + (0xFF74, 'M', u'エ'), + (0xFF75, 'M', u'オ'), + (0xFF76, 'M', u'カ'), + (0xFF77, 'M', u'キ'), + (0xFF78, 'M', u'ク'), + (0xFF79, 'M', u'ケ'), + (0xFF7A, 'M', u'コ'), + (0xFF7B, 'M', u'サ'), + (0xFF7C, 'M', u'シ'), + (0xFF7D, 'M', u'ス'), + (0xFF7E, 'M', u'セ'), + (0xFF7F, 'M', u'ソ'), + (0xFF80, 'M', u'タ'), + (0xFF81, 'M', u'チ'), + (0xFF82, 'M', u'ツ'), + (0xFF83, 'M', u'テ'), + (0xFF84, 'M', u'ト'), + (0xFF85, 'M', u'ナ'), + (0xFF86, 'M', u'ニ'), + (0xFF87, 'M', u'ヌ'), + (0xFF88, 'M', u'ネ'), + (0xFF89, 'M', u'ノ'), + (0xFF8A, 'M', u'ハ'), + (0xFF8B, 'M', u'ヒ'), + (0xFF8C, 'M', u'フ'), + (0xFF8D, 'M', u'ヘ'), + (0xFF8E, 'M', u'ホ'), + (0xFF8F, 'M', u'マ'), + (0xFF90, 'M', u'ミ'), + (0xFF91, 'M', u'ム'), + (0xFF92, 'M', u'メ'), + (0xFF93, 'M', u'モ'), + (0xFF94, 'M', u'ヤ'), + (0xFF95, 'M', u'ユ'), + (0xFF96, 'M', u'ヨ'), + (0xFF97, 'M', u'ラ'), + (0xFF98, 'M', u'リ'), + (0xFF99, 'M', u'ル'), + (0xFF9A, 'M', u'レ'), + (0xFF9B, 'M', u'ロ'), + (0xFF9C, 'M', u'ワ'), + (0xFF9D, 'M', u'ン'), + (0xFF9E, 'M', u'゙'), + (0xFF9F, 'M', u'゚'), + (0xFFA0, 'X'), + (0xFFA1, 'M', u'ᄀ'), + (0xFFA2, 'M', u'ᄁ'), + (0xFFA3, 'M', u'ᆪ'), + (0xFFA4, 'M', u'ᄂ'), + (0xFFA5, 'M', u'ᆬ'), + (0xFFA6, 'M', u'ᆭ'), + (0xFFA7, 'M', u'ᄃ'), + (0xFFA8, 'M', u'ᄄ'), + (0xFFA9, 'M', u'ᄅ'), + (0xFFAA, 'M', u'ᆰ'), + (0xFFAB, 'M', u'ᆱ'), + (0xFFAC, 'M', u'ᆲ'), + (0xFFAD, 'M', u'ᆳ'), + (0xFFAE, 'M', u'ᆴ'), + (0xFFAF, 'M', u'ᆵ'), + (0xFFB0, 'M', u'ᄚ'), + (0xFFB1, 'M', u'ᄆ'), + (0xFFB2, 'M', u'ᄇ'), + ] + +def _seg_52(): + return [ + (0xFFB3, 'M', u'ᄈ'), + (0xFFB4, 'M', u'ᄡ'), + (0xFFB5, 'M', u'ᄉ'), + (0xFFB6, 'M', u'ᄊ'), + (0xFFB7, 'M', u'ᄋ'), + (0xFFB8, 'M', u'ᄌ'), + (0xFFB9, 'M', u'ᄍ'), + (0xFFBA, 'M', u'ᄎ'), + (0xFFBB, 'M', u'ᄏ'), + (0xFFBC, 'M', u'ᄐ'), + (0xFFBD, 'M', u'ᄑ'), + (0xFFBE, 'M', u'ᄒ'), + (0xFFBF, 'X'), + (0xFFC2, 'M', u'ᅡ'), + (0xFFC3, 'M', u'ᅢ'), + (0xFFC4, 'M', u'ᅣ'), + (0xFFC5, 'M', u'ᅤ'), + (0xFFC6, 'M', u'ᅥ'), + (0xFFC7, 'M', u'ᅦ'), + (0xFFC8, 'X'), + (0xFFCA, 'M', u'ᅧ'), + (0xFFCB, 'M', u'ᅨ'), + (0xFFCC, 'M', u'ᅩ'), + (0xFFCD, 'M', u'ᅪ'), + (0xFFCE, 'M', u'ᅫ'), + (0xFFCF, 'M', u'ᅬ'), + (0xFFD0, 'X'), + (0xFFD2, 'M', u'ᅭ'), + (0xFFD3, 'M', u'ᅮ'), + (0xFFD4, 'M', u'ᅯ'), + (0xFFD5, 'M', u'ᅰ'), + (0xFFD6, 'M', u'ᅱ'), + (0xFFD7, 'M', u'ᅲ'), + (0xFFD8, 'X'), + (0xFFDA, 'M', u'ᅳ'), + (0xFFDB, 'M', u'ᅴ'), + (0xFFDC, 'M', u'ᅵ'), + (0xFFDD, 'X'), + (0xFFE0, 'M', u'¢'), + (0xFFE1, 'M', u'£'), + (0xFFE2, 'M', u'¬'), + (0xFFE3, '3', u' ̄'), + (0xFFE4, 'M', u'¦'), + (0xFFE5, 'M', u'¥'), + (0xFFE6, 'M', u'₩'), + (0xFFE7, 'X'), + (0xFFE8, 'M', u'│'), + (0xFFE9, 'M', u'←'), + (0xFFEA, 'M', u'↑'), + (0xFFEB, 'M', u'→'), + (0xFFEC, 'M', u'↓'), + (0xFFED, 'M', u'■'), + (0xFFEE, 'M', u'○'), + (0xFFEF, 'X'), + (0x10000, 'V'), + (0x1000C, 'X'), + (0x1000D, 'V'), + (0x10027, 'X'), + (0x10028, 'V'), + (0x1003B, 'X'), + (0x1003C, 'V'), + (0x1003E, 'X'), + (0x1003F, 'V'), + (0x1004E, 'X'), + (0x10050, 'V'), + (0x1005E, 'X'), + (0x10080, 'V'), + (0x100FB, 'X'), + (0x10100, 'V'), + (0x10103, 'X'), + (0x10107, 'V'), + (0x10134, 'X'), + (0x10137, 'V'), + (0x1018F, 'X'), + (0x10190, 'V'), + (0x1019C, 'X'), + (0x101A0, 'V'), + (0x101A1, 'X'), + (0x101D0, 'V'), + (0x101FE, 'X'), + (0x10280, 'V'), + (0x1029D, 'X'), + (0x102A0, 'V'), + (0x102D1, 'X'), + (0x102E0, 'V'), + (0x102FC, 'X'), + (0x10300, 'V'), + (0x10324, 'X'), + (0x1032D, 'V'), + (0x1034B, 'X'), + (0x10350, 'V'), + (0x1037B, 'X'), + (0x10380, 'V'), + (0x1039E, 'X'), + (0x1039F, 'V'), + (0x103C4, 'X'), + (0x103C8, 'V'), + (0x103D6, 'X'), + (0x10400, 'M', u'𐐨'), + (0x10401, 'M', u'𐐩'), + ] + +def _seg_53(): + return [ + (0x10402, 'M', u'𐐪'), + (0x10403, 'M', u'𐐫'), + (0x10404, 'M', u'𐐬'), + (0x10405, 'M', u'𐐭'), + (0x10406, 'M', u'𐐮'), + (0x10407, 'M', u'𐐯'), + (0x10408, 'M', u'𐐰'), + (0x10409, 'M', u'𐐱'), + (0x1040A, 'M', u'𐐲'), + (0x1040B, 'M', u'𐐳'), + (0x1040C, 'M', u'𐐴'), + (0x1040D, 'M', u'𐐵'), + (0x1040E, 'M', u'𐐶'), + (0x1040F, 'M', u'𐐷'), + (0x10410, 'M', u'𐐸'), + (0x10411, 'M', u'𐐹'), + (0x10412, 'M', u'𐐺'), + (0x10413, 'M', u'𐐻'), + (0x10414, 'M', u'𐐼'), + (0x10415, 'M', u'𐐽'), + (0x10416, 'M', u'𐐾'), + (0x10417, 'M', u'𐐿'), + (0x10418, 'M', u'𐑀'), + (0x10419, 'M', u'𐑁'), + (0x1041A, 'M', u'𐑂'), + (0x1041B, 'M', u'𐑃'), + (0x1041C, 'M', u'𐑄'), + (0x1041D, 'M', u'𐑅'), + (0x1041E, 'M', u'𐑆'), + (0x1041F, 'M', u'𐑇'), + (0x10420, 'M', u'𐑈'), + (0x10421, 'M', u'𐑉'), + (0x10422, 'M', u'𐑊'), + (0x10423, 'M', u'𐑋'), + (0x10424, 'M', u'𐑌'), + (0x10425, 'M', u'𐑍'), + (0x10426, 'M', u'𐑎'), + (0x10427, 'M', u'𐑏'), + (0x10428, 'V'), + (0x1049E, 'X'), + (0x104A0, 'V'), + (0x104AA, 'X'), + (0x104B0, 'M', u'𐓘'), + (0x104B1, 'M', u'𐓙'), + (0x104B2, 'M', u'𐓚'), + (0x104B3, 'M', u'𐓛'), + (0x104B4, 'M', u'𐓜'), + (0x104B5, 'M', u'𐓝'), + (0x104B6, 'M', u'𐓞'), + (0x104B7, 'M', u'𐓟'), + (0x104B8, 'M', u'𐓠'), + (0x104B9, 'M', u'𐓡'), + (0x104BA, 'M', u'𐓢'), + (0x104BB, 'M', u'𐓣'), + (0x104BC, 'M', u'𐓤'), + (0x104BD, 'M', u'𐓥'), + (0x104BE, 'M', u'𐓦'), + (0x104BF, 'M', u'𐓧'), + (0x104C0, 'M', u'𐓨'), + (0x104C1, 'M', u'𐓩'), + (0x104C2, 'M', u'𐓪'), + (0x104C3, 'M', u'𐓫'), + (0x104C4, 'M', u'𐓬'), + (0x104C5, 'M', u'𐓭'), + (0x104C6, 'M', u'𐓮'), + (0x104C7, 'M', u'𐓯'), + (0x104C8, 'M', u'𐓰'), + (0x104C9, 'M', u'𐓱'), + (0x104CA, 'M', u'𐓲'), + (0x104CB, 'M', u'𐓳'), + (0x104CC, 'M', u'𐓴'), + (0x104CD, 'M', u'𐓵'), + (0x104CE, 'M', u'𐓶'), + (0x104CF, 'M', u'𐓷'), + (0x104D0, 'M', u'𐓸'), + (0x104D1, 'M', u'𐓹'), + (0x104D2, 'M', u'𐓺'), + (0x104D3, 'M', u'𐓻'), + (0x104D4, 'X'), + (0x104D8, 'V'), + (0x104FC, 'X'), + (0x10500, 'V'), + (0x10528, 'X'), + (0x10530, 'V'), + (0x10564, 'X'), + (0x1056F, 'V'), + (0x10570, 'X'), + (0x10600, 'V'), + (0x10737, 'X'), + (0x10740, 'V'), + (0x10756, 'X'), + (0x10760, 'V'), + (0x10768, 'X'), + (0x10800, 'V'), + (0x10806, 'X'), + (0x10808, 'V'), + (0x10809, 'X'), + (0x1080A, 'V'), + (0x10836, 'X'), + (0x10837, 'V'), + ] + +def _seg_54(): + return [ + (0x10839, 'X'), + (0x1083C, 'V'), + (0x1083D, 'X'), + (0x1083F, 'V'), + (0x10856, 'X'), + (0x10857, 'V'), + (0x1089F, 'X'), + (0x108A7, 'V'), + (0x108B0, 'X'), + (0x108E0, 'V'), + (0x108F3, 'X'), + (0x108F4, 'V'), + (0x108F6, 'X'), + (0x108FB, 'V'), + (0x1091C, 'X'), + (0x1091F, 'V'), + (0x1093A, 'X'), + (0x1093F, 'V'), + (0x10940, 'X'), + (0x10980, 'V'), + (0x109B8, 'X'), + (0x109BC, 'V'), + (0x109D0, 'X'), + (0x109D2, 'V'), + (0x10A04, 'X'), + (0x10A05, 'V'), + (0x10A07, 'X'), + (0x10A0C, 'V'), + (0x10A14, 'X'), + (0x10A15, 'V'), + (0x10A18, 'X'), + (0x10A19, 'V'), + (0x10A36, 'X'), + (0x10A38, 'V'), + (0x10A3B, 'X'), + (0x10A3F, 'V'), + (0x10A49, 'X'), + (0x10A50, 'V'), + (0x10A59, 'X'), + (0x10A60, 'V'), + (0x10AA0, 'X'), + (0x10AC0, 'V'), + (0x10AE7, 'X'), + (0x10AEB, 'V'), + (0x10AF7, 'X'), + (0x10B00, 'V'), + (0x10B36, 'X'), + (0x10B39, 'V'), + (0x10B56, 'X'), + (0x10B58, 'V'), + (0x10B73, 'X'), + (0x10B78, 'V'), + (0x10B92, 'X'), + (0x10B99, 'V'), + (0x10B9D, 'X'), + (0x10BA9, 'V'), + (0x10BB0, 'X'), + (0x10C00, 'V'), + (0x10C49, 'X'), + (0x10C80, 'M', u'𐳀'), + (0x10C81, 'M', u'𐳁'), + (0x10C82, 'M', u'𐳂'), + (0x10C83, 'M', u'𐳃'), + (0x10C84, 'M', u'𐳄'), + (0x10C85, 'M', u'𐳅'), + (0x10C86, 'M', u'𐳆'), + (0x10C87, 'M', u'𐳇'), + (0x10C88, 'M', u'𐳈'), + (0x10C89, 'M', u'𐳉'), + (0x10C8A, 'M', u'𐳊'), + (0x10C8B, 'M', u'𐳋'), + (0x10C8C, 'M', u'𐳌'), + (0x10C8D, 'M', u'𐳍'), + (0x10C8E, 'M', u'𐳎'), + (0x10C8F, 'M', u'𐳏'), + (0x10C90, 'M', u'𐳐'), + (0x10C91, 'M', u'𐳑'), + (0x10C92, 'M', u'𐳒'), + (0x10C93, 'M', u'𐳓'), + (0x10C94, 'M', u'𐳔'), + (0x10C95, 'M', u'𐳕'), + (0x10C96, 'M', u'𐳖'), + (0x10C97, 'M', u'𐳗'), + (0x10C98, 'M', u'𐳘'), + (0x10C99, 'M', u'𐳙'), + (0x10C9A, 'M', u'𐳚'), + (0x10C9B, 'M', u'𐳛'), + (0x10C9C, 'M', u'𐳜'), + (0x10C9D, 'M', u'𐳝'), + (0x10C9E, 'M', u'𐳞'), + (0x10C9F, 'M', u'𐳟'), + (0x10CA0, 'M', u'𐳠'), + (0x10CA1, 'M', u'𐳡'), + (0x10CA2, 'M', u'𐳢'), + (0x10CA3, 'M', u'𐳣'), + (0x10CA4, 'M', u'𐳤'), + (0x10CA5, 'M', u'𐳥'), + (0x10CA6, 'M', u'𐳦'), + (0x10CA7, 'M', u'𐳧'), + (0x10CA8, 'M', u'𐳨'), + ] + +def _seg_55(): + return [ + (0x10CA9, 'M', u'𐳩'), + (0x10CAA, 'M', u'𐳪'), + (0x10CAB, 'M', u'𐳫'), + (0x10CAC, 'M', u'𐳬'), + (0x10CAD, 'M', u'𐳭'), + (0x10CAE, 'M', u'𐳮'), + (0x10CAF, 'M', u'𐳯'), + (0x10CB0, 'M', u'𐳰'), + (0x10CB1, 'M', u'𐳱'), + (0x10CB2, 'M', u'𐳲'), + (0x10CB3, 'X'), + (0x10CC0, 'V'), + (0x10CF3, 'X'), + (0x10CFA, 'V'), + (0x10D28, 'X'), + (0x10D30, 'V'), + (0x10D3A, 'X'), + (0x10E60, 'V'), + (0x10E7F, 'X'), + (0x10F00, 'V'), + (0x10F28, 'X'), + (0x10F30, 'V'), + (0x10F5A, 'X'), + (0x11000, 'V'), + (0x1104E, 'X'), + (0x11052, 'V'), + (0x11070, 'X'), + (0x1107F, 'V'), + (0x110BD, 'X'), + (0x110BE, 'V'), + (0x110C2, 'X'), + (0x110D0, 'V'), + (0x110E9, 'X'), + (0x110F0, 'V'), + (0x110FA, 'X'), + (0x11100, 'V'), + (0x11135, 'X'), + (0x11136, 'V'), + (0x11147, 'X'), + (0x11150, 'V'), + (0x11177, 'X'), + (0x11180, 'V'), + (0x111CE, 'X'), + (0x111D0, 'V'), + (0x111E0, 'X'), + (0x111E1, 'V'), + (0x111F5, 'X'), + (0x11200, 'V'), + (0x11212, 'X'), + (0x11213, 'V'), + (0x1123F, 'X'), + (0x11280, 'V'), + (0x11287, 'X'), + (0x11288, 'V'), + (0x11289, 'X'), + (0x1128A, 'V'), + (0x1128E, 'X'), + (0x1128F, 'V'), + (0x1129E, 'X'), + (0x1129F, 'V'), + (0x112AA, 'X'), + (0x112B0, 'V'), + (0x112EB, 'X'), + (0x112F0, 'V'), + (0x112FA, 'X'), + (0x11300, 'V'), + (0x11304, 'X'), + (0x11305, 'V'), + (0x1130D, 'X'), + (0x1130F, 'V'), + (0x11311, 'X'), + (0x11313, 'V'), + (0x11329, 'X'), + (0x1132A, 'V'), + (0x11331, 'X'), + (0x11332, 'V'), + (0x11334, 'X'), + (0x11335, 'V'), + (0x1133A, 'X'), + (0x1133B, 'V'), + (0x11345, 'X'), + (0x11347, 'V'), + (0x11349, 'X'), + (0x1134B, 'V'), + (0x1134E, 'X'), + (0x11350, 'V'), + (0x11351, 'X'), + (0x11357, 'V'), + (0x11358, 'X'), + (0x1135D, 'V'), + (0x11364, 'X'), + (0x11366, 'V'), + (0x1136D, 'X'), + (0x11370, 'V'), + (0x11375, 'X'), + (0x11400, 'V'), + (0x1145A, 'X'), + (0x1145B, 'V'), + (0x1145C, 'X'), + (0x1145D, 'V'), + ] + +def _seg_56(): + return [ + (0x1145F, 'X'), + (0x11480, 'V'), + (0x114C8, 'X'), + (0x114D0, 'V'), + (0x114DA, 'X'), + (0x11580, 'V'), + (0x115B6, 'X'), + (0x115B8, 'V'), + (0x115DE, 'X'), + (0x11600, 'V'), + (0x11645, 'X'), + (0x11650, 'V'), + (0x1165A, 'X'), + (0x11660, 'V'), + (0x1166D, 'X'), + (0x11680, 'V'), + (0x116B8, 'X'), + (0x116C0, 'V'), + (0x116CA, 'X'), + (0x11700, 'V'), + (0x1171B, 'X'), + (0x1171D, 'V'), + (0x1172C, 'X'), + (0x11730, 'V'), + (0x11740, 'X'), + (0x11800, 'V'), + (0x1183C, 'X'), + (0x118A0, 'M', u'𑣀'), + (0x118A1, 'M', u'𑣁'), + (0x118A2, 'M', u'𑣂'), + (0x118A3, 'M', u'𑣃'), + (0x118A4, 'M', u'𑣄'), + (0x118A5, 'M', u'𑣅'), + (0x118A6, 'M', u'𑣆'), + (0x118A7, 'M', u'𑣇'), + (0x118A8, 'M', u'𑣈'), + (0x118A9, 'M', u'𑣉'), + (0x118AA, 'M', u'𑣊'), + (0x118AB, 'M', u'𑣋'), + (0x118AC, 'M', u'𑣌'), + (0x118AD, 'M', u'𑣍'), + (0x118AE, 'M', u'𑣎'), + (0x118AF, 'M', u'𑣏'), + (0x118B0, 'M', u'𑣐'), + (0x118B1, 'M', u'𑣑'), + (0x118B2, 'M', u'𑣒'), + (0x118B3, 'M', u'𑣓'), + (0x118B4, 'M', u'𑣔'), + (0x118B5, 'M', u'𑣕'), + (0x118B6, 'M', u'𑣖'), + (0x118B7, 'M', u'𑣗'), + (0x118B8, 'M', u'𑣘'), + (0x118B9, 'M', u'𑣙'), + (0x118BA, 'M', u'𑣚'), + (0x118BB, 'M', u'𑣛'), + (0x118BC, 'M', u'𑣜'), + (0x118BD, 'M', u'𑣝'), + (0x118BE, 'M', u'𑣞'), + (0x118BF, 'M', u'𑣟'), + (0x118C0, 'V'), + (0x118F3, 'X'), + (0x118FF, 'V'), + (0x11900, 'X'), + (0x11A00, 'V'), + (0x11A48, 'X'), + (0x11A50, 'V'), + (0x11A84, 'X'), + (0x11A86, 'V'), + (0x11AA3, 'X'), + (0x11AC0, 'V'), + (0x11AF9, 'X'), + (0x11C00, 'V'), + (0x11C09, 'X'), + (0x11C0A, 'V'), + (0x11C37, 'X'), + (0x11C38, 'V'), + (0x11C46, 'X'), + (0x11C50, 'V'), + (0x11C6D, 'X'), + (0x11C70, 'V'), + (0x11C90, 'X'), + (0x11C92, 'V'), + (0x11CA8, 'X'), + (0x11CA9, 'V'), + (0x11CB7, 'X'), + (0x11D00, 'V'), + (0x11D07, 'X'), + (0x11D08, 'V'), + (0x11D0A, 'X'), + (0x11D0B, 'V'), + (0x11D37, 'X'), + (0x11D3A, 'V'), + (0x11D3B, 'X'), + (0x11D3C, 'V'), + (0x11D3E, 'X'), + (0x11D3F, 'V'), + (0x11D48, 'X'), + (0x11D50, 'V'), + (0x11D5A, 'X'), + (0x11D60, 'V'), + ] + +def _seg_57(): + return [ + (0x11D66, 'X'), + (0x11D67, 'V'), + (0x11D69, 'X'), + (0x11D6A, 'V'), + (0x11D8F, 'X'), + (0x11D90, 'V'), + (0x11D92, 'X'), + (0x11D93, 'V'), + (0x11D99, 'X'), + (0x11DA0, 'V'), + (0x11DAA, 'X'), + (0x11EE0, 'V'), + (0x11EF9, 'X'), + (0x12000, 'V'), + (0x1239A, 'X'), + (0x12400, 'V'), + (0x1246F, 'X'), + (0x12470, 'V'), + (0x12475, 'X'), + (0x12480, 'V'), + (0x12544, 'X'), + (0x13000, 'V'), + (0x1342F, 'X'), + (0x14400, 'V'), + (0x14647, 'X'), + (0x16800, 'V'), + (0x16A39, 'X'), + (0x16A40, 'V'), + (0x16A5F, 'X'), + (0x16A60, 'V'), + (0x16A6A, 'X'), + (0x16A6E, 'V'), + (0x16A70, 'X'), + (0x16AD0, 'V'), + (0x16AEE, 'X'), + (0x16AF0, 'V'), + (0x16AF6, 'X'), + (0x16B00, 'V'), + (0x16B46, 'X'), + (0x16B50, 'V'), + (0x16B5A, 'X'), + (0x16B5B, 'V'), + (0x16B62, 'X'), + (0x16B63, 'V'), + (0x16B78, 'X'), + (0x16B7D, 'V'), + (0x16B90, 'X'), + (0x16E60, 'V'), + (0x16E9B, 'X'), + (0x16F00, 'V'), + (0x16F45, 'X'), + (0x16F50, 'V'), + (0x16F7F, 'X'), + (0x16F8F, 'V'), + (0x16FA0, 'X'), + (0x16FE0, 'V'), + (0x16FE2, 'X'), + (0x17000, 'V'), + (0x187F2, 'X'), + (0x18800, 'V'), + (0x18AF3, 'X'), + (0x1B000, 'V'), + (0x1B11F, 'X'), + (0x1B170, 'V'), + (0x1B2FC, 'X'), + (0x1BC00, 'V'), + (0x1BC6B, 'X'), + (0x1BC70, 'V'), + (0x1BC7D, 'X'), + (0x1BC80, 'V'), + (0x1BC89, 'X'), + (0x1BC90, 'V'), + (0x1BC9A, 'X'), + (0x1BC9C, 'V'), + (0x1BCA0, 'I'), + (0x1BCA4, 'X'), + (0x1D000, 'V'), + (0x1D0F6, 'X'), + (0x1D100, 'V'), + (0x1D127, 'X'), + (0x1D129, 'V'), + (0x1D15E, 'M', u'𝅗𝅥'), + (0x1D15F, 'M', u'𝅘𝅥'), + (0x1D160, 'M', u'𝅘𝅥𝅮'), + (0x1D161, 'M', u'𝅘𝅥𝅯'), + (0x1D162, 'M', u'𝅘𝅥𝅰'), + (0x1D163, 'M', u'𝅘𝅥𝅱'), + (0x1D164, 'M', u'𝅘𝅥𝅲'), + (0x1D165, 'V'), + (0x1D173, 'X'), + (0x1D17B, 'V'), + (0x1D1BB, 'M', u'𝆹𝅥'), + (0x1D1BC, 'M', u'𝆺𝅥'), + (0x1D1BD, 'M', u'𝆹𝅥𝅮'), + (0x1D1BE, 'M', u'𝆺𝅥𝅮'), + (0x1D1BF, 'M', u'𝆹𝅥𝅯'), + (0x1D1C0, 'M', u'𝆺𝅥𝅯'), + (0x1D1C1, 'V'), + (0x1D1E9, 'X'), + (0x1D200, 'V'), + ] + +def _seg_58(): + return [ + (0x1D246, 'X'), + (0x1D2E0, 'V'), + (0x1D2F4, 'X'), + (0x1D300, 'V'), + (0x1D357, 'X'), + (0x1D360, 'V'), + (0x1D379, 'X'), + (0x1D400, 'M', u'a'), + (0x1D401, 'M', u'b'), + (0x1D402, 'M', u'c'), + (0x1D403, 'M', u'd'), + (0x1D404, 'M', u'e'), + (0x1D405, 'M', u'f'), + (0x1D406, 'M', u'g'), + (0x1D407, 'M', u'h'), + (0x1D408, 'M', u'i'), + (0x1D409, 'M', u'j'), + (0x1D40A, 'M', u'k'), + (0x1D40B, 'M', u'l'), + (0x1D40C, 'M', u'm'), + (0x1D40D, 'M', u'n'), + (0x1D40E, 'M', u'o'), + (0x1D40F, 'M', u'p'), + (0x1D410, 'M', u'q'), + (0x1D411, 'M', u'r'), + (0x1D412, 'M', u's'), + (0x1D413, 'M', u't'), + (0x1D414, 'M', u'u'), + (0x1D415, 'M', u'v'), + (0x1D416, 'M', u'w'), + (0x1D417, 'M', u'x'), + (0x1D418, 'M', u'y'), + (0x1D419, 'M', u'z'), + (0x1D41A, 'M', u'a'), + (0x1D41B, 'M', u'b'), + (0x1D41C, 'M', u'c'), + (0x1D41D, 'M', u'd'), + (0x1D41E, 'M', u'e'), + (0x1D41F, 'M', u'f'), + (0x1D420, 'M', u'g'), + (0x1D421, 'M', u'h'), + (0x1D422, 'M', u'i'), + (0x1D423, 'M', u'j'), + (0x1D424, 'M', u'k'), + (0x1D425, 'M', u'l'), + (0x1D426, 'M', u'm'), + (0x1D427, 'M', u'n'), + (0x1D428, 'M', u'o'), + (0x1D429, 'M', u'p'), + (0x1D42A, 'M', u'q'), + (0x1D42B, 'M', u'r'), + (0x1D42C, 'M', u's'), + (0x1D42D, 'M', u't'), + (0x1D42E, 'M', u'u'), + (0x1D42F, 'M', u'v'), + (0x1D430, 'M', u'w'), + (0x1D431, 'M', u'x'), + (0x1D432, 'M', u'y'), + (0x1D433, 'M', u'z'), + (0x1D434, 'M', u'a'), + (0x1D435, 'M', u'b'), + (0x1D436, 'M', u'c'), + (0x1D437, 'M', u'd'), + (0x1D438, 'M', u'e'), + (0x1D439, 'M', u'f'), + (0x1D43A, 'M', u'g'), + (0x1D43B, 'M', u'h'), + (0x1D43C, 'M', u'i'), + (0x1D43D, 'M', u'j'), + (0x1D43E, 'M', u'k'), + (0x1D43F, 'M', u'l'), + (0x1D440, 'M', u'm'), + (0x1D441, 'M', u'n'), + (0x1D442, 'M', u'o'), + (0x1D443, 'M', u'p'), + (0x1D444, 'M', u'q'), + (0x1D445, 'M', u'r'), + (0x1D446, 'M', u's'), + (0x1D447, 'M', u't'), + (0x1D448, 'M', u'u'), + (0x1D449, 'M', u'v'), + (0x1D44A, 'M', u'w'), + (0x1D44B, 'M', u'x'), + (0x1D44C, 'M', u'y'), + (0x1D44D, 'M', u'z'), + (0x1D44E, 'M', u'a'), + (0x1D44F, 'M', u'b'), + (0x1D450, 'M', u'c'), + (0x1D451, 'M', u'd'), + (0x1D452, 'M', u'e'), + (0x1D453, 'M', u'f'), + (0x1D454, 'M', u'g'), + (0x1D455, 'X'), + (0x1D456, 'M', u'i'), + (0x1D457, 'M', u'j'), + (0x1D458, 'M', u'k'), + (0x1D459, 'M', u'l'), + (0x1D45A, 'M', u'm'), + (0x1D45B, 'M', u'n'), + (0x1D45C, 'M', u'o'), + ] + +def _seg_59(): + return [ + (0x1D45D, 'M', u'p'), + (0x1D45E, 'M', u'q'), + (0x1D45F, 'M', u'r'), + (0x1D460, 'M', u's'), + (0x1D461, 'M', u't'), + (0x1D462, 'M', u'u'), + (0x1D463, 'M', u'v'), + (0x1D464, 'M', u'w'), + (0x1D465, 'M', u'x'), + (0x1D466, 'M', u'y'), + (0x1D467, 'M', u'z'), + (0x1D468, 'M', u'a'), + (0x1D469, 'M', u'b'), + (0x1D46A, 'M', u'c'), + (0x1D46B, 'M', u'd'), + (0x1D46C, 'M', u'e'), + (0x1D46D, 'M', u'f'), + (0x1D46E, 'M', u'g'), + (0x1D46F, 'M', u'h'), + (0x1D470, 'M', u'i'), + (0x1D471, 'M', u'j'), + (0x1D472, 'M', u'k'), + (0x1D473, 'M', u'l'), + (0x1D474, 'M', u'm'), + (0x1D475, 'M', u'n'), + (0x1D476, 'M', u'o'), + (0x1D477, 'M', u'p'), + (0x1D478, 'M', u'q'), + (0x1D479, 'M', u'r'), + (0x1D47A, 'M', u's'), + (0x1D47B, 'M', u't'), + (0x1D47C, 'M', u'u'), + (0x1D47D, 'M', u'v'), + (0x1D47E, 'M', u'w'), + (0x1D47F, 'M', u'x'), + (0x1D480, 'M', u'y'), + (0x1D481, 'M', u'z'), + (0x1D482, 'M', u'a'), + (0x1D483, 'M', u'b'), + (0x1D484, 'M', u'c'), + (0x1D485, 'M', u'd'), + (0x1D486, 'M', u'e'), + (0x1D487, 'M', u'f'), + (0x1D488, 'M', u'g'), + (0x1D489, 'M', u'h'), + (0x1D48A, 'M', u'i'), + (0x1D48B, 'M', u'j'), + (0x1D48C, 'M', u'k'), + (0x1D48D, 'M', u'l'), + (0x1D48E, 'M', u'm'), + (0x1D48F, 'M', u'n'), + (0x1D490, 'M', u'o'), + (0x1D491, 'M', u'p'), + (0x1D492, 'M', u'q'), + (0x1D493, 'M', u'r'), + (0x1D494, 'M', u's'), + (0x1D495, 'M', u't'), + (0x1D496, 'M', u'u'), + (0x1D497, 'M', u'v'), + (0x1D498, 'M', u'w'), + (0x1D499, 'M', u'x'), + (0x1D49A, 'M', u'y'), + (0x1D49B, 'M', u'z'), + (0x1D49C, 'M', u'a'), + (0x1D49D, 'X'), + (0x1D49E, 'M', u'c'), + (0x1D49F, 'M', u'd'), + (0x1D4A0, 'X'), + (0x1D4A2, 'M', u'g'), + (0x1D4A3, 'X'), + (0x1D4A5, 'M', u'j'), + (0x1D4A6, 'M', u'k'), + (0x1D4A7, 'X'), + (0x1D4A9, 'M', u'n'), + (0x1D4AA, 'M', u'o'), + (0x1D4AB, 'M', u'p'), + (0x1D4AC, 'M', u'q'), + (0x1D4AD, 'X'), + (0x1D4AE, 'M', u's'), + (0x1D4AF, 'M', u't'), + (0x1D4B0, 'M', u'u'), + (0x1D4B1, 'M', u'v'), + (0x1D4B2, 'M', u'w'), + (0x1D4B3, 'M', u'x'), + (0x1D4B4, 'M', u'y'), + (0x1D4B5, 'M', u'z'), + (0x1D4B6, 'M', u'a'), + (0x1D4B7, 'M', u'b'), + (0x1D4B8, 'M', u'c'), + (0x1D4B9, 'M', u'd'), + (0x1D4BA, 'X'), + (0x1D4BB, 'M', u'f'), + (0x1D4BC, 'X'), + (0x1D4BD, 'M', u'h'), + (0x1D4BE, 'M', u'i'), + (0x1D4BF, 'M', u'j'), + (0x1D4C0, 'M', u'k'), + (0x1D4C1, 'M', u'l'), + (0x1D4C2, 'M', u'm'), + (0x1D4C3, 'M', u'n'), + ] + +def _seg_60(): + return [ + (0x1D4C4, 'X'), + (0x1D4C5, 'M', u'p'), + (0x1D4C6, 'M', u'q'), + (0x1D4C7, 'M', u'r'), + (0x1D4C8, 'M', u's'), + (0x1D4C9, 'M', u't'), + (0x1D4CA, 'M', u'u'), + (0x1D4CB, 'M', u'v'), + (0x1D4CC, 'M', u'w'), + (0x1D4CD, 'M', u'x'), + (0x1D4CE, 'M', u'y'), + (0x1D4CF, 'M', u'z'), + (0x1D4D0, 'M', u'a'), + (0x1D4D1, 'M', u'b'), + (0x1D4D2, 'M', u'c'), + (0x1D4D3, 'M', u'd'), + (0x1D4D4, 'M', u'e'), + (0x1D4D5, 'M', u'f'), + (0x1D4D6, 'M', u'g'), + (0x1D4D7, 'M', u'h'), + (0x1D4D8, 'M', u'i'), + (0x1D4D9, 'M', u'j'), + (0x1D4DA, 'M', u'k'), + (0x1D4DB, 'M', u'l'), + (0x1D4DC, 'M', u'm'), + (0x1D4DD, 'M', u'n'), + (0x1D4DE, 'M', u'o'), + (0x1D4DF, 'M', u'p'), + (0x1D4E0, 'M', u'q'), + (0x1D4E1, 'M', u'r'), + (0x1D4E2, 'M', u's'), + (0x1D4E3, 'M', u't'), + (0x1D4E4, 'M', u'u'), + (0x1D4E5, 'M', u'v'), + (0x1D4E6, 'M', u'w'), + (0x1D4E7, 'M', u'x'), + (0x1D4E8, 'M', u'y'), + (0x1D4E9, 'M', u'z'), + (0x1D4EA, 'M', u'a'), + (0x1D4EB, 'M', u'b'), + (0x1D4EC, 'M', u'c'), + (0x1D4ED, 'M', u'd'), + (0x1D4EE, 'M', u'e'), + (0x1D4EF, 'M', u'f'), + (0x1D4F0, 'M', u'g'), + (0x1D4F1, 'M', u'h'), + (0x1D4F2, 'M', u'i'), + (0x1D4F3, 'M', u'j'), + (0x1D4F4, 'M', u'k'), + (0x1D4F5, 'M', u'l'), + (0x1D4F6, 'M', u'm'), + (0x1D4F7, 'M', u'n'), + (0x1D4F8, 'M', u'o'), + (0x1D4F9, 'M', u'p'), + (0x1D4FA, 'M', u'q'), + (0x1D4FB, 'M', u'r'), + (0x1D4FC, 'M', u's'), + (0x1D4FD, 'M', u't'), + (0x1D4FE, 'M', u'u'), + (0x1D4FF, 'M', u'v'), + (0x1D500, 'M', u'w'), + (0x1D501, 'M', u'x'), + (0x1D502, 'M', u'y'), + (0x1D503, 'M', u'z'), + (0x1D504, 'M', u'a'), + (0x1D505, 'M', u'b'), + (0x1D506, 'X'), + (0x1D507, 'M', u'd'), + (0x1D508, 'M', u'e'), + (0x1D509, 'M', u'f'), + (0x1D50A, 'M', u'g'), + (0x1D50B, 'X'), + (0x1D50D, 'M', u'j'), + (0x1D50E, 'M', u'k'), + (0x1D50F, 'M', u'l'), + (0x1D510, 'M', u'm'), + (0x1D511, 'M', u'n'), + (0x1D512, 'M', u'o'), + (0x1D513, 'M', u'p'), + (0x1D514, 'M', u'q'), + (0x1D515, 'X'), + (0x1D516, 'M', u's'), + (0x1D517, 'M', u't'), + (0x1D518, 'M', u'u'), + (0x1D519, 'M', u'v'), + (0x1D51A, 'M', u'w'), + (0x1D51B, 'M', u'x'), + (0x1D51C, 'M', u'y'), + (0x1D51D, 'X'), + (0x1D51E, 'M', u'a'), + (0x1D51F, 'M', u'b'), + (0x1D520, 'M', u'c'), + (0x1D521, 'M', u'd'), + (0x1D522, 'M', u'e'), + (0x1D523, 'M', u'f'), + (0x1D524, 'M', u'g'), + (0x1D525, 'M', u'h'), + (0x1D526, 'M', u'i'), + (0x1D527, 'M', u'j'), + (0x1D528, 'M', u'k'), + ] + +def _seg_61(): + return [ + (0x1D529, 'M', u'l'), + (0x1D52A, 'M', u'm'), + (0x1D52B, 'M', u'n'), + (0x1D52C, 'M', u'o'), + (0x1D52D, 'M', u'p'), + (0x1D52E, 'M', u'q'), + (0x1D52F, 'M', u'r'), + (0x1D530, 'M', u's'), + (0x1D531, 'M', u't'), + (0x1D532, 'M', u'u'), + (0x1D533, 'M', u'v'), + (0x1D534, 'M', u'w'), + (0x1D535, 'M', u'x'), + (0x1D536, 'M', u'y'), + (0x1D537, 'M', u'z'), + (0x1D538, 'M', u'a'), + (0x1D539, 'M', u'b'), + (0x1D53A, 'X'), + (0x1D53B, 'M', u'd'), + (0x1D53C, 'M', u'e'), + (0x1D53D, 'M', u'f'), + (0x1D53E, 'M', u'g'), + (0x1D53F, 'X'), + (0x1D540, 'M', u'i'), + (0x1D541, 'M', u'j'), + (0x1D542, 'M', u'k'), + (0x1D543, 'M', u'l'), + (0x1D544, 'M', u'm'), + (0x1D545, 'X'), + (0x1D546, 'M', u'o'), + (0x1D547, 'X'), + (0x1D54A, 'M', u's'), + (0x1D54B, 'M', u't'), + (0x1D54C, 'M', u'u'), + (0x1D54D, 'M', u'v'), + (0x1D54E, 'M', u'w'), + (0x1D54F, 'M', u'x'), + (0x1D550, 'M', u'y'), + (0x1D551, 'X'), + (0x1D552, 'M', u'a'), + (0x1D553, 'M', u'b'), + (0x1D554, 'M', u'c'), + (0x1D555, 'M', u'd'), + (0x1D556, 'M', u'e'), + (0x1D557, 'M', u'f'), + (0x1D558, 'M', u'g'), + (0x1D559, 'M', u'h'), + (0x1D55A, 'M', u'i'), + (0x1D55B, 'M', u'j'), + (0x1D55C, 'M', u'k'), + (0x1D55D, 'M', u'l'), + (0x1D55E, 'M', u'm'), + (0x1D55F, 'M', u'n'), + (0x1D560, 'M', u'o'), + (0x1D561, 'M', u'p'), + (0x1D562, 'M', u'q'), + (0x1D563, 'M', u'r'), + (0x1D564, 'M', u's'), + (0x1D565, 'M', u't'), + (0x1D566, 'M', u'u'), + (0x1D567, 'M', u'v'), + (0x1D568, 'M', u'w'), + (0x1D569, 'M', u'x'), + (0x1D56A, 'M', u'y'), + (0x1D56B, 'M', u'z'), + (0x1D56C, 'M', u'a'), + (0x1D56D, 'M', u'b'), + (0x1D56E, 'M', u'c'), + (0x1D56F, 'M', u'd'), + (0x1D570, 'M', u'e'), + (0x1D571, 'M', u'f'), + (0x1D572, 'M', u'g'), + (0x1D573, 'M', u'h'), + (0x1D574, 'M', u'i'), + (0x1D575, 'M', u'j'), + (0x1D576, 'M', u'k'), + (0x1D577, 'M', u'l'), + (0x1D578, 'M', u'm'), + (0x1D579, 'M', u'n'), + (0x1D57A, 'M', u'o'), + (0x1D57B, 'M', u'p'), + (0x1D57C, 'M', u'q'), + (0x1D57D, 'M', u'r'), + (0x1D57E, 'M', u's'), + (0x1D57F, 'M', u't'), + (0x1D580, 'M', u'u'), + (0x1D581, 'M', u'v'), + (0x1D582, 'M', u'w'), + (0x1D583, 'M', u'x'), + (0x1D584, 'M', u'y'), + (0x1D585, 'M', u'z'), + (0x1D586, 'M', u'a'), + (0x1D587, 'M', u'b'), + (0x1D588, 'M', u'c'), + (0x1D589, 'M', u'd'), + (0x1D58A, 'M', u'e'), + (0x1D58B, 'M', u'f'), + (0x1D58C, 'M', u'g'), + (0x1D58D, 'M', u'h'), + (0x1D58E, 'M', u'i'), + ] + +def _seg_62(): + return [ + (0x1D58F, 'M', u'j'), + (0x1D590, 'M', u'k'), + (0x1D591, 'M', u'l'), + (0x1D592, 'M', u'm'), + (0x1D593, 'M', u'n'), + (0x1D594, 'M', u'o'), + (0x1D595, 'M', u'p'), + (0x1D596, 'M', u'q'), + (0x1D597, 'M', u'r'), + (0x1D598, 'M', u's'), + (0x1D599, 'M', u't'), + (0x1D59A, 'M', u'u'), + (0x1D59B, 'M', u'v'), + (0x1D59C, 'M', u'w'), + (0x1D59D, 'M', u'x'), + (0x1D59E, 'M', u'y'), + (0x1D59F, 'M', u'z'), + (0x1D5A0, 'M', u'a'), + (0x1D5A1, 'M', u'b'), + (0x1D5A2, 'M', u'c'), + (0x1D5A3, 'M', u'd'), + (0x1D5A4, 'M', u'e'), + (0x1D5A5, 'M', u'f'), + (0x1D5A6, 'M', u'g'), + (0x1D5A7, 'M', u'h'), + (0x1D5A8, 'M', u'i'), + (0x1D5A9, 'M', u'j'), + (0x1D5AA, 'M', u'k'), + (0x1D5AB, 'M', u'l'), + (0x1D5AC, 'M', u'm'), + (0x1D5AD, 'M', u'n'), + (0x1D5AE, 'M', u'o'), + (0x1D5AF, 'M', u'p'), + (0x1D5B0, 'M', u'q'), + (0x1D5B1, 'M', u'r'), + (0x1D5B2, 'M', u's'), + (0x1D5B3, 'M', u't'), + (0x1D5B4, 'M', u'u'), + (0x1D5B5, 'M', u'v'), + (0x1D5B6, 'M', u'w'), + (0x1D5B7, 'M', u'x'), + (0x1D5B8, 'M', u'y'), + (0x1D5B9, 'M', u'z'), + (0x1D5BA, 'M', u'a'), + (0x1D5BB, 'M', u'b'), + (0x1D5BC, 'M', u'c'), + (0x1D5BD, 'M', u'd'), + (0x1D5BE, 'M', u'e'), + (0x1D5BF, 'M', u'f'), + (0x1D5C0, 'M', u'g'), + (0x1D5C1, 'M', u'h'), + (0x1D5C2, 'M', u'i'), + (0x1D5C3, 'M', u'j'), + (0x1D5C4, 'M', u'k'), + (0x1D5C5, 'M', u'l'), + (0x1D5C6, 'M', u'm'), + (0x1D5C7, 'M', u'n'), + (0x1D5C8, 'M', u'o'), + (0x1D5C9, 'M', u'p'), + (0x1D5CA, 'M', u'q'), + (0x1D5CB, 'M', u'r'), + (0x1D5CC, 'M', u's'), + (0x1D5CD, 'M', u't'), + (0x1D5CE, 'M', u'u'), + (0x1D5CF, 'M', u'v'), + (0x1D5D0, 'M', u'w'), + (0x1D5D1, 'M', u'x'), + (0x1D5D2, 'M', u'y'), + (0x1D5D3, 'M', u'z'), + (0x1D5D4, 'M', u'a'), + (0x1D5D5, 'M', u'b'), + (0x1D5D6, 'M', u'c'), + (0x1D5D7, 'M', u'd'), + (0x1D5D8, 'M', u'e'), + (0x1D5D9, 'M', u'f'), + (0x1D5DA, 'M', u'g'), + (0x1D5DB, 'M', u'h'), + (0x1D5DC, 'M', u'i'), + (0x1D5DD, 'M', u'j'), + (0x1D5DE, 'M', u'k'), + (0x1D5DF, 'M', u'l'), + (0x1D5E0, 'M', u'm'), + (0x1D5E1, 'M', u'n'), + (0x1D5E2, 'M', u'o'), + (0x1D5E3, 'M', u'p'), + (0x1D5E4, 'M', u'q'), + (0x1D5E5, 'M', u'r'), + (0x1D5E6, 'M', u's'), + (0x1D5E7, 'M', u't'), + (0x1D5E8, 'M', u'u'), + (0x1D5E9, 'M', u'v'), + (0x1D5EA, 'M', u'w'), + (0x1D5EB, 'M', u'x'), + (0x1D5EC, 'M', u'y'), + (0x1D5ED, 'M', u'z'), + (0x1D5EE, 'M', u'a'), + (0x1D5EF, 'M', u'b'), + (0x1D5F0, 'M', u'c'), + (0x1D5F1, 'M', u'd'), + (0x1D5F2, 'M', u'e'), + ] + +def _seg_63(): + return [ + (0x1D5F3, 'M', u'f'), + (0x1D5F4, 'M', u'g'), + (0x1D5F5, 'M', u'h'), + (0x1D5F6, 'M', u'i'), + (0x1D5F7, 'M', u'j'), + (0x1D5F8, 'M', u'k'), + (0x1D5F9, 'M', u'l'), + (0x1D5FA, 'M', u'm'), + (0x1D5FB, 'M', u'n'), + (0x1D5FC, 'M', u'o'), + (0x1D5FD, 'M', u'p'), + (0x1D5FE, 'M', u'q'), + (0x1D5FF, 'M', u'r'), + (0x1D600, 'M', u's'), + (0x1D601, 'M', u't'), + (0x1D602, 'M', u'u'), + (0x1D603, 'M', u'v'), + (0x1D604, 'M', u'w'), + (0x1D605, 'M', u'x'), + (0x1D606, 'M', u'y'), + (0x1D607, 'M', u'z'), + (0x1D608, 'M', u'a'), + (0x1D609, 'M', u'b'), + (0x1D60A, 'M', u'c'), + (0x1D60B, 'M', u'd'), + (0x1D60C, 'M', u'e'), + (0x1D60D, 'M', u'f'), + (0x1D60E, 'M', u'g'), + (0x1D60F, 'M', u'h'), + (0x1D610, 'M', u'i'), + (0x1D611, 'M', u'j'), + (0x1D612, 'M', u'k'), + (0x1D613, 'M', u'l'), + (0x1D614, 'M', u'm'), + (0x1D615, 'M', u'n'), + (0x1D616, 'M', u'o'), + (0x1D617, 'M', u'p'), + (0x1D618, 'M', u'q'), + (0x1D619, 'M', u'r'), + (0x1D61A, 'M', u's'), + (0x1D61B, 'M', u't'), + (0x1D61C, 'M', u'u'), + (0x1D61D, 'M', u'v'), + (0x1D61E, 'M', u'w'), + (0x1D61F, 'M', u'x'), + (0x1D620, 'M', u'y'), + (0x1D621, 'M', u'z'), + (0x1D622, 'M', u'a'), + (0x1D623, 'M', u'b'), + (0x1D624, 'M', u'c'), + (0x1D625, 'M', u'd'), + (0x1D626, 'M', u'e'), + (0x1D627, 'M', u'f'), + (0x1D628, 'M', u'g'), + (0x1D629, 'M', u'h'), + (0x1D62A, 'M', u'i'), + (0x1D62B, 'M', u'j'), + (0x1D62C, 'M', u'k'), + (0x1D62D, 'M', u'l'), + (0x1D62E, 'M', u'm'), + (0x1D62F, 'M', u'n'), + (0x1D630, 'M', u'o'), + (0x1D631, 'M', u'p'), + (0x1D632, 'M', u'q'), + (0x1D633, 'M', u'r'), + (0x1D634, 'M', u's'), + (0x1D635, 'M', u't'), + (0x1D636, 'M', u'u'), + (0x1D637, 'M', u'v'), + (0x1D638, 'M', u'w'), + (0x1D639, 'M', u'x'), + (0x1D63A, 'M', u'y'), + (0x1D63B, 'M', u'z'), + (0x1D63C, 'M', u'a'), + (0x1D63D, 'M', u'b'), + (0x1D63E, 'M', u'c'), + (0x1D63F, 'M', u'd'), + (0x1D640, 'M', u'e'), + (0x1D641, 'M', u'f'), + (0x1D642, 'M', u'g'), + (0x1D643, 'M', u'h'), + (0x1D644, 'M', u'i'), + (0x1D645, 'M', u'j'), + (0x1D646, 'M', u'k'), + (0x1D647, 'M', u'l'), + (0x1D648, 'M', u'm'), + (0x1D649, 'M', u'n'), + (0x1D64A, 'M', u'o'), + (0x1D64B, 'M', u'p'), + (0x1D64C, 'M', u'q'), + (0x1D64D, 'M', u'r'), + (0x1D64E, 'M', u's'), + (0x1D64F, 'M', u't'), + (0x1D650, 'M', u'u'), + (0x1D651, 'M', u'v'), + (0x1D652, 'M', u'w'), + (0x1D653, 'M', u'x'), + (0x1D654, 'M', u'y'), + (0x1D655, 'M', u'z'), + (0x1D656, 'M', u'a'), + ] + +def _seg_64(): + return [ + (0x1D657, 'M', u'b'), + (0x1D658, 'M', u'c'), + (0x1D659, 'M', u'd'), + (0x1D65A, 'M', u'e'), + (0x1D65B, 'M', u'f'), + (0x1D65C, 'M', u'g'), + (0x1D65D, 'M', u'h'), + (0x1D65E, 'M', u'i'), + (0x1D65F, 'M', u'j'), + (0x1D660, 'M', u'k'), + (0x1D661, 'M', u'l'), + (0x1D662, 'M', u'm'), + (0x1D663, 'M', u'n'), + (0x1D664, 'M', u'o'), + (0x1D665, 'M', u'p'), + (0x1D666, 'M', u'q'), + (0x1D667, 'M', u'r'), + (0x1D668, 'M', u's'), + (0x1D669, 'M', u't'), + (0x1D66A, 'M', u'u'), + (0x1D66B, 'M', u'v'), + (0x1D66C, 'M', u'w'), + (0x1D66D, 'M', u'x'), + (0x1D66E, 'M', u'y'), + (0x1D66F, 'M', u'z'), + (0x1D670, 'M', u'a'), + (0x1D671, 'M', u'b'), + (0x1D672, 'M', u'c'), + (0x1D673, 'M', u'd'), + (0x1D674, 'M', u'e'), + (0x1D675, 'M', u'f'), + (0x1D676, 'M', u'g'), + (0x1D677, 'M', u'h'), + (0x1D678, 'M', u'i'), + (0x1D679, 'M', u'j'), + (0x1D67A, 'M', u'k'), + (0x1D67B, 'M', u'l'), + (0x1D67C, 'M', u'm'), + (0x1D67D, 'M', u'n'), + (0x1D67E, 'M', u'o'), + (0x1D67F, 'M', u'p'), + (0x1D680, 'M', u'q'), + (0x1D681, 'M', u'r'), + (0x1D682, 'M', u's'), + (0x1D683, 'M', u't'), + (0x1D684, 'M', u'u'), + (0x1D685, 'M', u'v'), + (0x1D686, 'M', u'w'), + (0x1D687, 'M', u'x'), + (0x1D688, 'M', u'y'), + (0x1D689, 'M', u'z'), + (0x1D68A, 'M', u'a'), + (0x1D68B, 'M', u'b'), + (0x1D68C, 'M', u'c'), + (0x1D68D, 'M', u'd'), + (0x1D68E, 'M', u'e'), + (0x1D68F, 'M', u'f'), + (0x1D690, 'M', u'g'), + (0x1D691, 'M', u'h'), + (0x1D692, 'M', u'i'), + (0x1D693, 'M', u'j'), + (0x1D694, 'M', u'k'), + (0x1D695, 'M', u'l'), + (0x1D696, 'M', u'm'), + (0x1D697, 'M', u'n'), + (0x1D698, 'M', u'o'), + (0x1D699, 'M', u'p'), + (0x1D69A, 'M', u'q'), + (0x1D69B, 'M', u'r'), + (0x1D69C, 'M', u's'), + (0x1D69D, 'M', u't'), + (0x1D69E, 'M', u'u'), + (0x1D69F, 'M', u'v'), + (0x1D6A0, 'M', u'w'), + (0x1D6A1, 'M', u'x'), + (0x1D6A2, 'M', u'y'), + (0x1D6A3, 'M', u'z'), + (0x1D6A4, 'M', u'ı'), + (0x1D6A5, 'M', u'ȷ'), + (0x1D6A6, 'X'), + (0x1D6A8, 'M', u'α'), + (0x1D6A9, 'M', u'β'), + (0x1D6AA, 'M', u'γ'), + (0x1D6AB, 'M', u'δ'), + (0x1D6AC, 'M', u'ε'), + (0x1D6AD, 'M', u'ζ'), + (0x1D6AE, 'M', u'η'), + (0x1D6AF, 'M', u'θ'), + (0x1D6B0, 'M', u'ι'), + (0x1D6B1, 'M', u'κ'), + (0x1D6B2, 'M', u'λ'), + (0x1D6B3, 'M', u'μ'), + (0x1D6B4, 'M', u'ν'), + (0x1D6B5, 'M', u'ξ'), + (0x1D6B6, 'M', u'ο'), + (0x1D6B7, 'M', u'π'), + (0x1D6B8, 'M', u'ρ'), + (0x1D6B9, 'M', u'θ'), + (0x1D6BA, 'M', u'σ'), + (0x1D6BB, 'M', u'τ'), + ] + +def _seg_65(): + return [ + (0x1D6BC, 'M', u'υ'), + (0x1D6BD, 'M', u'φ'), + (0x1D6BE, 'M', u'χ'), + (0x1D6BF, 'M', u'ψ'), + (0x1D6C0, 'M', u'ω'), + (0x1D6C1, 'M', u'∇'), + (0x1D6C2, 'M', u'α'), + (0x1D6C3, 'M', u'β'), + (0x1D6C4, 'M', u'γ'), + (0x1D6C5, 'M', u'δ'), + (0x1D6C6, 'M', u'ε'), + (0x1D6C7, 'M', u'ζ'), + (0x1D6C8, 'M', u'η'), + (0x1D6C9, 'M', u'θ'), + (0x1D6CA, 'M', u'ι'), + (0x1D6CB, 'M', u'κ'), + (0x1D6CC, 'M', u'λ'), + (0x1D6CD, 'M', u'μ'), + (0x1D6CE, 'M', u'ν'), + (0x1D6CF, 'M', u'ξ'), + (0x1D6D0, 'M', u'ο'), + (0x1D6D1, 'M', u'π'), + (0x1D6D2, 'M', u'ρ'), + (0x1D6D3, 'M', u'σ'), + (0x1D6D5, 'M', u'τ'), + (0x1D6D6, 'M', u'υ'), + (0x1D6D7, 'M', u'φ'), + (0x1D6D8, 'M', u'χ'), + (0x1D6D9, 'M', u'ψ'), + (0x1D6DA, 'M', u'ω'), + (0x1D6DB, 'M', u'∂'), + (0x1D6DC, 'M', u'ε'), + (0x1D6DD, 'M', u'θ'), + (0x1D6DE, 'M', u'κ'), + (0x1D6DF, 'M', u'φ'), + (0x1D6E0, 'M', u'ρ'), + (0x1D6E1, 'M', u'π'), + (0x1D6E2, 'M', u'α'), + (0x1D6E3, 'M', u'β'), + (0x1D6E4, 'M', u'γ'), + (0x1D6E5, 'M', u'δ'), + (0x1D6E6, 'M', u'ε'), + (0x1D6E7, 'M', u'ζ'), + (0x1D6E8, 'M', u'η'), + (0x1D6E9, 'M', u'θ'), + (0x1D6EA, 'M', u'ι'), + (0x1D6EB, 'M', u'κ'), + (0x1D6EC, 'M', u'λ'), + (0x1D6ED, 'M', u'μ'), + (0x1D6EE, 'M', u'ν'), + (0x1D6EF, 'M', u'ξ'), + (0x1D6F0, 'M', u'ο'), + (0x1D6F1, 'M', u'π'), + (0x1D6F2, 'M', u'ρ'), + (0x1D6F3, 'M', u'θ'), + (0x1D6F4, 'M', u'σ'), + (0x1D6F5, 'M', u'τ'), + (0x1D6F6, 'M', u'υ'), + (0x1D6F7, 'M', u'φ'), + (0x1D6F8, 'M', u'χ'), + (0x1D6F9, 'M', u'ψ'), + (0x1D6FA, 'M', u'ω'), + (0x1D6FB, 'M', u'∇'), + (0x1D6FC, 'M', u'α'), + (0x1D6FD, 'M', u'β'), + (0x1D6FE, 'M', u'γ'), + (0x1D6FF, 'M', u'δ'), + (0x1D700, 'M', u'ε'), + (0x1D701, 'M', u'ζ'), + (0x1D702, 'M', u'η'), + (0x1D703, 'M', u'θ'), + (0x1D704, 'M', u'ι'), + (0x1D705, 'M', u'κ'), + (0x1D706, 'M', u'λ'), + (0x1D707, 'M', u'μ'), + (0x1D708, 'M', u'ν'), + (0x1D709, 'M', u'ξ'), + (0x1D70A, 'M', u'ο'), + (0x1D70B, 'M', u'π'), + (0x1D70C, 'M', u'ρ'), + (0x1D70D, 'M', u'σ'), + (0x1D70F, 'M', u'τ'), + (0x1D710, 'M', u'υ'), + (0x1D711, 'M', u'φ'), + (0x1D712, 'M', u'χ'), + (0x1D713, 'M', u'ψ'), + (0x1D714, 'M', u'ω'), + (0x1D715, 'M', u'∂'), + (0x1D716, 'M', u'ε'), + (0x1D717, 'M', u'θ'), + (0x1D718, 'M', u'κ'), + (0x1D719, 'M', u'φ'), + (0x1D71A, 'M', u'ρ'), + (0x1D71B, 'M', u'π'), + (0x1D71C, 'M', u'α'), + (0x1D71D, 'M', u'β'), + (0x1D71E, 'M', u'γ'), + (0x1D71F, 'M', u'δ'), + (0x1D720, 'M', u'ε'), + (0x1D721, 'M', u'ζ'), + ] + +def _seg_66(): + return [ + (0x1D722, 'M', u'η'), + (0x1D723, 'M', u'θ'), + (0x1D724, 'M', u'ι'), + (0x1D725, 'M', u'κ'), + (0x1D726, 'M', u'λ'), + (0x1D727, 'M', u'μ'), + (0x1D728, 'M', u'ν'), + (0x1D729, 'M', u'ξ'), + (0x1D72A, 'M', u'ο'), + (0x1D72B, 'M', u'π'), + (0x1D72C, 'M', u'ρ'), + (0x1D72D, 'M', u'θ'), + (0x1D72E, 'M', u'σ'), + (0x1D72F, 'M', u'τ'), + (0x1D730, 'M', u'υ'), + (0x1D731, 'M', u'φ'), + (0x1D732, 'M', u'χ'), + (0x1D733, 'M', u'ψ'), + (0x1D734, 'M', u'ω'), + (0x1D735, 'M', u'∇'), + (0x1D736, 'M', u'α'), + (0x1D737, 'M', u'β'), + (0x1D738, 'M', u'γ'), + (0x1D739, 'M', u'δ'), + (0x1D73A, 'M', u'ε'), + (0x1D73B, 'M', u'ζ'), + (0x1D73C, 'M', u'η'), + (0x1D73D, 'M', u'θ'), + (0x1D73E, 'M', u'ι'), + (0x1D73F, 'M', u'κ'), + (0x1D740, 'M', u'λ'), + (0x1D741, 'M', u'μ'), + (0x1D742, 'M', u'ν'), + (0x1D743, 'M', u'ξ'), + (0x1D744, 'M', u'ο'), + (0x1D745, 'M', u'π'), + (0x1D746, 'M', u'ρ'), + (0x1D747, 'M', u'σ'), + (0x1D749, 'M', u'τ'), + (0x1D74A, 'M', u'υ'), + (0x1D74B, 'M', u'φ'), + (0x1D74C, 'M', u'χ'), + (0x1D74D, 'M', u'ψ'), + (0x1D74E, 'M', u'ω'), + (0x1D74F, 'M', u'∂'), + (0x1D750, 'M', u'ε'), + (0x1D751, 'M', u'θ'), + (0x1D752, 'M', u'κ'), + (0x1D753, 'M', u'φ'), + (0x1D754, 'M', u'ρ'), + (0x1D755, 'M', u'π'), + (0x1D756, 'M', u'α'), + (0x1D757, 'M', u'β'), + (0x1D758, 'M', u'γ'), + (0x1D759, 'M', u'δ'), + (0x1D75A, 'M', u'ε'), + (0x1D75B, 'M', u'ζ'), + (0x1D75C, 'M', u'η'), + (0x1D75D, 'M', u'θ'), + (0x1D75E, 'M', u'ι'), + (0x1D75F, 'M', u'κ'), + (0x1D760, 'M', u'λ'), + (0x1D761, 'M', u'μ'), + (0x1D762, 'M', u'ν'), + (0x1D763, 'M', u'ξ'), + (0x1D764, 'M', u'ο'), + (0x1D765, 'M', u'π'), + (0x1D766, 'M', u'ρ'), + (0x1D767, 'M', u'θ'), + (0x1D768, 'M', u'σ'), + (0x1D769, 'M', u'τ'), + (0x1D76A, 'M', u'υ'), + (0x1D76B, 'M', u'φ'), + (0x1D76C, 'M', u'χ'), + (0x1D76D, 'M', u'ψ'), + (0x1D76E, 'M', u'ω'), + (0x1D76F, 'M', u'∇'), + (0x1D770, 'M', u'α'), + (0x1D771, 'M', u'β'), + (0x1D772, 'M', u'γ'), + (0x1D773, 'M', u'δ'), + (0x1D774, 'M', u'ε'), + (0x1D775, 'M', u'ζ'), + (0x1D776, 'M', u'η'), + (0x1D777, 'M', u'θ'), + (0x1D778, 'M', u'ι'), + (0x1D779, 'M', u'κ'), + (0x1D77A, 'M', u'λ'), + (0x1D77B, 'M', u'μ'), + (0x1D77C, 'M', u'ν'), + (0x1D77D, 'M', u'ξ'), + (0x1D77E, 'M', u'ο'), + (0x1D77F, 'M', u'π'), + (0x1D780, 'M', u'ρ'), + (0x1D781, 'M', u'σ'), + (0x1D783, 'M', u'τ'), + (0x1D784, 'M', u'υ'), + (0x1D785, 'M', u'φ'), + (0x1D786, 'M', u'χ'), + (0x1D787, 'M', u'ψ'), + ] + +def _seg_67(): + return [ + (0x1D788, 'M', u'ω'), + (0x1D789, 'M', u'∂'), + (0x1D78A, 'M', u'ε'), + (0x1D78B, 'M', u'θ'), + (0x1D78C, 'M', u'κ'), + (0x1D78D, 'M', u'φ'), + (0x1D78E, 'M', u'ρ'), + (0x1D78F, 'M', u'π'), + (0x1D790, 'M', u'α'), + (0x1D791, 'M', u'β'), + (0x1D792, 'M', u'γ'), + (0x1D793, 'M', u'δ'), + (0x1D794, 'M', u'ε'), + (0x1D795, 'M', u'ζ'), + (0x1D796, 'M', u'η'), + (0x1D797, 'M', u'θ'), + (0x1D798, 'M', u'ι'), + (0x1D799, 'M', u'κ'), + (0x1D79A, 'M', u'λ'), + (0x1D79B, 'M', u'μ'), + (0x1D79C, 'M', u'ν'), + (0x1D79D, 'M', u'ξ'), + (0x1D79E, 'M', u'ο'), + (0x1D79F, 'M', u'π'), + (0x1D7A0, 'M', u'ρ'), + (0x1D7A1, 'M', u'θ'), + (0x1D7A2, 'M', u'σ'), + (0x1D7A3, 'M', u'τ'), + (0x1D7A4, 'M', u'υ'), + (0x1D7A5, 'M', u'φ'), + (0x1D7A6, 'M', u'χ'), + (0x1D7A7, 'M', u'ψ'), + (0x1D7A8, 'M', u'ω'), + (0x1D7A9, 'M', u'∇'), + (0x1D7AA, 'M', u'α'), + (0x1D7AB, 'M', u'β'), + (0x1D7AC, 'M', u'γ'), + (0x1D7AD, 'M', u'δ'), + (0x1D7AE, 'M', u'ε'), + (0x1D7AF, 'M', u'ζ'), + (0x1D7B0, 'M', u'η'), + (0x1D7B1, 'M', u'θ'), + (0x1D7B2, 'M', u'ι'), + (0x1D7B3, 'M', u'κ'), + (0x1D7B4, 'M', u'λ'), + (0x1D7B5, 'M', u'μ'), + (0x1D7B6, 'M', u'ν'), + (0x1D7B7, 'M', u'ξ'), + (0x1D7B8, 'M', u'ο'), + (0x1D7B9, 'M', u'π'), + (0x1D7BA, 'M', u'ρ'), + (0x1D7BB, 'M', u'σ'), + (0x1D7BD, 'M', u'τ'), + (0x1D7BE, 'M', u'υ'), + (0x1D7BF, 'M', u'φ'), + (0x1D7C0, 'M', u'χ'), + (0x1D7C1, 'M', u'ψ'), + (0x1D7C2, 'M', u'ω'), + (0x1D7C3, 'M', u'∂'), + (0x1D7C4, 'M', u'ε'), + (0x1D7C5, 'M', u'θ'), + (0x1D7C6, 'M', u'κ'), + (0x1D7C7, 'M', u'φ'), + (0x1D7C8, 'M', u'ρ'), + (0x1D7C9, 'M', u'π'), + (0x1D7CA, 'M', u'ϝ'), + (0x1D7CC, 'X'), + (0x1D7CE, 'M', u'0'), + (0x1D7CF, 'M', u'1'), + (0x1D7D0, 'M', u'2'), + (0x1D7D1, 'M', u'3'), + (0x1D7D2, 'M', u'4'), + (0x1D7D3, 'M', u'5'), + (0x1D7D4, 'M', u'6'), + (0x1D7D5, 'M', u'7'), + (0x1D7D6, 'M', u'8'), + (0x1D7D7, 'M', u'9'), + (0x1D7D8, 'M', u'0'), + (0x1D7D9, 'M', u'1'), + (0x1D7DA, 'M', u'2'), + (0x1D7DB, 'M', u'3'), + (0x1D7DC, 'M', u'4'), + (0x1D7DD, 'M', u'5'), + (0x1D7DE, 'M', u'6'), + (0x1D7DF, 'M', u'7'), + (0x1D7E0, 'M', u'8'), + (0x1D7E1, 'M', u'9'), + (0x1D7E2, 'M', u'0'), + (0x1D7E3, 'M', u'1'), + (0x1D7E4, 'M', u'2'), + (0x1D7E5, 'M', u'3'), + (0x1D7E6, 'M', u'4'), + (0x1D7E7, 'M', u'5'), + (0x1D7E8, 'M', u'6'), + (0x1D7E9, 'M', u'7'), + (0x1D7EA, 'M', u'8'), + (0x1D7EB, 'M', u'9'), + (0x1D7EC, 'M', u'0'), + (0x1D7ED, 'M', u'1'), + (0x1D7EE, 'M', u'2'), + ] + +def _seg_68(): + return [ + (0x1D7EF, 'M', u'3'), + (0x1D7F0, 'M', u'4'), + (0x1D7F1, 'M', u'5'), + (0x1D7F2, 'M', u'6'), + (0x1D7F3, 'M', u'7'), + (0x1D7F4, 'M', u'8'), + (0x1D7F5, 'M', u'9'), + (0x1D7F6, 'M', u'0'), + (0x1D7F7, 'M', u'1'), + (0x1D7F8, 'M', u'2'), + (0x1D7F9, 'M', u'3'), + (0x1D7FA, 'M', u'4'), + (0x1D7FB, 'M', u'5'), + (0x1D7FC, 'M', u'6'), + (0x1D7FD, 'M', u'7'), + (0x1D7FE, 'M', u'8'), + (0x1D7FF, 'M', u'9'), + (0x1D800, 'V'), + (0x1DA8C, 'X'), + (0x1DA9B, 'V'), + (0x1DAA0, 'X'), + (0x1DAA1, 'V'), + (0x1DAB0, 'X'), + (0x1E000, 'V'), + (0x1E007, 'X'), + (0x1E008, 'V'), + (0x1E019, 'X'), + (0x1E01B, 'V'), + (0x1E022, 'X'), + (0x1E023, 'V'), + (0x1E025, 'X'), + (0x1E026, 'V'), + (0x1E02B, 'X'), + (0x1E800, 'V'), + (0x1E8C5, 'X'), + (0x1E8C7, 'V'), + (0x1E8D7, 'X'), + (0x1E900, 'M', u'𞤢'), + (0x1E901, 'M', u'𞤣'), + (0x1E902, 'M', u'𞤤'), + (0x1E903, 'M', u'𞤥'), + (0x1E904, 'M', u'𞤦'), + (0x1E905, 'M', u'𞤧'), + (0x1E906, 'M', u'𞤨'), + (0x1E907, 'M', u'𞤩'), + (0x1E908, 'M', u'𞤪'), + (0x1E909, 'M', u'𞤫'), + (0x1E90A, 'M', u'𞤬'), + (0x1E90B, 'M', u'𞤭'), + (0x1E90C, 'M', u'𞤮'), + (0x1E90D, 'M', u'𞤯'), + (0x1E90E, 'M', u'𞤰'), + (0x1E90F, 'M', u'𞤱'), + (0x1E910, 'M', u'𞤲'), + (0x1E911, 'M', u'𞤳'), + (0x1E912, 'M', u'𞤴'), + (0x1E913, 'M', u'𞤵'), + (0x1E914, 'M', u'𞤶'), + (0x1E915, 'M', u'𞤷'), + (0x1E916, 'M', u'𞤸'), + (0x1E917, 'M', u'𞤹'), + (0x1E918, 'M', u'𞤺'), + (0x1E919, 'M', u'𞤻'), + (0x1E91A, 'M', u'𞤼'), + (0x1E91B, 'M', u'𞤽'), + (0x1E91C, 'M', u'𞤾'), + (0x1E91D, 'M', u'𞤿'), + (0x1E91E, 'M', u'𞥀'), + (0x1E91F, 'M', u'𞥁'), + (0x1E920, 'M', u'𞥂'), + (0x1E921, 'M', u'𞥃'), + (0x1E922, 'V'), + (0x1E94B, 'X'), + (0x1E950, 'V'), + (0x1E95A, 'X'), + (0x1E95E, 'V'), + (0x1E960, 'X'), + (0x1EC71, 'V'), + (0x1ECB5, 'X'), + (0x1EE00, 'M', u'ا'), + (0x1EE01, 'M', u'ب'), + (0x1EE02, 'M', u'ج'), + (0x1EE03, 'M', u'د'), + (0x1EE04, 'X'), + (0x1EE05, 'M', u'و'), + (0x1EE06, 'M', u'ز'), + (0x1EE07, 'M', u'ح'), + (0x1EE08, 'M', u'ط'), + (0x1EE09, 'M', u'ي'), + (0x1EE0A, 'M', u'ك'), + (0x1EE0B, 'M', u'ل'), + (0x1EE0C, 'M', u'م'), + (0x1EE0D, 'M', u'ن'), + (0x1EE0E, 'M', u'س'), + (0x1EE0F, 'M', u'ع'), + (0x1EE10, 'M', u'ف'), + (0x1EE11, 'M', u'ص'), + (0x1EE12, 'M', u'ق'), + (0x1EE13, 'M', u'ر'), + (0x1EE14, 'M', u'ش'), + ] + +def _seg_69(): + return [ + (0x1EE15, 'M', u'ت'), + (0x1EE16, 'M', u'ث'), + (0x1EE17, 'M', u'خ'), + (0x1EE18, 'M', u'ذ'), + (0x1EE19, 'M', u'ض'), + (0x1EE1A, 'M', u'ظ'), + (0x1EE1B, 'M', u'غ'), + (0x1EE1C, 'M', u'ٮ'), + (0x1EE1D, 'M', u'ں'), + (0x1EE1E, 'M', u'ڡ'), + (0x1EE1F, 'M', u'ٯ'), + (0x1EE20, 'X'), + (0x1EE21, 'M', u'ب'), + (0x1EE22, 'M', u'ج'), + (0x1EE23, 'X'), + (0x1EE24, 'M', u'ه'), + (0x1EE25, 'X'), + (0x1EE27, 'M', u'ح'), + (0x1EE28, 'X'), + (0x1EE29, 'M', u'ي'), + (0x1EE2A, 'M', u'ك'), + (0x1EE2B, 'M', u'ل'), + (0x1EE2C, 'M', u'م'), + (0x1EE2D, 'M', u'ن'), + (0x1EE2E, 'M', u'س'), + (0x1EE2F, 'M', u'ع'), + (0x1EE30, 'M', u'ف'), + (0x1EE31, 'M', u'ص'), + (0x1EE32, 'M', u'ق'), + (0x1EE33, 'X'), + (0x1EE34, 'M', u'ش'), + (0x1EE35, 'M', u'ت'), + (0x1EE36, 'M', u'ث'), + (0x1EE37, 'M', u'خ'), + (0x1EE38, 'X'), + (0x1EE39, 'M', u'ض'), + (0x1EE3A, 'X'), + (0x1EE3B, 'M', u'غ'), + (0x1EE3C, 'X'), + (0x1EE42, 'M', u'ج'), + (0x1EE43, 'X'), + (0x1EE47, 'M', u'ح'), + (0x1EE48, 'X'), + (0x1EE49, 'M', u'ي'), + (0x1EE4A, 'X'), + (0x1EE4B, 'M', u'ل'), + (0x1EE4C, 'X'), + (0x1EE4D, 'M', u'ن'), + (0x1EE4E, 'M', u'س'), + (0x1EE4F, 'M', u'ع'), + (0x1EE50, 'X'), + (0x1EE51, 'M', u'ص'), + (0x1EE52, 'M', u'ق'), + (0x1EE53, 'X'), + (0x1EE54, 'M', u'ش'), + (0x1EE55, 'X'), + (0x1EE57, 'M', u'خ'), + (0x1EE58, 'X'), + (0x1EE59, 'M', u'ض'), + (0x1EE5A, 'X'), + (0x1EE5B, 'M', u'غ'), + (0x1EE5C, 'X'), + (0x1EE5D, 'M', u'ں'), + (0x1EE5E, 'X'), + (0x1EE5F, 'M', u'ٯ'), + (0x1EE60, 'X'), + (0x1EE61, 'M', u'ب'), + (0x1EE62, 'M', u'ج'), + (0x1EE63, 'X'), + (0x1EE64, 'M', u'ه'), + (0x1EE65, 'X'), + (0x1EE67, 'M', u'ح'), + (0x1EE68, 'M', u'ط'), + (0x1EE69, 'M', u'ي'), + (0x1EE6A, 'M', u'ك'), + (0x1EE6B, 'X'), + (0x1EE6C, 'M', u'م'), + (0x1EE6D, 'M', u'ن'), + (0x1EE6E, 'M', u'س'), + (0x1EE6F, 'M', u'ع'), + (0x1EE70, 'M', u'ف'), + (0x1EE71, 'M', u'ص'), + (0x1EE72, 'M', u'ق'), + (0x1EE73, 'X'), + (0x1EE74, 'M', u'ش'), + (0x1EE75, 'M', u'ت'), + (0x1EE76, 'M', u'ث'), + (0x1EE77, 'M', u'خ'), + (0x1EE78, 'X'), + (0x1EE79, 'M', u'ض'), + (0x1EE7A, 'M', u'ظ'), + (0x1EE7B, 'M', u'غ'), + (0x1EE7C, 'M', u'ٮ'), + (0x1EE7D, 'X'), + (0x1EE7E, 'M', u'ڡ'), + (0x1EE7F, 'X'), + (0x1EE80, 'M', u'ا'), + (0x1EE81, 'M', u'ب'), + (0x1EE82, 'M', u'ج'), + (0x1EE83, 'M', u'د'), + ] + +def _seg_70(): + return [ + (0x1EE84, 'M', u'ه'), + (0x1EE85, 'M', u'و'), + (0x1EE86, 'M', u'ز'), + (0x1EE87, 'M', u'ح'), + (0x1EE88, 'M', u'ط'), + (0x1EE89, 'M', u'ي'), + (0x1EE8A, 'X'), + (0x1EE8B, 'M', u'ل'), + (0x1EE8C, 'M', u'م'), + (0x1EE8D, 'M', u'ن'), + (0x1EE8E, 'M', u'س'), + (0x1EE8F, 'M', u'ع'), + (0x1EE90, 'M', u'ف'), + (0x1EE91, 'M', u'ص'), + (0x1EE92, 'M', u'ق'), + (0x1EE93, 'M', u'ر'), + (0x1EE94, 'M', u'ش'), + (0x1EE95, 'M', u'ت'), + (0x1EE96, 'M', u'ث'), + (0x1EE97, 'M', u'خ'), + (0x1EE98, 'M', u'ذ'), + (0x1EE99, 'M', u'ض'), + (0x1EE9A, 'M', u'ظ'), + (0x1EE9B, 'M', u'غ'), + (0x1EE9C, 'X'), + (0x1EEA1, 'M', u'ب'), + (0x1EEA2, 'M', u'ج'), + (0x1EEA3, 'M', u'د'), + (0x1EEA4, 'X'), + (0x1EEA5, 'M', u'و'), + (0x1EEA6, 'M', u'ز'), + (0x1EEA7, 'M', u'ح'), + (0x1EEA8, 'M', u'ط'), + (0x1EEA9, 'M', u'ي'), + (0x1EEAA, 'X'), + (0x1EEAB, 'M', u'ل'), + (0x1EEAC, 'M', u'م'), + (0x1EEAD, 'M', u'ن'), + (0x1EEAE, 'M', u'س'), + (0x1EEAF, 'M', u'ع'), + (0x1EEB0, 'M', u'ف'), + (0x1EEB1, 'M', u'ص'), + (0x1EEB2, 'M', u'ق'), + (0x1EEB3, 'M', u'ر'), + (0x1EEB4, 'M', u'ش'), + (0x1EEB5, 'M', u'ت'), + (0x1EEB6, 'M', u'ث'), + (0x1EEB7, 'M', u'خ'), + (0x1EEB8, 'M', u'ذ'), + (0x1EEB9, 'M', u'ض'), + (0x1EEBA, 'M', u'ظ'), + (0x1EEBB, 'M', u'غ'), + (0x1EEBC, 'X'), + (0x1EEF0, 'V'), + (0x1EEF2, 'X'), + (0x1F000, 'V'), + (0x1F02C, 'X'), + (0x1F030, 'V'), + (0x1F094, 'X'), + (0x1F0A0, 'V'), + (0x1F0AF, 'X'), + (0x1F0B1, 'V'), + (0x1F0C0, 'X'), + (0x1F0C1, 'V'), + (0x1F0D0, 'X'), + (0x1F0D1, 'V'), + (0x1F0F6, 'X'), + (0x1F101, '3', u'0,'), + (0x1F102, '3', u'1,'), + (0x1F103, '3', u'2,'), + (0x1F104, '3', u'3,'), + (0x1F105, '3', u'4,'), + (0x1F106, '3', u'5,'), + (0x1F107, '3', u'6,'), + (0x1F108, '3', u'7,'), + (0x1F109, '3', u'8,'), + (0x1F10A, '3', u'9,'), + (0x1F10B, 'V'), + (0x1F10D, 'X'), + (0x1F110, '3', u'(a)'), + (0x1F111, '3', u'(b)'), + (0x1F112, '3', u'(c)'), + (0x1F113, '3', u'(d)'), + (0x1F114, '3', u'(e)'), + (0x1F115, '3', u'(f)'), + (0x1F116, '3', u'(g)'), + (0x1F117, '3', u'(h)'), + (0x1F118, '3', u'(i)'), + (0x1F119, '3', u'(j)'), + (0x1F11A, '3', u'(k)'), + (0x1F11B, '3', u'(l)'), + (0x1F11C, '3', u'(m)'), + (0x1F11D, '3', u'(n)'), + (0x1F11E, '3', u'(o)'), + (0x1F11F, '3', u'(p)'), + (0x1F120, '3', u'(q)'), + (0x1F121, '3', u'(r)'), + (0x1F122, '3', u'(s)'), + (0x1F123, '3', u'(t)'), + (0x1F124, '3', u'(u)'), + ] + +def _seg_71(): + return [ + (0x1F125, '3', u'(v)'), + (0x1F126, '3', u'(w)'), + (0x1F127, '3', u'(x)'), + (0x1F128, '3', u'(y)'), + (0x1F129, '3', u'(z)'), + (0x1F12A, 'M', u'〔s〕'), + (0x1F12B, 'M', u'c'), + (0x1F12C, 'M', u'r'), + (0x1F12D, 'M', u'cd'), + (0x1F12E, 'M', u'wz'), + (0x1F12F, 'V'), + (0x1F130, 'M', u'a'), + (0x1F131, 'M', u'b'), + (0x1F132, 'M', u'c'), + (0x1F133, 'M', u'd'), + (0x1F134, 'M', u'e'), + (0x1F135, 'M', u'f'), + (0x1F136, 'M', u'g'), + (0x1F137, 'M', u'h'), + (0x1F138, 'M', u'i'), + (0x1F139, 'M', u'j'), + (0x1F13A, 'M', u'k'), + (0x1F13B, 'M', u'l'), + (0x1F13C, 'M', u'm'), + (0x1F13D, 'M', u'n'), + (0x1F13E, 'M', u'o'), + (0x1F13F, 'M', u'p'), + (0x1F140, 'M', u'q'), + (0x1F141, 'M', u'r'), + (0x1F142, 'M', u's'), + (0x1F143, 'M', u't'), + (0x1F144, 'M', u'u'), + (0x1F145, 'M', u'v'), + (0x1F146, 'M', u'w'), + (0x1F147, 'M', u'x'), + (0x1F148, 'M', u'y'), + (0x1F149, 'M', u'z'), + (0x1F14A, 'M', u'hv'), + (0x1F14B, 'M', u'mv'), + (0x1F14C, 'M', u'sd'), + (0x1F14D, 'M', u'ss'), + (0x1F14E, 'M', u'ppv'), + (0x1F14F, 'M', u'wc'), + (0x1F150, 'V'), + (0x1F16A, 'M', u'mc'), + (0x1F16B, 'M', u'md'), + (0x1F16C, 'X'), + (0x1F170, 'V'), + (0x1F190, 'M', u'dj'), + (0x1F191, 'V'), + (0x1F1AD, 'X'), + (0x1F1E6, 'V'), + (0x1F200, 'M', u'ほか'), + (0x1F201, 'M', u'ココ'), + (0x1F202, 'M', u'サ'), + (0x1F203, 'X'), + (0x1F210, 'M', u'手'), + (0x1F211, 'M', u'字'), + (0x1F212, 'M', u'双'), + (0x1F213, 'M', u'デ'), + (0x1F214, 'M', u'二'), + (0x1F215, 'M', u'多'), + (0x1F216, 'M', u'解'), + (0x1F217, 'M', u'天'), + (0x1F218, 'M', u'交'), + (0x1F219, 'M', u'映'), + (0x1F21A, 'M', u'無'), + (0x1F21B, 'M', u'料'), + (0x1F21C, 'M', u'前'), + (0x1F21D, 'M', u'後'), + (0x1F21E, 'M', u'再'), + (0x1F21F, 'M', u'新'), + (0x1F220, 'M', u'初'), + (0x1F221, 'M', u'終'), + (0x1F222, 'M', u'生'), + (0x1F223, 'M', u'販'), + (0x1F224, 'M', u'声'), + (0x1F225, 'M', u'吹'), + (0x1F226, 'M', u'演'), + (0x1F227, 'M', u'投'), + (0x1F228, 'M', u'捕'), + (0x1F229, 'M', u'一'), + (0x1F22A, 'M', u'三'), + (0x1F22B, 'M', u'遊'), + (0x1F22C, 'M', u'左'), + (0x1F22D, 'M', u'中'), + (0x1F22E, 'M', u'右'), + (0x1F22F, 'M', u'指'), + (0x1F230, 'M', u'走'), + (0x1F231, 'M', u'打'), + (0x1F232, 'M', u'禁'), + (0x1F233, 'M', u'空'), + (0x1F234, 'M', u'合'), + (0x1F235, 'M', u'満'), + (0x1F236, 'M', u'有'), + (0x1F237, 'M', u'月'), + (0x1F238, 'M', u'申'), + (0x1F239, 'M', u'割'), + (0x1F23A, 'M', u'営'), + (0x1F23B, 'M', u'配'), + ] + +def _seg_72(): + return [ + (0x1F23C, 'X'), + (0x1F240, 'M', u'〔本〕'), + (0x1F241, 'M', u'〔三〕'), + (0x1F242, 'M', u'〔二〕'), + (0x1F243, 'M', u'〔安〕'), + (0x1F244, 'M', u'〔点〕'), + (0x1F245, 'M', u'〔打〕'), + (0x1F246, 'M', u'〔盗〕'), + (0x1F247, 'M', u'〔勝〕'), + (0x1F248, 'M', u'〔敗〕'), + (0x1F249, 'X'), + (0x1F250, 'M', u'得'), + (0x1F251, 'M', u'可'), + (0x1F252, 'X'), + (0x1F260, 'V'), + (0x1F266, 'X'), + (0x1F300, 'V'), + (0x1F6D5, 'X'), + (0x1F6E0, 'V'), + (0x1F6ED, 'X'), + (0x1F6F0, 'V'), + (0x1F6FA, 'X'), + (0x1F700, 'V'), + (0x1F774, 'X'), + (0x1F780, 'V'), + (0x1F7D9, 'X'), + (0x1F800, 'V'), + (0x1F80C, 'X'), + (0x1F810, 'V'), + (0x1F848, 'X'), + (0x1F850, 'V'), + (0x1F85A, 'X'), + (0x1F860, 'V'), + (0x1F888, 'X'), + (0x1F890, 'V'), + (0x1F8AE, 'X'), + (0x1F900, 'V'), + (0x1F90C, 'X'), + (0x1F910, 'V'), + (0x1F93F, 'X'), + (0x1F940, 'V'), + (0x1F971, 'X'), + (0x1F973, 'V'), + (0x1F977, 'X'), + (0x1F97A, 'V'), + (0x1F97B, 'X'), + (0x1F97C, 'V'), + (0x1F9A3, 'X'), + (0x1F9B0, 'V'), + (0x1F9BA, 'X'), + (0x1F9C0, 'V'), + (0x1F9C3, 'X'), + (0x1F9D0, 'V'), + (0x1FA00, 'X'), + (0x1FA60, 'V'), + (0x1FA6E, 'X'), + (0x20000, 'V'), + (0x2A6D7, 'X'), + (0x2A700, 'V'), + (0x2B735, 'X'), + (0x2B740, 'V'), + (0x2B81E, 'X'), + (0x2B820, 'V'), + (0x2CEA2, 'X'), + (0x2CEB0, 'V'), + (0x2EBE1, 'X'), + (0x2F800, 'M', u'丽'), + (0x2F801, 'M', u'丸'), + (0x2F802, 'M', u'乁'), + (0x2F803, 'M', u'𠄢'), + (0x2F804, 'M', u'你'), + (0x2F805, 'M', u'侮'), + (0x2F806, 'M', u'侻'), + (0x2F807, 'M', u'倂'), + (0x2F808, 'M', u'偺'), + (0x2F809, 'M', u'備'), + (0x2F80A, 'M', u'僧'), + (0x2F80B, 'M', u'像'), + (0x2F80C, 'M', u'㒞'), + (0x2F80D, 'M', u'𠘺'), + (0x2F80E, 'M', u'免'), + (0x2F80F, 'M', u'兔'), + (0x2F810, 'M', u'兤'), + (0x2F811, 'M', u'具'), + (0x2F812, 'M', u'𠔜'), + (0x2F813, 'M', u'㒹'), + (0x2F814, 'M', u'內'), + (0x2F815, 'M', u'再'), + (0x2F816, 'M', u'𠕋'), + (0x2F817, 'M', u'冗'), + (0x2F818, 'M', u'冤'), + (0x2F819, 'M', u'仌'), + (0x2F81A, 'M', u'冬'), + (0x2F81B, 'M', u'况'), + (0x2F81C, 'M', u'𩇟'), + (0x2F81D, 'M', u'凵'), + (0x2F81E, 'M', u'刃'), + (0x2F81F, 'M', u'㓟'), + (0x2F820, 'M', u'刻'), + (0x2F821, 'M', u'剆'), + ] + +def _seg_73(): + return [ + (0x2F822, 'M', u'割'), + (0x2F823, 'M', u'剷'), + (0x2F824, 'M', u'㔕'), + (0x2F825, 'M', u'勇'), + (0x2F826, 'M', u'勉'), + (0x2F827, 'M', u'勤'), + (0x2F828, 'M', u'勺'), + (0x2F829, 'M', u'包'), + (0x2F82A, 'M', u'匆'), + (0x2F82B, 'M', u'北'), + (0x2F82C, 'M', u'卉'), + (0x2F82D, 'M', u'卑'), + (0x2F82E, 'M', u'博'), + (0x2F82F, 'M', u'即'), + (0x2F830, 'M', u'卽'), + (0x2F831, 'M', u'卿'), + (0x2F834, 'M', u'𠨬'), + (0x2F835, 'M', u'灰'), + (0x2F836, 'M', u'及'), + (0x2F837, 'M', u'叟'), + (0x2F838, 'M', u'𠭣'), + (0x2F839, 'M', u'叫'), + (0x2F83A, 'M', u'叱'), + (0x2F83B, 'M', u'吆'), + (0x2F83C, 'M', u'咞'), + (0x2F83D, 'M', u'吸'), + (0x2F83E, 'M', u'呈'), + (0x2F83F, 'M', u'周'), + (0x2F840, 'M', u'咢'), + (0x2F841, 'M', u'哶'), + (0x2F842, 'M', u'唐'), + (0x2F843, 'M', u'啓'), + (0x2F844, 'M', u'啣'), + (0x2F845, 'M', u'善'), + (0x2F847, 'M', u'喙'), + (0x2F848, 'M', u'喫'), + (0x2F849, 'M', u'喳'), + (0x2F84A, 'M', u'嗂'), + (0x2F84B, 'M', u'圖'), + (0x2F84C, 'M', u'嘆'), + (0x2F84D, 'M', u'圗'), + (0x2F84E, 'M', u'噑'), + (0x2F84F, 'M', u'噴'), + (0x2F850, 'M', u'切'), + (0x2F851, 'M', u'壮'), + (0x2F852, 'M', u'城'), + (0x2F853, 'M', u'埴'), + (0x2F854, 'M', u'堍'), + (0x2F855, 'M', u'型'), + (0x2F856, 'M', u'堲'), + (0x2F857, 'M', u'報'), + (0x2F858, 'M', u'墬'), + (0x2F859, 'M', u'𡓤'), + (0x2F85A, 'M', u'売'), + (0x2F85B, 'M', u'壷'), + (0x2F85C, 'M', u'夆'), + (0x2F85D, 'M', u'多'), + (0x2F85E, 'M', u'夢'), + (0x2F85F, 'M', u'奢'), + (0x2F860, 'M', u'𡚨'), + (0x2F861, 'M', u'𡛪'), + (0x2F862, 'M', u'姬'), + (0x2F863, 'M', u'娛'), + (0x2F864, 'M', u'娧'), + (0x2F865, 'M', u'姘'), + (0x2F866, 'M', u'婦'), + (0x2F867, 'M', u'㛮'), + (0x2F868, 'X'), + (0x2F869, 'M', u'嬈'), + (0x2F86A, 'M', u'嬾'), + (0x2F86C, 'M', u'𡧈'), + (0x2F86D, 'M', u'寃'), + (0x2F86E, 'M', u'寘'), + (0x2F86F, 'M', u'寧'), + (0x2F870, 'M', u'寳'), + (0x2F871, 'M', u'𡬘'), + (0x2F872, 'M', u'寿'), + (0x2F873, 'M', u'将'), + (0x2F874, 'X'), + (0x2F875, 'M', u'尢'), + (0x2F876, 'M', u'㞁'), + (0x2F877, 'M', u'屠'), + (0x2F878, 'M', u'屮'), + (0x2F879, 'M', u'峀'), + (0x2F87A, 'M', u'岍'), + (0x2F87B, 'M', u'𡷤'), + (0x2F87C, 'M', u'嵃'), + (0x2F87D, 'M', u'𡷦'), + (0x2F87E, 'M', u'嵮'), + (0x2F87F, 'M', u'嵫'), + (0x2F880, 'M', u'嵼'), + (0x2F881, 'M', u'巡'), + (0x2F882, 'M', u'巢'), + (0x2F883, 'M', u'㠯'), + (0x2F884, 'M', u'巽'), + (0x2F885, 'M', u'帨'), + (0x2F886, 'M', u'帽'), + (0x2F887, 'M', u'幩'), + (0x2F888, 'M', u'㡢'), + (0x2F889, 'M', u'𢆃'), + ] + +def _seg_74(): + return [ + (0x2F88A, 'M', u'㡼'), + (0x2F88B, 'M', u'庰'), + (0x2F88C, 'M', u'庳'), + (0x2F88D, 'M', u'庶'), + (0x2F88E, 'M', u'廊'), + (0x2F88F, 'M', u'𪎒'), + (0x2F890, 'M', u'廾'), + (0x2F891, 'M', u'𢌱'), + (0x2F893, 'M', u'舁'), + (0x2F894, 'M', u'弢'), + (0x2F896, 'M', u'㣇'), + (0x2F897, 'M', u'𣊸'), + (0x2F898, 'M', u'𦇚'), + (0x2F899, 'M', u'形'), + (0x2F89A, 'M', u'彫'), + (0x2F89B, 'M', u'㣣'), + (0x2F89C, 'M', u'徚'), + (0x2F89D, 'M', u'忍'), + (0x2F89E, 'M', u'志'), + (0x2F89F, 'M', u'忹'), + (0x2F8A0, 'M', u'悁'), + (0x2F8A1, 'M', u'㤺'), + (0x2F8A2, 'M', u'㤜'), + (0x2F8A3, 'M', u'悔'), + (0x2F8A4, 'M', u'𢛔'), + (0x2F8A5, 'M', u'惇'), + (0x2F8A6, 'M', u'慈'), + (0x2F8A7, 'M', u'慌'), + (0x2F8A8, 'M', u'慎'), + (0x2F8A9, 'M', u'慌'), + (0x2F8AA, 'M', u'慺'), + (0x2F8AB, 'M', u'憎'), + (0x2F8AC, 'M', u'憲'), + (0x2F8AD, 'M', u'憤'), + (0x2F8AE, 'M', u'憯'), + (0x2F8AF, 'M', u'懞'), + (0x2F8B0, 'M', u'懲'), + (0x2F8B1, 'M', u'懶'), + (0x2F8B2, 'M', u'成'), + (0x2F8B3, 'M', u'戛'), + (0x2F8B4, 'M', u'扝'), + (0x2F8B5, 'M', u'抱'), + (0x2F8B6, 'M', u'拔'), + (0x2F8B7, 'M', u'捐'), + (0x2F8B8, 'M', u'𢬌'), + (0x2F8B9, 'M', u'挽'), + (0x2F8BA, 'M', u'拼'), + (0x2F8BB, 'M', u'捨'), + (0x2F8BC, 'M', u'掃'), + (0x2F8BD, 'M', u'揤'), + (0x2F8BE, 'M', u'𢯱'), + (0x2F8BF, 'M', u'搢'), + (0x2F8C0, 'M', u'揅'), + (0x2F8C1, 'M', u'掩'), + (0x2F8C2, 'M', u'㨮'), + (0x2F8C3, 'M', u'摩'), + (0x2F8C4, 'M', u'摾'), + (0x2F8C5, 'M', u'撝'), + (0x2F8C6, 'M', u'摷'), + (0x2F8C7, 'M', u'㩬'), + (0x2F8C8, 'M', u'敏'), + (0x2F8C9, 'M', u'敬'), + (0x2F8CA, 'M', u'𣀊'), + (0x2F8CB, 'M', u'旣'), + (0x2F8CC, 'M', u'書'), + (0x2F8CD, 'M', u'晉'), + (0x2F8CE, 'M', u'㬙'), + (0x2F8CF, 'M', u'暑'), + (0x2F8D0, 'M', u'㬈'), + (0x2F8D1, 'M', u'㫤'), + (0x2F8D2, 'M', u'冒'), + (0x2F8D3, 'M', u'冕'), + (0x2F8D4, 'M', u'最'), + (0x2F8D5, 'M', u'暜'), + (0x2F8D6, 'M', u'肭'), + (0x2F8D7, 'M', u'䏙'), + (0x2F8D8, 'M', u'朗'), + (0x2F8D9, 'M', u'望'), + (0x2F8DA, 'M', u'朡'), + (0x2F8DB, 'M', u'杞'), + (0x2F8DC, 'M', u'杓'), + (0x2F8DD, 'M', u'𣏃'), + (0x2F8DE, 'M', u'㭉'), + (0x2F8DF, 'M', u'柺'), + (0x2F8E0, 'M', u'枅'), + (0x2F8E1, 'M', u'桒'), + (0x2F8E2, 'M', u'梅'), + (0x2F8E3, 'M', u'𣑭'), + (0x2F8E4, 'M', u'梎'), + (0x2F8E5, 'M', u'栟'), + (0x2F8E6, 'M', u'椔'), + (0x2F8E7, 'M', u'㮝'), + (0x2F8E8, 'M', u'楂'), + (0x2F8E9, 'M', u'榣'), + (0x2F8EA, 'M', u'槪'), + (0x2F8EB, 'M', u'檨'), + (0x2F8EC, 'M', u'𣚣'), + (0x2F8ED, 'M', u'櫛'), + (0x2F8EE, 'M', u'㰘'), + (0x2F8EF, 'M', u'次'), + ] + +def _seg_75(): + return [ + (0x2F8F0, 'M', u'𣢧'), + (0x2F8F1, 'M', u'歔'), + (0x2F8F2, 'M', u'㱎'), + (0x2F8F3, 'M', u'歲'), + (0x2F8F4, 'M', u'殟'), + (0x2F8F5, 'M', u'殺'), + (0x2F8F6, 'M', u'殻'), + (0x2F8F7, 'M', u'𣪍'), + (0x2F8F8, 'M', u'𡴋'), + (0x2F8F9, 'M', u'𣫺'), + (0x2F8FA, 'M', u'汎'), + (0x2F8FB, 'M', u'𣲼'), + (0x2F8FC, 'M', u'沿'), + (0x2F8FD, 'M', u'泍'), + (0x2F8FE, 'M', u'汧'), + (0x2F8FF, 'M', u'洖'), + (0x2F900, 'M', u'派'), + (0x2F901, 'M', u'海'), + (0x2F902, 'M', u'流'), + (0x2F903, 'M', u'浩'), + (0x2F904, 'M', u'浸'), + (0x2F905, 'M', u'涅'), + (0x2F906, 'M', u'𣴞'), + (0x2F907, 'M', u'洴'), + (0x2F908, 'M', u'港'), + (0x2F909, 'M', u'湮'), + (0x2F90A, 'M', u'㴳'), + (0x2F90B, 'M', u'滋'), + (0x2F90C, 'M', u'滇'), + (0x2F90D, 'M', u'𣻑'), + (0x2F90E, 'M', u'淹'), + (0x2F90F, 'M', u'潮'), + (0x2F910, 'M', u'𣽞'), + (0x2F911, 'M', u'𣾎'), + (0x2F912, 'M', u'濆'), + (0x2F913, 'M', u'瀹'), + (0x2F914, 'M', u'瀞'), + (0x2F915, 'M', u'瀛'), + (0x2F916, 'M', u'㶖'), + (0x2F917, 'M', u'灊'), + (0x2F918, 'M', u'災'), + (0x2F919, 'M', u'灷'), + (0x2F91A, 'M', u'炭'), + (0x2F91B, 'M', u'𠔥'), + (0x2F91C, 'M', u'煅'), + (0x2F91D, 'M', u'𤉣'), + (0x2F91E, 'M', u'熜'), + (0x2F91F, 'X'), + (0x2F920, 'M', u'爨'), + (0x2F921, 'M', u'爵'), + (0x2F922, 'M', u'牐'), + (0x2F923, 'M', u'𤘈'), + (0x2F924, 'M', u'犀'), + (0x2F925, 'M', u'犕'), + (0x2F926, 'M', u'𤜵'), + (0x2F927, 'M', u'𤠔'), + (0x2F928, 'M', u'獺'), + (0x2F929, 'M', u'王'), + (0x2F92A, 'M', u'㺬'), + (0x2F92B, 'M', u'玥'), + (0x2F92C, 'M', u'㺸'), + (0x2F92E, 'M', u'瑇'), + (0x2F92F, 'M', u'瑜'), + (0x2F930, 'M', u'瑱'), + (0x2F931, 'M', u'璅'), + (0x2F932, 'M', u'瓊'), + (0x2F933, 'M', u'㼛'), + (0x2F934, 'M', u'甤'), + (0x2F935, 'M', u'𤰶'), + (0x2F936, 'M', u'甾'), + (0x2F937, 'M', u'𤲒'), + (0x2F938, 'M', u'異'), + (0x2F939, 'M', u'𢆟'), + (0x2F93A, 'M', u'瘐'), + (0x2F93B, 'M', u'𤾡'), + (0x2F93C, 'M', u'𤾸'), + (0x2F93D, 'M', u'𥁄'), + (0x2F93E, 'M', u'㿼'), + (0x2F93F, 'M', u'䀈'), + (0x2F940, 'M', u'直'), + (0x2F941, 'M', u'𥃳'), + (0x2F942, 'M', u'𥃲'), + (0x2F943, 'M', u'𥄙'), + (0x2F944, 'M', u'𥄳'), + (0x2F945, 'M', u'眞'), + (0x2F946, 'M', u'真'), + (0x2F948, 'M', u'睊'), + (0x2F949, 'M', u'䀹'), + (0x2F94A, 'M', u'瞋'), + (0x2F94B, 'M', u'䁆'), + (0x2F94C, 'M', u'䂖'), + (0x2F94D, 'M', u'𥐝'), + (0x2F94E, 'M', u'硎'), + (0x2F94F, 'M', u'碌'), + (0x2F950, 'M', u'磌'), + (0x2F951, 'M', u'䃣'), + (0x2F952, 'M', u'𥘦'), + (0x2F953, 'M', u'祖'), + (0x2F954, 'M', u'𥚚'), + (0x2F955, 'M', u'𥛅'), + ] + +def _seg_76(): + return [ + (0x2F956, 'M', u'福'), + (0x2F957, 'M', u'秫'), + (0x2F958, 'M', u'䄯'), + (0x2F959, 'M', u'穀'), + (0x2F95A, 'M', u'穊'), + (0x2F95B, 'M', u'穏'), + (0x2F95C, 'M', u'𥥼'), + (0x2F95D, 'M', u'𥪧'), + (0x2F95F, 'X'), + (0x2F960, 'M', u'䈂'), + (0x2F961, 'M', u'𥮫'), + (0x2F962, 'M', u'篆'), + (0x2F963, 'M', u'築'), + (0x2F964, 'M', u'䈧'), + (0x2F965, 'M', u'𥲀'), + (0x2F966, 'M', u'糒'), + (0x2F967, 'M', u'䊠'), + (0x2F968, 'M', u'糨'), + (0x2F969, 'M', u'糣'), + (0x2F96A, 'M', u'紀'), + (0x2F96B, 'M', u'𥾆'), + (0x2F96C, 'M', u'絣'), + (0x2F96D, 'M', u'䌁'), + (0x2F96E, 'M', u'緇'), + (0x2F96F, 'M', u'縂'), + (0x2F970, 'M', u'繅'), + (0x2F971, 'M', u'䌴'), + (0x2F972, 'M', u'𦈨'), + (0x2F973, 'M', u'𦉇'), + (0x2F974, 'M', u'䍙'), + (0x2F975, 'M', u'𦋙'), + (0x2F976, 'M', u'罺'), + (0x2F977, 'M', u'𦌾'), + (0x2F978, 'M', u'羕'), + (0x2F979, 'M', u'翺'), + (0x2F97A, 'M', u'者'), + (0x2F97B, 'M', u'𦓚'), + (0x2F97C, 'M', u'𦔣'), + (0x2F97D, 'M', u'聠'), + (0x2F97E, 'M', u'𦖨'), + (0x2F97F, 'M', u'聰'), + (0x2F980, 'M', u'𣍟'), + (0x2F981, 'M', u'䏕'), + (0x2F982, 'M', u'育'), + (0x2F983, 'M', u'脃'), + (0x2F984, 'M', u'䐋'), + (0x2F985, 'M', u'脾'), + (0x2F986, 'M', u'媵'), + (0x2F987, 'M', u'𦞧'), + (0x2F988, 'M', u'𦞵'), + (0x2F989, 'M', u'𣎓'), + (0x2F98A, 'M', u'𣎜'), + (0x2F98B, 'M', u'舁'), + (0x2F98C, 'M', u'舄'), + (0x2F98D, 'M', u'辞'), + (0x2F98E, 'M', u'䑫'), + (0x2F98F, 'M', u'芑'), + (0x2F990, 'M', u'芋'), + (0x2F991, 'M', u'芝'), + (0x2F992, 'M', u'劳'), + (0x2F993, 'M', u'花'), + (0x2F994, 'M', u'芳'), + (0x2F995, 'M', u'芽'), + (0x2F996, 'M', u'苦'), + (0x2F997, 'M', u'𦬼'), + (0x2F998, 'M', u'若'), + (0x2F999, 'M', u'茝'), + (0x2F99A, 'M', u'荣'), + (0x2F99B, 'M', u'莭'), + (0x2F99C, 'M', u'茣'), + (0x2F99D, 'M', u'莽'), + (0x2F99E, 'M', u'菧'), + (0x2F99F, 'M', u'著'), + (0x2F9A0, 'M', u'荓'), + (0x2F9A1, 'M', u'菊'), + (0x2F9A2, 'M', u'菌'), + (0x2F9A3, 'M', u'菜'), + (0x2F9A4, 'M', u'𦰶'), + (0x2F9A5, 'M', u'𦵫'), + (0x2F9A6, 'M', u'𦳕'), + (0x2F9A7, 'M', u'䔫'), + (0x2F9A8, 'M', u'蓱'), + (0x2F9A9, 'M', u'蓳'), + (0x2F9AA, 'M', u'蔖'), + (0x2F9AB, 'M', u'𧏊'), + (0x2F9AC, 'M', u'蕤'), + (0x2F9AD, 'M', u'𦼬'), + (0x2F9AE, 'M', u'䕝'), + (0x2F9AF, 'M', u'䕡'), + (0x2F9B0, 'M', u'𦾱'), + (0x2F9B1, 'M', u'𧃒'), + (0x2F9B2, 'M', u'䕫'), + (0x2F9B3, 'M', u'虐'), + (0x2F9B4, 'M', u'虜'), + (0x2F9B5, 'M', u'虧'), + (0x2F9B6, 'M', u'虩'), + (0x2F9B7, 'M', u'蚩'), + (0x2F9B8, 'M', u'蚈'), + (0x2F9B9, 'M', u'蜎'), + (0x2F9BA, 'M', u'蛢'), + ] + +def _seg_77(): + return [ + (0x2F9BB, 'M', u'蝹'), + (0x2F9BC, 'M', u'蜨'), + (0x2F9BD, 'M', u'蝫'), + (0x2F9BE, 'M', u'螆'), + (0x2F9BF, 'X'), + (0x2F9C0, 'M', u'蟡'), + (0x2F9C1, 'M', u'蠁'), + (0x2F9C2, 'M', u'䗹'), + (0x2F9C3, 'M', u'衠'), + (0x2F9C4, 'M', u'衣'), + (0x2F9C5, 'M', u'𧙧'), + (0x2F9C6, 'M', u'裗'), + (0x2F9C7, 'M', u'裞'), + (0x2F9C8, 'M', u'䘵'), + (0x2F9C9, 'M', u'裺'), + (0x2F9CA, 'M', u'㒻'), + (0x2F9CB, 'M', u'𧢮'), + (0x2F9CC, 'M', u'𧥦'), + (0x2F9CD, 'M', u'䚾'), + (0x2F9CE, 'M', u'䛇'), + (0x2F9CF, 'M', u'誠'), + (0x2F9D0, 'M', u'諭'), + (0x2F9D1, 'M', u'變'), + (0x2F9D2, 'M', u'豕'), + (0x2F9D3, 'M', u'𧲨'), + (0x2F9D4, 'M', u'貫'), + (0x2F9D5, 'M', u'賁'), + (0x2F9D6, 'M', u'贛'), + (0x2F9D7, 'M', u'起'), + (0x2F9D8, 'M', u'𧼯'), + (0x2F9D9, 'M', u'𠠄'), + (0x2F9DA, 'M', u'跋'), + (0x2F9DB, 'M', u'趼'), + (0x2F9DC, 'M', u'跰'), + (0x2F9DD, 'M', u'𠣞'), + (0x2F9DE, 'M', u'軔'), + (0x2F9DF, 'M', u'輸'), + (0x2F9E0, 'M', u'𨗒'), + (0x2F9E1, 'M', u'𨗭'), + (0x2F9E2, 'M', u'邔'), + (0x2F9E3, 'M', u'郱'), + (0x2F9E4, 'M', u'鄑'), + (0x2F9E5, 'M', u'𨜮'), + (0x2F9E6, 'M', u'鄛'), + (0x2F9E7, 'M', u'鈸'), + (0x2F9E8, 'M', u'鋗'), + (0x2F9E9, 'M', u'鋘'), + (0x2F9EA, 'M', u'鉼'), + (0x2F9EB, 'M', u'鏹'), + (0x2F9EC, 'M', u'鐕'), + (0x2F9ED, 'M', u'𨯺'), + (0x2F9EE, 'M', u'開'), + (0x2F9EF, 'M', u'䦕'), + (0x2F9F0, 'M', u'閷'), + (0x2F9F1, 'M', u'𨵷'), + (0x2F9F2, 'M', u'䧦'), + (0x2F9F3, 'M', u'雃'), + (0x2F9F4, 'M', u'嶲'), + (0x2F9F5, 'M', u'霣'), + (0x2F9F6, 'M', u'𩅅'), + (0x2F9F7, 'M', u'𩈚'), + (0x2F9F8, 'M', u'䩮'), + (0x2F9F9, 'M', u'䩶'), + (0x2F9FA, 'M', u'韠'), + (0x2F9FB, 'M', u'𩐊'), + (0x2F9FC, 'M', u'䪲'), + (0x2F9FD, 'M', u'𩒖'), + (0x2F9FE, 'M', u'頋'), + (0x2FA00, 'M', u'頩'), + (0x2FA01, 'M', u'𩖶'), + (0x2FA02, 'M', u'飢'), + (0x2FA03, 'M', u'䬳'), + (0x2FA04, 'M', u'餩'), + (0x2FA05, 'M', u'馧'), + (0x2FA06, 'M', u'駂'), + (0x2FA07, 'M', u'駾'), + (0x2FA08, 'M', u'䯎'), + (0x2FA09, 'M', u'𩬰'), + (0x2FA0A, 'M', u'鬒'), + (0x2FA0B, 'M', u'鱀'), + (0x2FA0C, 'M', u'鳽'), + (0x2FA0D, 'M', u'䳎'), + (0x2FA0E, 'M', u'䳭'), + (0x2FA0F, 'M', u'鵧'), + (0x2FA10, 'M', u'𪃎'), + (0x2FA11, 'M', u'䳸'), + (0x2FA12, 'M', u'𪄅'), + (0x2FA13, 'M', u'𪈎'), + (0x2FA14, 'M', u'𪊑'), + (0x2FA15, 'M', u'麻'), + (0x2FA16, 'M', u'䵖'), + (0x2FA17, 'M', u'黹'), + (0x2FA18, 'M', u'黾'), + (0x2FA19, 'M', u'鼅'), + (0x2FA1A, 'M', u'鼏'), + (0x2FA1B, 'M', u'鼖'), + (0x2FA1C, 'M', u'鼻'), + (0x2FA1D, 'M', u'𪘀'), + (0x2FA1E, 'X'), + (0xE0100, 'I'), + ] + +def _seg_78(): + return [ + (0xE01F0, 'X'), + ] + +uts46data = tuple( + _seg_0() + + _seg_1() + + _seg_2() + + _seg_3() + + _seg_4() + + _seg_5() + + _seg_6() + + _seg_7() + + _seg_8() + + _seg_9() + + _seg_10() + + _seg_11() + + _seg_12() + + _seg_13() + + _seg_14() + + _seg_15() + + _seg_16() + + _seg_17() + + _seg_18() + + _seg_19() + + _seg_20() + + _seg_21() + + _seg_22() + + _seg_23() + + _seg_24() + + _seg_25() + + _seg_26() + + _seg_27() + + _seg_28() + + _seg_29() + + _seg_30() + + _seg_31() + + _seg_32() + + _seg_33() + + _seg_34() + + _seg_35() + + _seg_36() + + _seg_37() + + _seg_38() + + _seg_39() + + _seg_40() + + _seg_41() + + _seg_42() + + _seg_43() + + _seg_44() + + _seg_45() + + _seg_46() + + _seg_47() + + _seg_48() + + _seg_49() + + _seg_50() + + _seg_51() + + _seg_52() + + _seg_53() + + _seg_54() + + _seg_55() + + _seg_56() + + _seg_57() + + _seg_58() + + _seg_59() + + _seg_60() + + _seg_61() + + _seg_62() + + _seg_63() + + _seg_64() + + _seg_65() + + _seg_66() + + _seg_67() + + _seg_68() + + _seg_69() + + _seg_70() + + _seg_71() + + _seg_72() + + _seg_73() + + _seg_74() + + _seg_75() + + _seg_76() + + _seg_77() + + _seg_78() +) diff --git a/dropbox-script/requests/__init__.py b/dropbox-script/requests/__init__.py new file mode 100644 index 0000000..bc168ee --- /dev/null +++ b/dropbox-script/requests/__init__.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- + +# __ +# /__) _ _ _ _ _/ _ +# / ( (- (/ (/ (- _) / _) +# / + +""" +Requests HTTP Library +~~~~~~~~~~~~~~~~~~~~~ + +Requests is an HTTP library, written in Python, for human beings. Basic GET +usage: + + >>> import requests + >>> r = requests.get('https://www.python.org') + >>> r.status_code + 200 + >>> 'Python is a programming language' in r.content + True + +... or POST: + + >>> payload = dict(key1='value1', key2='value2') + >>> r = requests.post('https://httpbin.org/post', data=payload) + >>> print(r.text) + { + ... + "form": { + "key2": "value2", + "key1": "value1" + }, + ... + } + +The other HTTP methods are supported - see `requests.api`. Full documentation +is at . + +:copyright: (c) 2017 by Kenneth Reitz. +:license: Apache 2.0, see LICENSE for more details. +""" + +import urllib3 +import chardet +import warnings +from .exceptions import RequestsDependencyWarning + + +def check_compatibility(urllib3_version, chardet_version): + urllib3_version = urllib3_version.split('.') + assert urllib3_version != ['dev'] # Verify urllib3 isn't installed from git. + + # Sometimes, urllib3 only reports its version as 16.1. + if len(urllib3_version) == 2: + urllib3_version.append('0') + + # Check urllib3 for compatibility. + major, minor, patch = urllib3_version # noqa: F811 + major, minor, patch = int(major), int(minor), int(patch) + # urllib3 >= 1.21.1, <= 1.24 + assert major == 1 + assert minor >= 21 + assert minor <= 24 + + # Check chardet for compatibility. + major, minor, patch = chardet_version.split('.')[:3] + major, minor, patch = int(major), int(minor), int(patch) + # chardet >= 3.0.2, < 3.1.0 + assert major == 3 + assert minor < 1 + assert patch >= 2 + + +def _check_cryptography(cryptography_version): + # cryptography < 1.3.4 + try: + cryptography_version = list(map(int, cryptography_version.split('.'))) + except ValueError: + return + + if cryptography_version < [1, 3, 4]: + warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version) + warnings.warn(warning, RequestsDependencyWarning) + +# Check imported dependencies for compatibility. +try: + check_compatibility(urllib3.__version__, chardet.__version__) +except (AssertionError, ValueError): + warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported " + "version!".format(urllib3.__version__, chardet.__version__), + RequestsDependencyWarning) + +# Attempt to enable urllib3's SNI support, if possible +try: + from urllib3.contrib import pyopenssl + pyopenssl.inject_into_urllib3() + + # Check cryptography version + from cryptography import __version__ as cryptography_version + _check_cryptography(cryptography_version) +except ImportError: + pass + +# urllib3's DependencyWarnings should be silenced. +from urllib3.exceptions import DependencyWarning +warnings.simplefilter('ignore', DependencyWarning) + +from .__version__ import __title__, __description__, __url__, __version__ +from .__version__ import __build__, __author__, __author_email__, __license__ +from .__version__ import __copyright__, __cake__ + +from . import utils +from . import packages +from .models import Request, Response, PreparedRequest +from .api import request, get, head, post, patch, put, delete, options +from .sessions import session, Session +from .status_codes import codes +from .exceptions import ( + RequestException, Timeout, URLRequired, + TooManyRedirects, HTTPError, ConnectionError, + FileModeWarning, ConnectTimeout, ReadTimeout +) + +# Set default logging handler to avoid "No handler found" warnings. +import logging +from logging import NullHandler + +logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/dropbox-script/requests/__version__.py b/dropbox-script/requests/__version__.py new file mode 100644 index 0000000..f5b5d03 --- /dev/null +++ b/dropbox-script/requests/__version__.py @@ -0,0 +1,14 @@ +# .-. .-. .-. . . .-. .-. .-. .-. +# |( |- |.| | | |- `-. | `-. +# ' ' `-' `-`.`-' `-' `-' ' `-' + +__title__ = 'requests' +__description__ = 'Python HTTP for Humans.' +__url__ = 'http://python-requests.org' +__version__ = '2.21.0' +__build__ = 0x022100 +__author__ = 'Kenneth Reitz' +__author_email__ = 'me@kennethreitz.org' +__license__ = 'Apache 2.0' +__copyright__ = 'Copyright 2018 Kenneth Reitz' +__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/dropbox-script/requests/_internal_utils.py b/dropbox-script/requests/_internal_utils.py new file mode 100644 index 0000000..759d9a5 --- /dev/null +++ b/dropbox-script/requests/_internal_utils.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +""" +requests._internal_utils +~~~~~~~~~~~~~~ + +Provides utility functions that are consumed internally by Requests +which depend on extremely few external helpers (such as compat) +""" + +from .compat import is_py2, builtin_str, str + + +def to_native_string(string, encoding='ascii'): + """Given a string object, regardless of type, returns a representation of + that string in the native string type, encoding and decoding where + necessary. This assumes ASCII unless told otherwise. + """ + if isinstance(string, builtin_str): + out = string + else: + if is_py2: + out = string.encode(encoding) + else: + out = string.decode(encoding) + + return out + + +def unicode_is_ascii(u_string): + """Determine if unicode string only contains ASCII characters. + + :param str u_string: unicode string to check. Must be unicode + and not Python 2 `str`. + :rtype: bool + """ + assert isinstance(u_string, str) + try: + u_string.encode('ascii') + return True + except UnicodeEncodeError: + return False diff --git a/dropbox-script/requests/adapters.py b/dropbox-script/requests/adapters.py new file mode 100644 index 0000000..fa4d9b3 --- /dev/null +++ b/dropbox-script/requests/adapters.py @@ -0,0 +1,533 @@ +# -*- coding: utf-8 -*- + +""" +requests.adapters +~~~~~~~~~~~~~~~~~ + +This module contains the transport adapters that Requests uses to define +and maintain connections. +""" + +import os.path +import socket + +from urllib3.poolmanager import PoolManager, proxy_from_url +from urllib3.response import HTTPResponse +from urllib3.util import parse_url +from urllib3.util import Timeout as TimeoutSauce +from urllib3.util.retry import Retry +from urllib3.exceptions import ClosedPoolError +from urllib3.exceptions import ConnectTimeoutError +from urllib3.exceptions import HTTPError as _HTTPError +from urllib3.exceptions import MaxRetryError +from urllib3.exceptions import NewConnectionError +from urllib3.exceptions import ProxyError as _ProxyError +from urllib3.exceptions import ProtocolError +from urllib3.exceptions import ReadTimeoutError +from urllib3.exceptions import SSLError as _SSLError +from urllib3.exceptions import ResponseError +from urllib3.exceptions import LocationValueError + +from .models import Response +from .compat import urlparse, basestring +from .utils import (DEFAULT_CA_BUNDLE_PATH, extract_zipped_paths, + get_encoding_from_headers, prepend_scheme_if_needed, + get_auth_from_url, urldefragauth, select_proxy) +from .structures import CaseInsensitiveDict +from .cookies import extract_cookies_to_jar +from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, + ProxyError, RetryError, InvalidSchema, InvalidProxyURL, + InvalidURL) +from .auth import _basic_auth_str + +try: + from urllib3.contrib.socks import SOCKSProxyManager +except ImportError: + def SOCKSProxyManager(*args, **kwargs): + raise InvalidSchema("Missing dependencies for SOCKS support.") + +DEFAULT_POOLBLOCK = False +DEFAULT_POOLSIZE = 10 +DEFAULT_RETRIES = 0 +DEFAULT_POOL_TIMEOUT = None + + +class BaseAdapter(object): + """The Base Transport Adapter""" + + def __init__(self): + super(BaseAdapter, self).__init__() + + def send(self, request, stream=False, timeout=None, verify=True, + cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest ` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + """ + raise NotImplementedError + + def close(self): + """Cleans up adapter specific items.""" + raise NotImplementedError + + +class HTTPAdapter(BaseAdapter): + """The built-in HTTP Adapter for urllib3. + + Provides a general-case interface for Requests sessions to contact HTTP and + HTTPS urls by implementing the Transport Adapter interface. This class will + usually be created by the :class:`Session ` class under the + covers. + + :param pool_connections: The number of urllib3 connection pools to cache. + :param pool_maxsize: The maximum number of connections to save in the pool. + :param max_retries: The maximum number of retries each connection + should attempt. Note, this applies only to failed DNS lookups, socket + connections and connection timeouts, never to requests where data has + made it to the server. By default, Requests does not retry failed + connections. If you need granular control over the conditions under + which we retry a request, import urllib3's ``Retry`` class and pass + that instead. + :param pool_block: Whether the connection pool should block for connections. + + Usage:: + + >>> import requests + >>> s = requests.Session() + >>> a = requests.adapters.HTTPAdapter(max_retries=3) + >>> s.mount('http://', a) + """ + __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', + '_pool_block'] + + def __init__(self, pool_connections=DEFAULT_POOLSIZE, + pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, + pool_block=DEFAULT_POOLBLOCK): + if max_retries == DEFAULT_RETRIES: + self.max_retries = Retry(0, read=False) + else: + self.max_retries = Retry.from_int(max_retries) + self.config = {} + self.proxy_manager = {} + + super(HTTPAdapter, self).__init__() + + self._pool_connections = pool_connections + self._pool_maxsize = pool_maxsize + self._pool_block = pool_block + + self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) + + def __getstate__(self): + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + # Can't handle by adding 'proxy_manager' to self.__attrs__ because + # self.poolmanager uses a lambda function, which isn't pickleable. + self.proxy_manager = {} + self.config = {} + + for attr, value in state.items(): + setattr(self, attr, value) + + self.init_poolmanager(self._pool_connections, self._pool_maxsize, + block=self._pool_block) + + def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): + """Initializes a urllib3 PoolManager. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param connections: The number of urllib3 connection pools to cache. + :param maxsize: The maximum number of connections to save in the pool. + :param block: Block when no free connections are available. + :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. + """ + # save these values for pickling + self._pool_connections = connections + self._pool_maxsize = maxsize + self._pool_block = block + + self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, + block=block, strict=True, **pool_kwargs) + + def proxy_manager_for(self, proxy, **proxy_kwargs): + """Return urllib3 ProxyManager for the given proxy. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param proxy: The proxy to return a urllib3 ProxyManager for. + :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. + :returns: ProxyManager + :rtype: urllib3.ProxyManager + """ + if proxy in self.proxy_manager: + manager = self.proxy_manager[proxy] + elif proxy.lower().startswith('socks'): + username, password = get_auth_from_url(proxy) + manager = self.proxy_manager[proxy] = SOCKSProxyManager( + proxy, + username=username, + password=password, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs + ) + else: + proxy_headers = self.proxy_headers(proxy) + manager = self.proxy_manager[proxy] = proxy_from_url( + proxy, + proxy_headers=proxy_headers, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs) + + return manager + + def cert_verify(self, conn, url, verify, cert): + """Verify a SSL certificate. This method should not be called from user + code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param conn: The urllib3 connection object associated with the cert. + :param url: The requested URL. + :param verify: Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: The SSL certificate to verify. + """ + if url.lower().startswith('https') and verify: + + cert_loc = None + + # Allow self-specified cert location. + if verify is not True: + cert_loc = verify + + if not cert_loc: + cert_loc = extract_zipped_paths(DEFAULT_CA_BUNDLE_PATH) + + if not cert_loc or not os.path.exists(cert_loc): + raise IOError("Could not find a suitable TLS CA certificate bundle, " + "invalid path: {}".format(cert_loc)) + + conn.cert_reqs = 'CERT_REQUIRED' + + if not os.path.isdir(cert_loc): + conn.ca_certs = cert_loc + else: + conn.ca_cert_dir = cert_loc + else: + conn.cert_reqs = 'CERT_NONE' + conn.ca_certs = None + conn.ca_cert_dir = None + + if cert: + if not isinstance(cert, basestring): + conn.cert_file = cert[0] + conn.key_file = cert[1] + else: + conn.cert_file = cert + conn.key_file = None + if conn.cert_file and not os.path.exists(conn.cert_file): + raise IOError("Could not find the TLS certificate file, " + "invalid path: {}".format(conn.cert_file)) + if conn.key_file and not os.path.exists(conn.key_file): + raise IOError("Could not find the TLS key file, " + "invalid path: {}".format(conn.key_file)) + + def build_response(self, req, resp): + """Builds a :class:`Response ` object from a urllib3 + response. This should not be called from user code, and is only exposed + for use when subclassing the + :class:`HTTPAdapter ` + + :param req: The :class:`PreparedRequest ` used to generate the response. + :param resp: The urllib3 response object. + :rtype: requests.Response + """ + response = Response() + + # Fallback to None if there's no status_code, for whatever reason. + response.status_code = getattr(resp, 'status', None) + + # Make headers case-insensitive. + response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) + + # Set encoding. + response.encoding = get_encoding_from_headers(response.headers) + response.raw = resp + response.reason = response.raw.reason + + if isinstance(req.url, bytes): + response.url = req.url.decode('utf-8') + else: + response.url = req.url + + # Add new cookies from the server. + extract_cookies_to_jar(response.cookies, req, resp) + + # Give the Response some context. + response.request = req + response.connection = self + + return response + + def get_connection(self, url, proxies=None): + """Returns a urllib3 connection for the given URL. This should not be + called from user code, and is only exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param url: The URL to connect to. + :param proxies: (optional) A Requests-style dictionary of proxies used on this request. + :rtype: urllib3.ConnectionPool + """ + proxy = select_proxy(url, proxies) + + if proxy: + proxy = prepend_scheme_if_needed(proxy, 'http') + proxy_url = parse_url(proxy) + if not proxy_url.host: + raise InvalidProxyURL("Please check proxy URL. It is malformed" + " and could be missing the host.") + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_url(url) + else: + # Only scheme should be lower case + parsed = urlparse(url) + url = parsed.geturl() + conn = self.poolmanager.connection_from_url(url) + + return conn + + def close(self): + """Disposes of any internal state. + + Currently, this closes the PoolManager and any active ProxyManager, + which closes any pooled connections. + """ + self.poolmanager.clear() + for proxy in self.proxy_manager.values(): + proxy.clear() + + def request_url(self, request, proxies): + """Obtain the url to use when making the final request. + + If the message is being sent through a HTTP proxy, the full URL has to + be used. Otherwise, we should only use the path portion of the URL. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`PreparedRequest ` being sent. + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. + :rtype: str + """ + proxy = select_proxy(request.url, proxies) + scheme = urlparse(request.url).scheme + + is_proxied_http_request = (proxy and scheme != 'https') + using_socks_proxy = False + if proxy: + proxy_scheme = urlparse(proxy).scheme.lower() + using_socks_proxy = proxy_scheme.startswith('socks') + + url = request.path_url + if is_proxied_http_request and not using_socks_proxy: + url = urldefragauth(request.url) + + return url + + def add_headers(self, request, **kwargs): + """Add any headers needed by the connection. As of v2.0 this does + nothing by default, but is left for overriding by users that subclass + the :class:`HTTPAdapter `. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param request: The :class:`PreparedRequest ` to add headers to. + :param kwargs: The keyword arguments from the call to send(). + """ + pass + + def proxy_headers(self, proxy): + """Returns a dictionary of the headers to add to any request sent + through a proxy. This works with urllib3 magic to ensure that they are + correctly sent to the proxy, rather than in a tunnelled request if + CONNECT is being used. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter `. + + :param proxy: The url of the proxy being used for this request. + :rtype: dict + """ + headers = {} + username, password = get_auth_from_url(proxy) + + if username: + headers['Proxy-Authorization'] = _basic_auth_str(username, + password) + + return headers + + def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest ` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple or urllib3 Timeout object + :param verify: (optional) Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + :rtype: requests.Response + """ + + try: + conn = self.get_connection(request.url, proxies) + except LocationValueError as e: + raise InvalidURL(e, request=request) + + self.cert_verify(conn, request.url, verify, cert) + url = self.request_url(request, proxies) + self.add_headers(request, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) + + chunked = not (request.body is None or 'Content-Length' in request.headers) + + if isinstance(timeout, tuple): + try: + connect, read = timeout + timeout = TimeoutSauce(connect=connect, read=read) + except ValueError as e: + # this may raise a string formatting error. + err = ("Invalid timeout {}. Pass a (connect, read) " + "timeout tuple, or a single float to set " + "both timeouts to the same value".format(timeout)) + raise ValueError(err) + elif isinstance(timeout, TimeoutSauce): + pass + else: + timeout = TimeoutSauce(connect=timeout, read=timeout) + + try: + if not chunked: + resp = conn.urlopen( + method=request.method, + url=url, + body=request.body, + headers=request.headers, + redirect=False, + assert_same_host=False, + preload_content=False, + decode_content=False, + retries=self.max_retries, + timeout=timeout + ) + + # Send the request. + else: + if hasattr(conn, 'proxy_pool'): + conn = conn.proxy_pool + + low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT) + + try: + low_conn.putrequest(request.method, + url, + skip_accept_encoding=True) + + for header, value in request.headers.items(): + low_conn.putheader(header, value) + + low_conn.endheaders() + + for i in request.body: + low_conn.send(hex(len(i))[2:].encode('utf-8')) + low_conn.send(b'\r\n') + low_conn.send(i) + low_conn.send(b'\r\n') + low_conn.send(b'0\r\n\r\n') + + # Receive the response from the server + try: + # For Python 2.7, use buffering of HTTP responses + r = low_conn.getresponse(buffering=True) + except TypeError: + # For compatibility with Python 3.3+ + r = low_conn.getresponse() + + resp = HTTPResponse.from_httplib( + r, + pool=conn, + connection=low_conn, + preload_content=False, + decode_content=False + ) + except: + # If we hit any problems here, clean up the connection. + # Then, reraise so that we can handle the actual exception. + low_conn.close() + raise + + except (ProtocolError, socket.error) as err: + raise ConnectionError(err, request=request) + + except MaxRetryError as e: + if isinstance(e.reason, ConnectTimeoutError): + # TODO: Remove this in 3.0.0: see #2811 + if not isinstance(e.reason, NewConnectionError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + + if isinstance(e.reason, _ProxyError): + raise ProxyError(e, request=request) + + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + + raise ConnectionError(e, request=request) + + except ClosedPoolError as e: + raise ConnectionError(e, request=request) + + except _ProxyError as e: + raise ProxyError(e) + + except (_SSLError, _HTTPError) as e: + if isinstance(e, _SSLError): + # This branch is for urllib3 versions earlier than v1.22 + raise SSLError(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) + else: + raise + + return self.build_response(request, resp) diff --git a/dropbox-script/requests/api.py b/dropbox-script/requests/api.py new file mode 100644 index 0000000..abada96 --- /dev/null +++ b/dropbox-script/requests/api.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- + +""" +requests.api +~~~~~~~~~~~~ + +This module implements the Requests API. + +:copyright: (c) 2012 by Kenneth Reitz. +:license: Apache2, see LICENSE for more details. +""" + +from . import sessions + + +def request(method, url, **kwargs): + """Constructs and sends a :class:`Request `. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. + :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. + ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` + or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string + defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers + to add for the file. + :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How many seconds to wait for the server to send data + before giving up, as a float, or a :ref:`(connect timeout, read + timeout) ` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param stream: (optional) if ``False``, the response content will be immediately downloaded. + :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + :return: :class:`Response ` object + :rtype: requests.Response + + Usage:: + + >>> import requests + >>> req = requests.request('GET', 'https://httpbin.org/get') + + """ + + # By using the 'with' statement we are sure the session is closed, thus we + # avoid leaving sockets open which can trigger a ResourceWarning in some + # cases, and look like a memory leak in others. + with sessions.Session() as session: + return session.request(method=method, url=url, **kwargs) + + +def get(url, params=None, **kwargs): + r"""Sends a GET request. + + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary, list of tuples or bytes to send + in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return request('get', url, params=params, **kwargs) + + +def options(url, **kwargs): + r"""Sends an OPTIONS request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return request('options', url, **kwargs) + + +def head(url, **kwargs): + r"""Sends a HEAD request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return request('head', url, **kwargs) + + +def post(url, data=None, json=None, **kwargs): + r"""Sends a POST request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request('post', url, data=data, json=json, **kwargs) + + +def put(url, data=None, **kwargs): + r"""Sends a PUT request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request('put', url, data=data, **kwargs) + + +def patch(url, data=None, **kwargs): + r"""Sends a PATCH request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request('patch', url, data=data, **kwargs) + + +def delete(url, **kwargs): + r"""Sends a DELETE request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response + """ + + return request('delete', url, **kwargs) diff --git a/dropbox-script/requests/auth.py b/dropbox-script/requests/auth.py new file mode 100644 index 0000000..bdde51c --- /dev/null +++ b/dropbox-script/requests/auth.py @@ -0,0 +1,305 @@ +# -*- coding: utf-8 -*- + +""" +requests.auth +~~~~~~~~~~~~~ + +This module contains the authentication handlers for Requests. +""" + +import os +import re +import time +import hashlib +import threading +import warnings + +from base64 import b64encode + +from .compat import urlparse, str, basestring +from .cookies import extract_cookies_to_jar +from ._internal_utils import to_native_string +from .utils import parse_dict_header + +CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' +CONTENT_TYPE_MULTI_PART = 'multipart/form-data' + + +def _basic_auth_str(username, password): + """Returns a Basic Auth string.""" + + # "I want us to put a big-ol' comment on top of it that + # says that this behaviour is dumb but we need to preserve + # it because people are relying on it." + # - Lukasa + # + # These are here solely to maintain backwards compatibility + # for things like ints. This will be removed in 3.0.0. + if not isinstance(username, basestring): + warnings.warn( + "Non-string usernames will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(username), + category=DeprecationWarning, + ) + username = str(username) + + if not isinstance(password, basestring): + warnings.warn( + "Non-string passwords will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(password), + category=DeprecationWarning, + ) + password = str(password) + # -- End Removal -- + + if isinstance(username, str): + username = username.encode('latin1') + + if isinstance(password, str): + password = password.encode('latin1') + + authstr = 'Basic ' + to_native_string( + b64encode(b':'.join((username, password))).strip() + ) + + return authstr + + +class AuthBase(object): + """Base class that all auth implementations derive from""" + + def __call__(self, r): + raise NotImplementedError('Auth hooks must be callable.') + + +class HTTPBasicAuth(AuthBase): + """Attaches HTTP Basic Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other + + def __call__(self, r): + r.headers['Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPProxyAuth(HTTPBasicAuth): + """Attaches HTTP Proxy Authentication to a given Request object.""" + + def __call__(self, r): + r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPDigestAuth(AuthBase): + """Attaches HTTP Digest Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + # Keep state in per-thread local storage + self._thread_local = threading.local() + + def init_per_thread_state(self): + # Ensure state is initialized just once per-thread + if not hasattr(self._thread_local, 'init'): + self._thread_local.init = True + self._thread_local.last_nonce = '' + self._thread_local.nonce_count = 0 + self._thread_local.chal = {} + self._thread_local.pos = None + self._thread_local.num_401_calls = None + + def build_digest_header(self, method, url): + """ + :rtype: str + """ + + realm = self._thread_local.chal['realm'] + nonce = self._thread_local.chal['nonce'] + qop = self._thread_local.chal.get('qop') + algorithm = self._thread_local.chal.get('algorithm') + opaque = self._thread_local.chal.get('opaque') + hash_utf8 = None + + if algorithm is None: + _algorithm = 'MD5' + else: + _algorithm = algorithm.upper() + # lambdas assume digest modules are imported at the top level + if _algorithm == 'MD5' or _algorithm == 'MD5-SESS': + def md5_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.md5(x).hexdigest() + hash_utf8 = md5_utf8 + elif _algorithm == 'SHA': + def sha_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha1(x).hexdigest() + hash_utf8 = sha_utf8 + elif _algorithm == 'SHA-256': + def sha256_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha256(x).hexdigest() + hash_utf8 = sha256_utf8 + elif _algorithm == 'SHA-512': + def sha512_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha512(x).hexdigest() + hash_utf8 = sha512_utf8 + + KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) + + if hash_utf8 is None: + return None + + # XXX not implemented yet + entdig = None + p_parsed = urlparse(url) + #: path is request-uri defined in RFC 2616 which should not be empty + path = p_parsed.path or "/" + if p_parsed.query: + path += '?' + p_parsed.query + + A1 = '%s:%s:%s' % (self.username, realm, self.password) + A2 = '%s:%s' % (method, path) + + HA1 = hash_utf8(A1) + HA2 = hash_utf8(A2) + + if nonce == self._thread_local.last_nonce: + self._thread_local.nonce_count += 1 + else: + self._thread_local.nonce_count = 1 + ncvalue = '%08x' % self._thread_local.nonce_count + s = str(self._thread_local.nonce_count).encode('utf-8') + s += nonce.encode('utf-8') + s += time.ctime().encode('utf-8') + s += os.urandom(8) + + cnonce = (hashlib.sha1(s).hexdigest()[:16]) + if _algorithm == 'MD5-SESS': + HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) + + if not qop: + respdig = KD(HA1, "%s:%s" % (nonce, HA2)) + elif qop == 'auth' or 'auth' in qop.split(','): + noncebit = "%s:%s:%s:%s:%s" % ( + nonce, ncvalue, cnonce, 'auth', HA2 + ) + respdig = KD(HA1, noncebit) + else: + # XXX handle auth-int. + return None + + self._thread_local.last_nonce = nonce + + # XXX should the partial digests be encoded too? + base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ + 'response="%s"' % (self.username, realm, nonce, path, respdig) + if opaque: + base += ', opaque="%s"' % opaque + if algorithm: + base += ', algorithm="%s"' % algorithm + if entdig: + base += ', digest="%s"' % entdig + if qop: + base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) + + return 'Digest %s' % (base) + + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + self._thread_local.num_401_calls = 1 + + def handle_401(self, r, **kwargs): + """ + Takes the given response and tries digest-auth, if needed. + + :rtype: requests.Response + """ + + # If response is not 4xx, do not auth + # See https://github.com/requests/requests/issues/3772 + if not 400 <= r.status_code < 500: + self._thread_local.num_401_calls = 1 + return r + + if self._thread_local.pos is not None: + # Rewind the file position indicator of the body to where + # it was to resend the request. + r.request.body.seek(self._thread_local.pos) + s_auth = r.headers.get('www-authenticate', '') + + if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2: + + self._thread_local.num_401_calls += 1 + pat = re.compile(r'digest ', flags=re.IGNORECASE) + self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1)) + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.close() + prep = r.request.copy() + extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers['Authorization'] = self.build_digest_header( + prep.method, prep.url) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + self._thread_local.num_401_calls = 1 + return r + + def __call__(self, r): + # Initialize per-thread state, if needed + self.init_per_thread_state() + # If we have a saved nonce, skip the 401 + if self._thread_local.last_nonce: + r.headers['Authorization'] = self.build_digest_header(r.method, r.url) + try: + self._thread_local.pos = r.body.tell() + except AttributeError: + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self._thread_local.pos = None + r.register_hook('response', self.handle_401) + r.register_hook('response', self.handle_redirect) + self._thread_local.num_401_calls = 1 + + return r + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other diff --git a/dropbox-script/requests/certs.py b/dropbox-script/requests/certs.py new file mode 100644 index 0000000..d1a378d --- /dev/null +++ b/dropbox-script/requests/certs.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +requests.certs +~~~~~~~~~~~~~~ + +This module returns the preferred default CA certificate bundle. There is +only one — the one from the certifi package. + +If you are packaging Requests, e.g., for a Linux distribution or a managed +environment, you can change the definition of where() to return a separately +packaged CA bundle. +""" +from certifi import where + +if __name__ == '__main__': + print(where()) diff --git a/dropbox-script/requests/compat.py b/dropbox-script/requests/compat.py new file mode 100644 index 0000000..c44b35e --- /dev/null +++ b/dropbox-script/requests/compat.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- + +""" +requests.compat +~~~~~~~~~~~~~~~ + +This module handles import compatibility issues between Python 2 and +Python 3. +""" + +import chardet + +import sys + +# ------- +# Pythons +# ------- + +# Syntax sugar. +_ver = sys.version_info + +#: Python 2.x? +is_py2 = (_ver[0] == 2) + +#: Python 3.x? +is_py3 = (_ver[0] == 3) + +try: + import simplejson as json +except ImportError: + import json + +# --------- +# Specifics +# --------- + +if is_py2: + from urllib import ( + quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, + proxy_bypass, proxy_bypass_environment, getproxies_environment) + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag + from urllib2 import parse_http_list + import cookielib + from Cookie import Morsel + from StringIO import StringIO + from collections import Callable, Mapping, MutableMapping, OrderedDict + + + builtin_str = str + bytes = str + str = unicode + basestring = basestring + numeric_types = (int, long, float) + integer_types = (int, long) + +elif is_py3: + from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag + from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment + from http import cookiejar as cookielib + from http.cookies import Morsel + from io import StringIO + from collections import OrderedDict + from collections.abc import Callable, Mapping, MutableMapping + + builtin_str = str + str = str + bytes = bytes + basestring = (str, bytes) + numeric_types = (int, float) + integer_types = (int,) diff --git a/dropbox-script/requests/cookies.py b/dropbox-script/requests/cookies.py new file mode 100644 index 0000000..56fccd9 --- /dev/null +++ b/dropbox-script/requests/cookies.py @@ -0,0 +1,549 @@ +# -*- coding: utf-8 -*- + +""" +requests.cookies +~~~~~~~~~~~~~~~~ + +Compatibility code to be able to use `cookielib.CookieJar` with requests. + +requests.utils imports from here, so be careful with imports. +""" + +import copy +import time +import calendar + +from ._internal_utils import to_native_string +from .compat import cookielib, urlparse, urlunparse, Morsel, MutableMapping + +try: + import threading +except ImportError: + import dummy_threading as threading + + +class MockRequest(object): + """Wraps a `requests.Request` to mimic a `urllib2.Request`. + + The code in `cookielib.CookieJar` expects this interface in order to correctly + manage cookie policies, i.e., determine whether a cookie can be set, given the + domains of the request and the cookie. + + The original request object is read-only. The client is responsible for collecting + the new headers via `get_new_headers()` and interpreting them appropriately. You + probably want `get_cookie_header`, defined below. + """ + + def __init__(self, request): + self._r = request + self._new_headers = {} + self.type = urlparse(self._r.url).scheme + + def get_type(self): + return self.type + + def get_host(self): + return urlparse(self._r.url).netloc + + def get_origin_req_host(self): + return self.get_host() + + def get_full_url(self): + # Only return the response's URL if the user hadn't set the Host + # header + if not self._r.headers.get('Host'): + return self._r.url + # If they did set it, retrieve it and reconstruct the expected domain + host = to_native_string(self._r.headers['Host'], encoding='utf-8') + parsed = urlparse(self._r.url) + # Reconstruct the URL as we expect it + return urlunparse([ + parsed.scheme, host, parsed.path, parsed.params, parsed.query, + parsed.fragment + ]) + + def is_unverifiable(self): + return True + + def has_header(self, name): + return name in self._r.headers or name in self._new_headers + + def get_header(self, name, default=None): + return self._r.headers.get(name, self._new_headers.get(name, default)) + + def add_header(self, key, val): + """cookielib has no legitimate use for this method; add it back if you find one.""" + raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") + + def add_unredirected_header(self, name, value): + self._new_headers[name] = value + + def get_new_headers(self): + return self._new_headers + + @property + def unverifiable(self): + return self.is_unverifiable() + + @property + def origin_req_host(self): + return self.get_origin_req_host() + + @property + def host(self): + return self.get_host() + + +class MockResponse(object): + """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. + + ...what? Basically, expose the parsed HTTP headers from the server response + the way `cookielib` expects to see them. + """ + + def __init__(self, headers): + """Make a MockResponse for `cookielib` to read. + + :param headers: a httplib.HTTPMessage or analogous carrying the headers + """ + self._headers = headers + + def info(self): + return self._headers + + def getheaders(self, name): + self._headers.getheaders(name) + + +def extract_cookies_to_jar(jar, request, response): + """Extract the cookies from the response into a CookieJar. + + :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) + :param request: our own requests.Request object + :param response: urllib3.HTTPResponse object + """ + if not (hasattr(response, '_original_response') and + response._original_response): + return + # the _original_response field is the wrapped httplib.HTTPResponse object, + req = MockRequest(request) + # pull out the HTTPMessage with the headers and put it in the mock: + res = MockResponse(response._original_response.msg) + jar.extract_cookies(res, req) + + +def get_cookie_header(jar, request): + """ + Produce an appropriate Cookie header string to be sent with `request`, or None. + + :rtype: str + """ + r = MockRequest(request) + jar.add_cookie_header(r) + return r.get_new_headers().get('Cookie') + + +def remove_cookie_by_name(cookiejar, name, domain=None, path=None): + """Unsets a cookie by name, by default over all domains and paths. + + Wraps CookieJar.clear(), is O(n). + """ + clearables = [] + for cookie in cookiejar: + if cookie.name != name: + continue + if domain is not None and domain != cookie.domain: + continue + if path is not None and path != cookie.path: + continue + clearables.append((cookie.domain, cookie.path, cookie.name)) + + for domain, path, name in clearables: + cookiejar.clear(domain, path, name) + + +class CookieConflictError(RuntimeError): + """There are two cookies that meet the criteria specified in the cookie jar. + Use .get and .set and include domain and path args in order to be more specific. + """ + + +class RequestsCookieJar(cookielib.CookieJar, MutableMapping): + """Compatibility class; is a cookielib.CookieJar, but exposes a dict + interface. + + This is the CookieJar we create by default for requests and sessions that + don't specify one, since some clients may expect response.cookies and + session.cookies to support dict operations. + + Requests does not use the dict interface internally; it's just for + compatibility with external client code. All requests code should work + out of the box with externally provided instances of ``CookieJar``, e.g. + ``LWPCookieJar`` and ``FileCookieJar``. + + Unlike a regular CookieJar, this class is pickleable. + + .. warning:: dictionary operations that are normally O(1) may be O(n). + """ + + def get(self, name, default=None, domain=None, path=None): + """Dict-like get() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + + .. warning:: operation is O(n), not O(1). + """ + try: + return self._find_no_duplicates(name, domain, path) + except KeyError: + return default + + def set(self, name, value, **kwargs): + """Dict-like set() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + """ + # support client code that unsets cookies by assignment of a None value: + if value is None: + remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) + return + + if isinstance(value, Morsel): + c = morsel_to_cookie(value) + else: + c = create_cookie(name, value, **kwargs) + self.set_cookie(c) + return c + + def iterkeys(self): + """Dict-like iterkeys() that returns an iterator of names of cookies + from the jar. + + .. seealso:: itervalues() and iteritems(). + """ + for cookie in iter(self): + yield cookie.name + + def keys(self): + """Dict-like keys() that returns a list of names of cookies from the + jar. + + .. seealso:: values() and items(). + """ + return list(self.iterkeys()) + + def itervalues(self): + """Dict-like itervalues() that returns an iterator of values of cookies + from the jar. + + .. seealso:: iterkeys() and iteritems(). + """ + for cookie in iter(self): + yield cookie.value + + def values(self): + """Dict-like values() that returns a list of values of cookies from the + jar. + + .. seealso:: keys() and items(). + """ + return list(self.itervalues()) + + def iteritems(self): + """Dict-like iteritems() that returns an iterator of name-value tuples + from the jar. + + .. seealso:: iterkeys() and itervalues(). + """ + for cookie in iter(self): + yield cookie.name, cookie.value + + def items(self): + """Dict-like items() that returns a list of name-value tuples from the + jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a + vanilla python dict of key value pairs. + + .. seealso:: keys() and values(). + """ + return list(self.iteritems()) + + def list_domains(self): + """Utility method to list all the domains in the jar.""" + domains = [] + for cookie in iter(self): + if cookie.domain not in domains: + domains.append(cookie.domain) + return domains + + def list_paths(self): + """Utility method to list all the paths in the jar.""" + paths = [] + for cookie in iter(self): + if cookie.path not in paths: + paths.append(cookie.path) + return paths + + def multiple_domains(self): + """Returns True if there are multiple domains in the jar. + Returns False otherwise. + + :rtype: bool + """ + domains = [] + for cookie in iter(self): + if cookie.domain is not None and cookie.domain in domains: + return True + domains.append(cookie.domain) + return False # there is only one domain in jar + + def get_dict(self, domain=None, path=None): + """Takes as an argument an optional domain and path and returns a plain + old Python dict of name-value pairs of cookies that meet the + requirements. + + :rtype: dict + """ + dictionary = {} + for cookie in iter(self): + if ( + (domain is None or cookie.domain == domain) and + (path is None or cookie.path == path) + ): + dictionary[cookie.name] = cookie.value + return dictionary + + def __contains__(self, name): + try: + return super(RequestsCookieJar, self).__contains__(name) + except CookieConflictError: + return True + + def __getitem__(self, name): + """Dict-like __getitem__() for compatibility with client code. Throws + exception if there are more than one cookie with name. In that case, + use the more explicit get() method instead. + + .. warning:: operation is O(n), not O(1). + """ + return self._find_no_duplicates(name) + + def __setitem__(self, name, value): + """Dict-like __setitem__ for compatibility with client code. Throws + exception if there is already a cookie of that name in the jar. In that + case, use the more explicit set() method instead. + """ + self.set(name, value) + + def __delitem__(self, name): + """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s + ``remove_cookie_by_name()``. + """ + remove_cookie_by_name(self, name) + + def set_cookie(self, cookie, *args, **kwargs): + if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'): + cookie.value = cookie.value.replace('\\"', '') + return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs) + + def update(self, other): + """Updates this jar with cookies from another CookieJar or dict-like""" + if isinstance(other, cookielib.CookieJar): + for cookie in other: + self.set_cookie(copy.copy(cookie)) + else: + super(RequestsCookieJar, self).update(other) + + def _find(self, name, domain=None, path=None): + """Requests uses this method internally to get cookie values. + + If there are conflicting cookies, _find arbitrarily chooses one. + See _find_no_duplicates if you want an exception thrown if there are + conflicting cookies. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :return: cookie.value + """ + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + return cookie.value + + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def _find_no_duplicates(self, name, domain=None, path=None): + """Both ``__get_item__`` and ``get`` call this function: it's never + used elsewhere in Requests. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :raises KeyError: if cookie is not found + :raises CookieConflictError: if there are multiple cookies + that match name and optionally domain and path + :return: cookie.value + """ + toReturn = None + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + if toReturn is not None: # if there are multiple cookies that meet passed in criteria + raise CookieConflictError('There are multiple cookies with name, %r' % (name)) + toReturn = cookie.value # we will eventually return this as long as no cookie conflict + + if toReturn: + return toReturn + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def __getstate__(self): + """Unlike a normal CookieJar, this class is pickleable.""" + state = self.__dict__.copy() + # remove the unpickleable RLock object + state.pop('_cookies_lock') + return state + + def __setstate__(self, state): + """Unlike a normal CookieJar, this class is pickleable.""" + self.__dict__.update(state) + if '_cookies_lock' not in self.__dict__: + self._cookies_lock = threading.RLock() + + def copy(self): + """Return a copy of this RequestsCookieJar.""" + new_cj = RequestsCookieJar() + new_cj.set_policy(self.get_policy()) + new_cj.update(self) + return new_cj + + def get_policy(self): + """Return the CookiePolicy instance used.""" + return self._policy + + +def _copy_cookie_jar(jar): + if jar is None: + return None + + if hasattr(jar, 'copy'): + # We're dealing with an instance of RequestsCookieJar + return jar.copy() + # We're dealing with a generic CookieJar instance + new_jar = copy.copy(jar) + new_jar.clear() + for cookie in jar: + new_jar.set_cookie(copy.copy(cookie)) + return new_jar + + +def create_cookie(name, value, **kwargs): + """Make a cookie from underspecified parameters. + + By default, the pair of `name` and `value` will be set for the domain '' + and sent on every request (this is sometimes called a "supercookie"). + """ + result = { + 'version': 0, + 'name': name, + 'value': value, + 'port': None, + 'domain': '', + 'path': '/', + 'secure': False, + 'expires': None, + 'discard': True, + 'comment': None, + 'comment_url': None, + 'rest': {'HttpOnly': None}, + 'rfc2109': False, + } + + badargs = set(kwargs) - set(result) + if badargs: + err = 'create_cookie() got unexpected keyword arguments: %s' + raise TypeError(err % list(badargs)) + + result.update(kwargs) + result['port_specified'] = bool(result['port']) + result['domain_specified'] = bool(result['domain']) + result['domain_initial_dot'] = result['domain'].startswith('.') + result['path_specified'] = bool(result['path']) + + return cookielib.Cookie(**result) + + +def morsel_to_cookie(morsel): + """Convert a Morsel object into a Cookie containing the one k/v pair.""" + + expires = None + if morsel['max-age']: + try: + expires = int(time.time() + int(morsel['max-age'])) + except ValueError: + raise TypeError('max-age: %s must be integer' % morsel['max-age']) + elif morsel['expires']: + time_template = '%a, %d-%b-%Y %H:%M:%S GMT' + expires = calendar.timegm( + time.strptime(morsel['expires'], time_template) + ) + return create_cookie( + comment=morsel['comment'], + comment_url=bool(morsel['comment']), + discard=False, + domain=morsel['domain'], + expires=expires, + name=morsel.key, + path=morsel['path'], + port=None, + rest={'HttpOnly': morsel['httponly']}, + rfc2109=False, + secure=bool(morsel['secure']), + value=morsel.value, + version=morsel['version'] or 0, + ) + + +def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): + """Returns a CookieJar from a key/value dictionary. + + :param cookie_dict: Dict of key/values to insert into CookieJar. + :param cookiejar: (optional) A cookiejar to add the cookies to. + :param overwrite: (optional) If False, will not replace cookies + already in the jar with new ones. + :rtype: CookieJar + """ + if cookiejar is None: + cookiejar = RequestsCookieJar() + + if cookie_dict is not None: + names_from_jar = [cookie.name for cookie in cookiejar] + for name in cookie_dict: + if overwrite or (name not in names_from_jar): + cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + + return cookiejar + + +def merge_cookies(cookiejar, cookies): + """Add cookies to cookiejar and returns a merged CookieJar. + + :param cookiejar: CookieJar object to add the cookies to. + :param cookies: Dictionary or CookieJar object to be added. + :rtype: CookieJar + """ + if not isinstance(cookiejar, cookielib.CookieJar): + raise ValueError('You can only merge into CookieJar') + + if isinstance(cookies, dict): + cookiejar = cookiejar_from_dict( + cookies, cookiejar=cookiejar, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + try: + cookiejar.update(cookies) + except AttributeError: + for cookie_in_jar in cookies: + cookiejar.set_cookie(cookie_in_jar) + + return cookiejar diff --git a/dropbox-script/requests/exceptions.py b/dropbox-script/requests/exceptions.py new file mode 100644 index 0000000..a80cad8 --- /dev/null +++ b/dropbox-script/requests/exceptions.py @@ -0,0 +1,126 @@ +# -*- coding: utf-8 -*- + +""" +requests.exceptions +~~~~~~~~~~~~~~~~~~~ + +This module contains the set of Requests' exceptions. +""" +from urllib3.exceptions import HTTPError as BaseHTTPError + + +class RequestException(IOError): + """There was an ambiguous exception that occurred while handling your + request. + """ + + def __init__(self, *args, **kwargs): + """Initialize RequestException with `request` and `response` objects.""" + response = kwargs.pop('response', None) + self.response = response + self.request = kwargs.pop('request', None) + if (response is not None and not self.request and + hasattr(response, 'request')): + self.request = self.response.request + super(RequestException, self).__init__(*args, **kwargs) + + +class HTTPError(RequestException): + """An HTTP error occurred.""" + + +class ConnectionError(RequestException): + """A Connection error occurred.""" + + +class ProxyError(ConnectionError): + """A proxy error occurred.""" + + +class SSLError(ConnectionError): + """An SSL error occurred.""" + + +class Timeout(RequestException): + """The request timed out. + + Catching this error will catch both + :exc:`~requests.exceptions.ConnectTimeout` and + :exc:`~requests.exceptions.ReadTimeout` errors. + """ + + +class ConnectTimeout(ConnectionError, Timeout): + """The request timed out while trying to connect to the remote server. + + Requests that produced this error are safe to retry. + """ + + +class ReadTimeout(Timeout): + """The server did not send any data in the allotted amount of time.""" + + +class URLRequired(RequestException): + """A valid URL is required to make a request.""" + + +class TooManyRedirects(RequestException): + """Too many redirects.""" + + +class MissingSchema(RequestException, ValueError): + """The URL schema (e.g. http or https) is missing.""" + + +class InvalidSchema(RequestException, ValueError): + """See defaults.py for valid schemas.""" + + +class InvalidURL(RequestException, ValueError): + """The URL provided was somehow invalid.""" + + +class InvalidHeader(RequestException, ValueError): + """The header value provided was somehow invalid.""" + + +class InvalidProxyURL(InvalidURL): + """The proxy URL provided is invalid.""" + + +class ChunkedEncodingError(RequestException): + """The server declared chunked encoding but sent an invalid chunk.""" + + +class ContentDecodingError(RequestException, BaseHTTPError): + """Failed to decode response content""" + + +class StreamConsumedError(RequestException, TypeError): + """The content for this response was already consumed""" + + +class RetryError(RequestException): + """Custom retries logic failed""" + + +class UnrewindableBodyError(RequestException): + """Requests encountered an error when trying to rewind a body""" + +# Warnings + + +class RequestsWarning(Warning): + """Base warning for Requests.""" + pass + + +class FileModeWarning(RequestsWarning, DeprecationWarning): + """A file was opened in text mode, but Requests determined its binary length.""" + pass + + +class RequestsDependencyWarning(RequestsWarning): + """An imported dependency doesn't match the expected version range.""" + pass diff --git a/dropbox-script/requests/help.py b/dropbox-script/requests/help.py new file mode 100644 index 0000000..e53d35e --- /dev/null +++ b/dropbox-script/requests/help.py @@ -0,0 +1,119 @@ +"""Module containing bug report helper(s).""" +from __future__ import print_function + +import json +import platform +import sys +import ssl + +import idna +import urllib3 +import chardet + +from . import __version__ as requests_version + +try: + from urllib3.contrib import pyopenssl +except ImportError: + pyopenssl = None + OpenSSL = None + cryptography = None +else: + import OpenSSL + import cryptography + + +def _implementation(): + """Return a dict with the Python implementation and version. + + Provide both the name and the version of the Python implementation + currently running. For example, on CPython 2.7.5 it will return + {'name': 'CPython', 'version': '2.7.5'}. + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + implementation = platform.python_implementation() + + if implementation == 'CPython': + implementation_version = platform.python_version() + elif implementation == 'PyPy': + implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro) + if sys.pypy_version_info.releaselevel != 'final': + implementation_version = ''.join([ + implementation_version, sys.pypy_version_info.releaselevel + ]) + elif implementation == 'Jython': + implementation_version = platform.python_version() # Complete Guess + elif implementation == 'IronPython': + implementation_version = platform.python_version() # Complete Guess + else: + implementation_version = 'Unknown' + + return {'name': implementation, 'version': implementation_version} + + +def info(): + """Generate information for a bug report.""" + try: + platform_info = { + 'system': platform.system(), + 'release': platform.release(), + } + except IOError: + platform_info = { + 'system': 'Unknown', + 'release': 'Unknown', + } + + implementation_info = _implementation() + urllib3_info = {'version': urllib3.__version__} + chardet_info = {'version': chardet.__version__} + + pyopenssl_info = { + 'version': None, + 'openssl_version': '', + } + if OpenSSL: + pyopenssl_info = { + 'version': OpenSSL.__version__, + 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, + } + cryptography_info = { + 'version': getattr(cryptography, '__version__', ''), + } + idna_info = { + 'version': getattr(idna, '__version__', ''), + } + + system_ssl = ssl.OPENSSL_VERSION_NUMBER + system_ssl_info = { + 'version': '%x' % system_ssl if system_ssl is not None else '' + } + + return { + 'platform': platform_info, + 'implementation': implementation_info, + 'system_ssl': system_ssl_info, + 'using_pyopenssl': pyopenssl is not None, + 'pyOpenSSL': pyopenssl_info, + 'urllib3': urllib3_info, + 'chardet': chardet_info, + 'cryptography': cryptography_info, + 'idna': idna_info, + 'requests': { + 'version': requests_version, + }, + } + + +def main(): + """Pretty-print the bug information as JSON.""" + print(json.dumps(info(), sort_keys=True, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/dropbox-script/requests/hooks.py b/dropbox-script/requests/hooks.py new file mode 100644 index 0000000..7a51f21 --- /dev/null +++ b/dropbox-script/requests/hooks.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +""" +requests.hooks +~~~~~~~~~~~~~~ + +This module provides the capabilities for the Requests hooks system. + +Available hooks: + +``response``: + The response generated from a Request. +""" +HOOKS = ['response'] + + +def default_hooks(): + return {event: [] for event in HOOKS} + +# TODO: response is the only one + + +def dispatch_hook(key, hooks, hook_data, **kwargs): + """Dispatches a hook dictionary on a given piece of data.""" + hooks = hooks or {} + hooks = hooks.get(key) + if hooks: + if hasattr(hooks, '__call__'): + hooks = [hooks] + for hook in hooks: + _hook_data = hook(hook_data, **kwargs) + if _hook_data is not None: + hook_data = _hook_data + return hook_data diff --git a/dropbox-script/requests/models.py b/dropbox-script/requests/models.py new file mode 100644 index 0000000..62dcd0b --- /dev/null +++ b/dropbox-script/requests/models.py @@ -0,0 +1,953 @@ +# -*- coding: utf-8 -*- + +""" +requests.models +~~~~~~~~~~~~~~~ + +This module contains the primary objects that power Requests. +""" + +import datetime +import sys + +# Import encoding now, to avoid implicit import later. +# Implicit import within threads may cause LookupError when standard library is in a ZIP, +# such as in Embedded Python. See https://github.com/requests/requests/issues/3578. +import encodings.idna + +from urllib3.fields import RequestField +from urllib3.filepost import encode_multipart_formdata +from urllib3.util import parse_url +from urllib3.exceptions import ( + DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) + +from io import UnsupportedOperation +from .hooks import default_hooks +from .structures import CaseInsensitiveDict + +from .auth import HTTPBasicAuth +from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar +from .exceptions import ( + HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, + ContentDecodingError, ConnectionError, StreamConsumedError) +from ._internal_utils import to_native_string, unicode_is_ascii +from .utils import ( + guess_filename, get_auth_from_url, requote_uri, + stream_decode_response_unicode, to_key_val_list, parse_header_links, + iter_slices, guess_json_utf, super_len, check_header_validity) +from .compat import ( + Callable, Mapping, + cookielib, urlunparse, urlsplit, urlencode, str, bytes, + is_py2, chardet, builtin_str, basestring) +from .compat import json as complexjson +from .status_codes import codes + +#: The set of HTTP status codes that indicate an automatically +#: processable redirect. +REDIRECT_STATI = ( + codes.moved, # 301 + codes.found, # 302 + codes.other, # 303 + codes.temporary_redirect, # 307 + codes.permanent_redirect, # 308 +) + +DEFAULT_REDIRECT_LIMIT = 30 +CONTENT_CHUNK_SIZE = 10 * 1024 +ITER_CHUNK_SIZE = 512 + + +class RequestEncodingMixin(object): + @property + def path_url(self): + """Build the path URL to use.""" + + url = [] + + p = urlsplit(self.url) + + path = p.path + if not path: + path = '/' + + url.append(path) + + query = p.query + if query: + url.append('?') + url.append(query) + + return ''.join(url) + + @staticmethod + def _encode_params(data): + """Encode parameters in a piece of data. + + Will successfully encode parameters when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary + if parameters are supplied as a dict. + """ + + if isinstance(data, (str, bytes)): + return data + elif hasattr(data, 'read'): + return data + elif hasattr(data, '__iter__'): + result = [] + for k, vs in to_key_val_list(data): + if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): + vs = [vs] + for v in vs: + if v is not None: + result.append( + (k.encode('utf-8') if isinstance(k, str) else k, + v.encode('utf-8') if isinstance(v, str) else v)) + return urlencode(result, doseq=True) + else: + return data + + @staticmethod + def _encode_files(files, data): + """Build the body for a multipart/form-data request. + + Will successfully encode files when passed as a dict or a list of + tuples. Order is retained if data is a list of tuples but arbitrary + if parameters are supplied as a dict. + The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) + or 4-tuples (filename, fileobj, contentype, custom_headers). + """ + if (not files): + raise ValueError("Files must be provided.") + elif isinstance(data, basestring): + raise ValueError("Data must not be a string.") + + new_fields = [] + fields = to_key_val_list(data or {}) + files = to_key_val_list(files or {}) + + for field, val in fields: + if isinstance(val, basestring) or not hasattr(val, '__iter__'): + val = [val] + for v in val: + if v is not None: + # Don't call str() on bytestrings: in Py3 it all goes wrong. + if not isinstance(v, bytes): + v = str(v) + + new_fields.append( + (field.decode('utf-8') if isinstance(field, bytes) else field, + v.encode('utf-8') if isinstance(v, str) else v)) + + for (k, v) in files: + # support for explicit filename + ft = None + fh = None + if isinstance(v, (tuple, list)): + if len(v) == 2: + fn, fp = v + elif len(v) == 3: + fn, fp, ft = v + else: + fn, fp, ft, fh = v + else: + fn = guess_filename(v) or k + fp = v + + if isinstance(fp, (str, bytes, bytearray)): + fdata = fp + elif hasattr(fp, 'read'): + fdata = fp.read() + elif fp is None: + continue + else: + fdata = fp + + rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) + rf.make_multipart(content_type=ft) + new_fields.append(rf) + + body, content_type = encode_multipart_formdata(new_fields) + + return body, content_type + + +class RequestHooksMixin(object): + def register_hook(self, event, hook): + """Properly register a hook.""" + + if event not in self.hooks: + raise ValueError('Unsupported event specified, with event name "%s"' % (event)) + + if isinstance(hook, Callable): + self.hooks[event].append(hook) + elif hasattr(hook, '__iter__'): + self.hooks[event].extend(h for h in hook if isinstance(h, Callable)) + + def deregister_hook(self, event, hook): + """Deregister a previously registered hook. + Returns True if the hook existed, False if not. + """ + + try: + self.hooks[event].remove(hook) + return True + except ValueError: + return False + + +class Request(RequestHooksMixin): + """A user-created :class:`Request ` object. + + Used to prepare a :class:`PreparedRequest `, which is sent to the server. + + :param method: HTTP method to use. + :param url: URL to send. + :param headers: dictionary of headers to send. + :param files: dictionary of {filename: fileobject} files to multipart upload. + :param data: the body to attach to the request. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param json: json for the body to attach to the request (if files or data is not specified). + :param params: URL parameters to append to the URL. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :param auth: Auth handler or (user, pass) tuple. + :param cookies: dictionary or CookieJar of cookies to attach to this request. + :param hooks: dictionary of callback hooks, for internal usage. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> req.prepare() + + """ + + def __init__(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + + # Default empty dicts for dict params. + data = [] if data is None else data + files = [] if files is None else files + headers = {} if headers is None else headers + params = {} if params is None else params + hooks = {} if hooks is None else hooks + + self.hooks = default_hooks() + for (k, v) in list(hooks.items()): + self.register_hook(event=k, hook=v) + + self.method = method + self.url = url + self.headers = headers + self.files = files + self.data = data + self.json = json + self.params = params + self.auth = auth + self.cookies = cookies + + def __repr__(self): + return '' % (self.method) + + def prepare(self): + """Constructs a :class:`PreparedRequest ` for transmission and returns it.""" + p = PreparedRequest() + p.prepare( + method=self.method, + url=self.url, + headers=self.headers, + files=self.files, + data=self.data, + json=self.json, + params=self.params, + auth=self.auth, + cookies=self.cookies, + hooks=self.hooks, + ) + return p + + +class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): + """The fully mutable :class:`PreparedRequest ` object, + containing the exact bytes that will be sent to the server. + + Generated from either a :class:`Request ` object or manually. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'https://httpbin.org/get') + >>> r = req.prepare() + + + >>> s = requests.Session() + >>> s.send(r) + + """ + + def __init__(self): + #: HTTP verb to send to the server. + self.method = None + #: HTTP URL to send the request to. + self.url = None + #: dictionary of HTTP headers. + self.headers = None + # The `CookieJar` used to create the Cookie header will be stored here + # after prepare_cookies is called + self._cookies = None + #: request body to send to the server. + self.body = None + #: dictionary of callback hooks, for internal usage. + self.hooks = default_hooks() + #: integer denoting starting position of a readable file-like body. + self._body_position = None + + def prepare(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + """Prepares the entire request with the given parameters.""" + + self.prepare_method(method) + self.prepare_url(url, params) + self.prepare_headers(headers) + self.prepare_cookies(cookies) + self.prepare_body(data, files, json) + self.prepare_auth(auth, url) + + # Note that prepare_auth must be last to enable authentication schemes + # such as OAuth to work on a fully prepared request. + + # This MUST go after prepare_auth. Authenticators could add a hook + self.prepare_hooks(hooks) + + def __repr__(self): + return '' % (self.method) + + def copy(self): + p = PreparedRequest() + p.method = self.method + p.url = self.url + p.headers = self.headers.copy() if self.headers is not None else None + p._cookies = _copy_cookie_jar(self._cookies) + p.body = self.body + p.hooks = self.hooks + p._body_position = self._body_position + return p + + def prepare_method(self, method): + """Prepares the given HTTP method.""" + self.method = method + if self.method is not None: + self.method = to_native_string(self.method.upper()) + + @staticmethod + def _get_idna_encoded_host(host): + import idna + + try: + host = idna.encode(host, uts46=True).decode('utf-8') + except idna.IDNAError: + raise UnicodeError + return host + + def prepare_url(self, url, params): + """Prepares the given HTTP URL.""" + #: Accept objects that have string representations. + #: We're unable to blindly call unicode/str functions + #: as this will include the bytestring indicator (b'') + #: on python 3.x. + #: https://github.com/requests/requests/pull/2238 + if isinstance(url, bytes): + url = url.decode('utf8') + else: + url = unicode(url) if is_py2 else str(url) + + # Remove leading whitespaces from url + url = url.lstrip() + + # Don't do any URL preparation for non-HTTP schemes like `mailto`, + # `data` etc to work around exceptions from `url_parse`, which + # handles RFC 3986 only. + if ':' in url and not url.lower().startswith('http'): + self.url = url + return + + # Support for unicode domain names and paths. + try: + scheme, auth, host, port, path, query, fragment = parse_url(url) + except LocationParseError as e: + raise InvalidURL(*e.args) + + if not scheme: + error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?") + error = error.format(to_native_string(url, 'utf8')) + + raise MissingSchema(error) + + if not host: + raise InvalidURL("Invalid URL %r: No host supplied" % url) + + # In general, we want to try IDNA encoding the hostname if the string contains + # non-ASCII characters. This allows users to automatically get the correct IDNA + # behaviour. For strings containing only ASCII characters, we need to also verify + # it doesn't start with a wildcard (*), before allowing the unencoded hostname. + if not unicode_is_ascii(host): + try: + host = self._get_idna_encoded_host(host) + except UnicodeError: + raise InvalidURL('URL has an invalid label.') + elif host.startswith(u'*'): + raise InvalidURL('URL has an invalid label.') + + # Carefully reconstruct the network location + netloc = auth or '' + if netloc: + netloc += '@' + netloc += host + if port: + netloc += ':' + str(port) + + # Bare domains aren't valid URLs. + if not path: + path = '/' + + if is_py2: + if isinstance(scheme, str): + scheme = scheme.encode('utf-8') + if isinstance(netloc, str): + netloc = netloc.encode('utf-8') + if isinstance(path, str): + path = path.encode('utf-8') + if isinstance(query, str): + query = query.encode('utf-8') + if isinstance(fragment, str): + fragment = fragment.encode('utf-8') + + if isinstance(params, (str, bytes)): + params = to_native_string(params) + + enc_params = self._encode_params(params) + if enc_params: + if query: + query = '%s&%s' % (query, enc_params) + else: + query = enc_params + + url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) + self.url = url + + def prepare_headers(self, headers): + """Prepares the given HTTP headers.""" + + self.headers = CaseInsensitiveDict() + if headers: + for header in headers.items(): + # Raise exception on invalid header value. + check_header_validity(header) + name, value = header + self.headers[to_native_string(name)] = value + + def prepare_body(self, data, files, json=None): + """Prepares the given HTTP body data.""" + + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + # Nottin' on you. + body = None + content_type = None + + if not data and json is not None: + # urllib3 requires a bytes-like body. Python 2's json.dumps + # provides this natively, but Python 3 gives a Unicode string. + content_type = 'application/json' + body = complexjson.dumps(json) + if not isinstance(body, bytes): + body = body.encode('utf-8') + + is_stream = all([ + hasattr(data, '__iter__'), + not isinstance(data, (basestring, list, tuple, Mapping)) + ]) + + try: + length = super_len(data) + except (TypeError, AttributeError, UnsupportedOperation): + length = None + + if is_stream: + body = data + + if getattr(body, 'tell', None) is not None: + # Record the current file position before reading. + # This will allow us to rewind a file in the event + # of a redirect. + try: + self._body_position = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body + self._body_position = object() + + if files: + raise NotImplementedError('Streamed bodies and files are mutually exclusive.') + + if length: + self.headers['Content-Length'] = builtin_str(length) + else: + self.headers['Transfer-Encoding'] = 'chunked' + else: + # Multi-part file uploads. + if files: + (body, content_type) = self._encode_files(files, data) + else: + if data: + body = self._encode_params(data) + if isinstance(data, basestring) or hasattr(data, 'read'): + content_type = None + else: + content_type = 'application/x-www-form-urlencoded' + + self.prepare_content_length(body) + + # Add content-type if it wasn't explicitly provided. + if content_type and ('content-type' not in self.headers): + self.headers['Content-Type'] = content_type + + self.body = body + + def prepare_content_length(self, body): + """Prepare Content-Length header based on request method and body""" + if body is not None: + length = super_len(body) + if length: + # If length exists, set it. Otherwise, we fallback + # to Transfer-Encoding: chunked. + self.headers['Content-Length'] = builtin_str(length) + elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None: + # Set Content-Length to 0 for methods that can have a body + # but don't provide one. (i.e. not GET or HEAD) + self.headers['Content-Length'] = '0' + + def prepare_auth(self, auth, url=''): + """Prepares the given HTTP auth data.""" + + # If no Auth is explicitly provided, extract it from the URL first. + if auth is None: + url_auth = get_auth_from_url(self.url) + auth = url_auth if any(url_auth) else None + + if auth: + if isinstance(auth, tuple) and len(auth) == 2: + # special-case basic HTTP auth + auth = HTTPBasicAuth(*auth) + + # Allow auth to make its changes. + r = auth(self) + + # Update self to reflect the auth changes. + self.__dict__.update(r.__dict__) + + # Recompute Content-Length + self.prepare_content_length(self.body) + + def prepare_cookies(self, cookies): + """Prepares the given HTTP cookie data. + + This function eventually generates a ``Cookie`` header from the + given cookies using cookielib. Due to cookielib's design, the header + will not be regenerated if it already exists, meaning this function + can only be called once for the life of the + :class:`PreparedRequest ` object. Any subsequent calls + to ``prepare_cookies`` will have no actual effect, unless the "Cookie" + header is removed beforehand. + """ + if isinstance(cookies, cookielib.CookieJar): + self._cookies = cookies + else: + self._cookies = cookiejar_from_dict(cookies) + + cookie_header = get_cookie_header(self._cookies, self) + if cookie_header is not None: + self.headers['Cookie'] = cookie_header + + def prepare_hooks(self, hooks): + """Prepares the given hooks.""" + # hooks can be passed as None to the prepare method and to this + # method. To prevent iterating over None, simply use an empty list + # if hooks is False-y + hooks = hooks or [] + for event in hooks: + self.register_hook(event, hooks[event]) + + +class Response(object): + """The :class:`Response ` object, which contains a + server's response to an HTTP request. + """ + + __attrs__ = [ + '_content', 'status_code', 'headers', 'url', 'history', + 'encoding', 'reason', 'cookies', 'elapsed', 'request' + ] + + def __init__(self): + self._content = False + self._content_consumed = False + self._next = None + + #: Integer Code of responded HTTP Status, e.g. 404 or 200. + self.status_code = None + + #: Case-insensitive Dictionary of Response Headers. + #: For example, ``headers['content-encoding']`` will return the + #: value of a ``'Content-Encoding'`` response header. + self.headers = CaseInsensitiveDict() + + #: File-like object representation of response (for advanced usage). + #: Use of ``raw`` requires that ``stream=True`` be set on the request. + # This requirement does not apply for use internally to Requests. + self.raw = None + + #: Final URL location of Response. + self.url = None + + #: Encoding to decode with when accessing r.text. + self.encoding = None + + #: A list of :class:`Response ` objects from + #: the history of the Request. Any redirect responses will end + #: up here. The list is sorted from the oldest to the most recent request. + self.history = [] + + #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". + self.reason = None + + #: A CookieJar of Cookies the server sent back. + self.cookies = cookiejar_from_dict({}) + + #: The amount of time elapsed between sending the request + #: and the arrival of the response (as a timedelta). + #: This property specifically measures the time taken between sending + #: the first byte of the request and finishing parsing the headers. It + #: is therefore unaffected by consuming the response content or the + #: value of the ``stream`` keyword argument. + self.elapsed = datetime.timedelta(0) + + #: The :class:`PreparedRequest ` object to which this + #: is a response. + self.request = None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def __getstate__(self): + # Consume everything; accessing the content attribute makes + # sure the content has been fully read. + if not self._content_consumed: + self.content + + return {attr: getattr(self, attr, None) for attr in self.__attrs__} + + def __setstate__(self, state): + for name, value in state.items(): + setattr(self, name, value) + + # pickled objects do not have .raw + setattr(self, '_content_consumed', True) + setattr(self, 'raw', None) + + def __repr__(self): + return '' % (self.status_code) + + def __bool__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __nonzero__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __iter__(self): + """Allows you to use a response as an iterator.""" + return self.iter_content(128) + + @property + def ok(self): + """Returns True if :attr:`status_code` is less than 400, False if not. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + try: + self.raise_for_status() + except HTTPError: + return False + return True + + @property + def is_redirect(self): + """True if this Response is a well-formed HTTP redirect that could have + been processed automatically (by :meth:`Session.resolve_redirects`). + """ + return ('location' in self.headers and self.status_code in REDIRECT_STATI) + + @property + def is_permanent_redirect(self): + """True if this Response one of the permanent versions of redirect.""" + return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) + + @property + def next(self): + """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" + return self._next + + @property + def apparent_encoding(self): + """The apparent encoding, provided by the chardet library.""" + return chardet.detect(self.content)['encoding'] + + def iter_content(self, chunk_size=1, decode_unicode=False): + """Iterates over the response data. When stream=True is set on the + request, this avoids reading the content at once into memory for + large responses. The chunk size is the number of bytes it should + read into memory. This is not necessarily the length of each item + returned as decoding can take place. + + chunk_size must be of type int or None. A value of None will + function differently depending on the value of `stream`. + stream=True will read data as it arrives in whatever size the + chunks are received. If stream=False, data is returned as + a single chunk. + + If decode_unicode is True, content will be decoded using the best + available encoding based on the response. + """ + + def generate(): + # Special case for urllib3. + if hasattr(self.raw, 'stream'): + try: + for chunk in self.raw.stream(chunk_size, decode_content=True): + yield chunk + except ProtocolError as e: + raise ChunkedEncodingError(e) + except DecodeError as e: + raise ContentDecodingError(e) + except ReadTimeoutError as e: + raise ConnectionError(e) + else: + # Standard file-like object. + while True: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk + + self._content_consumed = True + + if self._content_consumed and isinstance(self._content, bool): + raise StreamConsumedError() + elif chunk_size is not None and not isinstance(chunk_size, int): + raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size)) + # simulate reading small chunks of the content + reused_chunks = iter_slices(self._content, chunk_size) + + stream_chunks = generate() + + chunks = reused_chunks if self._content_consumed else stream_chunks + + if decode_unicode: + chunks = stream_decode_response_unicode(chunks, self) + + return chunks + + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=False, delimiter=None): + """Iterates over the response data, one line at a time. When + stream=True is set on the request, this avoids reading the + content at once into memory for large responses. + + .. note:: This method is not reentrant safe. + """ + + pending = None + + for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): + + if pending is not None: + chunk = pending + chunk + + if delimiter: + lines = chunk.split(delimiter) + else: + lines = chunk.splitlines() + + if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: + pending = lines.pop() + else: + pending = None + + for line in lines: + yield line + + if pending is not None: + yield pending + + @property + def content(self): + """Content of the response, in bytes.""" + + if self._content is False: + # Read the contents. + if self._content_consumed: + raise RuntimeError( + 'The content for this response was already consumed') + + if self.status_code == 0 or self.raw is None: + self._content = None + else: + self._content = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b'' + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + If Response.encoding is None, encoding will be guessed using + ``chardet``. + + The encoding of the response content is determined based solely on HTTP + headers, following RFC 2616 to the letter. If you can take advantage of + non-HTTP knowledge to make a better guess at the encoding, you should + set ``r.encoding`` appropriately before accessing this property. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return str('') + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors='replace') + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors='replace') + + return content + + def json(self, **kwargs): + r"""Returns the json-encoded content of a response, if any. + + :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + :raises ValueError: If the response body does not contain valid json. + """ + + if not self.encoding and self.content and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using chardet to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + try: + return complexjson.loads( + self.content.decode(encoding), **kwargs + ) + except UnicodeDecodeError: + # Wrong UTF codec detected; usually because it's not UTF-8 + # but some other 8-bit codec. This is an RFC violation, + # and the server didn't bother to tell us what codec *was* + # used. + pass + return complexjson.loads(self.text, **kwargs) + + @property + def links(self): + """Returns the parsed header links of the response, if any.""" + + header = self.headers.get('link') + + # l = MultiDict() + l = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get('rel') or link.get('url') + l[key] = link + + return l + + def raise_for_status(self): + """Raises stored :class:`HTTPError`, if one occurred.""" + + http_error_msg = '' + if isinstance(self.reason, bytes): + # We attempt to decode utf-8 first because some servers + # choose to localize their reason strings. If the string + # isn't utf-8, we fall back to iso-8859-1 for all other + # encodings. (See PR #3538) + try: + reason = self.reason.decode('utf-8') + except UnicodeDecodeError: + reason = self.reason.decode('iso-8859-1') + else: + reason = self.reason + + if 400 <= self.status_code < 500: + http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url) + + elif 500 <= self.status_code < 600: + http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + """Releases the connection back to the pool. Once this method has been + called the underlying ``raw`` object must not be accessed again. + + *Note: Should not normally need to be called explicitly.* + """ + if not self._content_consumed: + self.raw.close() + + release_conn = getattr(self.raw, 'release_conn', None) + if release_conn is not None: + release_conn() diff --git a/dropbox-script/requests/packages.py b/dropbox-script/requests/packages.py new file mode 100644 index 0000000..7232fe0 --- /dev/null +++ b/dropbox-script/requests/packages.py @@ -0,0 +1,14 @@ +import sys + +# This code exists for backwards compatibility reasons. +# I don't like it either. Just look the other way. :) + +for package in ('urllib3', 'idna', 'chardet'): + locals()[package] = __import__(package) + # This traversal is apparently necessary such that the identities are + # preserved (requests.packages.urllib3.* is urllib3.*) + for mod in list(sys.modules): + if mod == package or mod.startswith(package + '.'): + sys.modules['requests.packages.' + mod] = sys.modules[mod] + +# Kinda cool, though, right? diff --git a/dropbox-script/requests/sessions.py b/dropbox-script/requests/sessions.py new file mode 100644 index 0000000..d73d700 --- /dev/null +++ b/dropbox-script/requests/sessions.py @@ -0,0 +1,770 @@ +# -*- coding: utf-8 -*- + +""" +requests.session +~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). +""" +import os +import sys +import time +from datetime import timedelta + +from .auth import _basic_auth_str +from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse, Mapping +from .cookies import ( + cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) +from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT +from .hooks import default_hooks, dispatch_hook +from ._internal_utils import to_native_string +from .utils import to_key_val_list, default_headers, DEFAULT_PORTS +from .exceptions import ( + TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) + +from .structures import CaseInsensitiveDict +from .adapters import HTTPAdapter + +from .utils import ( + requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, + get_auth_from_url, rewind_body +) + +from .status_codes import codes + +# formerly defined here, reexposed here for backward compatibility +from .models import REDIRECT_STATI + +# Preferred clock, based on which one is more accurate on a given system. +if sys.platform == 'win32': + try: # Python 3.4+ + preferred_clock = time.perf_counter + except AttributeError: # Earlier than Python 3. + preferred_clock = time.clock +else: + preferred_clock = time.time + + +def merge_setting(request_setting, session_setting, dict_class=OrderedDict): + """Determines appropriate setting for a given request, taking into account + the explicit setting on that request, and the setting in the session. If a + setting is a dictionary, they will be merged together using `dict_class` + """ + + if session_setting is None: + return request_setting + + if request_setting is None: + return session_setting + + # Bypass if not a dictionary (e.g. verify) + if not ( + isinstance(session_setting, Mapping) and + isinstance(request_setting, Mapping) + ): + return request_setting + + merged_setting = dict_class(to_key_val_list(session_setting)) + merged_setting.update(to_key_val_list(request_setting)) + + # Remove keys that are set to None. Extract keys first to avoid altering + # the dictionary during iteration. + none_keys = [k for (k, v) in merged_setting.items() if v is None] + for key in none_keys: + del merged_setting[key] + + return merged_setting + + +def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): + """Properly merges both requests and session hooks. + + This is necessary because when request_hooks == {'response': []}, the + merge breaks Session hooks entirely. + """ + if session_hooks is None or session_hooks.get('response') == []: + return request_hooks + + if request_hooks is None or request_hooks.get('response') == []: + return session_hooks + + return merge_setting(request_hooks, session_hooks, dict_class) + + +class SessionRedirectMixin(object): + + def get_redirect_target(self, resp): + """Receives a Response. Returns a redirect URI or ``None``""" + # Due to the nature of how requests processes redirects this method will + # be called at least once upon the original response and at least twice + # on each subsequent redirect response (if any). + # If a custom mixin is used to handle this logic, it may be advantageous + # to cache the redirect location onto the response object as a private + # attribute. + if resp.is_redirect: + location = resp.headers['location'] + # Currently the underlying http module on py3 decode headers + # in latin1, but empirical evidence suggests that latin1 is very + # rarely used with non-ASCII characters in HTTP headers. + # It is more likely to get UTF8 header rather than latin1. + # This causes incorrect handling of UTF8 encoded location headers. + # To solve this, we re-encode the location in latin1. + if is_py3: + location = location.encode('latin1') + return to_native_string(location, 'utf8') + return None + + def should_strip_auth(self, old_url, new_url): + """Decide whether Authorization header should be removed when redirecting""" + old_parsed = urlparse(old_url) + new_parsed = urlparse(new_url) + if old_parsed.hostname != new_parsed.hostname: + return True + # Special case: allow http -> https redirect when using the standard + # ports. This isn't specified by RFC 7235, but is kept to avoid + # breaking backwards compatibility with older versions of requests + # that allowed any redirects on the same host. + if (old_parsed.scheme == 'http' and old_parsed.port in (80, None) + and new_parsed.scheme == 'https' and new_parsed.port in (443, None)): + return False + + # Handle default port usage corresponding to scheme. + changed_port = old_parsed.port != new_parsed.port + changed_scheme = old_parsed.scheme != new_parsed.scheme + default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) + if (not changed_scheme and old_parsed.port in default_port + and new_parsed.port in default_port): + return False + + # Standard case: root URI must match + return changed_port or changed_scheme + + def resolve_redirects(self, resp, req, stream=False, timeout=None, + verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): + """Receives a Response. Returns a generator of Responses or Requests.""" + + hist = [] # keep track of history + + url = self.get_redirect_target(resp) + previous_fragment = urlparse(req.url).fragment + while url: + prepared_request = req.copy() + + # Update history and keep track of redirects. + # resp.history must ignore the original request in this loop + hist.append(resp) + resp.history = hist[1:] + + try: + resp.content # Consume socket so it can be released + except (ChunkedEncodingError, ContentDecodingError, RuntimeError): + resp.raw.read(decode_content=False) + + if len(resp.history) >= self.max_redirects: + raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) + + # Release the connection back into the pool. + resp.close() + + # Handle redirection without scheme (see: RFC 1808 Section 4) + if url.startswith('//'): + parsed_rurl = urlparse(resp.url) + url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url) + + # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) + parsed = urlparse(url) + if parsed.fragment == '' and previous_fragment: + parsed = parsed._replace(fragment=previous_fragment) + elif parsed.fragment: + previous_fragment = parsed.fragment + url = parsed.geturl() + + # Facilitate relative 'location' headers, as allowed by RFC 7231. + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + # Compliant with RFC3986, we percent encode the url. + if not parsed.netloc: + url = urljoin(resp.url, requote_uri(url)) + else: + url = requote_uri(url) + + prepared_request.url = to_native_string(url) + + self.rebuild_method(prepared_request, resp) + + # https://github.com/requests/requests/issues/1084 + if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): + # https://github.com/requests/requests/issues/3490 + purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') + for header in purged_headers: + prepared_request.headers.pop(header, None) + prepared_request.body = None + + headers = prepared_request.headers + try: + del headers['Cookie'] + except KeyError: + pass + + # Extract any cookies sent on the response to the cookiejar + # in the new request. Because we've mutated our copied prepared + # request, use the old one that we haven't yet touched. + extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) + merge_cookies(prepared_request._cookies, self.cookies) + prepared_request.prepare_cookies(prepared_request._cookies) + + # Rebuild auth and proxy information. + proxies = self.rebuild_proxies(prepared_request, proxies) + self.rebuild_auth(prepared_request, resp) + + # A failed tell() sets `_body_position` to `object()`. This non-None + # value ensures `rewindable` will be True, allowing us to raise an + # UnrewindableBodyError, instead of hanging the connection. + rewindable = ( + prepared_request._body_position is not None and + ('Content-Length' in headers or 'Transfer-Encoding' in headers) + ) + + # Attempt to rewind consumed file-like object. + if rewindable: + rewind_body(prepared_request) + + # Override the original request. + req = prepared_request + + if yield_requests: + yield req + else: + + resp = self.send( + req, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + **adapter_kwargs + ) + + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + + # extract redirect url, if any, for the next loop + url = self.get_redirect_target(resp) + yield resp + + def rebuild_auth(self, prepared_request, response): + """When being redirected we may want to strip authentication from the + request to avoid leaking credentials. This method intelligently removes + and reapplies authentication where possible to avoid credential loss. + """ + headers = prepared_request.headers + url = prepared_request.url + + if 'Authorization' in headers and self.should_strip_auth(response.request.url, url): + # If we get redirected to a new host, we should strip out any + # authentication headers. + del headers['Authorization'] + + # .netrc might have more auth for us on our new host. + new_auth = get_netrc_auth(url) if self.trust_env else None + if new_auth is not None: + prepared_request.prepare_auth(new_auth) + + return + + def rebuild_proxies(self, prepared_request, proxies): + """This method re-evaluates the proxy configuration by considering the + environment variables. If we are redirected to a URL covered by + NO_PROXY, we strip the proxy configuration. Otherwise, we set missing + proxy keys for this URL (in case they were stripped by a previous + redirect). + + This method also replaces the Proxy-Authorization header where + necessary. + + :rtype: dict + """ + proxies = proxies if proxies is not None else {} + headers = prepared_request.headers + url = prepared_request.url + scheme = urlparse(url).scheme + new_proxies = proxies.copy() + no_proxy = proxies.get('no_proxy') + + bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy) + if self.trust_env and not bypass_proxy: + environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) + + proxy = environ_proxies.get(scheme, environ_proxies.get('all')) + + if proxy: + new_proxies.setdefault(scheme, proxy) + + if 'Proxy-Authorization' in headers: + del headers['Proxy-Authorization'] + + try: + username, password = get_auth_from_url(new_proxies[scheme]) + except KeyError: + username, password = None, None + + if username and password: + headers['Proxy-Authorization'] = _basic_auth_str(username, password) + + return new_proxies + + def rebuild_method(self, prepared_request, response): + """When being redirected we may want to change the method of the request + based on certain specs or browser behavior. + """ + method = prepared_request.method + + # https://tools.ietf.org/html/rfc7231#section-6.4.4 + if response.status_code == codes.see_other and method != 'HEAD': + method = 'GET' + + # Do what the browsers do, despite standards... + # First, turn 302s into GETs. + if response.status_code == codes.found and method != 'HEAD': + method = 'GET' + + # Second, if a POST is responded to with a 301, turn it into a GET. + # This bizarre behaviour is explained in Issue 1704. + if response.status_code == codes.moved and method == 'POST': + method = 'GET' + + prepared_request.method = method + + +class Session(SessionRedirectMixin): + """A Requests session. + + Provides cookie persistence, connection-pooling, and configuration. + + Basic Usage:: + + >>> import requests + >>> s = requests.Session() + >>> s.get('https://httpbin.org/get') + + + Or as a context manager:: + + >>> with requests.Session() as s: + >>> s.get('https://httpbin.org/get') + + """ + + __attrs__ = [ + 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', + 'cert', 'prefetch', 'adapters', 'stream', 'trust_env', + 'max_redirects', + ] + + def __init__(self): + + #: A case-insensitive dictionary of headers to be sent on each + #: :class:`Request ` sent from this + #: :class:`Session `. + self.headers = default_headers() + + #: Default Authentication tuple or object to attach to + #: :class:`Request `. + self.auth = None + + #: Dictionary mapping protocol or protocol and host to the URL of the proxy + #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to + #: be used on each :class:`Request `. + self.proxies = {} + + #: Event-handling hooks. + self.hooks = default_hooks() + + #: Dictionary of querystring data to attach to each + #: :class:`Request `. The dictionary values may be lists for + #: representing multivalued query parameters. + self.params = {} + + #: Stream response content default. + self.stream = False + + #: SSL Verification default. + self.verify = True + + #: SSL client certificate default, if String, path to ssl client + #: cert file (.pem). If Tuple, ('cert', 'key') pair. + self.cert = None + + #: Maximum number of redirects allowed. If the request exceeds this + #: limit, a :class:`TooManyRedirects` exception is raised. + #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is + #: 30. + self.max_redirects = DEFAULT_REDIRECT_LIMIT + + #: Trust environment settings for proxy configuration, default + #: authentication and similar. + self.trust_env = True + + #: A CookieJar containing all currently outstanding cookies set on this + #: session. By default it is a + #: :class:`RequestsCookieJar `, but + #: may be any other ``cookielib.CookieJar`` compatible object. + self.cookies = cookiejar_from_dict({}) + + # Default connection adapters. + self.adapters = OrderedDict() + self.mount('https://', HTTPAdapter()) + self.mount('http://', HTTPAdapter()) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def prepare_request(self, request): + """Constructs a :class:`PreparedRequest ` for + transmission and returns it. The :class:`PreparedRequest` has settings + merged from the :class:`Request ` instance and those of the + :class:`Session`. + + :param request: :class:`Request` instance to prepare with this + session's settings. + :rtype: requests.PreparedRequest + """ + cookies = request.cookies or {} + + # Bootstrap CookieJar. + if not isinstance(cookies, cookielib.CookieJar): + cookies = cookiejar_from_dict(cookies) + + # Merge with session cookies + merged_cookies = merge_cookies( + merge_cookies(RequestsCookieJar(), self.cookies), cookies) + + # Set environment's basic authentication if not explicitly set. + auth = request.auth + if self.trust_env and not auth and not self.auth: + auth = get_netrc_auth(request.url) + + p = PreparedRequest() + p.prepare( + method=request.method.upper(), + url=request.url, + files=request.files, + data=request.data, + json=request.json, + headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), + params=merge_setting(request.params, self.params), + auth=merge_setting(auth, self.auth), + cookies=merged_cookies, + hooks=merge_hooks(request.hooks, self.hooks), + ) + return p + + def request(self, method, url, + params=None, data=None, headers=None, cookies=None, files=None, + auth=None, timeout=None, allow_redirects=True, proxies=None, + hooks=None, stream=None, verify=None, cert=None, json=None): + """Constructs a :class:`Request `, prepares it and sends it. + Returns :class:`Response ` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query + string for the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the + :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the + :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the + :class:`Request`. + :param files: (optional) Dictionary of ``'filename': file-like-objects`` + for multipart encoding upload. + :param auth: (optional) Auth tuple or callable to enable + Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Set to True by default. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol or protocol and + hostname to the URL of the proxy. + :param stream: (optional) whether to immediately download the response + content. Defaults to ``False``. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param cert: (optional) if String, path to ssl client cert file (.pem). + If Tuple, ('cert', 'key') pair. + :rtype: requests.Response + """ + # Create the Request. + req = Request( + method=method.upper(), + url=url, + headers=headers, + files=files, + data=data or {}, + json=json, + params=params or {}, + auth=auth, + cookies=cookies, + hooks=hooks, + ) + prep = self.prepare_request(req) + + proxies = proxies or {} + + settings = self.merge_environment_settings( + prep.url, proxies, stream, verify, cert + ) + + # Send the request. + send_kwargs = { + 'timeout': timeout, + 'allow_redirects': allow_redirects, + } + send_kwargs.update(settings) + resp = self.send(prep, **send_kwargs) + + return resp + + def get(self, url, **kwargs): + r"""Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('GET', url, **kwargs) + + def options(self, url, **kwargs): + r"""Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('OPTIONS', url, **kwargs) + + def head(self, url, **kwargs): + r"""Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return self.request('HEAD', url, **kwargs) + + def post(self, url, data=None, json=None, **kwargs): + r"""Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('POST', url, data=data, json=json, **kwargs) + + def put(self, url, data=None, **kwargs): + r"""Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PUT', url, data=data, **kwargs) + + def patch(self, url, data=None, **kwargs): + r"""Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PATCH', url, data=data, **kwargs) + + def delete(self, url, **kwargs): + r"""Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('DELETE', url, **kwargs) + + def send(self, request, **kwargs): + """Send a given PreparedRequest. + + :rtype: requests.Response + """ + # Set defaults that the hooks can utilize to ensure they always have + # the correct parameters to reproduce the previous request. + kwargs.setdefault('stream', self.stream) + kwargs.setdefault('verify', self.verify) + kwargs.setdefault('cert', self.cert) + kwargs.setdefault('proxies', self.proxies) + + # It's possible that users might accidentally send a Request object. + # Guard against that specific failure case. + if isinstance(request, Request): + raise ValueError('You can only send PreparedRequests.') + + # Set up variables needed for resolve_redirects and dispatching of hooks + allow_redirects = kwargs.pop('allow_redirects', True) + stream = kwargs.get('stream') + hooks = request.hooks + + # Get the appropriate adapter to use + adapter = self.get_adapter(url=request.url) + + # Start time (approximately) of the request + start = preferred_clock() + + # Send the request + r = adapter.send(request, **kwargs) + + # Total elapsed time of the request (approximately) + elapsed = preferred_clock() - start + r.elapsed = timedelta(seconds=elapsed) + + # Response manipulation hooks + r = dispatch_hook('response', hooks, r, **kwargs) + + # Persist cookies + if r.history: + + # If the hooks create history then we want those cookies too + for resp in r.history: + extract_cookies_to_jar(self.cookies, resp.request, resp.raw) + + extract_cookies_to_jar(self.cookies, request, r.raw) + + # Redirect resolving generator. + gen = self.resolve_redirects(r, request, **kwargs) + + # Resolve redirects if allowed. + history = [resp for resp in gen] if allow_redirects else [] + + # Shuffle things around if there's history. + if history: + # Insert the first (original) request at the start + history.insert(0, r) + # Get the last request made + r = history.pop() + r.history = history + + # If redirects aren't being followed, store the response on the Request for Response.next(). + if not allow_redirects: + try: + r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs)) + except StopIteration: + pass + + if not stream: + r.content + + return r + + def merge_environment_settings(self, url, proxies, stream, verify, cert): + """ + Check the environment and merge it with some settings. + + :rtype: dict + """ + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + no_proxy = proxies.get('no_proxy') if proxies is not None else None + env_proxies = get_environ_proxies(url, no_proxy=no_proxy) + for (k, v) in env_proxies.items(): + proxies.setdefault(k, v) + + # Look for requests environment configuration and be compatible + # with cURL. + if verify is True or verify is None: + verify = (os.environ.get('REQUESTS_CA_BUNDLE') or + os.environ.get('CURL_CA_BUNDLE')) + + # Merge all the kwargs. + proxies = merge_setting(proxies, self.proxies) + stream = merge_setting(stream, self.stream) + verify = merge_setting(verify, self.verify) + cert = merge_setting(cert, self.cert) + + return {'verify': verify, 'proxies': proxies, 'stream': stream, + 'cert': cert} + + def get_adapter(self, url): + """ + Returns the appropriate connection adapter for the given URL. + + :rtype: requests.adapters.BaseAdapter + """ + for (prefix, adapter) in self.adapters.items(): + + if url.lower().startswith(prefix.lower()): + return adapter + + # Nothing matches :-/ + raise InvalidSchema("No connection adapters were found for '%s'" % url) + + def close(self): + """Closes all adapters and as such the session""" + for v in self.adapters.values(): + v.close() + + def mount(self, prefix, adapter): + """Registers a connection adapter to a prefix. + + Adapters are sorted in descending order by prefix length. + """ + self.adapters[prefix] = adapter + keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] + + for key in keys_to_move: + self.adapters[key] = self.adapters.pop(key) + + def __getstate__(self): + state = {attr: getattr(self, attr, None) for attr in self.__attrs__} + return state + + def __setstate__(self, state): + for attr, value in state.items(): + setattr(self, attr, value) + + +def session(): + """ + Returns a :class:`Session` for context-management. + + .. deprecated:: 1.0.0 + + This method has been deprecated since version 1.0.0 and is only kept for + backwards compatibility. New code should use :class:`~requests.sessions.Session` + to create a session. This may be removed at a future date. + + :rtype: Session + """ + return Session() diff --git a/dropbox-script/requests/status_codes.py b/dropbox-script/requests/status_codes.py new file mode 100644 index 0000000..813e8c4 --- /dev/null +++ b/dropbox-script/requests/status_codes.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- + +r""" +The ``codes`` object defines a mapping from common names for HTTP statuses +to their numerical codes, accessible either as attributes or as dictionary +items. + +>>> requests.codes['temporary_redirect'] +307 +>>> requests.codes.teapot +418 +>>> requests.codes['\o/'] +200 + +Some codes have multiple names, and both upper- and lower-case versions of +the names are allowed. For example, ``codes.ok``, ``codes.OK``, and +``codes.okay`` all correspond to the HTTP status code 200. +""" + +from .structures import LookupDict + +_codes = { + + # Informational. + 100: ('continue',), + 101: ('switching_protocols',), + 102: ('processing',), + 103: ('checkpoint',), + 122: ('uri_too_long', 'request_uri_too_long'), + 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), + 201: ('created',), + 202: ('accepted',), + 203: ('non_authoritative_info', 'non_authoritative_information'), + 204: ('no_content',), + 205: ('reset_content', 'reset'), + 206: ('partial_content', 'partial'), + 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), + 208: ('already_reported',), + 226: ('im_used',), + + # Redirection. + 300: ('multiple_choices',), + 301: ('moved_permanently', 'moved', '\\o-'), + 302: ('found',), + 303: ('see_other', 'other'), + 304: ('not_modified',), + 305: ('use_proxy',), + 306: ('switch_proxy',), + 307: ('temporary_redirect', 'temporary_moved', 'temporary'), + 308: ('permanent_redirect', + 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 + + # Client Error. + 400: ('bad_request', 'bad'), + 401: ('unauthorized',), + 402: ('payment_required', 'payment'), + 403: ('forbidden',), + 404: ('not_found', '-o-'), + 405: ('method_not_allowed', 'not_allowed'), + 406: ('not_acceptable',), + 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), + 408: ('request_timeout', 'timeout'), + 409: ('conflict',), + 410: ('gone',), + 411: ('length_required',), + 412: ('precondition_failed', 'precondition'), + 413: ('request_entity_too_large',), + 414: ('request_uri_too_large',), + 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), + 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), + 417: ('expectation_failed',), + 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), + 421: ('misdirected_request',), + 422: ('unprocessable_entity', 'unprocessable'), + 423: ('locked',), + 424: ('failed_dependency', 'dependency'), + 425: ('unordered_collection', 'unordered'), + 426: ('upgrade_required', 'upgrade'), + 428: ('precondition_required', 'precondition'), + 429: ('too_many_requests', 'too_many'), + 431: ('header_fields_too_large', 'fields_too_large'), + 444: ('no_response', 'none'), + 449: ('retry_with', 'retry'), + 450: ('blocked_by_windows_parental_controls', 'parental_controls'), + 451: ('unavailable_for_legal_reasons', 'legal_reasons'), + 499: ('client_closed_request',), + + # Server Error. + 500: ('internal_server_error', 'server_error', '/o\\', '✗'), + 501: ('not_implemented',), + 502: ('bad_gateway',), + 503: ('service_unavailable', 'unavailable'), + 504: ('gateway_timeout',), + 505: ('http_version_not_supported', 'http_version'), + 506: ('variant_also_negotiates',), + 507: ('insufficient_storage',), + 509: ('bandwidth_limit_exceeded', 'bandwidth'), + 510: ('not_extended',), + 511: ('network_authentication_required', 'network_auth', 'network_authentication'), +} + +codes = LookupDict(name='status_codes') + +def _init(): + for code, titles in _codes.items(): + for title in titles: + setattr(codes, title, code) + if not title.startswith(('\\', '/')): + setattr(codes, title.upper(), code) + + def doc(code): + names = ', '.join('``%s``' % n for n in _codes[code]) + return '* %d: %s' % (code, names) + + global __doc__ + __doc__ = (__doc__ + '\n' + + '\n'.join(doc(code) for code in sorted(_codes)) + if __doc__ is not None else None) + +_init() diff --git a/dropbox-script/requests/structures.py b/dropbox-script/requests/structures.py new file mode 100644 index 0000000..da930e2 --- /dev/null +++ b/dropbox-script/requests/structures.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- + +""" +requests.structures +~~~~~~~~~~~~~~~~~~~ + +Data structures that power Requests. +""" + +from .compat import OrderedDict, Mapping, MutableMapping + + +class CaseInsensitiveDict(MutableMapping): + """A case-insensitive ``dict``-like object. + + Implements all methods and operations of + ``MutableMapping`` as well as dict's ``copy``. Also + provides ``lower_items``. + + All keys are expected to be strings. The structure remembers the + case of the last key to be set, and ``iter(instance)``, + ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` + will contain case-sensitive keys. However, querying and contains + testing is case insensitive:: + + cid = CaseInsensitiveDict() + cid['Accept'] = 'application/json' + cid['aCCEPT'] == 'application/json' # True + list(cid) == ['Accept'] # True + + For example, ``headers['content-encoding']`` will return the + value of a ``'Content-Encoding'`` response header, regardless + of how the header name was originally stored. + + If the constructor, ``.update``, or equality comparison + operations are given keys that have equal ``.lower()``s, the + behavior is undefined. + """ + + def __init__(self, data=None, **kwargs): + self._store = OrderedDict() + if data is None: + data = {} + self.update(data, **kwargs) + + def __setitem__(self, key, value): + # Use the lowercased key for lookups, but store the actual + # key alongside the value. + self._store[key.lower()] = (key, value) + + def __getitem__(self, key): + return self._store[key.lower()][1] + + def __delitem__(self, key): + del self._store[key.lower()] + + def __iter__(self): + return (casedkey for casedkey, mappedvalue in self._store.values()) + + def __len__(self): + return len(self._store) + + def lower_items(self): + """Like iteritems(), but with all lowercase keys.""" + return ( + (lowerkey, keyval[1]) + for (lowerkey, keyval) + in self._store.items() + ) + + def __eq__(self, other): + if isinstance(other, Mapping): + other = CaseInsensitiveDict(other) + else: + return NotImplemented + # Compare insensitively + return dict(self.lower_items()) == dict(other.lower_items()) + + # Copy is required + def copy(self): + return CaseInsensitiveDict(self._store.values()) + + def __repr__(self): + return str(dict(self.items())) + + +class LookupDict(dict): + """Dictionary lookup object.""" + + def __init__(self, name=None): + self.name = name + super(LookupDict, self).__init__() + + def __repr__(self): + return '' % (self.name) + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + + return self.__dict__.get(key, None) + + def get(self, key, default=None): + return self.__dict__.get(key, default) diff --git a/dropbox-script/requests/utils.py b/dropbox-script/requests/utils.py new file mode 100644 index 0000000..8170a8d --- /dev/null +++ b/dropbox-script/requests/utils.py @@ -0,0 +1,977 @@ +# -*- coding: utf-8 -*- + +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. +""" + +import codecs +import contextlib +import io +import os +import re +import socket +import struct +import sys +import tempfile +import warnings +import zipfile + +from .__version__ import __version__ +from . import certs +# to_native_string is unused here, but imported here for backwards compatibility +from ._internal_utils import to_native_string +from .compat import parse_http_list as _parse_list_header +from .compat import ( + quote, urlparse, bytes, str, OrderedDict, unquote, getproxies, + proxy_bypass, urlunparse, basestring, integer_types, is_py3, + proxy_bypass_environment, getproxies_environment, Mapping) +from .cookies import cookiejar_from_dict +from .structures import CaseInsensitiveDict +from .exceptions import ( + InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError) + +NETRC_FILES = ('.netrc', '_netrc') + +DEFAULT_CA_BUNDLE_PATH = certs.where() + +DEFAULT_PORTS = {'http': 80, 'https': 443} + + +if sys.platform == 'win32': + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + try: + if is_py3: + import winreg + else: + import _winreg as winreg + except ImportError: + return False + + try: + internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it + proxyEnable = int(winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0]) + # ProxyOverride is almost always a string + proxyOverride = winreg.QueryValueEx(internetSettings, + 'ProxyOverride')[0] + except OSError: + return False + if not proxyEnable or not proxyOverride: + return False + + # make a check value list from the registry entry: replace the + # '' string by the localhost entry and the corresponding + # canonical entry. + proxyOverride = proxyOverride.split(';') + # now check if we match one of the registry values. + for test in proxyOverride: + if test == '': + if '.' not in host: + return True + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + if re.match(test, host, re.I): + return True + return False + + def proxy_bypass(host): # noqa + """Return True, if the host should be bypassed. + + Checks proxy settings gathered from the environment, if specified, + or the registry. + """ + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_registry(host) + + +def dict_to_sequence(d): + """Returns an internal sequence dictionary update.""" + + if hasattr(d, 'items'): + d = d.items() + + return d + + +def super_len(o): + total_length = None + current_position = 0 + + if hasattr(o, '__len__'): + total_length = len(o) + + elif hasattr(o, 'len'): + total_length = o.len + + elif hasattr(o, 'fileno'): + try: + fileno = o.fileno() + except io.UnsupportedOperation: + pass + else: + total_length = os.fstat(fileno).st_size + + # Having used fstat to determine the file length, we need to + # confirm that this file was opened up in binary mode. + if 'b' not in o.mode: + warnings.warn(( + "Requests has determined the content-length for this " + "request using the binary size of the file: however, the " + "file has been opened in text mode (i.e. without the 'b' " + "flag in the mode). This may lead to an incorrect " + "content-length. In Requests 3.0, support will be removed " + "for files in text mode."), + FileModeWarning + ) + + if hasattr(o, 'tell'): + try: + current_position = o.tell() + except (OSError, IOError): + # This can happen in some weird situations, such as when the file + # is actually a special file descriptor like stdin. In this + # instance, we don't know what the length is, so set it to zero and + # let requests chunk it instead. + if total_length is not None: + current_position = total_length + else: + if hasattr(o, 'seek') and total_length is None: + # StringIO and BytesIO have seek but no useable fileno + try: + # seek to end of file + o.seek(0, 2) + total_length = o.tell() + + # seek back to current position to support + # partially read file-like objects + o.seek(current_position or 0) + except (OSError, IOError): + total_length = 0 + + if total_length is None: + total_length = 0 + + return max(0, total_length - current_position) + + +def get_netrc_auth(url, raise_errors=False): + """Returns the Requests tuple auth for a given url from netrc.""" + + try: + from netrc import netrc, NetrcParseError + + netrc_path = None + + for f in NETRC_FILES: + try: + loc = os.path.expanduser('~/{}'.format(f)) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See https://bugs.python.org/issue20164 & + # https://github.com/requests/requests/issues/1846 + return + + if os.path.exists(loc): + netrc_path = loc + break + + # Abort early if there isn't one. + if netrc_path is None: + return + + ri = urlparse(url) + + # Strip port numbers from netloc. This weird `if...encode`` dance is + # used for Python 3.2, which doesn't support unicode literals. + splitstr = b':' + if isinstance(url, str): + splitstr = splitstr.decode('ascii') + host = ri.netloc.split(splitstr)[0] + + try: + _netrc = netrc(netrc_path).authenticators(host) + if _netrc: + # Return with login / password + login_i = (0 if _netrc[0] else 1) + return (_netrc[login_i], _netrc[2]) + except (NetrcParseError, IOError): + # If there was a parsing error or a permissions issue reading the file, + # we'll just skip netrc auth unless explicitly asked to raise errors. + if raise_errors: + raise + + # AppEngine hackiness. + except (ImportError, AttributeError): + pass + + +def guess_filename(obj): + """Tries to guess the filename of the given object.""" + name = getattr(obj, 'name', None) + if (name and isinstance(name, basestring) and name[0] != '<' and + name[-1] != '>'): + return os.path.basename(name) + + +def extract_zipped_paths(path): + """Replace nonexistent paths that look like they refer to a member of a zip + archive with the location of an extracted copy of the target, or else + just return the provided path unchanged. + """ + if os.path.exists(path): + # this is already a valid path, no need to do anything further + return path + + # find the first valid part of the provided path and treat that as a zip archive + # assume the rest of the path is the name of a member in the archive + archive, member = os.path.split(path) + while archive and not os.path.exists(archive): + archive, prefix = os.path.split(archive) + member = '/'.join([prefix, member]) + + if not zipfile.is_zipfile(archive): + return path + + zip_file = zipfile.ZipFile(archive) + if member not in zip_file.namelist(): + return path + + # we have a valid zip archive and a valid member of that archive + tmp = tempfile.gettempdir() + extracted_path = os.path.join(tmp, *member.split('/')) + if not os.path.exists(extracted_path): + extracted_path = zip_file.extract(member, path=tmp) + + return extracted_path + + +def from_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. Unless it can not be represented as such, return an + OrderedDict, e.g., + + :: + + >>> from_key_val_list([('key', 'val')]) + OrderedDict([('key', 'val')]) + >>> from_key_val_list('string') + ValueError: cannot encode objects that are not 2-tuples + >>> from_key_val_list({'key': 'val'}) + OrderedDict([('key', 'val')]) + + :rtype: OrderedDict + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + return OrderedDict(value) + + +def to_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. If it can be, return a list of tuples, e.g., + + :: + + >>> to_key_val_list([('key', 'val')]) + [('key', 'val')] + >>> to_key_val_list({'key': 'val'}) + [('key', 'val')] + >>> to_key_val_list('string') + ValueError: cannot encode objects that are not 2-tuples. + + :rtype: list + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + if isinstance(value, Mapping): + value = value.items() + + return list(value) + + +# From mitsuhiko/werkzeug (used with permission). +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + :rtype: list + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +# From mitsuhiko/werkzeug (used with permission). +def parse_dict_header(value): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict: + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + :param value: a string with a dict header. + :return: :class:`dict` + :rtype: dict + """ + result = {} + for item in _parse_list_header(value): + if '=' not in item: + result[item] = None + continue + name, value = item.split('=', 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +# From mitsuhiko/werkzeug (used with permission). +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + :rtype: str + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != '\\\\': + return value.replace('\\\\', '\\').replace('\\"', '"') + return value + + +def dict_from_cookiejar(cj): + """Returns a key/value dictionary from a CookieJar. + + :param cj: CookieJar object to extract cookies from. + :rtype: dict + """ + + cookie_dict = {} + + for cookie in cj: + cookie_dict[cookie.name] = cookie.value + + return cookie_dict + + +def add_dict_to_cookiejar(cj, cookie_dict): + """Returns a CookieJar from a key/value dictionary. + + :param cj: CookieJar to insert cookies into. + :param cookie_dict: Dict of key/values to insert into CookieJar. + :rtype: CookieJar + """ + + return cookiejar_from_dict(cookie_dict, cj) + + +def get_encodings_from_content(content): + """Returns encodings from given content string. + + :param content: bytestring to extract encodings from. + """ + warnings.warn(( + 'In requests 3.0, get_encodings_from_content will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + charset_re = re.compile(r']', flags=re.I) + pragma_re = re.compile(r']', flags=re.I) + xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') + + return (charset_re.findall(content) + + pragma_re.findall(content) + + xml_re.findall(content)) + + +def _parse_content_type_header(header): + """Returns content type and parameters from given header + + :param header: string + :return: tuple containing content type and dictionary of + parameters + """ + + tokens = header.split(';') + content_type, params = tokens[0].strip(), tokens[1:] + params_dict = {} + items_to_strip = "\"' " + + for param in params: + param = param.strip() + if param: + key, value = param, True + index_of_equals = param.find("=") + if index_of_equals != -1: + key = param[:index_of_equals].strip(items_to_strip) + value = param[index_of_equals + 1:].strip(items_to_strip) + params_dict[key.lower()] = value + return content_type, params_dict + + +def get_encoding_from_headers(headers): + """Returns encodings from given HTTP Header Dict. + + :param headers: dictionary to extract encoding from. + :rtype: str + """ + + content_type = headers.get('content-type') + + if not content_type: + return None + + content_type, params = _parse_content_type_header(content_type) + + if 'charset' in params: + return params['charset'].strip("'\"") + + if 'text' in content_type: + return 'ISO-8859-1' + + +def stream_decode_response_unicode(iterator, r): + """Stream decodes a iterator.""" + + if r.encoding is None: + for item in iterator: + yield item + return + + decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') + for chunk in iterator: + rv = decoder.decode(chunk) + if rv: + yield rv + rv = decoder.decode(b'', final=True) + if rv: + yield rv + + +def iter_slices(string, slice_length): + """Iterate over slices of a string.""" + pos = 0 + if slice_length is None or slice_length <= 0: + slice_length = len(string) + while pos < len(string): + yield string[pos:pos + slice_length] + pos += slice_length + + +def get_unicode_from_response(r): + """Returns the requested content back in unicode. + + :param r: Response object to get unicode content from. + + Tried: + + 1. charset from content-type + 2. fall back and replace all unicode characters + + :rtype: str + """ + warnings.warn(( + 'In requests 3.0, get_unicode_from_response will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + tried_encodings = [] + + # Try charset from content-type + encoding = get_encoding_from_headers(r.headers) + + if encoding: + try: + return str(r.content, encoding) + except UnicodeError: + tried_encodings.append(encoding) + + # Fall back: + try: + return str(r.content, encoding, errors='replace') + except TypeError: + return r.content + + +# The unreserved URI characters (RFC 3986) +UNRESERVED_SET = frozenset( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") + + +def unquote_unreserved(uri): + """Un-escape any percent-escape sequences in a URI that are unreserved + characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + + :rtype: str + """ + parts = uri.split('%') + for i in range(1, len(parts)): + h = parts[i][0:2] + if len(h) == 2 and h.isalnum(): + try: + c = chr(int(h, 16)) + except ValueError: + raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) + + if c in UNRESERVED_SET: + parts[i] = c + parts[i][2:] + else: + parts[i] = '%' + parts[i] + else: + parts[i] = '%' + parts[i] + return ''.join(parts) + + +def requote_uri(uri): + """Re-quote the given URI. + + This function passes the given URI through an unquote/quote cycle to + ensure that it is fully and consistently quoted. + + :rtype: str + """ + safe_with_percent = "!#$%&'()*+,/:;=?@[]~" + safe_without_percent = "!#$&'()*+,/:;=?@[]~" + try: + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, + # unreserved, or '%') + return quote(unquote_unreserved(uri), safe=safe_with_percent) + except InvalidURL: + # We couldn't unquote the given URI, so let's try quoting it, but + # there may be unquoted '%'s in the URI. We need to make sure they're + # properly quoted so they do not cause issues elsewhere. + return quote(uri, safe=safe_without_percent) + + +def address_in_network(ip, net): + """This function allows you to check if an IP belongs to a network subnet + + Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 + returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 + + :rtype: bool + """ + ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] + netaddr, bits = net.split('/') + netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0] + network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask + return (ipaddr & netmask) == (network & netmask) + + +def dotted_netmask(mask): + """Converts mask from /xx format to xxx.xxx.xxx.xxx + + Example: if mask is 24 function returns 255.255.255.0 + + :rtype: str + """ + bits = 0xffffffff ^ (1 << 32 - mask) - 1 + return socket.inet_ntoa(struct.pack('>I', bits)) + + +def is_ipv4_address(string_ip): + """ + :rtype: bool + """ + try: + socket.inet_aton(string_ip) + except socket.error: + return False + return True + + +def is_valid_cidr(string_network): + """ + Very simple check of the cidr format in no_proxy variable. + + :rtype: bool + """ + if string_network.count('/') == 1: + try: + mask = int(string_network.split('/')[1]) + except ValueError: + return False + + if mask < 1 or mask > 32: + return False + + try: + socket.inet_aton(string_network.split('/')[0]) + except socket.error: + return False + else: + return False + return True + + +@contextlib.contextmanager +def set_environ(env_name, value): + """Set the environment variable 'env_name' to 'value' + + Save previous value, yield, and then restore the previous value stored in + the environment variable 'env_name'. + + If 'value' is None, do nothing""" + value_changed = value is not None + if value_changed: + old_value = os.environ.get(env_name) + os.environ[env_name] = value + try: + yield + finally: + if value_changed: + if old_value is None: + del os.environ[env_name] + else: + os.environ[env_name] = old_value + + +def should_bypass_proxies(url, no_proxy): + """ + Returns whether we should bypass proxies or not. + + :rtype: bool + """ + # Prioritize lowercase environment variables over uppercase + # to keep a consistent behaviour with other http projects (curl, wget). + get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy_arg = no_proxy + if no_proxy is None: + no_proxy = get_proxy('no_proxy') + parsed = urlparse(url) + + if parsed.hostname is None: + # URLs don't always have hostnames, e.g. file:/// urls. + return True + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the hostname, both with and without the port. + no_proxy = ( + host for host in no_proxy.replace(' ', '').split(',') if host + ) + + if is_ipv4_address(parsed.hostname): + for proxy_ip in no_proxy: + if is_valid_cidr(proxy_ip): + if address_in_network(parsed.hostname, proxy_ip): + return True + elif parsed.hostname == proxy_ip: + # If no_proxy ip was defined in plain IP notation instead of cidr notation & + # matches the IP of the index + return True + else: + host_with_port = parsed.hostname + if parsed.port: + host_with_port += ':{}'.format(parsed.port) + + for host in no_proxy: + if parsed.hostname.endswith(host) or host_with_port.endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return True + + with set_environ('no_proxy', no_proxy_arg): + # parsed.hostname can be `None` in cases such as a file URI. + try: + bypass = proxy_bypass(parsed.hostname) + except (TypeError, socket.gaierror): + bypass = False + + if bypass: + return True + + return False + + +def get_environ_proxies(url, no_proxy=None): + """ + Return a dict of environment proxies. + + :rtype: dict + """ + if should_bypass_proxies(url, no_proxy=no_proxy): + return {} + else: + return getproxies() + + +def select_proxy(url, proxies): + """Select a proxy for the url, if applicable. + + :param url: The url being for the request + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + """ + proxies = proxies or {} + urlparts = urlparse(url) + if urlparts.hostname is None: + return proxies.get(urlparts.scheme, proxies.get('all')) + + proxy_keys = [ + urlparts.scheme + '://' + urlparts.hostname, + urlparts.scheme, + 'all://' + urlparts.hostname, + 'all', + ] + proxy = None + for proxy_key in proxy_keys: + if proxy_key in proxies: + proxy = proxies[proxy_key] + break + + return proxy + + +def default_user_agent(name="python-requests"): + """ + Return a string representing the default user agent. + + :rtype: str + """ + return '%s/%s' % (name, __version__) + + +def default_headers(): + """ + :rtype: requests.structures.CaseInsensitiveDict + """ + return CaseInsensitiveDict({ + 'User-Agent': default_user_agent(), + 'Accept-Encoding': ', '.join(('gzip', 'deflate')), + 'Accept': '*/*', + 'Connection': 'keep-alive', + }) + + +def parse_header_links(value): + """Return a list of parsed link headers proxies. + + i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" + + :rtype: list + """ + + links = [] + + replace_chars = ' \'"' + + value = value.strip(replace_chars) + if not value: + return links + + for val in re.split(', *<', value): + try: + url, params = val.split(';', 1) + except ValueError: + url, params = val, '' + + link = {'url': url.strip('<> \'"')} + + for param in params.split(';'): + try: + key, value = param.split('=') + except ValueError: + break + + link[key.strip(replace_chars)] = value.strip(replace_chars) + + links.append(link) + + return links + + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + + +def guess_json_utf(data): + """ + :rtype: str + """ + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): + return 'utf-32' # BOM included + if sample[:3] == codecs.BOM_UTF8: + return 'utf-8-sig' # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return 'utf-16' # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return 'utf-8' + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return 'utf-16-be' + if sample[1::2] == _null2: # 2nd and 4th are null + return 'utf-16-le' + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return 'utf-32-be' + if sample[1:] == _null3: + return 'utf-32-le' + # Did not detect a valid UTF-32 ascii-range character + return None + + +def prepend_scheme_if_needed(url, new_scheme): + """Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) + + # urlparse is a finicky beast, and sometimes decides that there isn't a + # netloc present. Assume that it's being over-cautious, and switch netloc + # and path if urlparse decided there was no netloc. + if not netloc: + netloc, path = path, netloc + + return urlunparse((scheme, netloc, path, params, query, fragment)) + + +def get_auth_from_url(url): + """Given a url with authentication components, extract them into a tuple of + username,password. + + :rtype: (str,str) + """ + parsed = urlparse(url) + + try: + auth = (unquote(parsed.username), unquote(parsed.password)) + except (AttributeError, TypeError): + auth = ('', '') + + return auth + + +# Moved outside of function to avoid recompile every call +_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') +_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') + + +def check_header_validity(header): + """Verifies that header value is a string which doesn't contain + leading whitespace or return characters. This prevents unintended + header injection. + + :param header: tuple, in the format (name, value). + """ + name, value = header + + if isinstance(value, bytes): + pat = _CLEAN_HEADER_REGEX_BYTE + else: + pat = _CLEAN_HEADER_REGEX_STR + try: + if not pat.match(value): + raise InvalidHeader("Invalid return character or leading space in header: %s" % name) + except TypeError: + raise InvalidHeader("Value for header {%s: %s} must be of type str or " + "bytes, not %s" % (name, value, type(value))) + + +def urldefragauth(url): + """ + Given a url remove the fragment and the authentication part. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url) + + # see func:`prepend_scheme_if_needed` + if not netloc: + netloc, path = path, netloc + + netloc = netloc.rsplit('@', 1)[-1] + + return urlunparse((scheme, netloc, path, params, query, '')) + + +def rewind_body(prepared_request): + """Move file pointer back to its recorded starting position + so it can be read again on redirect. + """ + body_seek = getattr(prepared_request.body, 'seek', None) + if body_seek is not None and isinstance(prepared_request._body_position, integer_types): + try: + body_seek(prepared_request._body_position) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect.") + else: + raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/dropbox-script/six.py b/dropbox-script/six.py new file mode 100644 index 0000000..89b2188 --- /dev/null +++ b/dropbox-script/six.py @@ -0,0 +1,952 @@ +# Copyright (c) 2010-2018 Benjamin Peterson +# +# 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. + +"""Utilities for writing code that runs on Python 2 and 3""" + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson " +__version__ = "1.12.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("getoutput", "commands", "subprocess"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("splitvalue", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), + MovedAttribute("parse_http_list", "urllib2", "urllib.request"), + MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + try: + raise tp, value, tb + finally: + tb = None +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + try: + if from_value is None: + raise value + raise value from from_value + finally: + value = None +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + try: + raise value from from_value + finally: + value = None +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + if hasattr(cls, '__qualname__'): + orig_vars['__qualname__'] = cls.__qualname__ + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def ensure_binary(s, encoding='utf-8', errors='strict'): + """Coerce **s** to six.binary_type. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> encoded to `bytes` + - `bytes` -> `bytes` + """ + if isinstance(s, text_type): + return s.encode(encoding, errors) + elif isinstance(s, binary_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + +def ensure_str(s, encoding='utf-8', errors='strict'): + """Coerce *s* to `str`. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if not isinstance(s, (text_type, binary_type)): + raise TypeError("not expecting type '%s'" % type(s)) + if PY2 and isinstance(s, text_type): + s = s.encode(encoding, errors) + elif PY3 and isinstance(s, binary_type): + s = s.decode(encoding, errors) + return s + + +def ensure_text(s, encoding='utf-8', errors='strict'): + """Coerce *s* to six.text_type. + + For Python 2: + - `unicode` -> `unicode` + - `str` -> `unicode` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if isinstance(s, binary_type): + return s.decode(encoding, errors) + elif isinstance(s, text_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/dropbox-script/urllib3/__init__.py b/dropbox-script/urllib3/__init__.py new file mode 100644 index 0000000..148a9c3 --- /dev/null +++ b/dropbox-script/urllib3/__init__.py @@ -0,0 +1,92 @@ +""" +urllib3 - Thread-safe connection pooling and re-using. +""" + +from __future__ import absolute_import +import warnings + +from .connectionpool import ( + HTTPConnectionPool, + HTTPSConnectionPool, + connection_from_url +) + +from . import exceptions +from .filepost import encode_multipart_formdata +from .poolmanager import PoolManager, ProxyManager, proxy_from_url +from .response import HTTPResponse +from .util.request import make_headers +from .util.url import get_host +from .util.timeout import Timeout +from .util.retry import Retry + + +# Set default logging handler to avoid "No handler found" warnings. +import logging +from logging import NullHandler + +__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' +__license__ = 'MIT' +__version__ = '1.24.1' + +__all__ = ( + 'HTTPConnectionPool', + 'HTTPSConnectionPool', + 'PoolManager', + 'ProxyManager', + 'HTTPResponse', + 'Retry', + 'Timeout', + 'add_stderr_logger', + 'connection_from_url', + 'disable_warnings', + 'encode_multipart_formdata', + 'get_host', + 'make_headers', + 'proxy_from_url', +) + +logging.getLogger(__name__).addHandler(NullHandler()) + + +def add_stderr_logger(level=logging.DEBUG): + """ + Helper for quickly adding a StreamHandler to the logger. Useful for + debugging. + + Returns the handler after adding it. + """ + # This method needs to be in this __init__.py to get the __name__ correct + # even if urllib3 is vendored within another package. + logger = logging.getLogger(__name__) + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) + logger.addHandler(handler) + logger.setLevel(level) + logger.debug('Added a stderr logging handler to logger: %s', __name__) + return handler + + +# ... Clean up. +del NullHandler + + +# All warning filters *must* be appended unless you're really certain that they +# shouldn't be: otherwise, it's very hard for users to use most Python +# mechanisms to silence them. +# SecurityWarning's always go off by default. +warnings.simplefilter('always', exceptions.SecurityWarning, append=True) +# SubjectAltNameWarning's should go off once per host +warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True) +# InsecurePlatformWarning's don't vary between requests, so we keep it default. +warnings.simplefilter('default', exceptions.InsecurePlatformWarning, + append=True) +# SNIMissingWarnings should go off only once. +warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True) + + +def disable_warnings(category=exceptions.HTTPWarning): + """ + Helper for quickly disabling all urllib3 warnings. + """ + warnings.simplefilter('ignore', category) diff --git a/dropbox-script/urllib3/_collections.py b/dropbox-script/urllib3/_collections.py new file mode 100644 index 0000000..34f2381 --- /dev/null +++ b/dropbox-script/urllib3/_collections.py @@ -0,0 +1,329 @@ +from __future__ import absolute_import +try: + from collections.abc import Mapping, MutableMapping +except ImportError: + from collections import Mapping, MutableMapping +try: + from threading import RLock +except ImportError: # Platform-specific: No threads available + class RLock: + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_value, traceback): + pass + + +from collections import OrderedDict +from .exceptions import InvalidHeader +from .packages.six import iterkeys, itervalues, PY3 + + +__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict'] + + +_Null = object() + + +class RecentlyUsedContainer(MutableMapping): + """ + Provides a thread-safe dict-like container which maintains up to + ``maxsize`` keys while throwing away the least-recently-used keys beyond + ``maxsize``. + + :param maxsize: + Maximum number of recent elements to retain. + + :param dispose_func: + Every time an item is evicted from the container, + ``dispose_func(value)`` is called. Callback which will get called + """ + + ContainerCls = OrderedDict + + def __init__(self, maxsize=10, dispose_func=None): + self._maxsize = maxsize + self.dispose_func = dispose_func + + self._container = self.ContainerCls() + self.lock = RLock() + + def __getitem__(self, key): + # Re-insert the item, moving it to the end of the eviction line. + with self.lock: + item = self._container.pop(key) + self._container[key] = item + return item + + def __setitem__(self, key, value): + evicted_value = _Null + with self.lock: + # Possibly evict the existing value of 'key' + evicted_value = self._container.get(key, _Null) + self._container[key] = value + + # If we didn't evict an existing value, we might have to evict the + # least recently used item from the beginning of the container. + if len(self._container) > self._maxsize: + _key, evicted_value = self._container.popitem(last=False) + + if self.dispose_func and evicted_value is not _Null: + self.dispose_func(evicted_value) + + def __delitem__(self, key): + with self.lock: + value = self._container.pop(key) + + if self.dispose_func: + self.dispose_func(value) + + def __len__(self): + with self.lock: + return len(self._container) + + def __iter__(self): + raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') + + def clear(self): + with self.lock: + # Copy pointers to all values, then wipe the mapping + values = list(itervalues(self._container)) + self._container.clear() + + if self.dispose_func: + for value in values: + self.dispose_func(value) + + def keys(self): + with self.lock: + return list(iterkeys(self._container)) + + +class HTTPHeaderDict(MutableMapping): + """ + :param headers: + An iterable of field-value pairs. Must not contain multiple field names + when compared case-insensitively. + + :param kwargs: + Additional field-value pairs to pass in to ``dict.update``. + + A ``dict`` like container for storing HTTP Headers. + + Field names are stored and compared case-insensitively in compliance with + RFC 7230. Iteration provides the first case-sensitive key seen for each + case-insensitive pair. + + Using ``__setitem__`` syntax overwrites fields that compare equal + case-insensitively in order to maintain ``dict``'s api. For fields that + compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` + in a loop. + + If multiple fields that are equal case-insensitively are passed to the + constructor or ``.update``, the behavior is undefined and some will be + lost. + + >>> headers = HTTPHeaderDict() + >>> headers.add('Set-Cookie', 'foo=bar') + >>> headers.add('set-cookie', 'baz=quxx') + >>> headers['content-length'] = '7' + >>> headers['SET-cookie'] + 'foo=bar, baz=quxx' + >>> headers['Content-Length'] + '7' + """ + + def __init__(self, headers=None, **kwargs): + super(HTTPHeaderDict, self).__init__() + self._container = OrderedDict() + if headers is not None: + if isinstance(headers, HTTPHeaderDict): + self._copy_from(headers) + else: + self.extend(headers) + if kwargs: + self.extend(kwargs) + + def __setitem__(self, key, val): + self._container[key.lower()] = [key, val] + return self._container[key.lower()] + + def __getitem__(self, key): + val = self._container[key.lower()] + return ', '.join(val[1:]) + + def __delitem__(self, key): + del self._container[key.lower()] + + def __contains__(self, key): + return key.lower() in self._container + + def __eq__(self, other): + if not isinstance(other, Mapping) and not hasattr(other, 'keys'): + return False + if not isinstance(other, type(self)): + other = type(self)(other) + return (dict((k.lower(), v) for k, v in self.itermerged()) == + dict((k.lower(), v) for k, v in other.itermerged())) + + def __ne__(self, other): + return not self.__eq__(other) + + if not PY3: # Python 2 + iterkeys = MutableMapping.iterkeys + itervalues = MutableMapping.itervalues + + __marker = object() + + def __len__(self): + return len(self._container) + + def __iter__(self): + # Only provide the originally cased names + for vals in self._container.values(): + yield vals[0] + + def pop(self, key, default=__marker): + '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + ''' + # Using the MutableMapping function directly fails due to the private marker. + # Using ordinary dict.pop would expose the internal structures. + # So let's reinvent the wheel. + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def discard(self, key): + try: + del self[key] + except KeyError: + pass + + def add(self, key, val): + """Adds a (name, value) pair, doesn't overwrite the value if it already + exists. + + >>> headers = HTTPHeaderDict(foo='bar') + >>> headers.add('Foo', 'baz') + >>> headers['foo'] + 'bar, baz' + """ + key_lower = key.lower() + new_vals = [key, val] + # Keep the common case aka no item present as fast as possible + vals = self._container.setdefault(key_lower, new_vals) + if new_vals is not vals: + vals.append(val) + + def extend(self, *args, **kwargs): + """Generic import function for any type of header-like object. + Adapted version of MutableMapping.update in order to insert items + with self.add instead of self.__setitem__ + """ + if len(args) > 1: + raise TypeError("extend() takes at most 1 positional " + "arguments ({0} given)".format(len(args))) + other = args[0] if len(args) >= 1 else () + + if isinstance(other, HTTPHeaderDict): + for key, val in other.iteritems(): + self.add(key, val) + elif isinstance(other, Mapping): + for key in other: + self.add(key, other[key]) + elif hasattr(other, "keys"): + for key in other.keys(): + self.add(key, other[key]) + else: + for key, value in other: + self.add(key, value) + + for key, value in kwargs.items(): + self.add(key, value) + + def getlist(self, key, default=__marker): + """Returns a list of all the values for the named field. Returns an + empty list if the key doesn't exist.""" + try: + vals = self._container[key.lower()] + except KeyError: + if default is self.__marker: + return [] + return default + else: + return vals[1:] + + # Backwards compatibility for httplib + getheaders = getlist + getallmatchingheaders = getlist + iget = getlist + + # Backwards compatibility for http.cookiejar + get_all = getlist + + def __repr__(self): + return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) + + def _copy_from(self, other): + for key in other: + val = other.getlist(key) + if isinstance(val, list): + # Don't need to convert tuples + val = list(val) + self._container[key.lower()] = [key] + val + + def copy(self): + clone = type(self)() + clone._copy_from(self) + return clone + + def iteritems(self): + """Iterate over all header lines, including duplicate ones.""" + for key in self: + vals = self._container[key.lower()] + for val in vals[1:]: + yield vals[0], val + + def itermerged(self): + """Iterate over all headers, merging duplicate ones together.""" + for key in self: + val = self._container[key.lower()] + yield val[0], ', '.join(val[1:]) + + def items(self): + return list(self.iteritems()) + + @classmethod + def from_httplib(cls, message): # Python 2 + """Read headers from a Python 2 httplib message object.""" + # python2.7 does not expose a proper API for exporting multiheaders + # efficiently. This function re-reads raw lines from the message + # object and extracts the multiheaders properly. + obs_fold_continued_leaders = (' ', '\t') + headers = [] + + for line in message.headers: + if line.startswith(obs_fold_continued_leaders): + if not headers: + # We received a header line that starts with OWS as described + # in RFC-7230 S3.2.4. This indicates a multiline header, but + # there exists no previous header to which we can attach it. + raise InvalidHeader( + 'Header continuation with no previous header: %s' % line + ) + else: + key, value = headers[-1] + headers[-1] = (key, value + ' ' + line.strip()) + continue + + key, value = line.split(':', 1) + headers.append((key, value.strip())) + + return cls(headers) diff --git a/dropbox-script/urllib3/connection.py b/dropbox-script/urllib3/connection.py new file mode 100644 index 0000000..02b3665 --- /dev/null +++ b/dropbox-script/urllib3/connection.py @@ -0,0 +1,391 @@ +from __future__ import absolute_import +import datetime +import logging +import os +import socket +from socket import error as SocketError, timeout as SocketTimeout +import warnings +from .packages import six +from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection +from .packages.six.moves.http_client import HTTPException # noqa: F401 + +try: # Compiled with SSL? + import ssl + BaseSSLError = ssl.SSLError +except (ImportError, AttributeError): # Platform-specific: No SSL. + ssl = None + + class BaseSSLError(BaseException): + pass + + +try: # Python 3: + # Not a no-op, we're adding this to the namespace so it can be imported. + ConnectionError = ConnectionError +except NameError: # Python 2: + class ConnectionError(Exception): + pass + + +from .exceptions import ( + NewConnectionError, + ConnectTimeoutError, + SubjectAltNameWarning, + SystemTimeWarning, +) +from .packages.ssl_match_hostname import match_hostname, CertificateError + +from .util.ssl_ import ( + resolve_cert_reqs, + resolve_ssl_version, + assert_fingerprint, + create_urllib3_context, + ssl_wrap_socket +) + + +from .util import connection + +from ._collections import HTTPHeaderDict + +log = logging.getLogger(__name__) + +port_by_scheme = { + 'http': 80, + 'https': 443, +} + +# When updating RECENT_DATE, move it to within two years of the current date, +# and not less than 6 months ago. +# Example: if Today is 2018-01-01, then RECENT_DATE should be any date on or +# after 2016-01-01 (today - 2 years) AND before 2017-07-01 (today - 6 months) +RECENT_DATE = datetime.date(2017, 6, 30) + + +class DummyConnection(object): + """Used to detect a failed ConnectionCls import.""" + pass + + +class HTTPConnection(_HTTPConnection, object): + """ + Based on httplib.HTTPConnection but provides an extra constructor + backwards-compatibility layer between older and newer Pythons. + + Additional keyword parameters are used to configure attributes of the connection. + Accepted parameters include: + + - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` + - ``source_address``: Set the source address for the current connection. + - ``socket_options``: Set specific options on the underlying socket. If not specified, then + defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling + Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. + + For example, if you wish to enable TCP Keep Alive in addition to the defaults, + you might pass:: + + HTTPConnection.default_socket_options + [ + (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), + ] + + Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). + """ + + default_port = port_by_scheme['http'] + + #: Disable Nagle's algorithm by default. + #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` + default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] + + #: Whether this connection verifies the host's certificate. + is_verified = False + + def __init__(self, *args, **kw): + if six.PY3: # Python 3 + kw.pop('strict', None) + + # Pre-set source_address. + self.source_address = kw.get('source_address') + + #: The socket options provided by the user. If no options are + #: provided, we use the default options. + self.socket_options = kw.pop('socket_options', self.default_socket_options) + + _HTTPConnection.__init__(self, *args, **kw) + + @property + def host(self): + """ + Getter method to remove any trailing dots that indicate the hostname is an FQDN. + + In general, SSL certificates don't include the trailing dot indicating a + fully-qualified domain name, and thus, they don't validate properly when + checked against a domain name that includes the dot. In addition, some + servers may not expect to receive the trailing dot when provided. + + However, the hostname with trailing dot is critical to DNS resolution; doing a + lookup with the trailing dot will properly only resolve the appropriate FQDN, + whereas a lookup without a trailing dot will search the system's search domain + list. Thus, it's important to keep the original host around for use only in + those cases where it's appropriate (i.e., when doing DNS lookup to establish the + actual TCP connection across which we're going to send HTTP requests). + """ + return self._dns_host.rstrip('.') + + @host.setter + def host(self, value): + """ + Setter for the `host` property. + + We assume that only urllib3 uses the _dns_host attribute; httplib itself + only uses `host`, and it seems reasonable that other libraries follow suit. + """ + self._dns_host = value + + def _new_conn(self): + """ Establish a socket connection and set nodelay settings on it. + + :return: New socket connection. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = connection.create_connection( + (self._dns_host, self.port), self.timeout, **extra_kw) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except SocketError as e: + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + def _prepare_conn(self, conn): + self.sock = conn + if self._tunnel_host: + # TODO: Fix tunnel so it doesn't depend on self.sock state. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + def request_chunked(self, method, url, body=None, headers=None): + """ + Alternative to the common request method, which sends the + body with chunked encoding and not as one block + """ + headers = HTTPHeaderDict(headers if headers is not None else {}) + skip_accept_encoding = 'accept-encoding' in headers + skip_host = 'host' in headers + self.putrequest( + method, + url, + skip_accept_encoding=skip_accept_encoding, + skip_host=skip_host + ) + for header, value in headers.items(): + self.putheader(header, value) + if 'transfer-encoding' not in headers: + self.putheader('Transfer-Encoding', 'chunked') + self.endheaders() + + if body is not None: + stringish_types = six.string_types + (bytes,) + if isinstance(body, stringish_types): + body = (body,) + for chunk in body: + if not chunk: + continue + if not isinstance(chunk, bytes): + chunk = chunk.encode('utf8') + len_str = hex(len(chunk))[2:] + self.send(len_str.encode('utf-8')) + self.send(b'\r\n') + self.send(chunk) + self.send(b'\r\n') + + # After the if clause, to always have a closed body + self.send(b'0\r\n\r\n') + + +class HTTPSConnection(HTTPConnection): + default_port = port_by_scheme['https'] + + ssl_version = None + + def __init__(self, host, port=None, key_file=None, cert_file=None, + strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + ssl_context=None, server_hostname=None, **kw): + + HTTPConnection.__init__(self, host, port, strict=strict, + timeout=timeout, **kw) + + self.key_file = key_file + self.cert_file = cert_file + self.ssl_context = ssl_context + self.server_hostname = server_hostname + + # Required property for Google AppEngine 1.9.0 which otherwise causes + # HTTPS requests to go out as HTTP. (See Issue #356) + self._protocol = 'https' + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(None), + cert_reqs=resolve_cert_reqs(None), + ) + + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ssl_context=self.ssl_context, + server_hostname=self.server_hostname + ) + + +class VerifiedHTTPSConnection(HTTPSConnection): + """ + Based on httplib.HTTPSConnection but wraps the socket with + SSL certification. + """ + cert_reqs = None + ca_certs = None + ca_cert_dir = None + ssl_version = None + assert_fingerprint = None + + def set_cert(self, key_file=None, cert_file=None, + cert_reqs=None, ca_certs=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None): + """ + This method should only be called once, before the connection is used. + """ + # If cert_reqs is not provided, we can try to guess. If the user gave + # us a cert database, we assume they want to use it: otherwise, if + # they gave us an SSL Context object we should use whatever is set for + # it. + if cert_reqs is None: + if ca_certs or ca_cert_dir: + cert_reqs = 'CERT_REQUIRED' + elif self.ssl_context is not None: + cert_reqs = self.ssl_context.verify_mode + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + self.ca_certs = ca_certs and os.path.expanduser(ca_certs) + self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) + + def connect(self): + # Add certificate verification + conn = self._new_conn() + hostname = self.host + + if self._tunnel_host: + self.sock = conn + # Calls self._set_hostport(), so self.host is + # self._tunnel_host below. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + # Override the host with the one we're requesting data from. + hostname = self._tunnel_host + + server_hostname = hostname + if self.server_hostname is not None: + server_hostname = self.server_hostname + + is_time_off = datetime.date.today() < RECENT_DATE + if is_time_off: + warnings.warn(( + 'System time is way off (before {0}). This will probably ' + 'lead to SSL verification errors').format(RECENT_DATE), + SystemTimeWarning + ) + + # Wrap socket using verification with the root certs in + # trusted_root_certs + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(self.ssl_version), + cert_reqs=resolve_cert_reqs(self.cert_reqs), + ) + + context = self.ssl_context + context.verify_mode = resolve_cert_reqs(self.cert_reqs) + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + server_hostname=server_hostname, + ssl_context=context) + + if self.assert_fingerprint: + assert_fingerprint(self.sock.getpeercert(binary_form=True), + self.assert_fingerprint) + elif context.verify_mode != ssl.CERT_NONE \ + and not getattr(context, 'check_hostname', False) \ + and self.assert_hostname is not False: + # While urllib3 attempts to always turn off hostname matching from + # the TLS library, this cannot always be done. So we check whether + # the TLS Library still thinks it's matching hostnames. + cert = self.sock.getpeercert() + if not cert.get('subjectAltName', ()): + warnings.warn(( + 'Certificate for {0} has no `subjectAltName`, falling back to check for a ' + '`commonName` for now. This feature is being removed by major browsers and ' + 'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 ' + 'for details.)'.format(hostname)), + SubjectAltNameWarning + ) + _match_hostname(cert, self.assert_hostname or server_hostname) + + self.is_verified = ( + context.verify_mode == ssl.CERT_REQUIRED or + self.assert_fingerprint is not None + ) + + +def _match_hostname(cert, asserted_hostname): + try: + match_hostname(cert, asserted_hostname) + except CertificateError as e: + log.error( + 'Certificate did not match expected hostname: %s. ' + 'Certificate: %s', asserted_hostname, cert + ) + # Add cert to exception and reraise so client code can inspect + # the cert when catching the exception, if they want to + e._peer_cert = cert + raise + + +if ssl: + # Make a copy for testing. + UnverifiedHTTPSConnection = HTTPSConnection + HTTPSConnection = VerifiedHTTPSConnection +else: + HTTPSConnection = DummyConnection diff --git a/dropbox-script/urllib3/connectionpool.py b/dropbox-script/urllib3/connectionpool.py new file mode 100644 index 0000000..f7a8f19 --- /dev/null +++ b/dropbox-script/urllib3/connectionpool.py @@ -0,0 +1,896 @@ +from __future__ import absolute_import +import errno +import logging +import sys +import warnings + +from socket import error as SocketError, timeout as SocketTimeout +import socket + + +from .exceptions import ( + ClosedPoolError, + ProtocolError, + EmptyPoolError, + HeaderParsingError, + HostChangedError, + LocationValueError, + MaxRetryError, + ProxyError, + ReadTimeoutError, + SSLError, + TimeoutError, + InsecureRequestWarning, + NewConnectionError, +) +from .packages.ssl_match_hostname import CertificateError +from .packages import six +from .packages.six.moves import queue +from .connection import ( + port_by_scheme, + DummyConnection, + HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, + HTTPException, BaseSSLError, +) +from .request import RequestMethods +from .response import HTTPResponse + +from .util.connection import is_connection_dropped +from .util.request import set_file_position +from .util.response import assert_header_parsing +from .util.retry import Retry +from .util.timeout import Timeout +from .util.url import get_host, Url, NORMALIZABLE_SCHEMES +from .util.queue import LifoQueue + + +xrange = six.moves.xrange + +log = logging.getLogger(__name__) + +_Default = object() + + +# Pool objects +class ConnectionPool(object): + """ + Base class for all connection pools, such as + :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. + """ + + scheme = None + QueueCls = LifoQueue + + def __init__(self, host, port=None): + if not host: + raise LocationValueError("No host specified.") + + self.host = _ipv6_host(host, self.scheme) + self._proxy_host = host.lower() + self.port = port + + def __str__(self): + return '%s(host=%r, port=%r)' % (type(self).__name__, + self.host, self.port) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + # Return False to re-raise any potential exceptions + return False + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + pass + + +# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 +_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK} + + +class HTTPConnectionPool(ConnectionPool, RequestMethods): + """ + Thread-safe connection pool for one host. + + :param host: + Host used for this HTTP Connection (e.g. "localhost"), passed into + :class:`httplib.HTTPConnection`. + + :param port: + Port used for this HTTP Connection (None is equivalent to 80), passed + into :class:`httplib.HTTPConnection`. + + :param strict: + Causes BadStatusLine to be raised if the status line can't be parsed + as a valid HTTP/1.0 or 1.1 status line, passed into + :class:`httplib.HTTPConnection`. + + .. note:: + Only works in Python 2. This parameter is ignored in Python 3. + + :param timeout: + Socket timeout in seconds for each individual connection. This can + be a float or integer, which sets the timeout for the HTTP request, + or an instance of :class:`urllib3.util.Timeout` which gives you more + fine-grained control over request timeouts. After the constructor has + been parsed, this is always a `urllib3.util.Timeout` object. + + :param maxsize: + Number of connections to save that can be reused. More than 1 is useful + in multithreaded situations. If ``block`` is set to False, more + connections will be created but they will not be saved once they've + been used. + + :param block: + If set to True, no more than ``maxsize`` connections will be used at + a time. When no free connections are available, the call will block + until a connection has been released. This is a useful side effect for + particular multithreaded situations where one does not want to use more + than maxsize connections per host to prevent flooding. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param retries: + Retry configuration to use by default with requests in this pool. + + :param _proxy: + Parsed proxy URL, should not be used directly, instead, see + :class:`urllib3.connectionpool.ProxyManager`" + + :param _proxy_headers: + A dictionary with proxy headers, should not be used directly, + instead, see :class:`urllib3.connectionpool.ProxyManager`" + + :param \\**conn_kw: + Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, + :class:`urllib3.connection.HTTPSConnection` instances. + """ + + scheme = 'http' + ConnectionCls = HTTPConnection + ResponseCls = HTTPResponse + + def __init__(self, host, port=None, strict=False, + timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, + headers=None, retries=None, + _proxy=None, _proxy_headers=None, + **conn_kw): + ConnectionPool.__init__(self, host, port) + RequestMethods.__init__(self, headers) + + self.strict = strict + + if not isinstance(timeout, Timeout): + timeout = Timeout.from_float(timeout) + + if retries is None: + retries = Retry.DEFAULT + + self.timeout = timeout + self.retries = retries + + self.pool = self.QueueCls(maxsize) + self.block = block + + self.proxy = _proxy + self.proxy_headers = _proxy_headers or {} + + # Fill the queue up so that doing get() on it will block properly + for _ in xrange(maxsize): + self.pool.put(None) + + # These are mostly for testing and debugging purposes. + self.num_connections = 0 + self.num_requests = 0 + self.conn_kw = conn_kw + + if self.proxy: + # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. + # We cannot know if the user has added default socket options, so we cannot replace the + # list. + self.conn_kw.setdefault('socket_options', []) + + def _new_conn(self): + """ + Return a fresh :class:`HTTPConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTP connection (%d): %s:%s", + self.num_connections, self.host, self.port or "80") + + conn = self.ConnectionCls(host=self.host, port=self.port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + return conn + + def _get_conn(self, timeout=None): + """ + Get a connection. Will return a pooled connection if one is available. + + If no connections are available and :prop:`.block` is ``False``, then a + fresh connection is returned. + + :param timeout: + Seconds to wait before giving up and raising + :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and + :prop:`.block` is ``True``. + """ + conn = None + try: + conn = self.pool.get(block=self.block, timeout=timeout) + + except AttributeError: # self.pool is None + raise ClosedPoolError(self, "Pool is closed.") + + except queue.Empty: + if self.block: + raise EmptyPoolError(self, + "Pool reached maximum size and no more " + "connections are allowed.") + pass # Oh well, we'll create a new connection then + + # If this is a persistent connection, check if it got disconnected + if conn and is_connection_dropped(conn): + log.debug("Resetting dropped connection: %s", self.host) + conn.close() + if getattr(conn, 'auto_open', 1) == 0: + # This is a proxied connection that has been mutated by + # httplib._tunnel() and cannot be reused (since it would + # attempt to bypass the proxy) + conn = None + + return conn or self._new_conn() + + def _put_conn(self, conn): + """ + Put a connection back into the pool. + + :param conn: + Connection object for the current host and port as returned by + :meth:`._new_conn` or :meth:`._get_conn`. + + If the pool is already full, the connection is closed and discarded + because we exceeded maxsize. If connections are discarded frequently, + then maxsize should be increased. + + If the pool is closed, then the connection will be closed and discarded. + """ + try: + self.pool.put(conn, block=False) + return # Everything is dandy, done. + except AttributeError: + # self.pool is None. + pass + except queue.Full: + # This should never happen if self.block == True + log.warning( + "Connection pool is full, discarding connection: %s", + self.host) + + # Connection never got put back into the pool, close it. + if conn: + conn.close() + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + pass + + def _prepare_proxy(self, conn): + # Nothing to do for HTTP connections. + pass + + def _get_timeout(self, timeout): + """ Helper that always returns a :class:`urllib3.util.Timeout` """ + if timeout is _Default: + return self.timeout.clone() + + if isinstance(timeout, Timeout): + return timeout.clone() + else: + # User passed us an int/float. This is for backwards compatibility, + # can be removed later + return Timeout.from_float(timeout) + + def _raise_timeout(self, err, url, timeout_value): + """Is the error actually a timeout? Will raise a ReadTimeout or pass""" + + if isinstance(err, SocketTimeout): + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # See the above comment about EAGAIN in Python 3. In Python 2 we have + # to specifically catch it and throw the timeout error + if hasattr(err, 'errno') and err.errno in _blocking_errnos: + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # Catch possible read timeouts thrown as SSL errors. If not the + # case, rethrow the original. We need to do this because of: + # http://bugs.python.org/issue10272 + if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python < 2.7.4 + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + def _make_request(self, conn, method, url, timeout=_Default, chunked=False, + **httplib_request_kw): + """ + Perform a request on a given urllib connection object taken from our + pool. + + :param conn: + a connection from one of our connection pools + + :param timeout: + Socket timeout in seconds for the request. This can be a + float or integer, which will set the same timeout value for + the socket connect and the socket read, or an instance of + :class:`urllib3.util.Timeout`, which gives you more fine-grained + control over your timeouts. + """ + self.num_requests += 1 + + timeout_obj = self._get_timeout(timeout) + timeout_obj.start_connect() + conn.timeout = timeout_obj.connect_timeout + + # Trigger any extra validation we need to do. + try: + self._validate_conn(conn) + except (SocketTimeout, BaseSSLError) as e: + # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. + self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) + raise + + # conn.request() calls httplib.*.request, not the method in + # urllib3.request. It also calls makefile (recv) on the socket. + if chunked: + conn.request_chunked(method, url, **httplib_request_kw) + else: + conn.request(method, url, **httplib_request_kw) + + # Reset the timeout for the recv() on the socket + read_timeout = timeout_obj.read_timeout + + # App Engine doesn't have a sock attr + if getattr(conn, 'sock', None): + # In Python 3 socket.py will catch EAGAIN and return None when you + # try and read into the file pointer created by http.client, which + # instead raises a BadStatusLine exception. Instead of catching + # the exception and assuming all BadStatusLine exceptions are read + # timeouts, check for a zero timeout before making the request. + if read_timeout == 0: + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % read_timeout) + if read_timeout is Timeout.DEFAULT_TIMEOUT: + conn.sock.settimeout(socket.getdefaulttimeout()) + else: # None or a value + conn.sock.settimeout(read_timeout) + + # Receive the response from the server + try: + try: # Python 2.7, use buffering of HTTP responses + httplib_response = conn.getresponse(buffering=True) + except TypeError: # Python 3 + try: + httplib_response = conn.getresponse() + except Exception as e: + # Remove the TypeError from the exception chain in Python 3; + # otherwise it looks like a programming error was the cause. + six.raise_from(e, None) + except (SocketTimeout, BaseSSLError, SocketError) as e: + self._raise_timeout(err=e, url=url, timeout_value=read_timeout) + raise + + # AppEngine doesn't have a version attr. + http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') + log.debug("%s://%s:%s \"%s %s %s\" %s %s", self.scheme, self.host, self.port, + method, url, http_version, httplib_response.status, + httplib_response.length) + + try: + assert_header_parsing(httplib_response.msg) + except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 + log.warning( + 'Failed to parse headers (url=%s): %s', + self._absolute_url(url), hpe, exc_info=True) + + return httplib_response + + def _absolute_url(self, path): + return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + if self.pool is None: + return + # Disable access to the pool + old_pool, self.pool = self.pool, None + + try: + while True: + conn = old_pool.get(block=False) + if conn: + conn.close() + + except queue.Empty: + pass # Done. + + def is_same_host(self, url): + """ + Check if the given ``url`` is a member of the same host as this + connection pool. + """ + if url.startswith('/'): + return True + + # TODO: Add optional support for socket.gethostbyname checking. + scheme, host, port = get_host(url) + + host = _ipv6_host(host, self.scheme) + + # Use explicit default port for comparison when none is given + if self.port and not port: + port = port_by_scheme.get(scheme) + elif not self.port and port == port_by_scheme.get(scheme): + port = None + + return (scheme, host, port) == (self.scheme, self.host, self.port) + + def urlopen(self, method, url, body=None, headers=None, retries=None, + redirect=True, assert_same_host=True, timeout=_Default, + pool_timeout=None, release_conn=None, chunked=False, + body_pos=None, **response_kw): + """ + Get a connection from the pool and perform an HTTP request. This is the + lowest level call for making a request, so you'll need to specify all + the raw details. + + .. note:: + + More commonly, it's appropriate to use a convenience method provided + by :class:`.RequestMethods`, such as :meth:`request`. + + .. note:: + + `release_conn` will only behave as expected if + `preload_content=False` because we want to make + `preload_content=False` the default behaviour someday soon without + breaking backwards compatibility. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param body: + Data to send in the request body (useful for creating + POST requests, see HTTPConnectionPool.post_url for + more convenience). + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + + :param retries: + Configure the number of retries to allow before raising a + :class:`~urllib3.exceptions.MaxRetryError` exception. + + Pass ``None`` to retry until you receive a response. Pass a + :class:`~urllib3.util.retry.Retry` object for fine-grained control + over different types of retries. + Pass an integer number to retry connection errors that many times, + but no other types of errors. Pass zero to never retry. + + If ``False``, then retries are disabled and any exception is raised + immediately. Also, instead of raising a MaxRetryError on redirects, + the redirect response will be returned. + + :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. + + :param redirect: + If True, automatically handle redirects (status codes 301, 302, + 303, 307, 308). Each redirect counts as a retry. Disabling retries + will disable redirect, too. + + :param assert_same_host: + If ``True``, will make sure that the host of the pool requests is + consistent else will raise HostChangedError. When False, you can + use the pool on an HTTP proxy and request foreign hosts. + + :param timeout: + If specified, overrides the default timeout for this one + request. It may be a float (in seconds) or an instance of + :class:`urllib3.util.Timeout`. + + :param pool_timeout: + If set and the pool is set to block=True, then this method will + block for ``pool_timeout`` seconds and raise EmptyPoolError if no + connection is available within the time period. + + :param release_conn: + If False, then the urlopen call will not release the connection + back into the pool once a response is received (but will release if + you read the entire contents of the response such as when + `preload_content=True`). This is useful if you're not preloading + the response's content immediately. You will need to call + ``r.release_conn()`` on the response ``r`` to return the connection + back into the pool. If None, it takes the value of + ``response_kw.get('preload_content', True)``. + + :param chunked: + If True, urllib3 will send the body using chunked transfer + encoding. Otherwise, urllib3 will send the body using the standard + content-length form. Defaults to False. + + :param int body_pos: + Position to seek to in file-like body in the event of a retry or + redirect. Typically this won't need to be set because urllib3 will + auto-populate the value when needed. + + :param \\**response_kw: + Additional parameters are passed to + :meth:`urllib3.response.HTTPResponse.from_httplib` + """ + if headers is None: + headers = self.headers + + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect, default=self.retries) + + if release_conn is None: + release_conn = response_kw.get('preload_content', True) + + # Check host + if assert_same_host and not self.is_same_host(url): + raise HostChangedError(self, url, retries) + + conn = None + + # Track whether `conn` needs to be released before + # returning/raising/recursing. Update this variable if necessary, and + # leave `release_conn` constant throughout the function. That way, if + # the function recurses, the original value of `release_conn` will be + # passed down into the recursive call, and its value will be respected. + # + # See issue #651 [1] for details. + # + # [1] + release_this_conn = release_conn + + # Merge the proxy headers. Only do this in HTTP. We have to copy the + # headers dict so we can safely change it without those changes being + # reflected in anyone else's copy. + if self.scheme == 'http': + headers = headers.copy() + headers.update(self.proxy_headers) + + # Must keep the exception bound to a separate variable or else Python 3 + # complains about UnboundLocalError. + err = None + + # Keep track of whether we cleanly exited the except block. This + # ensures we do proper cleanup in finally. + clean_exit = False + + # Rewind body position, if needed. Record current position + # for future rewinds in the event of a redirect/retry. + body_pos = set_file_position(body, body_pos) + + try: + # Request a connection from the queue. + timeout_obj = self._get_timeout(timeout) + conn = self._get_conn(timeout=pool_timeout) + + conn.timeout = timeout_obj.connect_timeout + + is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None) + if is_new_proxy_conn: + self._prepare_proxy(conn) + + # Make the request on the httplib connection object. + httplib_response = self._make_request(conn, method, url, + timeout=timeout_obj, + body=body, headers=headers, + chunked=chunked) + + # If we're going to release the connection in ``finally:``, then + # the response doesn't need to know about the connection. Otherwise + # it will also try to release it and we'll have a double-release + # mess. + response_conn = conn if not release_conn else None + + # Pass method to Response for length checking + response_kw['request_method'] = method + + # Import httplib's response into our own wrapper object + response = self.ResponseCls.from_httplib(httplib_response, + pool=self, + connection=response_conn, + retries=retries, + **response_kw) + + # Everything went great! + clean_exit = True + + except queue.Empty: + # Timed out by queue. + raise EmptyPoolError(self, "No pool connections are available.") + + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError, CertificateError) as e: + # Discard the connection for these exceptions. It will be + # replaced during the next _get_conn() call. + clean_exit = False + if isinstance(e, (BaseSSLError, CertificateError)): + e = SSLError(e) + elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: + e = ProxyError('Cannot connect to proxy.', e) + elif isinstance(e, (SocketError, HTTPException)): + e = ProtocolError('Connection aborted.', e) + + retries = retries.increment(method, url, error=e, _pool=self, + _stacktrace=sys.exc_info()[2]) + retries.sleep() + + # Keep track of the error for the retry warning. + err = e + + finally: + if not clean_exit: + # We hit some kind of exception, handled or otherwise. We need + # to throw the connection away unless explicitly told not to. + # Close the connection, set the variable to None, and make sure + # we put the None back in the pool to avoid leaking it. + conn = conn and conn.close() + release_this_conn = True + + if release_this_conn: + # Put the connection back to be reused. If the connection is + # expired then it will be None, which will get replaced with a + # fresh connection during _get_conn. + self._put_conn(conn) + + if not conn: + # Try again + log.warning("Retrying (%r) after connection " + "broken by '%r': %s", retries, err, url) + return self.urlopen(method, url, body, headers, retries, + redirect, assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + def drain_and_release_conn(response): + try: + # discard any remaining response body, the connection will be + # released back to the pool once the entire response is read + response.read() + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError) as e: + pass + + # Handle redirect? + redirect_location = redirect and response.get_redirect_location() + if redirect_location: + if response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep_for_retry(response) + log.debug("Redirecting %s -> %s", url, redirect_location) + return self.urlopen( + method, redirect_location, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(response.getheader('Retry-After')) + if retries.is_retry(method, response.status, has_retry_after): + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_status: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep(response) + log.debug("Retry: %s", url) + return self.urlopen( + method, url, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, + body_pos=body_pos, **response_kw) + + return response + + +class HTTPSConnectionPool(HTTPConnectionPool): + """ + Same as :class:`.HTTPConnectionPool`, but HTTPS. + + When Python is compiled with the :mod:`ssl` module, then + :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, + instead of :class:`.HTTPSConnection`. + + :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, + ``assert_hostname`` and ``host`` in this order to verify connections. + If ``assert_hostname`` is False, no verification is done. + + The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, + ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is + available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade + the connection socket into an SSL socket. + """ + + scheme = 'https' + ConnectionCls = HTTPSConnection + + def __init__(self, host, port=None, + strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, + block=False, headers=None, retries=None, + _proxy=None, _proxy_headers=None, + key_file=None, cert_file=None, cert_reqs=None, + ca_certs=None, ssl_version=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None, **conn_kw): + + HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, + block, headers, retries, _proxy, _proxy_headers, + **conn_kw) + + if ca_certs and cert_reqs is None: + cert_reqs = 'CERT_REQUIRED' + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.ca_certs = ca_certs + self.ca_cert_dir = ca_cert_dir + self.ssl_version = ssl_version + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + + def _prepare_conn(self, conn): + """ + Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` + and establish the tunnel if proxy is used. + """ + + if isinstance(conn, VerifiedHTTPSConnection): + conn.set_cert(key_file=self.key_file, + cert_file=self.cert_file, + cert_reqs=self.cert_reqs, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + assert_hostname=self.assert_hostname, + assert_fingerprint=self.assert_fingerprint) + conn.ssl_version = self.ssl_version + return conn + + def _prepare_proxy(self, conn): + """ + Establish tunnel connection early, because otherwise httplib + would improperly set Host: header to proxy's IP:port. + """ + conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers) + conn.connect() + + def _new_conn(self): + """ + Return a fresh :class:`httplib.HTTPSConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTPS connection (%d): %s:%s", + self.num_connections, self.host, self.port or "443") + + if not self.ConnectionCls or self.ConnectionCls is DummyConnection: + raise SSLError("Can't connect to HTTPS URL because the SSL " + "module is not available.") + + actual_host = self.host + actual_port = self.port + if self.proxy is not None: + actual_host = self.proxy.host + actual_port = self.proxy.port + + conn = self.ConnectionCls(host=actual_host, port=actual_port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + + return self._prepare_conn(conn) + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + super(HTTPSConnectionPool, self)._validate_conn(conn) + + # Force connect early to allow us to validate the connection. + if not getattr(conn, 'sock', None): # AppEngine might not have `.sock` + conn.connect() + + if not conn.is_verified: + warnings.warn(( + 'Unverified HTTPS request is being made. ' + 'Adding certificate verification is strongly advised. See: ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings'), + InsecureRequestWarning) + + +def connection_from_url(url, **kw): + """ + Given a url, return an :class:`.ConnectionPool` instance of its host. + + This is a shortcut for not having to parse out the scheme, host, and port + of the url before creating an :class:`.ConnectionPool` instance. + + :param url: + Absolute URL string that must include the scheme. Port is optional. + + :param \\**kw: + Passes additional parameters to the constructor of the appropriate + :class:`.ConnectionPool`. Useful for specifying things like + timeout, maxsize, headers, etc. + + Example:: + + >>> conn = connection_from_url('http://google.com/') + >>> r = conn.request('GET', '/') + """ + scheme, host, port = get_host(url) + port = port or port_by_scheme.get(scheme, 80) + if scheme == 'https': + return HTTPSConnectionPool(host, port=port, **kw) + else: + return HTTPConnectionPool(host, port=port, **kw) + + +def _ipv6_host(host, scheme): + """ + Process IPv6 address literals + """ + + # httplib doesn't like it when we include brackets in IPv6 addresses + # Specifically, if we include brackets but also pass the port then + # httplib crazily doubles up the square brackets on the Host header. + # Instead, we need to make sure we never pass ``None`` as the port. + # However, for backward compatibility reasons we can't actually + # *assert* that. See http://bugs.python.org/issue28539 + # + # Also if an IPv6 address literal has a zone identifier, the + # percent sign might be URIencoded, convert it back into ASCII + if host.startswith('[') and host.endswith(']'): + host = host.replace('%25', '%').strip('[]') + if scheme in NORMALIZABLE_SCHEMES: + host = host.lower() + return host diff --git a/dropbox-script/urllib3/contrib/__init__.py b/dropbox-script/urllib3/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dropbox-script/urllib3/contrib/_appengine_environ.py b/dropbox-script/urllib3/contrib/_appengine_environ.py new file mode 100644 index 0000000..f3e0094 --- /dev/null +++ b/dropbox-script/urllib3/contrib/_appengine_environ.py @@ -0,0 +1,30 @@ +""" +This module provides means to detect the App Engine environment. +""" + +import os + + +def is_appengine(): + return (is_local_appengine() or + is_prod_appengine() or + is_prod_appengine_mvms()) + + +def is_appengine_sandbox(): + return is_appengine() and not is_prod_appengine_mvms() + + +def is_local_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Development/' in os.environ['SERVER_SOFTWARE']) + + +def is_prod_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and + not is_prod_appengine_mvms()) + + +def is_prod_appengine_mvms(): + return os.environ.get('GAE_VM', False) == 'true' diff --git a/dropbox-script/urllib3/contrib/_securetransport/__init__.py b/dropbox-script/urllib3/contrib/_securetransport/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dropbox-script/urllib3/contrib/_securetransport/bindings.py b/dropbox-script/urllib3/contrib/_securetransport/bindings.py new file mode 100644 index 0000000..bcf41c0 --- /dev/null +++ b/dropbox-script/urllib3/contrib/_securetransport/bindings.py @@ -0,0 +1,593 @@ +""" +This module uses ctypes to bind a whole bunch of functions and constants from +SecureTransport. The goal here is to provide the low-level API to +SecureTransport. These are essentially the C-level functions and constants, and +they're pretty gross to work with. + +This code is a bastardised version of the code found in Will Bond's oscrypto +library. An enormous debt is owed to him for blazing this trail for us. For +that reason, this code should be considered to be covered both by urllib3's +license and by oscrypto's: + + Copyright (c) 2015-2016 Will Bond + + 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. +""" +from __future__ import absolute_import + +import platform +from ctypes.util import find_library +from ctypes import ( + c_void_p, c_int32, c_char_p, c_size_t, c_byte, c_uint32, c_ulong, c_long, + c_bool +) +from ctypes import CDLL, POINTER, CFUNCTYPE + + +security_path = find_library('Security') +if not security_path: + raise ImportError('The library Security could not be found') + + +core_foundation_path = find_library('CoreFoundation') +if not core_foundation_path: + raise ImportError('The library CoreFoundation could not be found') + + +version = platform.mac_ver()[0] +version_info = tuple(map(int, version.split('.'))) +if version_info < (10, 8): + raise OSError( + 'Only OS X 10.8 and newer are supported, not %s.%s' % ( + version_info[0], version_info[1] + ) + ) + +Security = CDLL(security_path, use_errno=True) +CoreFoundation = CDLL(core_foundation_path, use_errno=True) + +Boolean = c_bool +CFIndex = c_long +CFStringEncoding = c_uint32 +CFData = c_void_p +CFString = c_void_p +CFArray = c_void_p +CFMutableArray = c_void_p +CFDictionary = c_void_p +CFError = c_void_p +CFType = c_void_p +CFTypeID = c_ulong + +CFTypeRef = POINTER(CFType) +CFAllocatorRef = c_void_p + +OSStatus = c_int32 + +CFDataRef = POINTER(CFData) +CFStringRef = POINTER(CFString) +CFArrayRef = POINTER(CFArray) +CFMutableArrayRef = POINTER(CFMutableArray) +CFDictionaryRef = POINTER(CFDictionary) +CFArrayCallBacks = c_void_p +CFDictionaryKeyCallBacks = c_void_p +CFDictionaryValueCallBacks = c_void_p + +SecCertificateRef = POINTER(c_void_p) +SecExternalFormat = c_uint32 +SecExternalItemType = c_uint32 +SecIdentityRef = POINTER(c_void_p) +SecItemImportExportFlags = c_uint32 +SecItemImportExportKeyParameters = c_void_p +SecKeychainRef = POINTER(c_void_p) +SSLProtocol = c_uint32 +SSLCipherSuite = c_uint32 +SSLContextRef = POINTER(c_void_p) +SecTrustRef = POINTER(c_void_p) +SSLConnectionRef = c_uint32 +SecTrustResultType = c_uint32 +SecTrustOptionFlags = c_uint32 +SSLProtocolSide = c_uint32 +SSLConnectionType = c_uint32 +SSLSessionOption = c_uint32 + + +try: + Security.SecItemImport.argtypes = [ + CFDataRef, + CFStringRef, + POINTER(SecExternalFormat), + POINTER(SecExternalItemType), + SecItemImportExportFlags, + POINTER(SecItemImportExportKeyParameters), + SecKeychainRef, + POINTER(CFArrayRef), + ] + Security.SecItemImport.restype = OSStatus + + Security.SecCertificateGetTypeID.argtypes = [] + Security.SecCertificateGetTypeID.restype = CFTypeID + + Security.SecIdentityGetTypeID.argtypes = [] + Security.SecIdentityGetTypeID.restype = CFTypeID + + Security.SecKeyGetTypeID.argtypes = [] + Security.SecKeyGetTypeID.restype = CFTypeID + + Security.SecCertificateCreateWithData.argtypes = [ + CFAllocatorRef, + CFDataRef + ] + Security.SecCertificateCreateWithData.restype = SecCertificateRef + + Security.SecCertificateCopyData.argtypes = [ + SecCertificateRef + ] + Security.SecCertificateCopyData.restype = CFDataRef + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SecIdentityCreateWithCertificate.argtypes = [ + CFTypeRef, + SecCertificateRef, + POINTER(SecIdentityRef) + ] + Security.SecIdentityCreateWithCertificate.restype = OSStatus + + Security.SecKeychainCreate.argtypes = [ + c_char_p, + c_uint32, + c_void_p, + Boolean, + c_void_p, + POINTER(SecKeychainRef) + ] + Security.SecKeychainCreate.restype = OSStatus + + Security.SecKeychainDelete.argtypes = [ + SecKeychainRef + ] + Security.SecKeychainDelete.restype = OSStatus + + Security.SecPKCS12Import.argtypes = [ + CFDataRef, + CFDictionaryRef, + POINTER(CFArrayRef) + ] + Security.SecPKCS12Import.restype = OSStatus + + SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) + SSLWriteFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t)) + + Security.SSLSetIOFuncs.argtypes = [ + SSLContextRef, + SSLReadFunc, + SSLWriteFunc + ] + Security.SSLSetIOFuncs.restype = OSStatus + + Security.SSLSetPeerID.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerID.restype = OSStatus + + Security.SSLSetCertificate.argtypes = [ + SSLContextRef, + CFArrayRef + ] + Security.SSLSetCertificate.restype = OSStatus + + Security.SSLSetCertificateAuthorities.argtypes = [ + SSLContextRef, + CFTypeRef, + Boolean + ] + Security.SSLSetCertificateAuthorities.restype = OSStatus + + Security.SSLSetConnection.argtypes = [ + SSLContextRef, + SSLConnectionRef + ] + Security.SSLSetConnection.restype = OSStatus + + Security.SSLSetPeerDomainName.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerDomainName.restype = OSStatus + + Security.SSLHandshake.argtypes = [ + SSLContextRef + ] + Security.SSLHandshake.restype = OSStatus + + Security.SSLRead.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLRead.restype = OSStatus + + Security.SSLWrite.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLWrite.restype = OSStatus + + Security.SSLClose.argtypes = [ + SSLContextRef + ] + Security.SSLClose.restype = OSStatus + + Security.SSLGetNumberSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberSupportedCiphers.restype = OSStatus + + Security.SSLGetSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetSupportedCiphers.restype = OSStatus + + Security.SSLSetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + c_size_t + ] + Security.SSLSetEnabledCiphers.restype = OSStatus + + Security.SSLGetNumberEnabledCiphers.argtype = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberEnabledCiphers.restype = OSStatus + + Security.SSLGetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetEnabledCiphers.restype = OSStatus + + Security.SSLGetNegotiatedCipher.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite) + ] + Security.SSLGetNegotiatedCipher.restype = OSStatus + + Security.SSLGetNegotiatedProtocolVersion.argtypes = [ + SSLContextRef, + POINTER(SSLProtocol) + ] + Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus + + Security.SSLCopyPeerTrust.argtypes = [ + SSLContextRef, + POINTER(SecTrustRef) + ] + Security.SSLCopyPeerTrust.restype = OSStatus + + Security.SecTrustSetAnchorCertificates.argtypes = [ + SecTrustRef, + CFArrayRef + ] + Security.SecTrustSetAnchorCertificates.restype = OSStatus + + Security.SecTrustSetAnchorCertificatesOnly.argstypes = [ + SecTrustRef, + Boolean + ] + Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus + + Security.SecTrustEvaluate.argtypes = [ + SecTrustRef, + POINTER(SecTrustResultType) + ] + Security.SecTrustEvaluate.restype = OSStatus + + Security.SecTrustGetCertificateCount.argtypes = [ + SecTrustRef + ] + Security.SecTrustGetCertificateCount.restype = CFIndex + + Security.SecTrustGetCertificateAtIndex.argtypes = [ + SecTrustRef, + CFIndex + ] + Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef + + Security.SSLCreateContext.argtypes = [ + CFAllocatorRef, + SSLProtocolSide, + SSLConnectionType + ] + Security.SSLCreateContext.restype = SSLContextRef + + Security.SSLSetSessionOption.argtypes = [ + SSLContextRef, + SSLSessionOption, + Boolean + ] + Security.SSLSetSessionOption.restype = OSStatus + + Security.SSLSetProtocolVersionMin.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMin.restype = OSStatus + + Security.SSLSetProtocolVersionMax.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMax.restype = OSStatus + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SSLReadFunc = SSLReadFunc + Security.SSLWriteFunc = SSLWriteFunc + Security.SSLContextRef = SSLContextRef + Security.SSLProtocol = SSLProtocol + Security.SSLCipherSuite = SSLCipherSuite + Security.SecIdentityRef = SecIdentityRef + Security.SecKeychainRef = SecKeychainRef + Security.SecTrustRef = SecTrustRef + Security.SecTrustResultType = SecTrustResultType + Security.SecExternalFormat = SecExternalFormat + Security.OSStatus = OSStatus + + Security.kSecImportExportPassphrase = CFStringRef.in_dll( + Security, 'kSecImportExportPassphrase' + ) + Security.kSecImportItemIdentity = CFStringRef.in_dll( + Security, 'kSecImportItemIdentity' + ) + + # CoreFoundation time! + CoreFoundation.CFRetain.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRetain.restype = CFTypeRef + + CoreFoundation.CFRelease.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRelease.restype = None + + CoreFoundation.CFGetTypeID.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFGetTypeID.restype = CFTypeID + + CoreFoundation.CFStringCreateWithCString.argtypes = [ + CFAllocatorRef, + c_char_p, + CFStringEncoding + ] + CoreFoundation.CFStringCreateWithCString.restype = CFStringRef + + CoreFoundation.CFStringGetCStringPtr.argtypes = [ + CFStringRef, + CFStringEncoding + ] + CoreFoundation.CFStringGetCStringPtr.restype = c_char_p + + CoreFoundation.CFStringGetCString.argtypes = [ + CFStringRef, + c_char_p, + CFIndex, + CFStringEncoding + ] + CoreFoundation.CFStringGetCString.restype = c_bool + + CoreFoundation.CFDataCreate.argtypes = [ + CFAllocatorRef, + c_char_p, + CFIndex + ] + CoreFoundation.CFDataCreate.restype = CFDataRef + + CoreFoundation.CFDataGetLength.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetLength.restype = CFIndex + + CoreFoundation.CFDataGetBytePtr.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetBytePtr.restype = c_void_p + + CoreFoundation.CFDictionaryCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + POINTER(CFTypeRef), + CFIndex, + CFDictionaryKeyCallBacks, + CFDictionaryValueCallBacks + ] + CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef + + CoreFoundation.CFDictionaryGetValue.argtypes = [ + CFDictionaryRef, + CFTypeRef + ] + CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef + + CoreFoundation.CFArrayCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + CFIndex, + CFArrayCallBacks, + ] + CoreFoundation.CFArrayCreate.restype = CFArrayRef + + CoreFoundation.CFArrayCreateMutable.argtypes = [ + CFAllocatorRef, + CFIndex, + CFArrayCallBacks + ] + CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef + + CoreFoundation.CFArrayAppendValue.argtypes = [ + CFMutableArrayRef, + c_void_p + ] + CoreFoundation.CFArrayAppendValue.restype = None + + CoreFoundation.CFArrayGetCount.argtypes = [ + CFArrayRef + ] + CoreFoundation.CFArrayGetCount.restype = CFIndex + + CoreFoundation.CFArrayGetValueAtIndex.argtypes = [ + CFArrayRef, + CFIndex + ] + CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p + + CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( + CoreFoundation, 'kCFAllocatorDefault' + ) + CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(CoreFoundation, 'kCFTypeArrayCallBacks') + CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryKeyCallBacks' + ) + CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryValueCallBacks' + ) + + CoreFoundation.CFTypeRef = CFTypeRef + CoreFoundation.CFArrayRef = CFArrayRef + CoreFoundation.CFStringRef = CFStringRef + CoreFoundation.CFDictionaryRef = CFDictionaryRef + +except (AttributeError): + raise ImportError('Error initializing ctypes') + + +class CFConst(object): + """ + A class object that acts as essentially a namespace for CoreFoundation + constants. + """ + kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) + + +class SecurityConst(object): + """ + A class object that acts as essentially a namespace for Security constants. + """ + kSSLSessionOptionBreakOnServerAuth = 0 + + kSSLProtocol2 = 1 + kSSLProtocol3 = 2 + kTLSProtocol1 = 4 + kTLSProtocol11 = 7 + kTLSProtocol12 = 8 + + kSSLClientSide = 1 + kSSLStreamType = 0 + + kSecFormatPEMSequence = 10 + + kSecTrustResultInvalid = 0 + kSecTrustResultProceed = 1 + # This gap is present on purpose: this was kSecTrustResultConfirm, which + # is deprecated. + kSecTrustResultDeny = 3 + kSecTrustResultUnspecified = 4 + kSecTrustResultRecoverableTrustFailure = 5 + kSecTrustResultFatalTrustFailure = 6 + kSecTrustResultOtherError = 7 + + errSSLProtocol = -9800 + errSSLWouldBlock = -9803 + errSSLClosedGraceful = -9805 + errSSLClosedNoNotify = -9816 + errSSLClosedAbort = -9806 + + errSSLXCertChainInvalid = -9807 + errSSLCrypto = -9809 + errSSLInternal = -9810 + errSSLCertExpired = -9814 + errSSLCertNotYetValid = -9815 + errSSLUnknownRootCert = -9812 + errSSLNoRootCert = -9813 + errSSLHostNameMismatch = -9843 + errSSLPeerHandshakeFail = -9824 + errSSLPeerUserCancelled = -9839 + errSSLWeakPeerEphemeralDHKey = -9850 + errSSLServerAuthCompleted = -9841 + errSSLRecordOverflow = -9847 + + errSecVerifyFailed = -67808 + errSecNoTrustSettings = -25263 + errSecItemNotFound = -25300 + errSecInvalidTrustSettings = -25262 + + # Cipher suites. We only pick the ones our default cipher string allows. + TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C + TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 + TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B + TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F + TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3 + TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F + TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2 + TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 + TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B + TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A + TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 + TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032 + TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D + TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C + TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D + TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C + TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 + TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F + TLS_AES_128_GCM_SHA256 = 0x1301 + TLS_AES_256_GCM_SHA384 = 0x1302 + TLS_CHACHA20_POLY1305_SHA256 = 0x1303 diff --git a/dropbox-script/urllib3/contrib/_securetransport/low_level.py b/dropbox-script/urllib3/contrib/_securetransport/low_level.py new file mode 100644 index 0000000..b13cd9e --- /dev/null +++ b/dropbox-script/urllib3/contrib/_securetransport/low_level.py @@ -0,0 +1,346 @@ +""" +Low-level helpers for the SecureTransport bindings. + +These are Python functions that are not directly related to the high-level APIs +but are necessary to get them to work. They include a whole bunch of low-level +CoreFoundation messing about and memory management. The concerns in this module +are almost entirely about trying to avoid memory leaks and providing +appropriate and useful assistance to the higher-level code. +""" +import base64 +import ctypes +import itertools +import re +import os +import ssl +import tempfile + +from .bindings import Security, CoreFoundation, CFConst + + +# This regular expression is used to grab PEM data out of a PEM bundle. +_PEM_CERTS_RE = re.compile( + b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL +) + + +def _cf_data_from_bytes(bytestring): + """ + Given a bytestring, create a CFData object from it. This CFData object must + be CFReleased by the caller. + """ + return CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring) + ) + + +def _cf_dictionary_from_tuples(tuples): + """ + Given a list of Python tuples, create an associated CFDictionary. + """ + dictionary_size = len(tuples) + + # We need to get the dictionary keys and values out in the same order. + keys = (t[0] for t in tuples) + values = (t[1] for t in tuples) + cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys) + cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values) + + return CoreFoundation.CFDictionaryCreate( + CoreFoundation.kCFAllocatorDefault, + cf_keys, + cf_values, + dictionary_size, + CoreFoundation.kCFTypeDictionaryKeyCallBacks, + CoreFoundation.kCFTypeDictionaryValueCallBacks, + ) + + +def _cf_string_to_unicode(value): + """ + Creates a Unicode string from a CFString object. Used entirely for error + reporting. + + Yes, it annoys me quite a lot that this function is this complex. + """ + value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p)) + + string = CoreFoundation.CFStringGetCStringPtr( + value_as_void_p, + CFConst.kCFStringEncodingUTF8 + ) + if string is None: + buffer = ctypes.create_string_buffer(1024) + result = CoreFoundation.CFStringGetCString( + value_as_void_p, + buffer, + 1024, + CFConst.kCFStringEncodingUTF8 + ) + if not result: + raise OSError('Error copying C string from CFStringRef') + string = buffer.value + if string is not None: + string = string.decode('utf-8') + return string + + +def _assert_no_error(error, exception_class=None): + """ + Checks the return code and throws an exception if there is an error to + report + """ + if error == 0: + return + + cf_error_string = Security.SecCopyErrorMessageString(error, None) + output = _cf_string_to_unicode(cf_error_string) + CoreFoundation.CFRelease(cf_error_string) + + if output is None or output == u'': + output = u'OSStatus %s' % error + + if exception_class is None: + exception_class = ssl.SSLError + + raise exception_class(output) + + +def _cert_array_from_pem(pem_bundle): + """ + Given a bundle of certs in PEM format, turns them into a CFArray of certs + that can be used to validate a cert chain. + """ + # Normalize the PEM bundle's line endings. + pem_bundle = pem_bundle.replace(b"\r\n", b"\n") + + der_certs = [ + base64.b64decode(match.group(1)) + for match in _PEM_CERTS_RE.finditer(pem_bundle) + ] + if not der_certs: + raise ssl.SSLError("No root certificates specified") + + cert_array = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks) + ) + if not cert_array: + raise ssl.SSLError("Unable to allocate memory!") + + try: + for der_bytes in der_certs: + certdata = _cf_data_from_bytes(der_bytes) + if not certdata: + raise ssl.SSLError("Unable to allocate memory!") + cert = Security.SecCertificateCreateWithData( + CoreFoundation.kCFAllocatorDefault, certdata + ) + CoreFoundation.CFRelease(certdata) + if not cert: + raise ssl.SSLError("Unable to build cert object!") + + CoreFoundation.CFArrayAppendValue(cert_array, cert) + CoreFoundation.CFRelease(cert) + except Exception: + # We need to free the array before the exception bubbles further. + # We only want to do that if an error occurs: otherwise, the caller + # should free. + CoreFoundation.CFRelease(cert_array) + + return cert_array + + +def _is_cert(item): + """ + Returns True if a given CFTypeRef is a certificate. + """ + expected = Security.SecCertificateGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _is_identity(item): + """ + Returns True if a given CFTypeRef is an identity. + """ + expected = Security.SecIdentityGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _temporary_keychain(): + """ + This function creates a temporary Mac keychain that we can use to work with + credentials. This keychain uses a one-time password and a temporary file to + store the data. We expect to have one keychain per socket. The returned + SecKeychainRef must be freed by the caller, including calling + SecKeychainDelete. + + Returns a tuple of the SecKeychainRef and the path to the temporary + directory that contains it. + """ + # Unfortunately, SecKeychainCreate requires a path to a keychain. This + # means we cannot use mkstemp to use a generic temporary file. Instead, + # we're going to create a temporary directory and a filename to use there. + # This filename will be 8 random bytes expanded into base64. We also need + # some random bytes to password-protect the keychain we're creating, so we + # ask for 40 random bytes. + random_bytes = os.urandom(40) + filename = base64.b16encode(random_bytes[:8]).decode('utf-8') + password = base64.b16encode(random_bytes[8:]) # Must be valid UTF-8 + tempdirectory = tempfile.mkdtemp() + + keychain_path = os.path.join(tempdirectory, filename).encode('utf-8') + + # We now want to create the keychain itself. + keychain = Security.SecKeychainRef() + status = Security.SecKeychainCreate( + keychain_path, + len(password), + password, + False, + None, + ctypes.byref(keychain) + ) + _assert_no_error(status) + + # Having created the keychain, we want to pass it off to the caller. + return keychain, tempdirectory + + +def _load_items_from_file(keychain, path): + """ + Given a single file, loads all the trust objects from it into arrays and + the keychain. + Returns a tuple of lists: the first list is a list of identities, the + second a list of certs. + """ + certificates = [] + identities = [] + result_array = None + + with open(path, 'rb') as f: + raw_filedata = f.read() + + try: + filedata = CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, + raw_filedata, + len(raw_filedata) + ) + result_array = CoreFoundation.CFArrayRef() + result = Security.SecItemImport( + filedata, # cert data + None, # Filename, leaving it out for now + None, # What the type of the file is, we don't care + None, # what's in the file, we don't care + 0, # import flags + None, # key params, can include passphrase in the future + keychain, # The keychain to insert into + ctypes.byref(result_array) # Results + ) + _assert_no_error(result) + + # A CFArray is not very useful to us as an intermediary + # representation, so we are going to extract the objects we want + # and then free the array. We don't need to keep hold of keys: the + # keychain already has them! + result_count = CoreFoundation.CFArrayGetCount(result_array) + for index in range(result_count): + item = CoreFoundation.CFArrayGetValueAtIndex( + result_array, index + ) + item = ctypes.cast(item, CoreFoundation.CFTypeRef) + + if _is_cert(item): + CoreFoundation.CFRetain(item) + certificates.append(item) + elif _is_identity(item): + CoreFoundation.CFRetain(item) + identities.append(item) + finally: + if result_array: + CoreFoundation.CFRelease(result_array) + + CoreFoundation.CFRelease(filedata) + + return (identities, certificates) + + +def _load_client_cert_chain(keychain, *paths): + """ + Load certificates and maybe keys from a number of files. Has the end goal + of returning a CFArray containing one SecIdentityRef, and then zero or more + SecCertificateRef objects, suitable for use as a client certificate trust + chain. + """ + # Ok, the strategy. + # + # This relies on knowing that macOS will not give you a SecIdentityRef + # unless you have imported a key into a keychain. This is a somewhat + # artificial limitation of macOS (for example, it doesn't necessarily + # affect iOS), but there is nothing inside Security.framework that lets you + # get a SecIdentityRef without having a key in a keychain. + # + # So the policy here is we take all the files and iterate them in order. + # Each one will use SecItemImport to have one or more objects loaded from + # it. We will also point at a keychain that macOS can use to work with the + # private key. + # + # Once we have all the objects, we'll check what we actually have. If we + # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, + # we'll take the first certificate (which we assume to be our leaf) and + # ask the keychain to give us a SecIdentityRef with that cert's associated + # key. + # + # We'll then return a CFArray containing the trust chain: one + # SecIdentityRef and then zero-or-more SecCertificateRef objects. The + # responsibility for freeing this CFArray will be with the caller. This + # CFArray must remain alive for the entire connection, so in practice it + # will be stored with a single SSLSocket, along with the reference to the + # keychain. + certificates = [] + identities = [] + + # Filter out bad paths. + paths = (path for path in paths if path) + + try: + for file_path in paths: + new_identities, new_certs = _load_items_from_file( + keychain, file_path + ) + identities.extend(new_identities) + certificates.extend(new_certs) + + # Ok, we have everything. The question is: do we have an identity? If + # not, we want to grab one from the first cert we have. + if not identities: + new_identity = Security.SecIdentityRef() + status = Security.SecIdentityCreateWithCertificate( + keychain, + certificates[0], + ctypes.byref(new_identity) + ) + _assert_no_error(status) + identities.append(new_identity) + + # We now want to release the original certificate, as we no longer + # need it. + CoreFoundation.CFRelease(certificates.pop(0)) + + # We now need to build a new CFArray that holds the trust chain. + trust_chain = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + for item in itertools.chain(identities, certificates): + # ArrayAppendValue does a CFRetain on the item. That's fine, + # because the finally block will release our other refs to them. + CoreFoundation.CFArrayAppendValue(trust_chain, item) + + return trust_chain + finally: + for obj in itertools.chain(identities, certificates): + CoreFoundation.CFRelease(obj) diff --git a/dropbox-script/urllib3/contrib/appengine.py b/dropbox-script/urllib3/contrib/appengine.py new file mode 100644 index 0000000..2952f11 --- /dev/null +++ b/dropbox-script/urllib3/contrib/appengine.py @@ -0,0 +1,289 @@ +""" +This module provides a pool manager that uses Google App Engine's +`URLFetch Service `_. + +Example usage:: + + from urllib3 import PoolManager + from urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox + + if is_appengine_sandbox(): + # AppEngineManager uses AppEngine's URLFetch API behind the scenes + http = AppEngineManager() + else: + # PoolManager uses a socket-level API behind the scenes + http = PoolManager() + + r = http.request('GET', 'https://google.com/') + +There are `limitations `_ to the URLFetch service and it may not be +the best choice for your application. There are three options for using +urllib3 on Google App Engine: + +1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is + cost-effective in many circumstances as long as your usage is within the + limitations. +2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets. + Sockets also have `limitations and restrictions + `_ and have a lower free quota than URLFetch. + To use sockets, be sure to specify the following in your ``app.yaml``:: + + env_variables: + GAE_USE_SOCKETS_HTTPLIB : 'true' + +3. If you are using `App Engine Flexible +`_, you can use the standard +:class:`PoolManager` without any configuration or special environment variables. +""" + +from __future__ import absolute_import +import io +import logging +import warnings +from ..packages.six.moves.urllib.parse import urljoin + +from ..exceptions import ( + HTTPError, + HTTPWarning, + MaxRetryError, + ProtocolError, + TimeoutError, + SSLError +) + +from ..request import RequestMethods +from ..response import HTTPResponse +from ..util.timeout import Timeout +from ..util.retry import Retry +from . import _appengine_environ + +try: + from google.appengine.api import urlfetch +except ImportError: + urlfetch = None + + +log = logging.getLogger(__name__) + + +class AppEnginePlatformWarning(HTTPWarning): + pass + + +class AppEnginePlatformError(HTTPError): + pass + + +class AppEngineManager(RequestMethods): + """ + Connection manager for Google App Engine sandbox applications. + + This manager uses the URLFetch service directly instead of using the + emulated httplib, and is subject to URLFetch limitations as described in + the App Engine documentation `here + `_. + + Notably it will raise an :class:`AppEnginePlatformError` if: + * URLFetch is not available. + * If you attempt to use this on App Engine Flexible, as full socket + support is available. + * If a request size is more than 10 megabytes. + * If a response size is more than 32 megabtyes. + * If you use an unsupported request method such as OPTIONS. + + Beyond those cases, it will raise normal urllib3 errors. + """ + + def __init__(self, headers=None, retries=None, validate_certificate=True, + urlfetch_retries=True): + if not urlfetch: + raise AppEnginePlatformError( + "URLFetch is not available in this environment.") + + if is_prod_appengine_mvms(): + raise AppEnginePlatformError( + "Use normal urllib3.PoolManager instead of AppEngineManager" + "on Managed VMs, as using URLFetch is not necessary in " + "this environment.") + + warnings.warn( + "urllib3 is using URLFetch on Google App Engine sandbox instead " + "of sockets. To use sockets directly instead of URLFetch see " + "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.", + AppEnginePlatformWarning) + + RequestMethods.__init__(self, headers) + self.validate_certificate = validate_certificate + self.urlfetch_retries = urlfetch_retries + + self.retries = retries or Retry.DEFAULT + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + # Return False to re-raise any potential exceptions + return False + + def urlopen(self, method, url, body=None, headers=None, + retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT, + **response_kw): + + retries = self._get_retries(retries, redirect) + + try: + follow_redirects = ( + redirect and + retries.redirect != 0 and + retries.total) + response = urlfetch.fetch( + url, + payload=body, + method=method, + headers=headers or {}, + allow_truncated=False, + follow_redirects=self.urlfetch_retries and follow_redirects, + deadline=self._get_absolute_timeout(timeout), + validate_certificate=self.validate_certificate, + ) + except urlfetch.DeadlineExceededError as e: + raise TimeoutError(self, e) + + except urlfetch.InvalidURLError as e: + if 'too large' in str(e): + raise AppEnginePlatformError( + "URLFetch request too large, URLFetch only " + "supports requests up to 10mb in size.", e) + raise ProtocolError(e) + + except urlfetch.DownloadError as e: + if 'Too many redirects' in str(e): + raise MaxRetryError(self, url, reason=e) + raise ProtocolError(e) + + except urlfetch.ResponseTooLargeError as e: + raise AppEnginePlatformError( + "URLFetch response too large, URLFetch only supports" + "responses up to 32mb in size.", e) + + except urlfetch.SSLCertificateError as e: + raise SSLError(e) + + except urlfetch.InvalidMethodError as e: + raise AppEnginePlatformError( + "URLFetch does not support method: %s" % method, e) + + http_response = self._urlfetch_response_to_http_response( + response, retries=retries, **response_kw) + + # Handle redirect? + redirect_location = redirect and http_response.get_redirect_location() + if redirect_location: + # Check for redirect response + if (self.urlfetch_retries and retries.raise_on_redirect): + raise MaxRetryError(self, url, "too many redirects") + else: + if http_response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=http_response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + raise MaxRetryError(self, url, "too many redirects") + return http_response + + retries.sleep_for_retry(http_response) + log.debug("Redirecting %s -> %s", url, redirect_location) + redirect_url = urljoin(url, redirect_location) + return self.urlopen( + method, redirect_url, body, headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(http_response.getheader('Retry-After')) + if retries.is_retry(method, http_response.status, has_retry_after): + retries = retries.increment( + method, url, response=http_response, _pool=self) + log.debug("Retry: %s", url) + retries.sleep(http_response) + return self.urlopen( + method, url, + body=body, headers=headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + return http_response + + def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): + + if is_prod_appengine(): + # Production GAE handles deflate encoding automatically, but does + # not remove the encoding header. + content_encoding = urlfetch_resp.headers.get('content-encoding') + + if content_encoding == 'deflate': + del urlfetch_resp.headers['content-encoding'] + + transfer_encoding = urlfetch_resp.headers.get('transfer-encoding') + # We have a full response's content, + # so let's make sure we don't report ourselves as chunked data. + if transfer_encoding == 'chunked': + encodings = transfer_encoding.split(",") + encodings.remove('chunked') + urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings) + + original_response = HTTPResponse( + # In order for decoding to work, we must present the content as + # a file-like object. + body=io.BytesIO(urlfetch_resp.content), + msg=urlfetch_resp.header_msg, + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + **response_kw + ) + + return HTTPResponse( + body=io.BytesIO(urlfetch_resp.content), + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + original_response=original_response, + **response_kw + ) + + def _get_absolute_timeout(self, timeout): + if timeout is Timeout.DEFAULT_TIMEOUT: + return None # Defer to URLFetch's default. + if isinstance(timeout, Timeout): + if timeout._read is not None or timeout._connect is not None: + warnings.warn( + "URLFetch does not support granular timeout settings, " + "reverting to total or default URLFetch timeout.", + AppEnginePlatformWarning) + return timeout.total + return timeout + + def _get_retries(self, retries, redirect): + if not isinstance(retries, Retry): + retries = Retry.from_int( + retries, redirect=redirect, default=self.retries) + + if retries.connect or retries.read or retries.redirect: + warnings.warn( + "URLFetch only supports total retries and does not " + "recognize connect, read, or redirect retry parameters.", + AppEnginePlatformWarning) + + return retries + + +# Alias methods from _appengine_environ to maintain public API interface. + +is_appengine = _appengine_environ.is_appengine +is_appengine_sandbox = _appengine_environ.is_appengine_sandbox +is_local_appengine = _appengine_environ.is_local_appengine +is_prod_appengine = _appengine_environ.is_prod_appengine +is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms diff --git a/dropbox-script/urllib3/contrib/ntlmpool.py b/dropbox-script/urllib3/contrib/ntlmpool.py new file mode 100644 index 0000000..8ea127c --- /dev/null +++ b/dropbox-script/urllib3/contrib/ntlmpool.py @@ -0,0 +1,111 @@ +""" +NTLM authenticating pool, contributed by erikcederstran + +Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 +""" +from __future__ import absolute_import + +from logging import getLogger +from ntlm import ntlm + +from .. import HTTPSConnectionPool +from ..packages.six.moves.http_client import HTTPSConnection + + +log = getLogger(__name__) + + +class NTLMConnectionPool(HTTPSConnectionPool): + """ + Implements an NTLM authentication version of an urllib3 connection pool + """ + + scheme = 'https' + + def __init__(self, user, pw, authurl, *args, **kwargs): + """ + authurl is a random URL on the server that is protected by NTLM. + user is the Windows user, probably in the DOMAIN\\username format. + pw is the password for the user. + """ + super(NTLMConnectionPool, self).__init__(*args, **kwargs) + self.authurl = authurl + self.rawuser = user + user_parts = user.split('\\', 1) + self.domain = user_parts[0].upper() + self.user = user_parts[1] + self.pw = pw + + def _new_conn(self): + # Performs the NTLM handshake that secures the connection. The socket + # must be kept open while requests are performed. + self.num_connections += 1 + log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s', + self.num_connections, self.host, self.authurl) + + headers = {'Connection': 'Keep-Alive'} + req_header = 'Authorization' + resp_header = 'www-authenticate' + + conn = HTTPSConnection(host=self.host, port=self.port) + + # Send negotiation message + headers[req_header] = ( + 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + reshdr = dict(res.getheaders()) + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', reshdr) + log.debug('Response data: %s [...]', res.read(100)) + + # Remove the reference to the socket, so that it can not be closed by + # the response object (we want to keep the socket open) + res.fp = None + + # Server should respond with a challenge message + auth_header_values = reshdr[resp_header].split(', ') + auth_header_value = None + for s in auth_header_values: + if s[:5] == 'NTLM ': + auth_header_value = s[5:] + if auth_header_value is None: + raise Exception('Unexpected %s response header: %s' % + (resp_header, reshdr[resp_header])) + + # Send authentication message + ServerChallenge, NegotiateFlags = \ + ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) + auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, + self.user, + self.domain, + self.pw, + NegotiateFlags) + headers[req_header] = 'NTLM %s' % auth_msg + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', dict(res.getheaders())) + log.debug('Response data: %s [...]', res.read()[:100]) + if res.status != 200: + if res.status == 401: + raise Exception('Server rejected request: wrong ' + 'username or password') + raise Exception('Wrong server response: %s %s' % + (res.status, res.reason)) + + res.fp = None + log.debug('Connection established') + return conn + + def urlopen(self, method, url, body=None, headers=None, retries=3, + redirect=True, assert_same_host=True): + if headers is None: + headers = {} + headers['Connection'] = 'Keep-Alive' + return super(NTLMConnectionPool, self).urlopen(method, url, body, + headers, retries, + redirect, + assert_same_host) diff --git a/dropbox-script/urllib3/contrib/pyopenssl.py b/dropbox-script/urllib3/contrib/pyopenssl.py new file mode 100644 index 0000000..7c0e946 --- /dev/null +++ b/dropbox-script/urllib3/contrib/pyopenssl.py @@ -0,0 +1,466 @@ +""" +SSL with SNI_-support for Python 2. Follow these instructions if you would +like to verify SSL certificates in Python 2. Note, the default libraries do +*not* do certificate checking; you need to do additional work to validate +certificates yourself. + +This needs the following packages installed: + +* pyOpenSSL (tested with 16.0.0) +* cryptography (minimum 1.3.4, from pyopenssl) +* idna (minimum 2.0, from cryptography) + +However, pyopenssl depends on cryptography, which depends on idna, so while we +use all three directly here we end up having relatively few packages required. + +You can install them with the following command: + + pip install pyopenssl cryptography idna + +To activate certificate checking, call +:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code +before you begin making HTTP requests. This can be done in a ``sitecustomize`` +module, or at any other time before your application begins using ``urllib3``, +like this:: + + try: + import urllib3.contrib.pyopenssl + urllib3.contrib.pyopenssl.inject_into_urllib3() + except ImportError: + pass + +Now you can use :mod:`urllib3` as you normally would, and it will support SNI +when the required modules are installed. + +Activating this module also has the positive side effect of disabling SSL/TLS +compression in Python 2 (see `CRIME attack`_). + +If you want to configure the default list of supported cipher suites, you can +set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. + +.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication +.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) +""" +from __future__ import absolute_import + +import OpenSSL.SSL +from cryptography import x509 +from cryptography.hazmat.backends.openssl import backend as openssl_backend +from cryptography.hazmat.backends.openssl.x509 import _Certificate +try: + from cryptography.x509 import UnsupportedExtension +except ImportError: + # UnsupportedExtension is gone in cryptography >= 2.1.0 + class UnsupportedExtension(Exception): + pass + +from socket import timeout, error as SocketError +from io import BytesIO + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +import logging +import ssl +from ..packages import six +import sys + +from .. import util + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works. +HAS_SNI = True + +# Map from urllib3 to PyOpenSSL compatible parameter-values. +_openssl_versions = { + ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, + ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, +} + +if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD + +if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD + +try: + _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD}) +except AttributeError: + pass + +_stdlib_to_openssl_verify = { + ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, + ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, + ssl.CERT_REQUIRED: + OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, +} +_openssl_to_stdlib_verify = dict( + (v, k) for k, v in _stdlib_to_openssl_verify.items() +) + +# OpenSSL will only write 16K at a time +SSL_WRITE_BLOCKSIZE = 16384 + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + + +log = logging.getLogger(__name__) + + +def inject_into_urllib3(): + 'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.' + + _validate_dependencies_met() + + util.ssl_.SSLContext = PyOpenSSLContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_PYOPENSSL = True + util.ssl_.IS_PYOPENSSL = True + + +def extract_from_urllib3(): + 'Undo monkey-patching by :func:`inject_into_urllib3`.' + + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_PYOPENSSL = False + util.ssl_.IS_PYOPENSSL = False + + +def _validate_dependencies_met(): + """ + Verifies that PyOpenSSL's package-level dependencies have been met. + Throws `ImportError` if they are not met. + """ + # Method added in `cryptography==1.1`; not available in older versions + from cryptography.x509.extensions import Extensions + if getattr(Extensions, "get_extension_for_class", None) is None: + raise ImportError("'cryptography' module missing required functionality. " + "Try upgrading to v1.3.4 or newer.") + + # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 + # attribute is only present on those versions. + from OpenSSL.crypto import X509 + x509 = X509() + if getattr(x509, "_x509", None) is None: + raise ImportError("'pyOpenSSL' module missing required functionality. " + "Try upgrading to v0.14 or newer.") + + +def _dnsname_to_stdlib(name): + """ + Converts a dNSName SubjectAlternativeName field to the form used by the + standard library on the given Python version. + + Cryptography produces a dNSName as a unicode string that was idna-decoded + from ASCII bytes. We need to idna-encode that string to get it back, and + then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib + uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). + + If the name cannot be idna-encoded then we return None signalling that + the name given should be skipped. + """ + def idna_encode(name): + """ + Borrowed wholesale from the Python Cryptography Project. It turns out + that we can't just safely call `idna.encode`: it can explode for + wildcard names. This avoids that problem. + """ + import idna + + try: + for prefix in [u'*.', u'.']: + if name.startswith(prefix): + name = name[len(prefix):] + return prefix.encode('ascii') + idna.encode(name) + return idna.encode(name) + except idna.core.IDNAError: + return None + + name = idna_encode(name) + if name is None: + return None + elif sys.version_info >= (3, 0): + name = name.decode('utf-8') + return name + + +def get_subj_alt_name(peer_cert): + """ + Given an PyOpenSSL certificate, provides all the subject alternative names. + """ + # Pass the cert to cryptography, which has much better APIs for this. + if hasattr(peer_cert, "to_cryptography"): + cert = peer_cert.to_cryptography() + else: + # This is technically using private APIs, but should work across all + # relevant versions before PyOpenSSL got a proper API for this. + cert = _Certificate(openssl_backend, peer_cert._x509) + + # We want to find the SAN extension. Ask Cryptography to locate it (it's + # faster than looping in Python) + try: + ext = cert.extensions.get_extension_for_class( + x509.SubjectAlternativeName + ).value + except x509.ExtensionNotFound: + # No such extension, return the empty list. + return [] + except (x509.DuplicateExtension, UnsupportedExtension, + x509.UnsupportedGeneralNameType, UnicodeError) as e: + # A problem has been found with the quality of the certificate. Assume + # no SAN field is present. + log.warning( + "A problem was encountered with the certificate that prevented " + "urllib3 from finding the SubjectAlternativeName field. This can " + "affect certificate validation. The error was %s", + e, + ) + return [] + + # We want to return dNSName and iPAddress fields. We need to cast the IPs + # back to strings because the match_hostname function wants them as + # strings. + # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 + # decoded. This is pretty frustrating, but that's what the standard library + # does with certificates, and so we need to attempt to do the same. + # We also want to skip over names which cannot be idna encoded. + names = [ + ('DNS', name) for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) + if name is not None + ] + names.extend( + ('IP Address', str(name)) + for name in ext.get_values_for_type(x509.IPAddress) + ) + + return names + + +class WrappedSocket(object): + '''API-compatibility wrapper for Python OpenSSL's Connection-class. + + Note: _makefile_refs, _drop() and _reuse() are needed for the garbage + collector of pypy. + ''' + + def __init__(self, connection, socket, suppress_ragged_eofs=True): + self.connection = connection + self.socket = socket + self.suppress_ragged_eofs = suppress_ragged_eofs + self._makefile_refs = 0 + self._closed = False + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, *args, **kwargs): + try: + data = self.connection.recv(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return b'' + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return b'' + else: + raise + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout('The read operation timed out') + else: + return self.recv(*args, **kwargs) + else: + return data + + def recv_into(self, *args, **kwargs): + try: + return self.connection.recv_into(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return 0 + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return 0 + else: + raise + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + raise timeout('The read operation timed out') + else: + return self.recv_into(*args, **kwargs) + + def settimeout(self, timeout): + return self.socket.settimeout(timeout) + + def _send_until_done(self, data): + while True: + try: + return self.connection.send(data) + except OpenSSL.SSL.WantWriteError: + if not util.wait_for_write(self.socket, self.socket.gettimeout()): + raise timeout() + continue + except OpenSSL.SSL.SysCallError as e: + raise SocketError(str(e)) + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + # FIXME rethrow compatible exceptions should we ever use this + self.connection.shutdown() + + def close(self): + if self._makefile_refs < 1: + try: + self._closed = True + return self.connection.close() + except OpenSSL.SSL.Error: + return + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + x509 = self.connection.get_peer_certificate() + + if not x509: + return x509 + + if binary_form: + return OpenSSL.crypto.dump_certificate( + OpenSSL.crypto.FILETYPE_ASN1, + x509) + + return { + 'subject': ( + (('commonName', x509.get_subject().CN),), + ), + 'subjectAltName': get_subj_alt_name(x509) + } + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + makefile = backport_makefile + +WrappedSocket.makefile = makefile + + +class PyOpenSSLContext(object): + """ + I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible + for translating the interface of the standard library ``SSLContext`` object + to calls into PyOpenSSL. + """ + def __init__(self, protocol): + self.protocol = _openssl_versions[protocol] + self._ctx = OpenSSL.SSL.Context(self.protocol) + self._options = 0 + self.check_hostname = False + + @property + def options(self): + return self._options + + @options.setter + def options(self, value): + self._options = value + self._ctx.set_options(value) + + @property + def verify_mode(self): + return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] + + @verify_mode.setter + def verify_mode(self, value): + self._ctx.set_verify( + _stdlib_to_openssl_verify[value], + _verify_callback + ) + + def set_default_verify_paths(self): + self._ctx.set_default_verify_paths() + + def set_ciphers(self, ciphers): + if isinstance(ciphers, six.text_type): + ciphers = ciphers.encode('utf-8') + self._ctx.set_cipher_list(ciphers) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + if cafile is not None: + cafile = cafile.encode('utf-8') + if capath is not None: + capath = capath.encode('utf-8') + self._ctx.load_verify_locations(cafile, capath) + if cadata is not None: + self._ctx.load_verify_locations(BytesIO(cadata)) + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._ctx.use_certificate_chain_file(certfile) + if password is not None: + self._ctx.set_passwd_cb(lambda max_length, prompt_twice, userdata: password) + self._ctx.use_privatekey_file(keyfile or certfile) + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + cnx = OpenSSL.SSL.Connection(self._ctx, sock) + + if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 + server_hostname = server_hostname.encode('utf-8') + + if server_hostname is not None: + cnx.set_tlsext_host_name(server_hostname) + + cnx.set_connect_state() + + while True: + try: + cnx.do_handshake() + except OpenSSL.SSL.WantReadError: + if not util.wait_for_read(sock, sock.gettimeout()): + raise timeout('select timed out') + continue + except OpenSSL.SSL.Error as e: + raise ssl.SSLError('bad handshake: %r' % e) + break + + return WrappedSocket(cnx, sock) + + +def _verify_callback(cnx, x509, err_no, err_depth, return_code): + return err_no == 0 diff --git a/dropbox-script/urllib3/contrib/securetransport.py b/dropbox-script/urllib3/contrib/securetransport.py new file mode 100644 index 0000000..77cb59e --- /dev/null +++ b/dropbox-script/urllib3/contrib/securetransport.py @@ -0,0 +1,804 @@ +""" +SecureTranport support for urllib3 via ctypes. + +This makes platform-native TLS available to urllib3 users on macOS without the +use of a compiler. This is an important feature because the Python Package +Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL +that ships with macOS is not capable of doing TLSv1.2. The only way to resolve +this is to give macOS users an alternative solution to the problem, and that +solution is to use SecureTransport. + +We use ctypes here because this solution must not require a compiler. That's +because pip is not allowed to require a compiler either. + +This is not intended to be a seriously long-term solution to this problem. +The hope is that PEP 543 will eventually solve this issue for us, at which +point we can retire this contrib module. But in the short term, we need to +solve the impending tire fire that is Python on Mac without this kind of +contrib module. So...here we are. + +To use this module, simply import and inject it:: + + import urllib3.contrib.securetransport + urllib3.contrib.securetransport.inject_into_urllib3() + +Happy TLSing! +""" +from __future__ import absolute_import + +import contextlib +import ctypes +import errno +import os.path +import shutil +import socket +import ssl +import threading +import weakref + +from .. import util +from ._securetransport.bindings import ( + Security, SecurityConst, CoreFoundation +) +from ._securetransport.low_level import ( + _assert_no_error, _cert_array_from_pem, _temporary_keychain, + _load_client_cert_chain +) + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works +HAS_SNI = True + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + +# This dictionary is used by the read callback to obtain a handle to the +# calling wrapped socket. This is a pretty silly approach, but for now it'll +# do. I feel like I should be able to smuggle a handle to the wrapped socket +# directly in the SSLConnectionRef, but for now this approach will work I +# guess. +# +# We need to lock around this structure for inserts, but we don't do it for +# reads/writes in the callbacks. The reasoning here goes as follows: +# +# 1. It is not possible to call into the callbacks before the dictionary is +# populated, so once in the callback the id must be in the dictionary. +# 2. The callbacks don't mutate the dictionary, they only read from it, and +# so cannot conflict with any of the insertions. +# +# This is good: if we had to lock in the callbacks we'd drastically slow down +# the performance of this code. +_connection_refs = weakref.WeakValueDictionary() +_connection_ref_lock = threading.Lock() + +# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over +# for no better reason than we need *a* limit, and this one is right there. +SSL_WRITE_BLOCKSIZE = 16384 + +# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to +# individual cipher suites. We need to do this because this is how +# SecureTransport wants them. +CIPHER_SUITES = [ + SecurityConst.TLS_AES_256_GCM_SHA384, + SecurityConst.TLS_CHACHA20_POLY1305_SHA256, + SecurityConst.TLS_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA, +] + +# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of +# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version. +_protocol_to_min_max = { + ssl.PROTOCOL_SSLv23: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), +} + +if hasattr(ssl, "PROTOCOL_SSLv2"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = ( + SecurityConst.kSSLProtocol2, SecurityConst.kSSLProtocol2 + ) +if hasattr(ssl, "PROTOCOL_SSLv3"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = ( + SecurityConst.kSSLProtocol3, SecurityConst.kSSLProtocol3 + ) +if hasattr(ssl, "PROTOCOL_TLSv1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = ( + SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol1 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = ( + SecurityConst.kTLSProtocol11, SecurityConst.kTLSProtocol11 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_2"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = ( + SecurityConst.kTLSProtocol12, SecurityConst.kTLSProtocol12 + ) +if hasattr(ssl, "PROTOCOL_TLS"): + _protocol_to_min_max[ssl.PROTOCOL_TLS] = _protocol_to_min_max[ssl.PROTOCOL_SSLv23] + + +def inject_into_urllib3(): + """ + Monkey-patch urllib3 with SecureTransport-backed SSL-support. + """ + util.ssl_.SSLContext = SecureTransportContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_SECURETRANSPORT = True + util.ssl_.IS_SECURETRANSPORT = True + + +def extract_from_urllib3(): + """ + Undo monkey-patching by :func:`inject_into_urllib3`. + """ + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_SECURETRANSPORT = False + util.ssl_.IS_SECURETRANSPORT = False + + +def _read_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport read callback. This is called by ST to request that data + be returned from the socket. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + requested_length = data_length_pointer[0] + + timeout = wrapped_socket.gettimeout() + error = None + read_count = 0 + + try: + while read_count < requested_length: + if timeout is None or timeout >= 0: + if not util.wait_for_read(base_socket, timeout): + raise socket.error(errno.EAGAIN, 'timed out') + + remaining = requested_length - read_count + buffer = (ctypes.c_char * remaining).from_address( + data_buffer + read_count + ) + chunk_size = base_socket.recv_into(buffer, remaining) + read_count += chunk_size + if not chunk_size: + if not read_count: + return SecurityConst.errSSLClosedGraceful + break + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + data_length_pointer[0] = read_count + if error == errno.ECONNRESET or error == errno.EPIPE: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = read_count + + if read_count != requested_length: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +def _write_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport write callback. This is called by ST to request that data + actually be sent on the network. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + bytes_to_write = data_length_pointer[0] + data = ctypes.string_at(data_buffer, bytes_to_write) + + timeout = wrapped_socket.gettimeout() + error = None + sent = 0 + + try: + while sent < bytes_to_write: + if timeout is None or timeout >= 0: + if not util.wait_for_write(base_socket, timeout): + raise socket.error(errno.EAGAIN, 'timed out') + chunk_sent = base_socket.send(data) + sent += chunk_sent + + # This has some needless copying here, but I'm not sure there's + # much value in optimising this data path. + data = data[chunk_sent:] + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + data_length_pointer[0] = sent + if error == errno.ECONNRESET or error == errno.EPIPE: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = sent + + if sent != bytes_to_write: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +# We need to keep these two objects references alive: if they get GC'd while +# in use then SecureTransport could attempt to call a function that is in freed +# memory. That would be...uh...bad. Yeah, that's the word. Bad. +_read_callback_pointer = Security.SSLReadFunc(_read_callback) +_write_callback_pointer = Security.SSLWriteFunc(_write_callback) + + +class WrappedSocket(object): + """ + API-compatibility wrapper for Python's OpenSSL wrapped socket object. + + Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage + collector of PyPy. + """ + def __init__(self, socket): + self.socket = socket + self.context = None + self._makefile_refs = 0 + self._closed = False + self._exception = None + self._keychain = None + self._keychain_dir = None + self._client_cert_chain = None + + # We save off the previously-configured timeout and then set it to + # zero. This is done because we use select and friends to handle the + # timeouts, but if we leave the timeout set on the lower socket then + # Python will "kindly" call select on that socket again for us. Avoid + # that by forcing the timeout to zero. + self._timeout = self.socket.gettimeout() + self.socket.settimeout(0) + + @contextlib.contextmanager + def _raise_on_error(self): + """ + A context manager that can be used to wrap calls that do I/O from + SecureTransport. If any of the I/O callbacks hit an exception, this + context manager will correctly propagate the exception after the fact. + This avoids silently swallowing those exceptions. + + It also correctly forces the socket closed. + """ + self._exception = None + + # We explicitly don't catch around this yield because in the unlikely + # event that an exception was hit in the block we don't want to swallow + # it. + yield + if self._exception is not None: + exception, self._exception = self._exception, None + self.close() + raise exception + + def _set_ciphers(self): + """ + Sets up the allowed ciphers. By default this matches the set in + util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done + custom and doesn't allow changing at this time, mostly because parsing + OpenSSL cipher strings is going to be a freaking nightmare. + """ + ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES) + result = Security.SSLSetEnabledCiphers( + self.context, ciphers, len(CIPHER_SUITES) + ) + _assert_no_error(result) + + def _custom_validate(self, verify, trust_bundle): + """ + Called when we have set custom validation. We do this in two cases: + first, when cert validation is entirely disabled; and second, when + using a custom trust DB. + """ + # If we disabled cert validation, just say: cool. + if not verify: + return + + # We want data in memory, so load it up. + if os.path.isfile(trust_bundle): + with open(trust_bundle, 'rb') as f: + trust_bundle = f.read() + + cert_array = None + trust = Security.SecTrustRef() + + try: + # Get a CFArray that contains the certs we want. + cert_array = _cert_array_from_pem(trust_bundle) + + # Ok, now the hard part. We want to get the SecTrustRef that ST has + # created for this connection, shove our CAs into it, tell ST to + # ignore everything else it knows, and then ask if it can build a + # chain. This is a buuuunch of code. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + raise ssl.SSLError("Failed to copy trust reference") + + result = Security.SecTrustSetAnchorCertificates(trust, cert_array) + _assert_no_error(result) + + result = Security.SecTrustSetAnchorCertificatesOnly(trust, True) + _assert_no_error(result) + + trust_result = Security.SecTrustResultType() + result = Security.SecTrustEvaluate( + trust, ctypes.byref(trust_result) + ) + _assert_no_error(result) + finally: + if trust: + CoreFoundation.CFRelease(trust) + + if cert_array is not None: + CoreFoundation.CFRelease(cert_array) + + # Ok, now we can look at what the result was. + successes = ( + SecurityConst.kSecTrustResultUnspecified, + SecurityConst.kSecTrustResultProceed + ) + if trust_result.value not in successes: + raise ssl.SSLError( + "certificate verify failed, error code: %d" % + trust_result.value + ) + + def handshake(self, + server_hostname, + verify, + trust_bundle, + min_version, + max_version, + client_cert, + client_key, + client_key_passphrase): + """ + Actually performs the TLS handshake. This is run automatically by + wrapped socket, and shouldn't be needed in user code. + """ + # First, we do the initial bits of connection setup. We need to create + # a context, set its I/O funcs, and set the connection reference. + self.context = Security.SSLCreateContext( + None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType + ) + result = Security.SSLSetIOFuncs( + self.context, _read_callback_pointer, _write_callback_pointer + ) + _assert_no_error(result) + + # Here we need to compute the handle to use. We do this by taking the + # id of self modulo 2**31 - 1. If this is already in the dictionary, we + # just keep incrementing by one until we find a free space. + with _connection_ref_lock: + handle = id(self) % 2147483647 + while handle in _connection_refs: + handle = (handle + 1) % 2147483647 + _connection_refs[handle] = self + + result = Security.SSLSetConnection(self.context, handle) + _assert_no_error(result) + + # If we have a server hostname, we should set that too. + if server_hostname: + if not isinstance(server_hostname, bytes): + server_hostname = server_hostname.encode('utf-8') + + result = Security.SSLSetPeerDomainName( + self.context, server_hostname, len(server_hostname) + ) + _assert_no_error(result) + + # Setup the ciphers. + self._set_ciphers() + + # Set the minimum and maximum TLS versions. + result = Security.SSLSetProtocolVersionMin(self.context, min_version) + _assert_no_error(result) + result = Security.SSLSetProtocolVersionMax(self.context, max_version) + _assert_no_error(result) + + # If there's a trust DB, we need to use it. We do that by telling + # SecureTransport to break on server auth. We also do that if we don't + # want to validate the certs at all: we just won't actually do any + # authing in that case. + if not verify or trust_bundle is not None: + result = Security.SSLSetSessionOption( + self.context, + SecurityConst.kSSLSessionOptionBreakOnServerAuth, + True + ) + _assert_no_error(result) + + # If there's a client cert, we need to use it. + if client_cert: + self._keychain, self._keychain_dir = _temporary_keychain() + self._client_cert_chain = _load_client_cert_chain( + self._keychain, client_cert, client_key + ) + result = Security.SSLSetCertificate( + self.context, self._client_cert_chain + ) + _assert_no_error(result) + + while True: + with self._raise_on_error(): + result = Security.SSLHandshake(self.context) + + if result == SecurityConst.errSSLWouldBlock: + raise socket.timeout("handshake timed out") + elif result == SecurityConst.errSSLServerAuthCompleted: + self._custom_validate(verify, trust_bundle) + continue + else: + _assert_no_error(result) + break + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, bufsiz): + buffer = ctypes.create_string_buffer(bufsiz) + bytes_read = self.recv_into(buffer, bufsiz) + data = buffer[:bytes_read] + return data + + def recv_into(self, buffer, nbytes=None): + # Read short on EOF. + if self._closed: + return 0 + + if nbytes is None: + nbytes = len(buffer) + + buffer = (ctypes.c_char * nbytes).from_buffer(buffer) + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLRead( + self.context, buffer, nbytes, ctypes.byref(processed_bytes) + ) + + # There are some result codes that we want to treat as "not always + # errors". Specifically, those are errSSLWouldBlock, + # errSSLClosedGraceful, and errSSLClosedNoNotify. + if (result == SecurityConst.errSSLWouldBlock): + # If we didn't process any bytes, then this was just a time out. + # However, we can get errSSLWouldBlock in situations when we *did* + # read some data, and in those cases we should just read "short" + # and return. + if processed_bytes.value == 0: + # Timed out, no data read. + raise socket.timeout("recv timed out") + elif result in (SecurityConst.errSSLClosedGraceful, SecurityConst.errSSLClosedNoNotify): + # The remote peer has closed this connection. We should do so as + # well. Note that we don't actually return here because in + # principle this could actually be fired along with return data. + # It's unlikely though. + self.close() + else: + _assert_no_error(result) + + # Ok, we read and probably succeeded. We should return whatever data + # was actually read. + return processed_bytes.value + + def settimeout(self, timeout): + self._timeout = timeout + + def gettimeout(self): + return self._timeout + + def send(self, data): + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLWrite( + self.context, data, len(data), ctypes.byref(processed_bytes) + ) + + if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: + # Timed out + raise socket.timeout("send timed out") + else: + _assert_no_error(result) + + # We sent, and probably succeeded. Tell them how much we sent. + return processed_bytes.value + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self.send(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + with self._raise_on_error(): + Security.SSLClose(self.context) + + def close(self): + # TODO: should I do clean shutdown here? Do I have to? + if self._makefile_refs < 1: + self._closed = True + if self.context: + CoreFoundation.CFRelease(self.context) + self.context = None + if self._client_cert_chain: + CoreFoundation.CFRelease(self._client_cert_chain) + self._client_cert_chain = None + if self._keychain: + Security.SecKeychainDelete(self._keychain) + CoreFoundation.CFRelease(self._keychain) + shutil.rmtree(self._keychain_dir) + self._keychain = self._keychain_dir = None + return self.socket.close() + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + # Urgh, annoying. + # + # Here's how we do this: + # + # 1. Call SSLCopyPeerTrust to get hold of the trust object for this + # connection. + # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. + # 3. To get the CN, call SecCertificateCopyCommonName and process that + # string so that it's of the appropriate type. + # 4. To get the SAN, we need to do something a bit more complex: + # a. Call SecCertificateCopyValues to get the data, requesting + # kSecOIDSubjectAltName. + # b. Mess about with this dictionary to try to get the SANs out. + # + # This is gross. Really gross. It's going to be a few hundred LoC extra + # just to repeat something that SecureTransport can *already do*. So my + # operating assumption at this time is that what we want to do is + # instead to just flag to urllib3 that it shouldn't do its own hostname + # validation when using SecureTransport. + if not binary_form: + raise ValueError( + "SecureTransport only supports dumping binary certs" + ) + trust = Security.SecTrustRef() + certdata = None + der_bytes = None + + try: + # Grab the trust store. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + # Probably we haven't done the handshake yet. No biggie. + return None + + cert_count = Security.SecTrustGetCertificateCount(trust) + if not cert_count: + # Also a case that might happen if we haven't handshaked. + # Handshook? Handshaken? + return None + + leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) + assert leaf + + # Ok, now we want the DER bytes. + certdata = Security.SecCertificateCopyData(leaf) + assert certdata + + data_length = CoreFoundation.CFDataGetLength(certdata) + data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) + der_bytes = ctypes.string_at(data_buffer, data_length) + finally: + if certdata: + CoreFoundation.CFRelease(certdata) + if trust: + CoreFoundation.CFRelease(trust) + + return der_bytes + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + def makefile(self, mode="r", buffering=None, *args, **kwargs): + # We disable buffering with SecureTransport because it conflicts with + # the buffering that ST does internally (see issue #1153 for more). + buffering = 0 + return backport_makefile(self, mode, buffering, *args, **kwargs) + +WrappedSocket.makefile = makefile + + +class SecureTransportContext(object): + """ + I am a wrapper class for the SecureTransport library, to translate the + interface of the standard library ``SSLContext`` object to calls into + SecureTransport. + """ + def __init__(self, protocol): + self._min_version, self._max_version = _protocol_to_min_max[protocol] + self._options = 0 + self._verify = False + self._trust_bundle = None + self._client_cert = None + self._client_key = None + self._client_key_passphrase = None + + @property + def check_hostname(self): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + return True + + @check_hostname.setter + def check_hostname(self, value): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + pass + + @property + def options(self): + # TODO: Well, crap. + # + # So this is the bit of the code that is the most likely to cause us + # trouble. Essentially we need to enumerate all of the SSL options that + # users might want to use and try to see if we can sensibly translate + # them, or whether we should just ignore them. + return self._options + + @options.setter + def options(self, value): + # TODO: Update in line with above. + self._options = value + + @property + def verify_mode(self): + return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE + + @verify_mode.setter + def verify_mode(self, value): + self._verify = True if value == ssl.CERT_REQUIRED else False + + def set_default_verify_paths(self): + # So, this has to do something a bit weird. Specifically, what it does + # is nothing. + # + # This means that, if we had previously had load_verify_locations + # called, this does not undo that. We need to do that because it turns + # out that the rest of the urllib3 code will attempt to load the + # default verify paths if it hasn't been told about any paths, even if + # the context itself was sometime earlier. We resolve that by just + # ignoring it. + pass + + def load_default_certs(self): + return self.set_default_verify_paths() + + def set_ciphers(self, ciphers): + # For now, we just require the default cipher string. + if ciphers != util.ssl_.DEFAULT_CIPHERS: + raise ValueError( + "SecureTransport doesn't support custom cipher strings" + ) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + # OK, we only really support cadata and cafile. + if capath is not None: + raise ValueError( + "SecureTransport does not support cert directories" + ) + + self._trust_bundle = cafile or cadata + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._client_cert = certfile + self._client_key = keyfile + self._client_cert_passphrase = password + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + # So, what do we do here? Firstly, we assert some properties. This is a + # stripped down shim, so there is some functionality we don't support. + # See PEP 543 for the real deal. + assert not server_side + assert do_handshake_on_connect + assert suppress_ragged_eofs + + # Ok, we're good to go. Now we want to create the wrapped socket object + # and store it in the appropriate place. + wrapped_socket = WrappedSocket(sock) + + # Now we can handshake + wrapped_socket.handshake( + server_hostname, self._verify, self._trust_bundle, + self._min_version, self._max_version, self._client_cert, + self._client_key, self._client_key_passphrase + ) + return wrapped_socket diff --git a/dropbox-script/urllib3/contrib/socks.py b/dropbox-script/urllib3/contrib/socks.py new file mode 100644 index 0000000..811e312 --- /dev/null +++ b/dropbox-script/urllib3/contrib/socks.py @@ -0,0 +1,192 @@ +# -*- coding: utf-8 -*- +""" +This module contains provisional support for SOCKS proxies from within +urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and +SOCKS5. To enable its functionality, either install PySocks or install this +module with the ``socks`` extra. + +The SOCKS implementation supports the full range of urllib3 features. It also +supports the following SOCKS features: + +- SOCKS4 +- SOCKS4a +- SOCKS5 +- Usernames and passwords for the SOCKS proxy + +Known Limitations: + +- Currently PySocks does not support contacting remote websites via literal + IPv6 addresses. Any such connection attempt will fail. You must use a domain + name. +- Currently PySocks does not support IPv6 connections to the SOCKS proxy. Any + such connection attempt will fail. +""" +from __future__ import absolute_import + +try: + import socks +except ImportError: + import warnings + from ..exceptions import DependencyWarning + + warnings.warn(( + 'SOCKS support in urllib3 requires the installation of optional ' + 'dependencies: specifically, PySocks. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies' + ), + DependencyWarning + ) + raise + +from socket import error as SocketError, timeout as SocketTimeout + +from ..connection import ( + HTTPConnection, HTTPSConnection +) +from ..connectionpool import ( + HTTPConnectionPool, HTTPSConnectionPool +) +from ..exceptions import ConnectTimeoutError, NewConnectionError +from ..poolmanager import PoolManager +from ..util.url import parse_url + +try: + import ssl +except ImportError: + ssl = None + + +class SOCKSConnection(HTTPConnection): + """ + A plain-text HTTP connection that connects via a SOCKS proxy. + """ + def __init__(self, *args, **kwargs): + self._socks_options = kwargs.pop('_socks_options') + super(SOCKSConnection, self).__init__(*args, **kwargs) + + def _new_conn(self): + """ + Establish a new connection via the SOCKS proxy. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = socks.create_connection( + (self.host, self.port), + proxy_type=self._socks_options['socks_version'], + proxy_addr=self._socks_options['proxy_host'], + proxy_port=self._socks_options['proxy_port'], + proxy_username=self._socks_options['username'], + proxy_password=self._socks_options['password'], + proxy_rdns=self._socks_options['rdns'], + timeout=self.timeout, + **extra_kw + ) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except socks.ProxyError as e: + # This is fragile as hell, but it seems to be the only way to raise + # useful errors here. + if e.socket_err: + error = e.socket_err + if isinstance(error, SocketTimeout): + raise ConnectTimeoutError( + self, + "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout) + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % error + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % e + ) + + except SocketError as e: # Defensive: PySocks should catch all these. + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + +# We don't need to duplicate the Verified/Unverified distinction from +# urllib3/connection.py here because the HTTPSConnection will already have been +# correctly set to either the Verified or Unverified form by that module. This +# means the SOCKSHTTPSConnection will automatically be the correct type. +class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): + pass + + +class SOCKSHTTPConnectionPool(HTTPConnectionPool): + ConnectionCls = SOCKSConnection + + +class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): + ConnectionCls = SOCKSHTTPSConnection + + +class SOCKSProxyManager(PoolManager): + """ + A version of the urllib3 ProxyManager that routes connections via the + defined SOCKS proxy. + """ + pool_classes_by_scheme = { + 'http': SOCKSHTTPConnectionPool, + 'https': SOCKSHTTPSConnectionPool, + } + + def __init__(self, proxy_url, username=None, password=None, + num_pools=10, headers=None, **connection_pool_kw): + parsed = parse_url(proxy_url) + + if username is None and password is None and parsed.auth is not None: + split = parsed.auth.split(':') + if len(split) == 2: + username, password = split + if parsed.scheme == 'socks5': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = False + elif parsed.scheme == 'socks5h': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = True + elif parsed.scheme == 'socks4': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = False + elif parsed.scheme == 'socks4a': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = True + else: + raise ValueError( + "Unable to determine SOCKS version from %s" % proxy_url + ) + + self.proxy_url = proxy_url + + socks_options = { + 'socks_version': socks_version, + 'proxy_host': parsed.host, + 'proxy_port': parsed.port, + 'username': username, + 'password': password, + 'rdns': rdns + } + connection_pool_kw['_socks_options'] = socks_options + + super(SOCKSProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw + ) + + self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/dropbox-script/urllib3/exceptions.py b/dropbox-script/urllib3/exceptions.py new file mode 100644 index 0000000..7bbaa98 --- /dev/null +++ b/dropbox-script/urllib3/exceptions.py @@ -0,0 +1,246 @@ +from __future__ import absolute_import +from .packages.six.moves.http_client import ( + IncompleteRead as httplib_IncompleteRead +) +# Base Exceptions + + +class HTTPError(Exception): + "Base exception used by this module." + pass + + +class HTTPWarning(Warning): + "Base warning used by this module." + pass + + +class PoolError(HTTPError): + "Base exception for errors caused within a pool." + def __init__(self, pool, message): + self.pool = pool + HTTPError.__init__(self, "%s: %s" % (pool, message)) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, None) + + +class RequestError(PoolError): + "Base exception for PoolErrors that have associated URLs." + def __init__(self, pool, url, message): + self.url = url + PoolError.__init__(self, pool, message) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, self.url, None) + + +class SSLError(HTTPError): + "Raised when SSL certificate fails in an HTTPS connection." + pass + + +class ProxyError(HTTPError): + "Raised when the connection to a proxy fails." + pass + + +class DecodeError(HTTPError): + "Raised when automatic decoding based on Content-Type fails." + pass + + +class ProtocolError(HTTPError): + "Raised when something unexpected happens mid-request/response." + pass + + +#: Renamed to ProtocolError but aliased for backwards compatibility. +ConnectionError = ProtocolError + + +# Leaf Exceptions + +class MaxRetryError(RequestError): + """Raised when the maximum number of retries is exceeded. + + :param pool: The connection pool + :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` + :param string url: The requested Url + :param exceptions.Exception reason: The underlying error + + """ + + def __init__(self, pool, url, reason=None): + self.reason = reason + + message = "Max retries exceeded with url: %s (Caused by %r)" % ( + url, reason) + + RequestError.__init__(self, pool, url, message) + + +class HostChangedError(RequestError): + "Raised when an existing pool gets a request for a foreign host." + + def __init__(self, pool, url, retries=3): + message = "Tried to open a foreign host with url: %s" % url + RequestError.__init__(self, pool, url, message) + self.retries = retries + + +class TimeoutStateError(HTTPError): + """ Raised when passing an invalid state to a timeout """ + pass + + +class TimeoutError(HTTPError): + """ Raised when a socket timeout error occurs. + + Catching this error will catch both :exc:`ReadTimeoutErrors + ` and :exc:`ConnectTimeoutErrors `. + """ + pass + + +class ReadTimeoutError(TimeoutError, RequestError): + "Raised when a socket timeout occurs while receiving data from a server" + pass + + +# This timeout error does not have a URL attached and needs to inherit from the +# base HTTPError +class ConnectTimeoutError(TimeoutError): + "Raised when a socket timeout occurs while connecting to a server" + pass + + +class NewConnectionError(ConnectTimeoutError, PoolError): + "Raised when we fail to establish a new connection. Usually ECONNREFUSED." + pass + + +class EmptyPoolError(PoolError): + "Raised when a pool runs out of connections and no more are allowed." + pass + + +class ClosedPoolError(PoolError): + "Raised when a request enters a pool after the pool has been closed." + pass + + +class LocationValueError(ValueError, HTTPError): + "Raised when there is something wrong with a given URL input." + pass + + +class LocationParseError(LocationValueError): + "Raised when get_host or similar fails to parse the URL input." + + def __init__(self, location): + message = "Failed to parse: %s" % location + HTTPError.__init__(self, message) + + self.location = location + + +class ResponseError(HTTPError): + "Used as a container for an error reason supplied in a MaxRetryError." + GENERIC_ERROR = 'too many error responses' + SPECIFIC_ERROR = 'too many {status_code} error responses' + + +class SecurityWarning(HTTPWarning): + "Warned when performing security reducing actions" + pass + + +class SubjectAltNameWarning(SecurityWarning): + "Warned when connecting to a host with a certificate missing a SAN." + pass + + +class InsecureRequestWarning(SecurityWarning): + "Warned when making an unverified HTTPS request." + pass + + +class SystemTimeWarning(SecurityWarning): + "Warned when system time is suspected to be wrong" + pass + + +class InsecurePlatformWarning(SecurityWarning): + "Warned when certain SSL configuration is not available on a platform." + pass + + +class SNIMissingWarning(HTTPWarning): + "Warned when making a HTTPS request without SNI available." + pass + + +class DependencyWarning(HTTPWarning): + """ + Warned when an attempt is made to import a module with missing optional + dependencies. + """ + pass + + +class ResponseNotChunked(ProtocolError, ValueError): + "Response needs to be chunked in order to read it as chunks." + pass + + +class BodyNotHttplibCompatible(HTTPError): + """ + Body should be httplib.HTTPResponse like (have an fp attribute which + returns raw chunks) for read_chunked(). + """ + pass + + +class IncompleteRead(HTTPError, httplib_IncompleteRead): + """ + Response length doesn't match expected Content-Length + + Subclass of http_client.IncompleteRead to allow int value + for `partial` to avoid creating large objects on streamed + reads. + """ + def __init__(self, partial, expected): + super(IncompleteRead, self).__init__(partial, expected) + + def __repr__(self): + return ('IncompleteRead(%i bytes read, ' + '%i more expected)' % (self.partial, self.expected)) + + +class InvalidHeader(HTTPError): + "The header provided was somehow invalid." + pass + + +class ProxySchemeUnknown(AssertionError, ValueError): + "ProxyManager does not support the supplied scheme" + # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. + + def __init__(self, scheme): + message = "Not supported proxy scheme %s" % scheme + super(ProxySchemeUnknown, self).__init__(message) + + +class HeaderParsingError(HTTPError): + "Raised by assert_header_parsing, but we convert it to a log.warning statement." + def __init__(self, defects, unparsed_data): + message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data) + super(HeaderParsingError, self).__init__(message) + + +class UnrewindableBodyError(HTTPError): + "urllib3 encountered an error when trying to rewind a body" + pass diff --git a/dropbox-script/urllib3/fields.py b/dropbox-script/urllib3/fields.py new file mode 100644 index 0000000..37fe64a --- /dev/null +++ b/dropbox-script/urllib3/fields.py @@ -0,0 +1,178 @@ +from __future__ import absolute_import +import email.utils +import mimetypes + +from .packages import six + + +def guess_content_type(filename, default='application/octet-stream'): + """ + Guess the "Content-Type" of a file. + + :param filename: + The filename to guess the "Content-Type" of using :mod:`mimetypes`. + :param default: + If no "Content-Type" can be guessed, default to `default`. + """ + if filename: + return mimetypes.guess_type(filename)[0] or default + return default + + +def format_header_param(name, value): + """ + Helper function to format and quote a single header parameter. + + Particularly useful for header parameters which might contain + non-ASCII values, like file names. This follows RFC 2231, as + suggested by RFC 2388 Section 4.4. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + if not any(ch in value for ch in '"\\\r\n'): + result = '%s="%s"' % (name, value) + try: + result.encode('ascii') + except (UnicodeEncodeError, UnicodeDecodeError): + pass + else: + return result + if not six.PY3 and isinstance(value, six.text_type): # Python 2: + value = value.encode('utf-8') + value = email.utils.encode_rfc2231(value, 'utf-8') + value = '%s*=%s' % (name, value) + return value + + +class RequestField(object): + """ + A data container for request body parameters. + + :param name: + The name of this request field. + :param data: + The data/value body. + :param filename: + An optional filename of the request field. + :param headers: + An optional dict-like object of headers to initially use for the field. + """ + def __init__(self, name, data, filename=None, headers=None): + self._name = name + self._filename = filename + self.data = data + self.headers = {} + if headers: + self.headers = dict(headers) + + @classmethod + def from_tuples(cls, fieldname, value): + """ + A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. + + Supports constructing :class:`~urllib3.fields.RequestField` from + parameter of key/value strings AND key/filetuple. A filetuple is a + (filename, data, MIME type) tuple where the MIME type is optional. + For example:: + + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + + Field names and filenames must be unicode. + """ + if isinstance(value, tuple): + if len(value) == 3: + filename, data, content_type = value + else: + filename, data = value + content_type = guess_content_type(filename) + else: + filename = None + content_type = None + data = value + + request_param = cls(fieldname, data, filename=filename) + request_param.make_multipart(content_type=content_type) + + return request_param + + def _render_part(self, name, value): + """ + Overridable helper function to format a single header parameter. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + return format_header_param(name, value) + + def _render_parts(self, header_parts): + """ + Helper function to format and quote a single header. + + Useful for single headers that are composed of multiple items. E.g., + 'Content-Disposition' fields. + + :param header_parts: + A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format + as `k1="v1"; k2="v2"; ...`. + """ + parts = [] + iterable = header_parts + if isinstance(header_parts, dict): + iterable = header_parts.items() + + for name, value in iterable: + if value is not None: + parts.append(self._render_part(name, value)) + + return '; '.join(parts) + + def render_headers(self): + """ + Renders the headers for this request field. + """ + lines = [] + + sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location'] + for sort_key in sort_keys: + if self.headers.get(sort_key, False): + lines.append('%s: %s' % (sort_key, self.headers[sort_key])) + + for header_name, header_value in self.headers.items(): + if header_name not in sort_keys: + if header_value: + lines.append('%s: %s' % (header_name, header_value)) + + lines.append('\r\n') + return '\r\n'.join(lines) + + def make_multipart(self, content_disposition=None, content_type=None, + content_location=None): + """ + Makes this request field into a multipart request field. + + This method overrides "Content-Disposition", "Content-Type" and + "Content-Location" headers to the request parameter. + + :param content_type: + The 'Content-Type' of the request body. + :param content_location: + The 'Content-Location' of the request body. + + """ + self.headers['Content-Disposition'] = content_disposition or 'form-data' + self.headers['Content-Disposition'] += '; '.join([ + '', self._render_parts( + (('name', self._name), ('filename', self._filename)) + ) + ]) + self.headers['Content-Type'] = content_type + self.headers['Content-Location'] = content_location diff --git a/dropbox-script/urllib3/filepost.py b/dropbox-script/urllib3/filepost.py new file mode 100644 index 0000000..78f1e19 --- /dev/null +++ b/dropbox-script/urllib3/filepost.py @@ -0,0 +1,98 @@ +from __future__ import absolute_import +import binascii +import codecs +import os + +from io import BytesIO + +from .packages import six +from .packages.six import b +from .fields import RequestField + +writer = codecs.lookup('utf-8')[3] + + +def choose_boundary(): + """ + Our embarrassingly-simple replacement for mimetools.choose_boundary. + """ + boundary = binascii.hexlify(os.urandom(16)) + if six.PY3: + boundary = boundary.decode('ascii') + return boundary + + +def iter_field_objects(fields): + """ + Iterate over fields. + + Supports list of (k, v) tuples and dicts, and lists of + :class:`~urllib3.fields.RequestField`. + + """ + if isinstance(fields, dict): + i = six.iteritems(fields) + else: + i = iter(fields) + + for field in i: + if isinstance(field, RequestField): + yield field + else: + yield RequestField.from_tuples(*field) + + +def iter_fields(fields): + """ + .. deprecated:: 1.6 + + Iterate over fields. + + The addition of :class:`~urllib3.fields.RequestField` makes this function + obsolete. Instead, use :func:`iter_field_objects`, which returns + :class:`~urllib3.fields.RequestField` objects. + + Supports list of (k, v) tuples and dicts. + """ + if isinstance(fields, dict): + return ((k, v) for k, v in six.iteritems(fields)) + + return ((k, v) for k, v in fields) + + +def encode_multipart_formdata(fields, boundary=None): + """ + Encode a dictionary of ``fields`` using the multipart/form-data MIME format. + + :param fields: + Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). + + :param boundary: + If not specified, then a random boundary will be generated using + :func:`urllib3.filepost.choose_boundary`. + """ + body = BytesIO() + if boundary is None: + boundary = choose_boundary() + + for field in iter_field_objects(fields): + body.write(b('--%s\r\n' % (boundary))) + + writer(body).write(field.render_headers()) + data = field.data + + if isinstance(data, int): + data = str(data) # Backwards compatibility + + if isinstance(data, six.text_type): + writer(body).write(data) + else: + body.write(data) + + body.write(b'\r\n') + + body.write(b('--%s--\r\n' % (boundary))) + + content_type = str('multipart/form-data; boundary=%s' % boundary) + + return body.getvalue(), content_type diff --git a/dropbox-script/urllib3/poolmanager.py b/dropbox-script/urllib3/poolmanager.py new file mode 100644 index 0000000..fe5491c --- /dev/null +++ b/dropbox-script/urllib3/poolmanager.py @@ -0,0 +1,450 @@ +from __future__ import absolute_import +import collections +import functools +import logging + +from ._collections import RecentlyUsedContainer +from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool +from .connectionpool import port_by_scheme +from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown +from .packages.six.moves.urllib.parse import urljoin +from .request import RequestMethods +from .util.url import parse_url +from .util.retry import Retry + + +__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] + + +log = logging.getLogger(__name__) + +SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', + 'ssl_version', 'ca_cert_dir', 'ssl_context') + +# All known keyword arguments that could be provided to the pool manager, its +# pools, or the underlying connections. This is used to construct a pool key. +_key_fields = ( + 'key_scheme', # str + 'key_host', # str + 'key_port', # int + 'key_timeout', # int or float or Timeout + 'key_retries', # int or Retry + 'key_strict', # bool + 'key_block', # bool + 'key_source_address', # str + 'key_key_file', # str + 'key_cert_file', # str + 'key_cert_reqs', # str + 'key_ca_certs', # str + 'key_ssl_version', # str + 'key_ca_cert_dir', # str + 'key_ssl_context', # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext + 'key_maxsize', # int + 'key_headers', # dict + 'key__proxy', # parsed proxy url + 'key__proxy_headers', # dict + 'key_socket_options', # list of (level (int), optname (int), value (int or str)) tuples + 'key__socks_options', # dict + 'key_assert_hostname', # bool or string + 'key_assert_fingerprint', # str + 'key_server_hostname', #str +) + +#: The namedtuple class used to construct keys for the connection pool. +#: All custom key schemes should include the fields in this key at a minimum. +PoolKey = collections.namedtuple('PoolKey', _key_fields) + + +def _default_key_normalizer(key_class, request_context): + """ + Create a pool key out of a request context dictionary. + + According to RFC 3986, both the scheme and host are case-insensitive. + Therefore, this function normalizes both before constructing the pool + key for an HTTPS request. If you wish to change this behaviour, provide + alternate callables to ``key_fn_by_scheme``. + + :param key_class: + The class to use when constructing the key. This should be a namedtuple + with the ``scheme`` and ``host`` keys at a minimum. + :type key_class: namedtuple + :param request_context: + A dictionary-like object that contain the context for a request. + :type request_context: dict + + :return: A namedtuple that can be used as a connection pool key. + :rtype: PoolKey + """ + # Since we mutate the dictionary, make a copy first + context = request_context.copy() + context['scheme'] = context['scheme'].lower() + context['host'] = context['host'].lower() + + # These are both dictionaries and need to be transformed into frozensets + for key in ('headers', '_proxy_headers', '_socks_options'): + if key in context and context[key] is not None: + context[key] = frozenset(context[key].items()) + + # The socket_options key may be a list and needs to be transformed into a + # tuple. + socket_opts = context.get('socket_options') + if socket_opts is not None: + context['socket_options'] = tuple(socket_opts) + + # Map the kwargs to the names in the namedtuple - this is necessary since + # namedtuples can't have fields starting with '_'. + for key in list(context.keys()): + context['key_' + key] = context.pop(key) + + # Default to ``None`` for keys missing from the context + for field in key_class._fields: + if field not in context: + context[field] = None + + return key_class(**context) + + +#: A dictionary that maps a scheme to a callable that creates a pool key. +#: This can be used to alter the way pool keys are constructed, if desired. +#: Each PoolManager makes a copy of this dictionary so they can be configured +#: globally here, or individually on the instance. +key_fn_by_scheme = { + 'http': functools.partial(_default_key_normalizer, PoolKey), + 'https': functools.partial(_default_key_normalizer, PoolKey), +} + +pool_classes_by_scheme = { + 'http': HTTPConnectionPool, + 'https': HTTPSConnectionPool, +} + + +class PoolManager(RequestMethods): + """ + Allows for arbitrary requests while transparently keeping track of + necessary connection pools for you. + + :param num_pools: + Number of connection pools to cache before discarding the least + recently used pool. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param \\**connection_pool_kw: + Additional parameters are used to create fresh + :class:`urllib3.connectionpool.ConnectionPool` instances. + + Example:: + + >>> manager = PoolManager(num_pools=2) + >>> r = manager.request('GET', 'http://google.com/') + >>> r = manager.request('GET', 'http://google.com/mail') + >>> r = manager.request('GET', 'http://yahoo.com/') + >>> len(manager.pools) + 2 + + """ + + proxy = None + + def __init__(self, num_pools=10, headers=None, **connection_pool_kw): + RequestMethods.__init__(self, headers) + self.connection_pool_kw = connection_pool_kw + self.pools = RecentlyUsedContainer(num_pools, + dispose_func=lambda p: p.close()) + + # Locally set the pool classes and keys so other PoolManagers can + # override them. + self.pool_classes_by_scheme = pool_classes_by_scheme + self.key_fn_by_scheme = key_fn_by_scheme.copy() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.clear() + # Return False to re-raise any potential exceptions + return False + + def _new_pool(self, scheme, host, port, request_context=None): + """ + Create a new :class:`ConnectionPool` based on host, port, scheme, and + any additional pool keyword arguments. + + If ``request_context`` is provided, it is provided as keyword arguments + to the pool class used. This method is used to actually create the + connection pools handed out by :meth:`connection_from_url` and + companion methods. It is intended to be overridden for customization. + """ + pool_cls = self.pool_classes_by_scheme[scheme] + if request_context is None: + request_context = self.connection_pool_kw.copy() + + # Although the context has everything necessary to create the pool, + # this function has historically only used the scheme, host, and port + # in the positional args. When an API change is acceptable these can + # be removed. + for key in ('scheme', 'host', 'port'): + request_context.pop(key, None) + + if scheme == 'http': + for kw in SSL_KEYWORDS: + request_context.pop(kw, None) + + return pool_cls(host, port, **request_context) + + def clear(self): + """ + Empty our store of pools and direct them all to close. + + This will not affect in-flight connections, but they will not be + re-used after completion. + """ + self.pools.clear() + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + """ + Get a :class:`ConnectionPool` based on the host, port, and scheme. + + If ``port`` isn't given, it will be derived from the ``scheme`` using + ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is + provided, it is merged with the instance's ``connection_pool_kw`` + variable and used to create the new connection pool, if one is + needed. + """ + + if not host: + raise LocationValueError("No host specified.") + + request_context = self._merge_pool_kwargs(pool_kwargs) + request_context['scheme'] = scheme or 'http' + if not port: + port = port_by_scheme.get(request_context['scheme'].lower(), 80) + request_context['port'] = port + request_context['host'] = host + + return self.connection_from_context(request_context) + + def connection_from_context(self, request_context): + """ + Get a :class:`ConnectionPool` based on the request context. + + ``request_context`` must at least contain the ``scheme`` key and its + value must be a key in ``key_fn_by_scheme`` instance variable. + """ + scheme = request_context['scheme'].lower() + pool_key_constructor = self.key_fn_by_scheme[scheme] + pool_key = pool_key_constructor(request_context) + + return self.connection_from_pool_key(pool_key, request_context=request_context) + + def connection_from_pool_key(self, pool_key, request_context=None): + """ + Get a :class:`ConnectionPool` based on the provided pool key. + + ``pool_key`` should be a namedtuple that only contains immutable + objects. At a minimum it must have the ``scheme``, ``host``, and + ``port`` fields. + """ + with self.pools.lock: + # If the scheme, host, or port doesn't match existing open + # connections, open a new ConnectionPool. + pool = self.pools.get(pool_key) + if pool: + return pool + + # Make a fresh ConnectionPool of the desired type + scheme = request_context['scheme'] + host = request_context['host'] + port = request_context['port'] + pool = self._new_pool(scheme, host, port, request_context=request_context) + self.pools[pool_key] = pool + + return pool + + def connection_from_url(self, url, pool_kwargs=None): + """ + Similar to :func:`urllib3.connectionpool.connection_from_url`. + + If ``pool_kwargs`` is not provided and a new pool needs to be + constructed, ``self.connection_pool_kw`` is used to initialize + the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` + is provided, it is used instead. Note that if a new pool does not + need to be created for the request, the provided ``pool_kwargs`` are + not used. + """ + u = parse_url(url) + return self.connection_from_host(u.host, port=u.port, scheme=u.scheme, + pool_kwargs=pool_kwargs) + + def _merge_pool_kwargs(self, override): + """ + Merge a dictionary of override values for self.connection_pool_kw. + + This does not modify self.connection_pool_kw and returns a new dict. + Any keys in the override dictionary with a value of ``None`` are + removed from the merged dictionary. + """ + base_pool_kwargs = self.connection_pool_kw.copy() + if override: + for key, value in override.items(): + if value is None: + try: + del base_pool_kwargs[key] + except KeyError: + pass + else: + base_pool_kwargs[key] = value + return base_pool_kwargs + + def urlopen(self, method, url, redirect=True, **kw): + """ + Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` + with custom cross-host redirect logic and only sends the request-uri + portion of the ``url``. + + The given ``url`` parameter must be absolute, such that an appropriate + :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. + """ + u = parse_url(url) + conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + kw['assert_same_host'] = False + kw['redirect'] = False + + if 'headers' not in kw: + kw['headers'] = self.headers.copy() + + if self.proxy is not None and u.scheme == "http": + response = conn.urlopen(method, url, **kw) + else: + response = conn.urlopen(method, u.request_uri, **kw) + + redirect_location = redirect and response.get_redirect_location() + if not redirect_location: + return response + + # Support relative URLs for redirecting. + redirect_location = urljoin(url, redirect_location) + + # RFC 7231, Section 6.4.4 + if response.status == 303: + method = 'GET' + + retries = kw.get('retries') + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect) + + # Strip headers marked as unsafe to forward to the redirected location. + # Check remove_headers_on_redirect to avoid a potential network call within + # conn.is_same_host() which may use socket.gethostbyname() in the future. + if (retries.remove_headers_on_redirect + and not conn.is_same_host(redirect_location)): + for header in retries.remove_headers_on_redirect: + kw['headers'].pop(header, None) + + try: + retries = retries.increment(method, url, response=response, _pool=conn) + except MaxRetryError: + if retries.raise_on_redirect: + raise + return response + + kw['retries'] = retries + kw['redirect'] = redirect + + log.info("Redirecting %s -> %s", url, redirect_location) + return self.urlopen(method, redirect_location, **kw) + + +class ProxyManager(PoolManager): + """ + Behaves just like :class:`PoolManager`, but sends all requests through + the defined proxy, using the CONNECT method for HTTPS URLs. + + :param proxy_url: + The URL of the proxy to be used. + + :param proxy_headers: + A dictionary containing headers that will be sent to the proxy. In case + of HTTP they are being sent with each request, while in the + HTTPS/CONNECT case they are sent only once. Could be used for proxy + authentication. + + Example: + >>> proxy = urllib3.ProxyManager('http://localhost:3128/') + >>> r1 = proxy.request('GET', 'http://google.com/') + >>> r2 = proxy.request('GET', 'http://httpbin.org/') + >>> len(proxy.pools) + 1 + >>> r3 = proxy.request('GET', 'https://httpbin.org/') + >>> r4 = proxy.request('GET', 'https://twitter.com/') + >>> len(proxy.pools) + 3 + + """ + + def __init__(self, proxy_url, num_pools=10, headers=None, + proxy_headers=None, **connection_pool_kw): + + if isinstance(proxy_url, HTTPConnectionPool): + proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host, + proxy_url.port) + proxy = parse_url(proxy_url) + if not proxy.port: + port = port_by_scheme.get(proxy.scheme, 80) + proxy = proxy._replace(port=port) + + if proxy.scheme not in ("http", "https"): + raise ProxySchemeUnknown(proxy.scheme) + + self.proxy = proxy + self.proxy_headers = proxy_headers or {} + + connection_pool_kw['_proxy'] = self.proxy + connection_pool_kw['_proxy_headers'] = self.proxy_headers + + super(ProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw) + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + if scheme == "https": + return super(ProxyManager, self).connection_from_host( + host, port, scheme, pool_kwargs=pool_kwargs) + + return super(ProxyManager, self).connection_from_host( + self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs) + + def _set_proxy_headers(self, url, headers=None): + """ + Sets headers needed by proxies: specifically, the Accept and Host + headers. Only sets headers not provided by the user. + """ + headers_ = {'Accept': '*/*'} + + netloc = parse_url(url).netloc + if netloc: + headers_['Host'] = netloc + + if headers: + headers_.update(headers) + return headers_ + + def urlopen(self, method, url, redirect=True, **kw): + "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." + u = parse_url(url) + + if u.scheme == "http": + # For proxied HTTPS requests, httplib sets the necessary headers + # on the CONNECT to the proxy. For HTTP, we'll definitely + # need to set 'Host' at the very least. + headers = kw.get('headers', self.headers) + kw['headers'] = self._set_proxy_headers(url, headers) + + return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) + + +def proxy_from_url(url, **kw): + return ProxyManager(proxy_url=url, **kw) diff --git a/dropbox-script/urllib3/request.py b/dropbox-script/urllib3/request.py new file mode 100644 index 0000000..8f2f44b --- /dev/null +++ b/dropbox-script/urllib3/request.py @@ -0,0 +1,150 @@ +from __future__ import absolute_import + +from .filepost import encode_multipart_formdata +from .packages.six.moves.urllib.parse import urlencode + + +__all__ = ['RequestMethods'] + + +class RequestMethods(object): + """ + Convenience mixin for classes who implement a :meth:`urlopen` method, such + as :class:`~urllib3.connectionpool.HTTPConnectionPool` and + :class:`~urllib3.poolmanager.PoolManager`. + + Provides behavior for making common types of HTTP request methods and + decides which type of request field encoding to use. + + Specifically, + + :meth:`.request_encode_url` is for sending requests whose fields are + encoded in the URL (such as GET, HEAD, DELETE). + + :meth:`.request_encode_body` is for sending requests whose fields are + encoded in the *body* of the request using multipart or www-form-urlencoded + (such as for POST, PUT, PATCH). + + :meth:`.request` is for making any kind of request, it will look up the + appropriate encoding format and use one of the above two methods to make + the request. + + Initializer parameters: + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + """ + + _encode_url_methods = {'DELETE', 'GET', 'HEAD', 'OPTIONS'} + + def __init__(self, headers=None): + self.headers = headers or {} + + def urlopen(self, method, url, body=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **kw): # Abstract + raise NotImplementedError("Classes extending RequestMethods must implement " + "their own ``urlopen`` method.") + + def request(self, method, url, fields=None, headers=None, **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the appropriate encoding of + ``fields`` based on the ``method`` used. + + This is a convenience method that requires the least amount of manual + effort. It can be used in most situations, while still having the + option to drop down to more specific methods when necessary, such as + :meth:`request_encode_url`, :meth:`request_encode_body`, + or even the lowest level :meth:`urlopen`. + """ + method = method.upper() + + urlopen_kw['request_url'] = url + + if method in self._encode_url_methods: + return self.request_encode_url(method, url, fields=fields, + headers=headers, + **urlopen_kw) + else: + return self.request_encode_body(method, url, fields=fields, + headers=headers, + **urlopen_kw) + + def request_encode_url(self, method, url, fields=None, headers=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the url. This is useful for request methods like GET, HEAD, DELETE, etc. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': headers} + extra_kw.update(urlopen_kw) + + if fields: + url += '?' + urlencode(fields) + + return self.urlopen(method, url, **extra_kw) + + def request_encode_body(self, method, url, fields=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the body. This is useful for request methods like POST, PUT, PATCH, etc. + + When ``encode_multipart=True`` (default), then + :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode + the payload with the appropriate content type. Otherwise + :meth:`urllib.urlencode` is used with the + 'application/x-www-form-urlencoded' content type. + + Multipart encoding must be used when posting files, and it's reasonably + safe to use it in other times too. However, it may break request + signing, such as with OAuth. + + Supports an optional ``fields`` parameter of key/value strings AND + key/filetuple. A filetuple is a (filename, data, MIME type) tuple where + the MIME type is optional. For example:: + + fields = { + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), + 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + } + + When uploading a file, providing a filename (the first parameter of the + tuple) is optional but recommended to best mimic behavior of browsers. + + Note that if ``headers`` are supplied, the 'Content-Type' header will + be overwritten because it depends on the dynamic random boundary string + which is used to compose the body of the request. The random boundary + string can be explicitly set with the ``multipart_boundary`` parameter. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': {}} + + if fields: + if 'body' in urlopen_kw: + raise TypeError( + "request got values for both 'fields' and 'body', can only specify one.") + + if encode_multipart: + body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary) + else: + body, content_type = urlencode(fields), 'application/x-www-form-urlencoded' + + extra_kw['body'] = body + extra_kw['headers'] = {'Content-Type': content_type} + + extra_kw['headers'].update(headers) + extra_kw.update(urlopen_kw) + + return self.urlopen(method, url, **extra_kw) diff --git a/dropbox-script/urllib3/response.py b/dropbox-script/urllib3/response.py new file mode 100644 index 0000000..c112690 --- /dev/null +++ b/dropbox-script/urllib3/response.py @@ -0,0 +1,705 @@ +from __future__ import absolute_import +from contextlib import contextmanager +import zlib +import io +import logging +from socket import timeout as SocketTimeout +from socket import error as SocketError + +from ._collections import HTTPHeaderDict +from .exceptions import ( + BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError, + ResponseNotChunked, IncompleteRead, InvalidHeader +) +from .packages.six import string_types as basestring, PY3 +from .packages.six.moves import http_client as httplib +from .connection import HTTPException, BaseSSLError +from .util.response import is_fp_closed, is_response_to_head + +log = logging.getLogger(__name__) + + +class DeflateDecoder(object): + + def __init__(self): + self._first_try = True + self._data = b'' + self._obj = zlib.decompressobj() + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + if not data: + return data + + if not self._first_try: + return self._obj.decompress(data) + + self._data += data + try: + decompressed = self._obj.decompress(data) + if decompressed: + self._first_try = False + self._data = None + return decompressed + except zlib.error: + self._first_try = False + self._obj = zlib.decompressobj(-zlib.MAX_WBITS) + try: + return self.decompress(self._data) + finally: + self._data = None + + +class GzipDecoderState(object): + + FIRST_MEMBER = 0 + OTHER_MEMBERS = 1 + SWALLOW_DATA = 2 + + +class GzipDecoder(object): + + def __init__(self): + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + self._state = GzipDecoderState.FIRST_MEMBER + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + ret = bytearray() + if self._state == GzipDecoderState.SWALLOW_DATA or not data: + return bytes(ret) + while True: + try: + ret += self._obj.decompress(data) + except zlib.error: + previous_state = self._state + # Ignore data after the first error + self._state = GzipDecoderState.SWALLOW_DATA + if previous_state == GzipDecoderState.OTHER_MEMBERS: + # Allow trailing garbage acceptable in other gzip clients + return bytes(ret) + raise + data = self._obj.unused_data + if not data: + return bytes(ret) + self._state = GzipDecoderState.OTHER_MEMBERS + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + + +class MultiDecoder(object): + """ + From RFC7231: + If one or more encodings have been applied to a representation, the + sender that applied the encodings MUST generate a Content-Encoding + header field that lists the content codings in the order in which + they were applied. + """ + + def __init__(self, modes): + self._decoders = [_get_decoder(m.strip()) for m in modes.split(',')] + + def flush(self): + return self._decoders[0].flush() + + def decompress(self, data): + for d in reversed(self._decoders): + data = d.decompress(data) + return data + + +def _get_decoder(mode): + if ',' in mode: + return MultiDecoder(mode) + + if mode == 'gzip': + return GzipDecoder() + + return DeflateDecoder() + + +class HTTPResponse(io.IOBase): + """ + HTTP Response container. + + Backwards-compatible to httplib's HTTPResponse but the response ``body`` is + loaded and decoded on-demand when the ``data`` property is accessed. This + class is also compatible with the Python standard library's :mod:`io` + module, and can hence be treated as a readable object in the context of that + framework. + + Extra parameters for behaviour not present in httplib.HTTPResponse: + + :param preload_content: + If True, the response's body will be preloaded during construction. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param original_response: + When this HTTPResponse wrapper is generated from an httplib.HTTPResponse + object, it's convenient to include the original for debug purposes. It's + otherwise unused. + + :param retries: + The retries contains the last :class:`~urllib3.util.retry.Retry` that + was used during the request. + + :param enforce_content_length: + Enforce content length checking. Body returned by server must match + value of Content-Length header, if present. Otherwise, raise error. + """ + + CONTENT_DECODERS = ['gzip', 'deflate'] + REDIRECT_STATUSES = [301, 302, 303, 307, 308] + + def __init__(self, body='', headers=None, status=0, version=0, reason=None, + strict=0, preload_content=True, decode_content=True, + original_response=None, pool=None, connection=None, msg=None, + retries=None, enforce_content_length=False, + request_method=None, request_url=None): + + if isinstance(headers, HTTPHeaderDict): + self.headers = headers + else: + self.headers = HTTPHeaderDict(headers) + self.status = status + self.version = version + self.reason = reason + self.strict = strict + self.decode_content = decode_content + self.retries = retries + self.enforce_content_length = enforce_content_length + + self._decoder = None + self._body = None + self._fp = None + self._original_response = original_response + self._fp_bytes_read = 0 + self.msg = msg + self._request_url = request_url + + if body and isinstance(body, (basestring, bytes)): + self._body = body + + self._pool = pool + self._connection = connection + + if hasattr(body, 'read'): + self._fp = body + + # Are we using the chunked-style of transfer encoding? + self.chunked = False + self.chunk_left = None + tr_enc = self.headers.get('transfer-encoding', '').lower() + # Don't incur the penalty of creating a list and then discarding it + encodings = (enc.strip() for enc in tr_enc.split(",")) + if "chunked" in encodings: + self.chunked = True + + # Determine length of response + self.length_remaining = self._init_length(request_method) + + # If requested, preload the body. + if preload_content and not self._body: + self._body = self.read(decode_content=decode_content) + + def get_redirect_location(self): + """ + Should we redirect and where to? + + :returns: Truthy redirect location string if we got a redirect status + code and valid location. ``None`` if redirect status and no + location. ``False`` if not a redirect status code. + """ + if self.status in self.REDIRECT_STATUSES: + return self.headers.get('location') + + return False + + def release_conn(self): + if not self._pool or not self._connection: + return + + self._pool._put_conn(self._connection) + self._connection = None + + @property + def data(self): + # For backwords-compat with earlier urllib3 0.4 and earlier. + if self._body: + return self._body + + if self._fp: + return self.read(cache_content=True) + + @property + def connection(self): + return self._connection + + def isclosed(self): + return is_fp_closed(self._fp) + + def tell(self): + """ + Obtain the number of bytes pulled over the wire so far. May differ from + the amount of content returned by :meth:``HTTPResponse.read`` if bytes + are encoded on the wire (e.g, compressed). + """ + return self._fp_bytes_read + + def _init_length(self, request_method): + """ + Set initial length value for Response content if available. + """ + length = self.headers.get('content-length') + + if length is not None: + if self.chunked: + # This Response will fail with an IncompleteRead if it can't be + # received as chunked. This method falls back to attempt reading + # the response before raising an exception. + log.warning("Received response with both Content-Length and " + "Transfer-Encoding set. This is expressly forbidden " + "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " + "attempting to process response as Transfer-Encoding: " + "chunked.") + return None + + try: + # RFC 7230 section 3.3.2 specifies multiple content lengths can + # be sent in a single Content-Length header + # (e.g. Content-Length: 42, 42). This line ensures the values + # are all valid ints and that as long as the `set` length is 1, + # all values are the same. Otherwise, the header is invalid. + lengths = set([int(val) for val in length.split(',')]) + if len(lengths) > 1: + raise InvalidHeader("Content-Length contained multiple " + "unmatching values (%s)" % length) + length = lengths.pop() + except ValueError: + length = None + else: + if length < 0: + length = None + + # Convert status to int for comparison + # In some cases, httplib returns a status of "_UNKNOWN" + try: + status = int(self.status) + except ValueError: + status = 0 + + # Check for responses that shouldn't include a body + if status in (204, 304) or 100 <= status < 200 or request_method == 'HEAD': + length = 0 + + return length + + def _init_decoder(self): + """ + Set-up the _decoder attribute if necessary. + """ + # Note: content-encoding value should be case-insensitive, per RFC 7230 + # Section 3.2 + content_encoding = self.headers.get('content-encoding', '').lower() + if self._decoder is None: + if content_encoding in self.CONTENT_DECODERS: + self._decoder = _get_decoder(content_encoding) + elif ',' in content_encoding: + encodings = [e.strip() for e in content_encoding.split(',') if e.strip() in self.CONTENT_DECODERS] + if len(encodings): + self._decoder = _get_decoder(content_encoding) + + def _decode(self, data, decode_content, flush_decoder): + """ + Decode the data passed in and potentially flush the decoder. + """ + try: + if decode_content and self._decoder: + data = self._decoder.decompress(data) + except (IOError, zlib.error) as e: + content_encoding = self.headers.get('content-encoding', '').lower() + raise DecodeError( + "Received response with content-encoding: %s, but " + "failed to decode it." % content_encoding, e) + + if flush_decoder and decode_content: + data += self._flush_decoder() + + return data + + def _flush_decoder(self): + """ + Flushes the decoder. Should only be called if the decoder is actually + being used. + """ + if self._decoder: + buf = self._decoder.decompress(b'') + return buf + self._decoder.flush() + + return b'' + + @contextmanager + def _error_catcher(self): + """ + Catch low-level python exceptions, instead re-raising urllib3 + variants, so that low-level exceptions are not leaked in the + high-level api. + + On exit, release the connection back to the pool. + """ + clean_exit = False + + try: + try: + yield + + except SocketTimeout: + # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but + # there is yet no clean way to get at it from this context. + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except BaseSSLError as e: + # FIXME: Is there a better way to differentiate between SSLErrors? + if 'read operation timed out' not in str(e): # Defensive: + # This shouldn't happen but just in case we're missing an edge + # case, let's avoid swallowing SSL errors. + raise + + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except (HTTPException, SocketError) as e: + # This includes IncompleteRead. + raise ProtocolError('Connection broken: %r' % e, e) + + # If no exception is thrown, we should avoid cleaning up + # unnecessarily. + clean_exit = True + finally: + # If we didn't terminate cleanly, we need to throw away our + # connection. + if not clean_exit: + # The response may not be closed but we're not going to use it + # anymore so close it now to ensure that the connection is + # released back to the pool. + if self._original_response: + self._original_response.close() + + # Closing the response may not actually be sufficient to close + # everything, so if we have a hold of the connection close that + # too. + if self._connection: + self._connection.close() + + # If we hold the original response but it's closed now, we should + # return the connection back to the pool. + if self._original_response and self._original_response.isclosed(): + self.release_conn() + + def read(self, amt=None, decode_content=None, cache_content=False): + """ + Similar to :meth:`httplib.HTTPResponse.read`, but with two additional + parameters: ``decode_content`` and ``cache_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param cache_content: + If True, will save the returned data such that the same result is + returned despite of the state of the underlying file object. This + is useful if you want the ``.data`` property to continue working + after having ``.read()`` the file object. (Overridden if ``amt`` is + set.) + """ + self._init_decoder() + if decode_content is None: + decode_content = self.decode_content + + if self._fp is None: + return + + flush_decoder = False + data = None + + with self._error_catcher(): + if amt is None: + # cStringIO doesn't like amt=None + data = self._fp.read() + flush_decoder = True + else: + cache_content = False + data = self._fp.read(amt) + if amt != 0 and not data: # Platform-specific: Buggy versions of Python. + # Close the connection when no data is returned + # + # This is redundant to what httplib/http.client _should_ + # already do. However, versions of python released before + # December 15, 2012 (http://bugs.python.org/issue16298) do + # not properly close the connection in all cases. There is + # no harm in redundantly calling close. + self._fp.close() + flush_decoder = True + if self.enforce_content_length and self.length_remaining not in (0, None): + # This is an edge case that httplib failed to cover due + # to concerns of backward compatibility. We're + # addressing it here to make sure IncompleteRead is + # raised during streaming, so all calls with incorrect + # Content-Length are caught. + raise IncompleteRead(self._fp_bytes_read, self.length_remaining) + + if data: + self._fp_bytes_read += len(data) + if self.length_remaining is not None: + self.length_remaining -= len(data) + + data = self._decode(data, decode_content, flush_decoder) + + if cache_content: + self._body = data + + return data + + def stream(self, amt=2**16, decode_content=None): + """ + A generator wrapper for the read() method. A call will block until + ``amt`` bytes have been read from the connection or until the + connection is closed. + + :param amt: + How much of the content to read. The generator will return up to + much data per iteration, but may return less. This is particularly + likely when using compressed data. However, the empty string will + never be returned. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + if self.chunked and self.supports_chunked_reads(): + for line in self.read_chunked(amt, decode_content=decode_content): + yield line + else: + while not is_fp_closed(self._fp): + data = self.read(amt=amt, decode_content=decode_content) + + if data: + yield data + + @classmethod + def from_httplib(ResponseCls, r, **response_kw): + """ + Given an :class:`httplib.HTTPResponse` instance ``r``, return a + corresponding :class:`urllib3.response.HTTPResponse` object. + + Remaining parameters are passed to the HTTPResponse constructor, along + with ``original_response=r``. + """ + headers = r.msg + + if not isinstance(headers, HTTPHeaderDict): + if PY3: # Python 3 + headers = HTTPHeaderDict(headers.items()) + else: # Python 2 + headers = HTTPHeaderDict.from_httplib(headers) + + # HTTPResponse objects in Python 3 don't have a .strict attribute + strict = getattr(r, 'strict', 0) + resp = ResponseCls(body=r, + headers=headers, + status=r.status, + version=r.version, + reason=r.reason, + strict=strict, + original_response=r, + **response_kw) + return resp + + # Backwards-compatibility methods for httplib.HTTPResponse + def getheaders(self): + return self.headers + + def getheader(self, name, default=None): + return self.headers.get(name, default) + + # Backwards compatibility for http.cookiejar + def info(self): + return self.headers + + # Overrides from io.IOBase + def close(self): + if not self.closed: + self._fp.close() + + if self._connection: + self._connection.close() + + @property + def closed(self): + if self._fp is None: + return True + elif hasattr(self._fp, 'isclosed'): + return self._fp.isclosed() + elif hasattr(self._fp, 'closed'): + return self._fp.closed + else: + return True + + def fileno(self): + if self._fp is None: + raise IOError("HTTPResponse has no file to get a fileno from") + elif hasattr(self._fp, "fileno"): + return self._fp.fileno() + else: + raise IOError("The file-like object this HTTPResponse is wrapped " + "around has no file descriptor") + + def flush(self): + if self._fp is not None and hasattr(self._fp, 'flush'): + return self._fp.flush() + + def readable(self): + # This method is required for `io` module compatibility. + return True + + def readinto(self, b): + # This method is required for `io` module compatibility. + temp = self.read(len(b)) + if len(temp) == 0: + return 0 + else: + b[:len(temp)] = temp + return len(temp) + + def supports_chunked_reads(self): + """ + Checks if the underlying file-like object looks like a + httplib.HTTPResponse object. We do this by testing for the fp + attribute. If it is present we assume it returns raw chunks as + processed by read_chunked(). + """ + return hasattr(self._fp, 'fp') + + def _update_chunk_length(self): + # First, we'll figure out length of a chunk and then + # we'll try to read it from socket. + if self.chunk_left is not None: + return + line = self._fp.fp.readline() + line = line.split(b';', 1)[0] + try: + self.chunk_left = int(line, 16) + except ValueError: + # Invalid chunked protocol response, abort. + self.close() + raise httplib.IncompleteRead(line) + + def _handle_chunk(self, amt): + returned_chunk = None + if amt is None: + chunk = self._fp._safe_read(self.chunk_left) + returned_chunk = chunk + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + elif amt < self.chunk_left: + value = self._fp._safe_read(amt) + self.chunk_left = self.chunk_left - amt + returned_chunk = value + elif amt == self.chunk_left: + value = self._fp._safe_read(amt) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + returned_chunk = value + else: # amt > self.chunk_left + returned_chunk = self._fp._safe_read(self.chunk_left) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + return returned_chunk + + def read_chunked(self, amt=None, decode_content=None): + """ + Similar to :meth:`HTTPResponse.read`, but with an additional + parameter: ``decode_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + self._init_decoder() + # FIXME: Rewrite this method and make it a class with a better structured logic. + if not self.chunked: + raise ResponseNotChunked( + "Response is not chunked. " + "Header 'transfer-encoding: chunked' is missing.") + if not self.supports_chunked_reads(): + raise BodyNotHttplibCompatible( + "Body should be httplib.HTTPResponse like. " + "It should have have an fp attribute which returns raw chunks.") + + with self._error_catcher(): + # Don't bother reading the body of a HEAD request. + if self._original_response and is_response_to_head(self._original_response): + self._original_response.close() + return + + # If a response is already read and closed + # then return immediately. + if self._fp.fp is None: + return + + while True: + self._update_chunk_length() + if self.chunk_left == 0: + break + chunk = self._handle_chunk(amt) + decoded = self._decode(chunk, decode_content=decode_content, + flush_decoder=False) + if decoded: + yield decoded + + if decode_content: + # On CPython and PyPy, we should never need to flush the + # decoder. However, on Jython we *might* need to, so + # lets defensively do it anyway. + decoded = self._flush_decoder() + if decoded: # Platform-specific: Jython. + yield decoded + + # Chunk content ends with \r\n: discard it. + while True: + line = self._fp.fp.readline() + if not line: + # Some sites may not end with '\r\n'. + break + if line == b'\r\n': + break + + # We read everything; close the "file". + if self._original_response: + self._original_response.close() + + def geturl(self): + """ + Returns the URL that was the source of this response. + If the request that generated this response redirected, this method + will return the final redirect location. + """ + if self.retries is not None and len(self.retries.history): + return self.retries.history[-1].redirect_location + else: + return self._request_url diff --git a/dropbox-script/urllib3/util/__init__.py b/dropbox-script/urllib3/util/__init__.py new file mode 100644 index 0000000..2f2770b --- /dev/null +++ b/dropbox-script/urllib3/util/__init__.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import +# For backwards compatibility, provide imports that used to be here. +from .connection import is_connection_dropped +from .request import make_headers +from .response import is_fp_closed +from .ssl_ import ( + SSLContext, + HAS_SNI, + IS_PYOPENSSL, + IS_SECURETRANSPORT, + assert_fingerprint, + resolve_cert_reqs, + resolve_ssl_version, + ssl_wrap_socket, +) +from .timeout import ( + current_time, + Timeout, +) + +from .retry import Retry +from .url import ( + get_host, + parse_url, + split_first, + Url, +) +from .wait import ( + wait_for_read, + wait_for_write +) + +__all__ = ( + 'HAS_SNI', + 'IS_PYOPENSSL', + 'IS_SECURETRANSPORT', + 'SSLContext', + 'Retry', + 'Timeout', + 'Url', + 'assert_fingerprint', + 'current_time', + 'is_connection_dropped', + 'is_fp_closed', + 'get_host', + 'parse_url', + 'make_headers', + 'resolve_cert_reqs', + 'resolve_ssl_version', + 'split_first', + 'ssl_wrap_socket', + 'wait_for_read', + 'wait_for_write' +) diff --git a/dropbox-script/urllib3/util/connection.py b/dropbox-script/urllib3/util/connection.py new file mode 100644 index 0000000..5ad70b2 --- /dev/null +++ b/dropbox-script/urllib3/util/connection.py @@ -0,0 +1,134 @@ +from __future__ import absolute_import +import socket +from .wait import NoWayToWaitForSocketError, wait_for_read +from ..contrib import _appengine_environ + + +def is_connection_dropped(conn): # Platform-specific + """ + Returns True if the connection is dropped and should be closed. + + :param conn: + :class:`httplib.HTTPConnection` object. + + Note: For platforms like AppEngine, this will always return ``False`` to + let the platform handle connection recycling transparently for us. + """ + sock = getattr(conn, 'sock', False) + if sock is False: # Platform-specific: AppEngine + return False + if sock is None: # Connection already closed (such as by httplib). + return True + try: + # Returns True if readable, which here means it's been dropped + return wait_for_read(sock, timeout=0.0) + except NoWayToWaitForSocketError: # Platform-specific: AppEngine + return False + + +# This function is copied from socket.py in the Python 2.7 standard +# library test suite. Added to its signature is only `socket_options`. +# One additional modification is that we avoid binding to IPv6 servers +# discovered in DNS if the system doesn't have IPv6 functionality. +def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + source_address=None, socket_options=None): + """Connect to *address* and return the socket object. + + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :func:`getdefaulttimeout` + is used. If *source_address* is set it must be a tuple of (host, port) + for the socket to bind as a source address before making the connection. + An host of '' or port 0 tells the OS to use the default. + """ + + host, port = address + if host.startswith('['): + host = host.strip('[]') + err = None + + # Using the value from allowed_gai_family() in the context of getaddrinfo lets + # us select whether to work with IPv4 DNS records, IPv6 records, or both. + # The original create_connection function always returns all records. + family = allowed_gai_family() + + for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = socket.socket(af, socktype, proto) + + # If provided, set socket level options before connecting. + _set_socket_options(sock, socket_options) + + if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: + sock.settimeout(timeout) + if source_address: + sock.bind(source_address) + sock.connect(sa) + return sock + + except socket.error as e: + err = e + if sock is not None: + sock.close() + sock = None + + if err is not None: + raise err + + raise socket.error("getaddrinfo returns an empty list") + + +def _set_socket_options(sock, options): + if options is None: + return + + for opt in options: + sock.setsockopt(*opt) + + +def allowed_gai_family(): + """This function is designed to work in the context of + getaddrinfo, where family=socket.AF_UNSPEC is the default and + will perform a DNS search for both IPv6 and IPv4 records.""" + + family = socket.AF_INET + if HAS_IPV6: + family = socket.AF_UNSPEC + return family + + +def _has_ipv6(host): + """ Returns True if the system can bind an IPv6 address. """ + sock = None + has_ipv6 = False + + # App Engine doesn't support IPV6 sockets and actually has a quota on the + # number of sockets that can be used, so just early out here instead of + # creating a socket needlessly. + # See https://github.com/urllib3/urllib3/issues/1446 + if _appengine_environ.is_appengine_sandbox(): + return False + + if socket.has_ipv6: + # has_ipv6 returns true if cPython was compiled with IPv6 support. + # It does not tell us if the system has IPv6 support enabled. To + # determine that we must bind to an IPv6 address. + # https://github.com/shazow/urllib3/pull/611 + # https://bugs.python.org/issue658327 + try: + sock = socket.socket(socket.AF_INET6) + sock.bind((host, 0)) + has_ipv6 = True + except Exception: + pass + + if sock: + sock.close() + return has_ipv6 + + +HAS_IPV6 = _has_ipv6('::1') diff --git a/dropbox-script/urllib3/util/queue.py b/dropbox-script/urllib3/util/queue.py new file mode 100644 index 0000000..d3d379a --- /dev/null +++ b/dropbox-script/urllib3/util/queue.py @@ -0,0 +1,21 @@ +import collections +from ..packages import six +from ..packages.six.moves import queue + +if six.PY2: + # Queue is imported for side effects on MS Windows. See issue #229. + import Queue as _unused_module_Queue # noqa: F401 + + +class LifoQueue(queue.Queue): + def _init(self, _): + self.queue = collections.deque() + + def _qsize(self, len=len): + return len(self.queue) + + def _put(self, item): + self.queue.append(item) + + def _get(self): + return self.queue.pop() diff --git a/dropbox-script/urllib3/util/request.py b/dropbox-script/urllib3/util/request.py new file mode 100644 index 0000000..3ddfcd5 --- /dev/null +++ b/dropbox-script/urllib3/util/request.py @@ -0,0 +1,118 @@ +from __future__ import absolute_import +from base64 import b64encode + +from ..packages.six import b, integer_types +from ..exceptions import UnrewindableBodyError + +ACCEPT_ENCODING = 'gzip,deflate' +_FAILEDTELL = object() + + +def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, + basic_auth=None, proxy_basic_auth=None, disable_cache=None): + """ + Shortcuts for generating request headers. + + :param keep_alive: + If ``True``, adds 'connection: keep-alive' header. + + :param accept_encoding: + Can be a boolean, list, or string. + ``True`` translates to 'gzip,deflate'. + List will get joined by comma. + String will be used as provided. + + :param user_agent: + String representing the user-agent you want, such as + "python-urllib3/0.6" + + :param basic_auth: + Colon-separated username:password string for 'authorization: basic ...' + auth header. + + :param proxy_basic_auth: + Colon-separated username:password string for 'proxy-authorization: basic ...' + auth header. + + :param disable_cache: + If ``True``, adds 'cache-control: no-cache' header. + + Example:: + + >>> make_headers(keep_alive=True, user_agent="Batman/1.0") + {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} + >>> make_headers(accept_encoding=True) + {'accept-encoding': 'gzip,deflate'} + """ + headers = {} + if accept_encoding: + if isinstance(accept_encoding, str): + pass + elif isinstance(accept_encoding, list): + accept_encoding = ','.join(accept_encoding) + else: + accept_encoding = ACCEPT_ENCODING + headers['accept-encoding'] = accept_encoding + + if user_agent: + headers['user-agent'] = user_agent + + if keep_alive: + headers['connection'] = 'keep-alive' + + if basic_auth: + headers['authorization'] = 'Basic ' + \ + b64encode(b(basic_auth)).decode('utf-8') + + if proxy_basic_auth: + headers['proxy-authorization'] = 'Basic ' + \ + b64encode(b(proxy_basic_auth)).decode('utf-8') + + if disable_cache: + headers['cache-control'] = 'no-cache' + + return headers + + +def set_file_position(body, pos): + """ + If a position is provided, move file to that point. + Otherwise, we'll attempt to record a position for future use. + """ + if pos is not None: + rewind_body(body, pos) + elif getattr(body, 'tell', None) is not None: + try: + pos = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body. + pos = _FAILEDTELL + + return pos + + +def rewind_body(body, body_pos): + """ + Attempt to rewind body to a certain position. + Primarily used for request redirects and retries. + + :param body: + File-like object that supports seek. + + :param int pos: + Position to seek to in file. + """ + body_seek = getattr(body, 'seek', None) + if body_seek is not None and isinstance(body_pos, integer_types): + try: + body_seek(body_pos) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect/retry.") + elif body_pos is _FAILEDTELL: + raise UnrewindableBodyError("Unable to record file position for rewinding " + "request body during a redirect/retry.") + else: + raise ValueError("body_pos must be of type integer, " + "instead it was %s." % type(body_pos)) diff --git a/dropbox-script/urllib3/util/response.py b/dropbox-script/urllib3/util/response.py new file mode 100644 index 0000000..3d54864 --- /dev/null +++ b/dropbox-script/urllib3/util/response.py @@ -0,0 +1,87 @@ +from __future__ import absolute_import +from ..packages.six.moves import http_client as httplib + +from ..exceptions import HeaderParsingError + + +def is_fp_closed(obj): + """ + Checks whether a given file-like object is closed. + + :param obj: + The file-like object to check. + """ + + try: + # Check `isclosed()` first, in case Python3 doesn't set `closed`. + # GH Issue #928 + return obj.isclosed() + except AttributeError: + pass + + try: + # Check via the official file-like-object way. + return obj.closed + except AttributeError: + pass + + try: + # Check if the object is a container for another file-like object that + # gets released on exhaustion (e.g. HTTPResponse). + return obj.fp is None + except AttributeError: + pass + + raise ValueError("Unable to determine whether fp is closed.") + + +def assert_header_parsing(headers): + """ + Asserts whether all headers have been successfully parsed. + Extracts encountered errors from the result of parsing headers. + + Only works on Python 3. + + :param headers: Headers to verify. + :type headers: `httplib.HTTPMessage`. + + :raises urllib3.exceptions.HeaderParsingError: + If parsing errors are found. + """ + + # This will fail silently if we pass in the wrong kind of parameter. + # To make debugging easier add an explicit check. + if not isinstance(headers, httplib.HTTPMessage): + raise TypeError('expected httplib.Message, got {0}.'.format( + type(headers))) + + defects = getattr(headers, 'defects', None) + get_payload = getattr(headers, 'get_payload', None) + + unparsed_data = None + if get_payload: + # get_payload is actually email.message.Message.get_payload; + # we're only interested in the result if it's not a multipart message + if not headers.is_multipart(): + payload = get_payload() + + if isinstance(payload, (bytes, str)): + unparsed_data = payload + + if defects or unparsed_data: + raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) + + +def is_response_to_head(response): + """ + Checks whether the request of a response has been a HEAD-request. + Handles the quirks of AppEngine. + + :param conn: + :type conn: :class:`httplib.HTTPResponse` + """ + # FIXME: Can we do this somehow without accessing private httplib _method? + method = response._method + if isinstance(method, int): # Platform-specific: Appengine + return method == 3 + return method.upper() == 'HEAD' diff --git a/dropbox-script/urllib3/util/retry.py b/dropbox-script/urllib3/util/retry.py new file mode 100644 index 0000000..e7d0abd --- /dev/null +++ b/dropbox-script/urllib3/util/retry.py @@ -0,0 +1,411 @@ +from __future__ import absolute_import +import time +import logging +from collections import namedtuple +from itertools import takewhile +import email +import re + +from ..exceptions import ( + ConnectTimeoutError, + MaxRetryError, + ProtocolError, + ReadTimeoutError, + ResponseError, + InvalidHeader, +) +from ..packages import six + + +log = logging.getLogger(__name__) + + +# Data structure for representing the metadata of requests that result in a retry. +RequestHistory = namedtuple('RequestHistory', ["method", "url", "error", + "status", "redirect_location"]) + + +class Retry(object): + """ Retry configuration. + + Each retry attempt will create a new Retry object with updated values, so + they can be safely reused. + + Retries can be defined as a default for a pool:: + + retries = Retry(connect=5, read=2, redirect=5) + http = PoolManager(retries=retries) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', retries=Retry(10)) + + Retries can be disabled by passing ``False``:: + + response = http.request('GET', 'http://example.com/', retries=False) + + Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless + retries are disabled, in which case the causing exception will be raised. + + :param int total: + Total number of retries to allow. Takes precedence over other counts. + + Set to ``None`` to remove this constraint and fall back on other + counts. It's a good idea to set this to some sensibly-high value to + account for unexpected edge cases and avoid infinite retry loops. + + Set to ``0`` to fail on the first retry. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int connect: + How many connection-related errors to retry on. + + These are errors raised before the request is sent to the remote server, + which we assume has not triggered the server to process the request. + + Set to ``0`` to fail on the first retry of this type. + + :param int read: + How many times to retry on read errors. + + These errors are raised after the request was sent to the server, so the + request may have side-effects. + + Set to ``0`` to fail on the first retry of this type. + + :param int redirect: + How many redirects to perform. Limit this to avoid infinite redirect + loops. + + A redirect is a HTTP response with a status code 301, 302, 303, 307 or + 308. + + Set to ``0`` to fail on the first retry of this type. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int status: + How many times to retry on bad status codes. + + These are retries made on responses, where status code matches + ``status_forcelist``. + + Set to ``0`` to fail on the first retry of this type. + + :param iterable method_whitelist: + Set of uppercased HTTP method verbs that we should retry on. + + By default, we only retry on methods which are considered to be + idempotent (multiple requests with the same parameters end with the + same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`. + + Set to a ``False`` value to retry on any verb. + + :param iterable status_forcelist: + A set of integer HTTP status codes that we should force a retry on. + A retry is initiated if the request method is in ``method_whitelist`` + and the response status code is in ``status_forcelist``. + + By default, this is disabled with ``None``. + + :param float backoff_factor: + A backoff factor to apply between attempts after the second try + (most errors are resolved immediately by a second try without a + delay). urllib3 will sleep for:: + + {backoff factor} * (2 ** ({number of total retries} - 1)) + + seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep + for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer + than :attr:`Retry.BACKOFF_MAX`. + + By default, backoff is disabled (set to 0). + + :param bool raise_on_redirect: Whether, if the number of redirects is + exhausted, to raise a MaxRetryError, or to return a response with a + response code in the 3xx range. + + :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: + whether we should raise an exception, or return a response, + if status falls in ``status_forcelist`` range and retries have + been exhausted. + + :param tuple history: The history of the request encountered during + each call to :meth:`~Retry.increment`. The list is in the order + the requests occurred. Each list item is of class :class:`RequestHistory`. + + :param bool respect_retry_after_header: + Whether to respect Retry-After header on status codes defined as + :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. + + :param iterable remove_headers_on_redirect: + Sequence of headers to remove from the request when a response + indicating a redirect is returned before firing off the redirected + request. + """ + + DEFAULT_METHOD_WHITELIST = frozenset([ + 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) + + RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) + + DEFAULT_REDIRECT_HEADERS_BLACKLIST = frozenset(['Authorization']) + + #: Maximum backoff time. + BACKOFF_MAX = 120 + + def __init__(self, total=10, connect=None, read=None, redirect=None, status=None, + method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, + backoff_factor=0, raise_on_redirect=True, raise_on_status=True, + history=None, respect_retry_after_header=True, + remove_headers_on_redirect=DEFAULT_REDIRECT_HEADERS_BLACKLIST): + + self.total = total + self.connect = connect + self.read = read + self.status = status + + if redirect is False or total is False: + redirect = 0 + raise_on_redirect = False + + self.redirect = redirect + self.status_forcelist = status_forcelist or set() + self.method_whitelist = method_whitelist + self.backoff_factor = backoff_factor + self.raise_on_redirect = raise_on_redirect + self.raise_on_status = raise_on_status + self.history = history or tuple() + self.respect_retry_after_header = respect_retry_after_header + self.remove_headers_on_redirect = remove_headers_on_redirect + + def new(self, **kw): + params = dict( + total=self.total, + connect=self.connect, read=self.read, redirect=self.redirect, status=self.status, + method_whitelist=self.method_whitelist, + status_forcelist=self.status_forcelist, + backoff_factor=self.backoff_factor, + raise_on_redirect=self.raise_on_redirect, + raise_on_status=self.raise_on_status, + history=self.history, + remove_headers_on_redirect=self.remove_headers_on_redirect + ) + params.update(kw) + return type(self)(**params) + + @classmethod + def from_int(cls, retries, redirect=True, default=None): + """ Backwards-compatibility for the old retries format.""" + if retries is None: + retries = default if default is not None else cls.DEFAULT + + if isinstance(retries, Retry): + return retries + + redirect = bool(redirect) and None + new_retries = cls(retries, redirect=redirect) + log.debug("Converted retries value: %r -> %r", retries, new_retries) + return new_retries + + def get_backoff_time(self): + """ Formula for computing the current backoff + + :rtype: float + """ + # We want to consider only the last consecutive errors sequence (Ignore redirects). + consecutive_errors_len = len(list(takewhile(lambda x: x.redirect_location is None, + reversed(self.history)))) + if consecutive_errors_len <= 1: + return 0 + + backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) + return min(self.BACKOFF_MAX, backoff_value) + + def parse_retry_after(self, retry_after): + # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 + if re.match(r"^\s*[0-9]+\s*$", retry_after): + seconds = int(retry_after) + else: + retry_date_tuple = email.utils.parsedate(retry_after) + if retry_date_tuple is None: + raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) + retry_date = time.mktime(retry_date_tuple) + seconds = retry_date - time.time() + + if seconds < 0: + seconds = 0 + + return seconds + + def get_retry_after(self, response): + """ Get the value of Retry-After in seconds. """ + + retry_after = response.getheader("Retry-After") + + if retry_after is None: + return None + + return self.parse_retry_after(retry_after) + + def sleep_for_retry(self, response=None): + retry_after = self.get_retry_after(response) + if retry_after: + time.sleep(retry_after) + return True + + return False + + def _sleep_backoff(self): + backoff = self.get_backoff_time() + if backoff <= 0: + return + time.sleep(backoff) + + def sleep(self, response=None): + """ Sleep between retry attempts. + + This method will respect a server's ``Retry-After`` response header + and sleep the duration of the time requested. If that is not present, it + will use an exponential backoff. By default, the backoff factor is 0 and + this method will return immediately. + """ + + if response: + slept = self.sleep_for_retry(response) + if slept: + return + + self._sleep_backoff() + + def _is_connection_error(self, err): + """ Errors when we're fairly sure that the server did not receive the + request, so it should be safe to retry. + """ + return isinstance(err, ConnectTimeoutError) + + def _is_read_error(self, err): + """ Errors that occur after the request has been started, so we should + assume that the server began processing it. + """ + return isinstance(err, (ReadTimeoutError, ProtocolError)) + + def _is_method_retryable(self, method): + """ Checks if a given HTTP method should be retried upon, depending if + it is included on the method whitelist. + """ + if self.method_whitelist and method.upper() not in self.method_whitelist: + return False + + return True + + def is_retry(self, method, status_code, has_retry_after=False): + """ Is this method/status code retryable? (Based on whitelists and control + variables such as the number of total retries to allow, whether to + respect the Retry-After header, whether this header is present, and + whether the returned status code is on the list of status codes to + be retried upon on the presence of the aforementioned header) + """ + if not self._is_method_retryable(method): + return False + + if self.status_forcelist and status_code in self.status_forcelist: + return True + + return (self.total and self.respect_retry_after_header and + has_retry_after and (status_code in self.RETRY_AFTER_STATUS_CODES)) + + def is_exhausted(self): + """ Are we out of retries? """ + retry_counts = (self.total, self.connect, self.read, self.redirect, self.status) + retry_counts = list(filter(None, retry_counts)) + if not retry_counts: + return False + + return min(retry_counts) < 0 + + def increment(self, method=None, url=None, response=None, error=None, + _pool=None, _stacktrace=None): + """ Return a new Retry object with incremented retry counters. + + :param response: A response object, or None, if the server did not + return a response. + :type response: :class:`~urllib3.response.HTTPResponse` + :param Exception error: An error encountered during the request, or + None if the response was received successfully. + + :return: A new ``Retry`` object. + """ + if self.total is False and error: + # Disabled, indicate to re-raise the error. + raise six.reraise(type(error), error, _stacktrace) + + total = self.total + if total is not None: + total -= 1 + + connect = self.connect + read = self.read + redirect = self.redirect + status_count = self.status + cause = 'unknown' + status = None + redirect_location = None + + if error and self._is_connection_error(error): + # Connect retry? + if connect is False: + raise six.reraise(type(error), error, _stacktrace) + elif connect is not None: + connect -= 1 + + elif error and self._is_read_error(error): + # Read retry? + if read is False or not self._is_method_retryable(method): + raise six.reraise(type(error), error, _stacktrace) + elif read is not None: + read -= 1 + + elif response and response.get_redirect_location(): + # Redirect retry? + if redirect is not None: + redirect -= 1 + cause = 'too many redirects' + redirect_location = response.get_redirect_location() + status = response.status + + else: + # Incrementing because of a server error like a 500 in + # status_forcelist and a the given method is in the whitelist + cause = ResponseError.GENERIC_ERROR + if response and response.status: + if status_count is not None: + status_count -= 1 + cause = ResponseError.SPECIFIC_ERROR.format( + status_code=response.status) + status = response.status + + history = self.history + (RequestHistory(method, url, error, status, redirect_location),) + + new_retry = self.new( + total=total, + connect=connect, read=read, redirect=redirect, status=status_count, + history=history) + + if new_retry.is_exhausted(): + raise MaxRetryError(_pool, url, error or ResponseError(cause)) + + log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) + + return new_retry + + def __repr__(self): + return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' + 'read={self.read}, redirect={self.redirect}, status={self.status})').format( + cls=type(self), self=self) + + +# For backwards compatibility (equivalent to pre-v1.9): +Retry.DEFAULT = Retry(3) diff --git a/dropbox-script/urllib3/util/ssl_.py b/dropbox-script/urllib3/util/ssl_.py new file mode 100644 index 0000000..64ea192 --- /dev/null +++ b/dropbox-script/urllib3/util/ssl_.py @@ -0,0 +1,381 @@ +from __future__ import absolute_import +import errno +import warnings +import hmac +import socket + +from binascii import hexlify, unhexlify +from hashlib import md5, sha1, sha256 + +from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning +from ..packages import six + + +SSLContext = None +HAS_SNI = False +IS_PYOPENSSL = False +IS_SECURETRANSPORT = False + +# Maps the length of a digest to a possible hash function producing this digest +HASHFUNC_MAP = { + 32: md5, + 40: sha1, + 64: sha256, +} + + +def _const_compare_digest_backport(a, b): + """ + Compare two digests of equal length in constant time. + + The digests must be of type str/bytes. + Returns True if the digests match, and False otherwise. + """ + result = abs(len(a) - len(b)) + for l, r in zip(bytearray(a), bytearray(b)): + result |= l ^ r + return result == 0 + + +_const_compare_digest = getattr(hmac, 'compare_digest', + _const_compare_digest_backport) + + +try: # Test for SSL features + import ssl + from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 + from ssl import HAS_SNI # Has SNI? +except ImportError: + pass + + +try: + from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION +except ImportError: + OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 + OP_NO_COMPRESSION = 0x20000 + + +# Python 2.7 doesn't have inet_pton on non-Linux so we fallback on inet_aton in +# those cases. This means that we can only detect IPv4 addresses in this case. +if hasattr(socket, 'inet_pton'): + inet_pton = socket.inet_pton +else: + # Maybe we can use ipaddress if the user has urllib3[secure]? + try: + import ipaddress + + def inet_pton(_, host): + if isinstance(host, bytes): + host = host.decode('ascii') + return ipaddress.ip_address(host) + + except ImportError: # Platform-specific: Non-Linux + def inet_pton(_, host): + return socket.inet_aton(host) + + +# A secure default. +# Sources for more information on TLS ciphers: +# +# - https://wiki.mozilla.org/Security/Server_Side_TLS +# - https://www.ssllabs.com/projects/best-practices/index.html +# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ +# +# The general intent is: +# - Prefer TLS 1.3 cipher suites +# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), +# - prefer ECDHE over DHE for better performance, +# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and +# security, +# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, +# - disable NULL authentication, MD5 MACs and DSS for security reasons. +DEFAULT_CIPHERS = ':'.join([ + 'TLS13-AES-256-GCM-SHA384', + 'TLS13-CHACHA20-POLY1305-SHA256', + 'TLS13-AES-128-GCM-SHA256', + 'ECDH+AESGCM', + 'ECDH+CHACHA20', + 'DH+AESGCM', + 'DH+CHACHA20', + 'ECDH+AES256', + 'DH+AES256', + 'ECDH+AES128', + 'DH+AES', + 'RSA+AESGCM', + 'RSA+AES', + '!aNULL', + '!eNULL', + '!MD5', +]) + +try: + from ssl import SSLContext # Modern SSL? +except ImportError: + import sys + + class SSLContext(object): # Platform-specific: Python 2 + def __init__(self, protocol_version): + self.protocol = protocol_version + # Use default values from a real SSLContext + self.check_hostname = False + self.verify_mode = ssl.CERT_NONE + self.ca_certs = None + self.options = 0 + self.certfile = None + self.keyfile = None + self.ciphers = None + + def load_cert_chain(self, certfile, keyfile): + self.certfile = certfile + self.keyfile = keyfile + + def load_verify_locations(self, cafile=None, capath=None): + self.ca_certs = cafile + + if capath is not None: + raise SSLError("CA directories not supported in older Pythons") + + def set_ciphers(self, cipher_suite): + self.ciphers = cipher_suite + + def wrap_socket(self, socket, server_hostname=None, server_side=False): + warnings.warn( + 'A true SSLContext object is not available. This prevents ' + 'urllib3 from configuring SSL appropriately and may cause ' + 'certain SSL connections to fail. You can upgrade to a newer ' + 'version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + InsecurePlatformWarning + ) + kwargs = { + 'keyfile': self.keyfile, + 'certfile': self.certfile, + 'ca_certs': self.ca_certs, + 'cert_reqs': self.verify_mode, + 'ssl_version': self.protocol, + 'server_side': server_side, + } + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) + + +def assert_fingerprint(cert, fingerprint): + """ + Checks if given fingerprint matches the supplied certificate. + + :param cert: + Certificate as bytes object. + :param fingerprint: + Fingerprint as string of hexdigits, can be interspersed by colons. + """ + + fingerprint = fingerprint.replace(':', '').lower() + digest_length = len(fingerprint) + hashfunc = HASHFUNC_MAP.get(digest_length) + if not hashfunc: + raise SSLError( + 'Fingerprint of invalid length: {0}'.format(fingerprint)) + + # We need encode() here for py32; works on py2 and p33. + fingerprint_bytes = unhexlify(fingerprint.encode()) + + cert_digest = hashfunc(cert).digest() + + if not _const_compare_digest(cert_digest, fingerprint_bytes): + raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' + .format(fingerprint, hexlify(cert_digest))) + + +def resolve_cert_reqs(candidate): + """ + Resolves the argument to a numeric constant, which can be passed to + the wrap_socket function/method from the ssl module. + Defaults to :data:`ssl.CERT_NONE`. + If given a string it is assumed to be the name of the constant in the + :mod:`ssl` module or its abbreviation. + (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. + If it's neither `None` nor a string we assume it is already the numeric + constant which can directly be passed to wrap_socket. + """ + if candidate is None: + return CERT_NONE + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'CERT_' + candidate) + return res + + return candidate + + +def resolve_ssl_version(candidate): + """ + like resolve_cert_reqs + """ + if candidate is None: + return PROTOCOL_SSLv23 + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'PROTOCOL_' + candidate) + return res + + return candidate + + +def create_urllib3_context(ssl_version=None, cert_reqs=None, + options=None, ciphers=None): + """All arguments have the same meaning as ``ssl_wrap_socket``. + + By default, this function does a lot of the same work that + ``ssl.create_default_context`` does on Python 3.4+. It: + + - Disables SSLv2, SSLv3, and compression + - Sets a restricted set of server ciphers + + If you wish to enable SSLv3, you can do:: + + from urllib3.util import ssl_ + context = ssl_.create_urllib3_context() + context.options &= ~ssl_.OP_NO_SSLv3 + + You can do the same to enable compression (substituting ``COMPRESSION`` + for ``SSLv3`` in the last line above). + + :param ssl_version: + The desired protocol version to use. This will default to + PROTOCOL_SSLv23 which will negotiate the highest protocol that both + the server and your installation of OpenSSL support. + :param cert_reqs: + Whether to require the certificate verification. This defaults to + ``ssl.CERT_REQUIRED``. + :param options: + Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, + ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. + :param ciphers: + Which cipher suites to allow the server to select. + :returns: + Constructed SSLContext object with specified options + :rtype: SSLContext + """ + context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) + + context.set_ciphers(ciphers or DEFAULT_CIPHERS) + + # Setting the default here, as we may have no ssl module on import + cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs + + if options is None: + options = 0 + # SSLv2 is easily broken and is considered harmful and dangerous + options |= OP_NO_SSLv2 + # SSLv3 has several problems and is now dangerous + options |= OP_NO_SSLv3 + # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ + # (issue #309) + options |= OP_NO_COMPRESSION + + context.options |= options + + context.verify_mode = cert_reqs + if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 + # We do our own verification, including fingerprints and alternative + # hostnames. So disable it here + context.check_hostname = False + return context + + +def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None, ciphers=None, ssl_context=None, + ca_cert_dir=None): + """ + All arguments except for server_hostname, ssl_context, and ca_cert_dir have + the same meaning as they do when using :func:`ssl.wrap_socket`. + + :param server_hostname: + When SNI is supported, the expected hostname of the certificate + :param ssl_context: + A pre-made :class:`SSLContext` object. If none is provided, one will + be created using :func:`create_urllib3_context`. + :param ciphers: + A string of ciphers we wish the client to support. + :param ca_cert_dir: + A directory containing CA certificates in multiple separate files, as + supported by OpenSSL's -CApath flag or the capath argument to + SSLContext.load_verify_locations(). + """ + context = ssl_context + if context is None: + # Note: This branch of code and all the variables in it are no longer + # used by urllib3 itself. We should consider deprecating and removing + # this code. + context = create_urllib3_context(ssl_version, cert_reqs, + ciphers=ciphers) + + if ca_certs or ca_cert_dir: + try: + context.load_verify_locations(ca_certs, ca_cert_dir) + except IOError as e: # Platform-specific: Python 2.7 + raise SSLError(e) + # Py33 raises FileNotFoundError which subclasses OSError + # These are not equivalent unless we check the errno attribute + except OSError as e: # Platform-specific: Python 3.3 and beyond + if e.errno == errno.ENOENT: + raise SSLError(e) + raise + elif getattr(context, 'load_default_certs', None) is not None: + # try to load OS default certs; works well on Windows (require Python3.4+) + context.load_default_certs() + + if certfile: + context.load_cert_chain(certfile, keyfile) + + # If we detect server_hostname is an IP address then the SNI + # extension should not be used according to RFC3546 Section 3.1 + # We shouldn't warn the user if SNI isn't available but we would + # not be using SNI anyways due to IP address for server_hostname. + if ((server_hostname is not None and not is_ipaddress(server_hostname)) + or IS_SECURETRANSPORT): + if HAS_SNI and server_hostname is not None: + return context.wrap_socket(sock, server_hostname=server_hostname) + + warnings.warn( + 'An HTTPS request has been made, but the SNI (Server Name ' + 'Indication) extension to TLS is not available on this platform. ' + 'This may cause the server to present an incorrect TLS ' + 'certificate, which can cause validation failures. You can upgrade to ' + 'a newer version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + SNIMissingWarning + ) + + return context.wrap_socket(sock) + + +def is_ipaddress(hostname): + """Detects whether the hostname given is an IP address. + + :param str hostname: Hostname to examine. + :return: True if the hostname is an IP address, False otherwise. + """ + if six.PY3 and isinstance(hostname, bytes): + # IDN A-label bytes are ASCII compatible. + hostname = hostname.decode('ascii') + + families = [socket.AF_INET] + if hasattr(socket, 'AF_INET6'): + families.append(socket.AF_INET6) + + for af in families: + try: + inet_pton(af, hostname) + except (socket.error, ValueError, OSError): + pass + else: + return True + return False diff --git a/dropbox-script/urllib3/util/timeout.py b/dropbox-script/urllib3/util/timeout.py new file mode 100644 index 0000000..cec817e --- /dev/null +++ b/dropbox-script/urllib3/util/timeout.py @@ -0,0 +1,242 @@ +from __future__ import absolute_import +# The default socket timeout, used by httplib to indicate that no timeout was +# specified by the user +from socket import _GLOBAL_DEFAULT_TIMEOUT +import time + +from ..exceptions import TimeoutStateError + +# A sentinel value to indicate that no timeout was specified by the user in +# urllib3 +_Default = object() + + +# Use time.monotonic if available. +current_time = getattr(time, "monotonic", time.time) + + +class Timeout(object): + """ Timeout configuration. + + Timeouts can be defined as a default for a pool:: + + timeout = Timeout(connect=2.0, read=7.0) + http = PoolManager(timeout=timeout) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) + + Timeouts can be disabled by setting all the parameters to ``None``:: + + no_timeout = Timeout(connect=None, read=None) + response = http.request('GET', 'http://example.com/, timeout=no_timeout) + + + :param total: + This combines the connect and read timeouts into one; the read timeout + will be set to the time leftover from the connect attempt. In the + event that both a connect timeout and a total are specified, or a read + timeout and a total are specified, the shorter timeout will be applied. + + Defaults to None. + + :type total: integer, float, or None + + :param connect: + The maximum amount of time to wait for a connection attempt to a server + to succeed. Omitting the parameter will default the connect timeout to + the system default, probably `the global default timeout in socket.py + `_. + None will set an infinite timeout for connection attempts. + + :type connect: integer, float, or None + + :param read: + The maximum amount of time to wait between consecutive + read operations for a response from the server. Omitting + the parameter will default the read timeout to the system + default, probably `the global default timeout in socket.py + `_. + None will set an infinite timeout. + + :type read: integer, float, or None + + .. note:: + + Many factors can affect the total amount of time for urllib3 to return + an HTTP response. + + For example, Python's DNS resolver does not obey the timeout specified + on the socket. Other factors that can affect total request time include + high CPU load, high swap, the program running at a low priority level, + or other behaviors. + + In addition, the read and total timeouts only measure the time between + read operations on the socket connecting the client and the server, + not the total amount of time for the request to return a complete + response. For most requests, the timeout is raised because the server + has not sent the first byte in the specified time. This is not always + the case; if a server streams one byte every fifteen seconds, a timeout + of 20 seconds will not trigger, even though the request will take + several minutes to complete. + + If your goal is to cut off any request after a set amount of wall clock + time, consider having a second "watcher" thread to cut off a slow + request. + """ + + #: A sentinel object representing the default timeout value + DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT + + def __init__(self, total=None, connect=_Default, read=_Default): + self._connect = self._validate_timeout(connect, 'connect') + self._read = self._validate_timeout(read, 'read') + self.total = self._validate_timeout(total, 'total') + self._start_connect = None + + def __str__(self): + return '%s(connect=%r, read=%r, total=%r)' % ( + type(self).__name__, self._connect, self._read, self.total) + + @classmethod + def _validate_timeout(cls, value, name): + """ Check that a timeout attribute is valid. + + :param value: The timeout value to validate + :param name: The name of the timeout attribute to validate. This is + used to specify in error messages. + :return: The validated and casted version of the given value. + :raises ValueError: If it is a numeric value less than or equal to + zero, or the type is not an integer, float, or None. + """ + if value is _Default: + return cls.DEFAULT_TIMEOUT + + if value is None or value is cls.DEFAULT_TIMEOUT: + return value + + if isinstance(value, bool): + raise ValueError("Timeout cannot be a boolean value. It must " + "be an int, float or None.") + try: + float(value) + except (TypeError, ValueError): + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + try: + if value <= 0: + raise ValueError("Attempted to set %s timeout to %s, but the " + "timeout cannot be set to a value less " + "than or equal to 0." % (name, value)) + except TypeError: # Python 3 + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + return value + + @classmethod + def from_float(cls, timeout): + """ Create a new Timeout from a legacy timeout value. + + The timeout value used by httplib.py sets the same timeout on the + connect(), and recv() socket requests. This creates a :class:`Timeout` + object that sets the individual timeouts to the ``timeout`` value + passed to this function. + + :param timeout: The legacy timeout value. + :type timeout: integer, float, sentinel default object, or None + :return: Timeout object + :rtype: :class:`Timeout` + """ + return Timeout(read=timeout, connect=timeout) + + def clone(self): + """ Create a copy of the timeout object + + Timeout properties are stored per-pool but each request needs a fresh + Timeout object to ensure each one has its own start/stop configured. + + :return: a copy of the timeout object + :rtype: :class:`Timeout` + """ + # We can't use copy.deepcopy because that will also create a new object + # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to + # detect the user default. + return Timeout(connect=self._connect, read=self._read, + total=self.total) + + def start_connect(self): + """ Start the timeout clock, used during a connect() attempt + + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to start a timer that has been started already. + """ + if self._start_connect is not None: + raise TimeoutStateError("Timeout timer has already been started.") + self._start_connect = current_time() + return self._start_connect + + def get_connect_duration(self): + """ Gets the time elapsed since the call to :meth:`start_connect`. + + :return: Elapsed time. + :rtype: float + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to get duration for a timer that hasn't been started. + """ + if self._start_connect is None: + raise TimeoutStateError("Can't get connect duration for timer " + "that has not started.") + return current_time() - self._start_connect + + @property + def connect_timeout(self): + """ Get the value to use when setting a connection timeout. + + This will be a positive float or integer, the value None + (never timeout), or the default system timeout. + + :return: Connect timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + """ + if self.total is None: + return self._connect + + if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: + return self.total + + return min(self._connect, self.total) + + @property + def read_timeout(self): + """ Get the value for the read timeout. + + This assumes some time has elapsed in the connection timeout and + computes the read timeout appropriately. + + If self.total is set, the read timeout is dependent on the amount of + time taken by the connect timeout. If the connection time has not been + established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be + raised. + + :return: Value to use for the read timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` + has not yet been called on this object. + """ + if (self.total is not None and + self.total is not self.DEFAULT_TIMEOUT and + self._read is not None and + self._read is not self.DEFAULT_TIMEOUT): + # In case the connect timeout has not yet been established. + if self._start_connect is None: + return self._read + return max(0, min(self.total - self.get_connect_duration(), + self._read)) + elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: + return max(0, self.total - self.get_connect_duration()) + else: + return self._read diff --git a/dropbox-script/urllib3/util/url.py b/dropbox-script/urllib3/util/url.py new file mode 100644 index 0000000..6b6f996 --- /dev/null +++ b/dropbox-script/urllib3/util/url.py @@ -0,0 +1,230 @@ +from __future__ import absolute_import +from collections import namedtuple + +from ..exceptions import LocationParseError + + +url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] + +# We only want to normalize urls with an HTTP(S) scheme. +# urllib3 infers URLs without a scheme (None) to be http. +NORMALIZABLE_SCHEMES = ('http', 'https', None) + + +class Url(namedtuple('Url', url_attrs)): + """ + Datastructure for representing an HTTP URL. Used as a return value for + :func:`parse_url`. Both the scheme and host are normalized as they are + both case-insensitive according to RFC 3986. + """ + __slots__ = () + + def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, + query=None, fragment=None): + if path and not path.startswith('/'): + path = '/' + path + if scheme: + scheme = scheme.lower() + if host and scheme in NORMALIZABLE_SCHEMES: + host = host.lower() + return super(Url, cls).__new__(cls, scheme, auth, host, port, path, + query, fragment) + + @property + def hostname(self): + """For backwards-compatibility with urlparse. We're nice like that.""" + return self.host + + @property + def request_uri(self): + """Absolute path including the query string.""" + uri = self.path or '/' + + if self.query is not None: + uri += '?' + self.query + + return uri + + @property + def netloc(self): + """Network location including host and port""" + if self.port: + return '%s:%d' % (self.host, self.port) + return self.host + + @property + def url(self): + """ + Convert self into a url + + This function should more or less round-trip with :func:`.parse_url`. The + returned url may not be exactly the same as the url inputted to + :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls + with a blank port will have : removed). + + Example: :: + + >>> U = parse_url('http://google.com/mail/') + >>> U.url + 'http://google.com/mail/' + >>> Url('http', 'username:password', 'host.com', 80, + ... '/path', 'query', 'fragment').url + 'http://username:password@host.com:80/path?query#fragment' + """ + scheme, auth, host, port, path, query, fragment = self + url = '' + + # We use "is not None" we want things to happen with empty strings (or 0 port) + if scheme is not None: + url += scheme + '://' + if auth is not None: + url += auth + '@' + if host is not None: + url += host + if port is not None: + url += ':' + str(port) + if path is not None: + url += path + if query is not None: + url += '?' + query + if fragment is not None: + url += '#' + fragment + + return url + + def __str__(self): + return self.url + + +def split_first(s, delims): + """ + Given a string and an iterable of delimiters, split on the first found + delimiter. Return two split parts and the matched delimiter. + + If not found, then the first part is the full input string. + + Example:: + + >>> split_first('foo/bar?baz', '?/=') + ('foo', 'bar?baz', '/') + >>> split_first('foo/bar?baz', '123') + ('foo/bar?baz', '', None) + + Scales linearly with number of delims. Not ideal for large number of delims. + """ + min_idx = None + min_delim = None + for d in delims: + idx = s.find(d) + if idx < 0: + continue + + if min_idx is None or idx < min_idx: + min_idx = idx + min_delim = d + + if min_idx is None or min_idx < 0: + return s, '', None + + return s[:min_idx], s[min_idx + 1:], min_delim + + +def parse_url(url): + """ + Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is + performed to parse incomplete urls. Fields not provided will be None. + + Partly backwards-compatible with :mod:`urlparse`. + + Example:: + + >>> parse_url('http://google.com/mail/') + Url(scheme='http', host='google.com', port=None, path='/mail/', ...) + >>> parse_url('google.com:80') + Url(scheme=None, host='google.com', port=80, path=None, ...) + >>> parse_url('/foo?bar') + Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) + """ + + # While this code has overlap with stdlib's urlparse, it is much + # simplified for our needs and less annoying. + # Additionally, this implementations does silly things to be optimal + # on CPython. + + if not url: + # Empty + return Url() + + scheme = None + auth = None + host = None + port = None + path = None + fragment = None + query = None + + # Scheme + if '://' in url: + scheme, url = url.split('://', 1) + + # Find the earliest Authority Terminator + # (http://tools.ietf.org/html/rfc3986#section-3.2) + url, path_, delim = split_first(url, ['/', '?', '#']) + + if delim: + # Reassemble the path + path = delim + path_ + + # Auth + if '@' in url: + # Last '@' denotes end of auth part + auth, url = url.rsplit('@', 1) + + # IPv6 + if url and url[0] == '[': + host, url = url.split(']', 1) + host += ']' + + # Port + if ':' in url: + _host, port = url.split(':', 1) + + if not host: + host = _host + + if port: + # If given, ports must be integers. No whitespace, no plus or + # minus prefixes, no non-integer digits such as ^2 (superscript). + if not port.isdigit(): + raise LocationParseError(url) + try: + port = int(port) + except ValueError: + raise LocationParseError(url) + else: + # Blank ports are cool, too. (rfc3986#section-3.2.3) + port = None + + elif not host and url: + host = url + + if not path: + return Url(scheme, auth, host, port, path, query, fragment) + + # Fragment + if '#' in path: + path, fragment = path.split('#', 1) + + # Query + if '?' in path: + path, query = path.split('?', 1) + + return Url(scheme, auth, host, port, path, query, fragment) + + +def get_host(url): + """ + Deprecated. Use :func:`parse_url` instead. + """ + p = parse_url(url) + return p.scheme or 'http', p.hostname, p.port diff --git a/dropbox-script/urllib3/util/wait.py b/dropbox-script/urllib3/util/wait.py new file mode 100644 index 0000000..4db71ba --- /dev/null +++ b/dropbox-script/urllib3/util/wait.py @@ -0,0 +1,150 @@ +import errno +from functools import partial +import select +import sys +try: + from time import monotonic +except ImportError: + from time import time as monotonic + +__all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"] + + +class NoWayToWaitForSocketError(Exception): + pass + + +# How should we wait on sockets? +# +# There are two types of APIs you can use for waiting on sockets: the fancy +# modern stateful APIs like epoll/kqueue, and the older stateless APIs like +# select/poll. The stateful APIs are more efficient when you have a lots of +# sockets to keep track of, because you can set them up once and then use them +# lots of times. But we only ever want to wait on a single socket at a time +# and don't want to keep track of state, so the stateless APIs are actually +# more efficient. So we want to use select() or poll(). +# +# Now, how do we choose between select() and poll()? On traditional Unixes, +# select() has a strange calling convention that makes it slow, or fail +# altogether, for high-numbered file descriptors. The point of poll() is to fix +# that, so on Unixes, we prefer poll(). +# +# On Windows, there is no poll() (or at least Python doesn't provide a wrapper +# for it), but that's OK, because on Windows, select() doesn't have this +# strange calling convention; plain select() works fine. +# +# So: on Windows we use select(), and everywhere else we use poll(). We also +# fall back to select() in case poll() is somehow broken or missing. + +if sys.version_info >= (3, 5): + # Modern Python, that retries syscalls by default + def _retry_on_intr(fn, timeout): + return fn(timeout) +else: + # Old and broken Pythons. + def _retry_on_intr(fn, timeout): + if timeout is None: + deadline = float("inf") + else: + deadline = monotonic() + timeout + + while True: + try: + return fn(timeout) + # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7 + except (OSError, select.error) as e: + # 'e.args[0]' incantation works for both OSError and select.error + if e.args[0] != errno.EINTR: + raise + else: + timeout = deadline - monotonic() + if timeout < 0: + timeout = 0 + if timeout == float("inf"): + timeout = None + continue + + +def select_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + rcheck = [] + wcheck = [] + if read: + rcheck.append(sock) + if write: + wcheck.append(sock) + # When doing a non-blocking connect, most systems signal success by + # marking the socket writable. Windows, though, signals success by marked + # it as "exceptional". We paper over the difference by checking the write + # sockets for both conditions. (The stdlib selectors module does the same + # thing.) + fn = partial(select.select, rcheck, wcheck, wcheck) + rready, wready, xready = _retry_on_intr(fn, timeout) + return bool(rready or wready or xready) + + +def poll_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + mask = 0 + if read: + mask |= select.POLLIN + if write: + mask |= select.POLLOUT + poll_obj = select.poll() + poll_obj.register(sock, mask) + + # For some reason, poll() takes timeout in milliseconds + def do_poll(t): + if t is not None: + t *= 1000 + return poll_obj.poll(t) + + return bool(_retry_on_intr(do_poll, timeout)) + + +def null_wait_for_socket(*args, **kwargs): + raise NoWayToWaitForSocketError("no select-equivalent available") + + +def _have_working_poll(): + # Apparently some systems have a select.poll that fails as soon as you try + # to use it, either due to strange configuration or broken monkeypatching + # from libraries like eventlet/greenlet. + try: + poll_obj = select.poll() + _retry_on_intr(poll_obj.poll, 0) + except (AttributeError, OSError): + return False + else: + return True + + +def wait_for_socket(*args, **kwargs): + # We delay choosing which implementation to use until the first time we're + # called. We could do it at import time, but then we might make the wrong + # decision if someone goes wild with monkeypatching select.poll after + # we're imported. + global wait_for_socket + if _have_working_poll(): + wait_for_socket = poll_wait_for_socket + elif hasattr(select, "select"): + wait_for_socket = select_wait_for_socket + else: # Platform-specific: Appengine. + wait_for_socket = null_wait_for_socket + return wait_for_socket(*args, **kwargs) + + +def wait_for_read(sock, timeout=None): + """ Waits for reading to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, read=True, timeout=timeout) + + +def wait_for_write(sock, timeout=None): + """ Waits for writing to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, write=True, timeout=timeout)