arelle-release 2.37.64__py3-none-any.whl → 2.37.66__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of arelle-release might be problematic. Click here for more details.

arelle/UrlUtil.py CHANGED
@@ -31,6 +31,9 @@ def authority(url: str, includeScheme: bool=True) -> str:
31
31
  def scheme(url: str) -> str | None: # returns None if no scheme part
32
32
  return (url or "").rpartition(":")[0] or None
33
33
 
34
+ def isExternalUrl(url: str) -> bool:
35
+ return scheme(url) in ("http", "https", "ftp")
36
+
34
37
  absoluteUrlPattern = None
35
38
  # http://www.ietf.org/rfc/rfc2396.txt section 4.3
36
39
  # this pattern doesn't allow some valid unicode characters
@@ -13,7 +13,7 @@ from arelle.PythonUtil import isLegacyAbs
13
13
  from arelle.XbrlConst import ixbrlAll, xhtml
14
14
  from arelle.XmlUtil import setXmlns, xmlstring, xmlDeclarationPattern, XmlDeclarationLocationException
15
15
  from arelle.ModelObject import ModelObject
16
- from arelle.UrlUtil import decodeBase64DataImage, isHttpUrl, scheme
16
+ from arelle.UrlUtil import decodeBase64DataImage, isExternalUrl, isHttpUrl, scheme
17
17
 
18
18
  XMLpattern = re.compile(r".*(<|&lt;|&#x3C;|&#60;)[A-Za-z_]+[A-Za-z0-9_:]*[^>]*(/>|>|&gt;|/&gt;).*", re.DOTALL)
19
19
  CDATApattern = re.compile(r"<!\[CDATA\[(.+)\]\]")
@@ -631,7 +631,7 @@ def validateTextBlockFacts(modelXbrl):
631
631
  attribute=attrTag, element=eltTag)
632
632
  elif eltTag == "a" and (not allowedExternalHrefPattern or allowedExternalHrefPattern.match(attrValue)):
633
633
  pass
634
- elif scheme(attrValue) in ("http", "https", "ftp"):
634
+ elif isExternalUrl(attrValue):
635
635
  modelXbrl.error(("EFM.6.05.16.externalReference", "FERC.6.05.16.externalReference"),
636
636
  _("Fact %(fact)s of context %(contextID)s has an invalid external reference in '%(attribute)s' for <%(element)s>"),
637
637
  modelObject=f1, fact=f1.qname, contextID=f1.contextID,
@@ -773,7 +773,7 @@ def validateHtmlContent(modelXbrl, referenceElt, htmlEltTree, validatedObjectLab
773
773
  messageCodes=("EFM.6.05.34.activeContent", "EFM.5.02.05.activeContent", "FERC.6.05.34.activeContent", "FERC.5.02.05.activeContent"))
774
774
  elif eltTag == "a" and (not allowedExternalHrefPattern or allowedExternalHrefPattern.match(attrValue)):
775
775
  pass
776
- elif scheme(attrValue) in ("http", "https", "ftp"):
776
+ elif isExternalUrl(attrValue):
777
777
  modelXbrl.error(messageCodePrefix + "externalReference",
778
778
  _("%(validatedObjectLabel)s has an invalid external reference in '%(attribute)s' for <%(element)s>: %(value)s"),
779
779
  modelObject=elt, validatedObjectLabel=validatedObjectLabel,
arelle/ViewFile.py CHANGED
@@ -18,6 +18,7 @@ XLSX = 2
18
18
  HTML = 3
19
19
  XML = 4
20
20
  JSON = 5
21
+ TABULAR_VIEW_TYPES = {CSV, XLSX, HTML}
21
22
  TYPENAMES = ["NOOUT", "CSV", "XLSX", "HTML", "XML", "JSON"] # null means no output
22
23
  nonNameCharPattern = re.compile(r"[^\w\-\.:]")
23
24
 
@@ -3,7 +3,7 @@ See COPYRIGHT.md for copyright information.
3
3
  '''
4
4
  from arelle import ViewFile, ModelDtsObject, XbrlConst, XmlUtil
5
5
  from arelle.XbrlConst import conceptNameLabelRole, standardLabel, terseLabel, documentationLabel
6
- from arelle.ViewFile import CSV, XLSX, HTML, XML, JSON
6
+ from arelle.ViewFile import CSV, XLSX, HTML, XML, JSON, TABULAR_VIEW_TYPES
7
7
  import datetime
8
8
  import regex as re
9
9
  from collections import defaultdict
@@ -324,7 +324,7 @@ class ViewFacts(ViewFile.View):
324
324
  try:
325
325
  colId = self.contextColId[fact.context.objectId()]
326
326
  # special case of start date, pick column corresponding
327
- if preferredLabel == XbrlConst.periodStartLabel:
327
+ if self.type in TABULAR_VIEW_TYPES and preferredLabel == XbrlConst.periodStartLabel:
328
328
  date = fact.context.instantDatetime
329
329
  if date:
330
330
  if date in self.startdatetimeColId:
arelle/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '2.37.64'
32
- __version_tuple__ = version_tuple = (2, 37, 64)
31
+ __version__ = version = '2.37.66'
32
+ __version_tuple__ = version_tuple = (2, 37, 66)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -14,7 +14,7 @@ from arelle.ModelInstanceObject import ModelFact
14
14
  from arelle.ModelValue import QName
15
15
  from arelle.ModelXbrl import ModelXbrl
16
16
  from arelle.typing import TypeGetText
17
- from arelle.UrlUtil import scheme
17
+ from arelle.UrlUtil import isExternalUrl
18
18
  from arelle.utils.Contexts import ContextHashKey
19
19
  from arelle.utils.validate.Validation import Validation
20
20
  from arelle.ValidateFilingText import parseImageDataURL
@@ -73,7 +73,7 @@ def errorOnForbiddenImage(
73
73
  """
74
74
  invalidImages = []
75
75
  for image in images:
76
- if scheme(image) in ("http", "https", "ftp"):
76
+ if isExternalUrl(image):
77
77
  invalidImages.append(image)
78
78
  elif image.startswith("data:image"):
79
79
  dataURLParts = parseImageDataURL(image)
@@ -3,14 +3,17 @@ See COPYRIGHT.md for copyright information.
3
3
  """
4
4
  from __future__ import annotations
5
5
 
6
- from pathlib import Path
6
+ from collections import defaultdict
7
7
  from typing import Any, Iterable
8
8
 
9
9
  import regex
10
10
  from jaconv import jaconv
11
11
 
12
12
  from arelle import XbrlConst, ValidateDuplicateFacts
13
+ from arelle.Cntlr import Cntlr
14
+ from arelle.FileSource import FileSource
13
15
  from arelle.LinkbaseType import LinkbaseType
16
+ from arelle.ModelDtsObject import ModelResource, ModelConcept
14
17
  from arelle.ModelValue import QName
15
18
  from arelle.ValidateDuplicateFacts import DuplicateType
16
19
  from arelle.ValidateXbrl import ValidateXbrl
@@ -19,6 +22,7 @@ from arelle.utils.PluginHooks import ValidationHook
19
22
  from arelle.utils.validate.Decorator import validation
20
23
  from arelle.utils.validate.Validation import Validation
21
24
  from ..Constants import AccountingStandard
25
+ from ..ControllerPluginData import ControllerPluginData
22
26
  from ..DeiRequirements import DeiItemStatus
23
27
  from ..DisclosureSystems import (DISCLOSURE_SYSTEM_EDINET)
24
28
  from ..PluginValidationDataExtension import PluginValidationDataExtension
@@ -548,6 +552,103 @@ def rule_EC8027W(
548
552
  )
549
553
 
550
554
 
555
+ @validation(
556
+ hook=ValidationHook.XBRL_FINALLY,
557
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
558
+ )
559
+ def rule_EC8028W(
560
+ pluginData: PluginValidationDataExtension,
561
+ val: ValidateXbrl,
562
+ *args: Any,
563
+ **kwargs: Any,
564
+ ) -> Iterable[Validation]:
565
+ """
566
+ EDINET.EC8028W: The priority attribute must not be duplicated for the same
567
+ element and label role within the submitter's taxonomy.
568
+
569
+ Note: Not mentioned in documentation, but inferring from sample filings that
570
+ label language should also be considered.
571
+ """
572
+ labelsRelationshipSet = val.modelXbrl.relationshipSet(XbrlConst.conceptLabel)
573
+ if labelsRelationshipSet is None:
574
+ return
575
+ for concept, rels in labelsRelationshipSet.fromModelObjects().items():
576
+ groups = defaultdict(list)
577
+ for rel in rels:
578
+ if not isinstance(rel.toModelObject, ModelResource):
579
+ continue
580
+ if not pluginData.isExtensionUri(rel.modelDocument.uri, val.modelXbrl):
581
+ continue
582
+ groups[(rel.toModelObject.xmlLang, rel.toModelObject.role, rel.priority)].append(rel)
583
+ for (lang, role, priority), group in groups.items():
584
+ if len(group) > 1:
585
+ yield Validation.warning(
586
+ codes='EDINET.EC8028W',
587
+ msg=_("The priority attribute must not be duplicated for the same "
588
+ "element and label role in the same submitter taxonomy. "
589
+ "File name: '%(path)s'. Concept: '%(concept)s'. "
590
+ "Role: '%(role)s'. Priority: %(priority)s. "
591
+ "Please check the element and label name of the corresponding "
592
+ "file. Please set the priority attribute so that the same "
593
+ "element and the same label role in the submitter's taxonomy "
594
+ "are not duplicated."),
595
+ path=rels[0].document.basename,
596
+ concept=concept.qname,
597
+ role=role,
598
+ priority=priority,
599
+ modelObject=group,
600
+ )
601
+
602
+
603
+ @validation(
604
+ hook=ValidationHook.COMPLETE,
605
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
606
+ )
607
+ def rule_EC8029W(
608
+ pluginData: ControllerPluginData,
609
+ cntlr: Cntlr,
610
+ fileSource: FileSource,
611
+ *args: Any,
612
+ **kwargs: Any,
613
+ ) -> Iterable[Validation]:
614
+ """
615
+ EDINET.EC8029W: Any non-abstract element referenced in the definition or presentation linkbase must
616
+ be present in an instance.
617
+ """
618
+ linkbaseTypes = (LinkbaseType.DEFINITION, LinkbaseType.PRESENTATION)
619
+ arcroles = tuple(
620
+ arcrole
621
+ for linkbaseType in linkbaseTypes
622
+ for arcrole in linkbaseType.getArcroles()
623
+ )
624
+ referencedConcepts: set[ModelConcept] = set()
625
+ usedConcepts: set[ModelConcept] = set()
626
+ for modelXbrl in pluginData.loadedModelXbrls:
627
+ usedConcepts.update(fact.concept for fact in modelXbrl.facts)
628
+ relSet = modelXbrl.relationshipSet(arcroles)
629
+ if relSet is None:
630
+ continue
631
+ concepts = list(relSet.fromModelObjects().keys()) + list(relSet.toModelObjects().keys())
632
+ for concept in concepts:
633
+ if not isinstance(concept, ModelConcept):
634
+ continue
635
+ if concept.isAbstract:
636
+ continue
637
+ referencedConcepts.add(concept)
638
+ unusedConcepts = referencedConcepts - usedConcepts
639
+ for concept in unusedConcepts:
640
+ yield Validation.warning(
641
+ codes='EDINET.EC8029W',
642
+ msg=_("The non-abstract element present in the presentation link or definition "
643
+ "link is not set in an inline XBRL file. "
644
+ "Element: '%(concept)s'. "
645
+ "Please use the element in the inline XBRL file. If it is an unnecessary "
646
+ "element, please delete it from the presentation link and definition link."),
647
+ concept=concept.qname.localName,
648
+ modelObject=concept,
649
+ )
650
+
651
+
551
652
  @validation(
552
653
  hook=ValidationHook.XBRL_FINALLY,
553
654
  disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
@@ -3,13 +3,14 @@ See COPYRIGHT.md for copyright information.
3
3
  """
4
4
  from __future__ import annotations
5
5
 
6
+ import contextlib
6
7
  from collections import defaultdict
7
8
  from datetime import timedelta
8
9
  from typing import Any, cast, Iterable
9
10
 
10
11
  import regex
11
12
 
12
- from arelle import ModelDocument, XbrlConst, XmlUtil
13
+ from arelle import ModelDocument, UrlUtil, XbrlConst, XmlUtil
13
14
  from arelle.HtmlUtil import attrValue
14
15
  from arelle.LinkbaseType import LinkbaseType
15
16
  from arelle.ModelDtsObject import ModelConcept
@@ -1272,7 +1273,6 @@ def rule_gfm_1_4_4(
1272
1273
  GFM 1.4.4: The xlink:role attribute of an element with a type="extended" attribute or a
1273
1274
  type="resource" attribute must be present and must not be empty.
1274
1275
  """
1275
-
1276
1276
  for modelDocument in val.modelXbrl.urlDocs.values():
1277
1277
  if pluginData.isStandardTaxonomyUrl(modelDocument.uri, val.modelXbrl):
1278
1278
  continue
@@ -1289,6 +1289,74 @@ def rule_gfm_1_4_4(
1289
1289
  )
1290
1290
 
1291
1291
 
1292
+ @validation(
1293
+ hook=ValidationHook.XBRL_FINALLY,
1294
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
1295
+ )
1296
+ def rule_gfm_1_4_6(
1297
+ pluginData: PluginValidationDataExtension,
1298
+ val: ValidateXbrl,
1299
+ *args: Any,
1300
+ **kwargs: Any,
1301
+ ) -> Iterable[Validation]:
1302
+ """
1303
+ EDINET.EC5700W: [GFM 1.4.6] Please correct the value of the link:arcroleRef attribute to
1304
+ one specified in the XBRL 2.1 specification or the EDINET taxonomy.
1305
+ GFM 1.4.6: The text preceding a sharp sign "#" in an xlink:href attribute of link:arcroleRef must
1306
+ be a standard taxonomy or in a file recognised in the disclosure system.
1307
+ """
1308
+
1309
+ for modelDocument in val.modelXbrl.urlDocs.values():
1310
+ if pluginData.isStandardTaxonomyUrl(modelDocument.uri, val.modelXbrl):
1311
+ continue
1312
+ rootElt = modelDocument.xmlRootElement
1313
+ for elt in rootElt.iter(XbrlConst.qnLinkArcroleRef.clarkNotation):
1314
+ refUri = elt.get("arcroleURI")
1315
+ hrefAttr = elt.get(XbrlConst.qnXlinkHref.clarkNotation)
1316
+ hrefUri, hrefId = UrlUtil.splitDecodeFragment(hrefAttr)
1317
+ if hrefUri not in val.disclosureSystem.standardTaxonomiesDict:
1318
+ yield Validation.warning(
1319
+ codes='EDINET.EC5700W.GFM.1.4.6',
1320
+ msg=_("Please correct the value of the link:arcroleRef attribute to one specified in the XBRL 2.1 specification or the EDINET taxonomy."
1321
+ " link:arcroleRef: %(xlinkHref)s, arcrole: %(refURI)s,"),
1322
+ modelObject=elt,
1323
+ refURI=refUri,
1324
+ xlinkHref=hrefUri
1325
+ )
1326
+
1327
+
1328
+ @validation(
1329
+ hook=ValidationHook.XBRL_FINALLY,
1330
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
1331
+ )
1332
+ def rule_gfm_1_4_8(
1333
+ pluginData: PluginValidationDataExtension,
1334
+ val: ValidateXbrl,
1335
+ *args: Any,
1336
+ **kwargs: Any,
1337
+ ) -> Iterable[Validation]:
1338
+ """
1339
+ EDINET.EC5700W: [GFM 1.4.8] Correct the priority attribute value so that it is less than 10.
1340
+ """
1341
+
1342
+ for modelDocument in val.modelXbrl.urlDocs.values():
1343
+ if pluginData.isStandardTaxonomyUrl(modelDocument.uri, val.modelXbrl):
1344
+ continue
1345
+ rootElt = modelDocument.xmlRootElement
1346
+ ns = {'xlink': 'http://www.w3.org/1999/xlink'}
1347
+ for elt in rootElt.xpath('//*[@xlink:type="arc"][@priority]', namespaces=ns):
1348
+ priority = elt.get("priority")
1349
+ with contextlib.suppress(ValueError, TypeError):
1350
+ if int(priority) >= 10:
1351
+ yield Validation.warning(
1352
+ codes='EDINET.EC5700W.GFM.1.4.8',
1353
+ msg=_("Correct the priority attribute value so that it is less than 10. Arc element: %(arcName)s, priority: %(priority)s"),
1354
+ arcName=elt.qname,
1355
+ modelObject=elt,
1356
+ priority=priority,
1357
+ )
1358
+
1359
+
1292
1360
  @validation(
1293
1361
  hook=ValidationHook.XBRL_FINALLY,
1294
1362
  disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
@@ -11,6 +11,7 @@ from typing import Any, Iterable, TYPE_CHECKING
11
11
  from arelle import UrlUtil, XbrlConst
12
12
  from arelle.Cntlr import Cntlr
13
13
  from arelle.FileSource import FileSource
14
+ from arelle.ModelDocument import Type as ModelDocumentType
14
15
  from arelle.ModelInstanceObject import ModelFact
15
16
  from arelle.ModelObject import ModelObject
16
17
  from arelle.ValidateXbrl import ValidateXbrl
@@ -1098,6 +1099,71 @@ def rule_EC1031E(
1098
1099
  )
1099
1100
 
1100
1101
 
1102
+ @validation(
1103
+ hook=ValidationHook.XBRL_FINALLY,
1104
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
1105
+ )
1106
+ def rule_EC8023W(
1107
+ pluginData: PluginValidationDataExtension,
1108
+ val: ValidateXbrl,
1109
+ *args: Any,
1110
+ **kwargs: Any,
1111
+ ) -> Iterable[Validation]:
1112
+ """
1113
+ EDINET.EC8023W: In IXBRL files, 'nonFraction' elements should be immediately preceded by
1114
+ '△' if and only if the sign attribute is '-'.
1115
+
1116
+ * Tagging using International Financial Reporting Standards taxonomy elements is not checked.
1117
+ * Tagging using Japanese GAAP notes or IFRS financial statement filer-specific additional elements
1118
+ may be identified as an exception and a warning displayed, even if the data content is correct.
1119
+ """
1120
+ nsmap = {
1121
+ 'ix': XbrlConst.ixbrl
1122
+ }
1123
+ negativeFactXpath = """
1124
+ //ix:nonFraction[@sign="-"][
1125
+ (preceding-sibling::text()[1] and normalize-space(preceding-sibling::text()[1]) != '△')
1126
+ or
1127
+ not(preceding-sibling::text()[1])
1128
+ ]
1129
+ """
1130
+ postiveFactXpath = """
1131
+ //ix:nonFraction[
1132
+ not(@sign="-")
1133
+ and
1134
+ (
1135
+ (preceding-sibling::text()[1] and normalize-space(preceding-sibling::text()[1]) = '△')
1136
+ )
1137
+ ]
1138
+ """
1139
+ for doc in val.modelXbrl.urlDocs.values():
1140
+ if doc.type != ModelDocumentType.INLINEXBRL:
1141
+ continue
1142
+ if not pluginData.isExtensionUri(doc.uri, val.modelXbrl):
1143
+ continue
1144
+ for elt in doc.xmlRootElement.xpath(negativeFactXpath, namespaces=nsmap):
1145
+ if elt.qname.namespaceURI == pluginData.jpigpNamespace:
1146
+ continue
1147
+ yield Validation.error(
1148
+ codes='EDINET.EC8023W',
1149
+ msg=_("In an inline XBRL file, if the sign attribute of the ix:nonFraction "
1150
+ "element is set to \"-\" (minus), you must set \"△\" immediately "
1151
+ "before the ix:nonFraction element tag."),
1152
+ modelObject=elt,
1153
+ )
1154
+ for elt in doc.xmlRootElement.xpath(postiveFactXpath, namespaces=nsmap):
1155
+ if elt.qname.namespaceURI == pluginData.jpigpNamespace:
1156
+ continue
1157
+ yield Validation.error(
1158
+ codes='EDINET.EC8023W',
1159
+ msg=_("In an inline XBRL file, if the sign attribute of the ix:nonFraction "
1160
+ "element is not set to \"-\" (minus), there is no need to set \"△\" "
1161
+ "immediately before the ix:nonFraction element tag."),
1162
+ modelObject=elt,
1163
+ )
1164
+
1165
+
1166
+
1101
1167
  @validation(
1102
1168
  hook=ValidationHook.FILESOURCE,
1103
1169
  disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
@@ -348,6 +348,11 @@ def checkFilingDTS(
348
348
  val.modelXbrl.error("ESEF.3.1.1.linkbasesNotSeparateFiles",
349
349
  _("Each linkbase type MUST be provided in a separate linkbase file, found: %(linkbasesFound)s."),
350
350
  modelObject=modelDocument.xmlRootElement, linkbasesFound=", ".join(sorted(linkbasesFound)))
351
+ # As per ESEF conformance test case TC2_invalid, also output an extensionTaxonomyWrongFilesStructure error
352
+ val.modelXbrl.error("ESEF.3.1.1.extensionTaxonomyWrongFilesStructure",
353
+ _("Each linkbase type MUST be provided in a separate linkbase file, please check file %(documentName)s."),
354
+ modelObject=modelDocument.xmlRootElement,
355
+ documentName=modelDocument.basename)
351
356
 
352
357
  # check for any prohibiting dimensionArc's
353
358
  for prohibitingArcElt in modelDocument.xmlRootElement.iterdescendants(tag="{http://www.xbrl.org/2003/linkbase}definitionArc"):
@@ -10,7 +10,7 @@ from lxml.etree import XML, XMLSyntaxError
10
10
 
11
11
  from arelle.ModelObject import ModelObject
12
12
  from arelle.ModelXbrl import ModelXbrl
13
- from arelle.UrlUtil import scheme
13
+ from arelle.UrlUtil import isExternalUrl
14
14
  from arelle.ValidateFilingText import validateGraphicHeaderType
15
15
  from arelle.typing import TypeGetText
16
16
  from ..Const import supportedImgTypes
@@ -89,7 +89,7 @@ def checkSVGContent(
89
89
  modelXbrl.error(f"{guidance}.executableCodePresent",
90
90
  _("Inline XBRL images MUST NOT contain executable code: %(element)s"),
91
91
  modelObject=imgElt, element=eltTag)
92
- elif scheme(href) in ("http", "https", "ftp"):
92
+ elif isExternalUrl(href):
93
93
  modelXbrl.error(f"{guidance}.referencesPointingOutsideOfTheReportingPackagePresent",
94
94
  _("Inline XBRL instance document [image] MUST NOT contain any reference pointing to resources outside the reporting package: %(element)s"),
95
95
  modelObject=imgElt, element=eltTag)
@@ -27,7 +27,7 @@ from arelle.PythonUtil import isLegacyAbs, strTruncate
27
27
  from arelle.utils.Contexts import partitionModelXbrlContexts
28
28
  from arelle.utils.Units import partitionModelXbrlUnits
29
29
  from arelle.utils.validate.DetectScriptsInXhtml import containsScriptMarkers
30
- from arelle.UrlUtil import decodeBase64DataImage, isHttpUrl, scheme
30
+ from arelle.UrlUtil import decodeBase64DataImage, isHttpUrl, isExternalUrl
31
31
  from arelle.ValidateFilingText import parseImageDataURL
32
32
  from arelle.ValidateUtr import ValidateUtr
33
33
  from arelle.ValidateXbrl import ValidateXbrl
@@ -307,7 +307,7 @@ def validateXbrlFinally(val: ValidateXbrl, *args: Any, **kwargs: Any) -> None:
307
307
  modelObject=elt, element=eltTag)
308
308
  elif eltTag == "img":
309
309
  src = elt.get("src","").strip()
310
- if scheme(src) in ("http", "https", "ftp"):
310
+ if isExternalUrl(src):
311
311
  modelXbrl.error("ESEF.4.1.6.xHTMLDocumentContainsExternalReferences" if val.unconsolidated
312
312
  else "ESEF.3.5.1.inlineXbrlDocumentContainsExternalReferences",
313
313
  _("Inline XBRL instance documents MUST NOT contain any reference pointing to resources outside the reporting package: %(element)s"),
@@ -365,7 +365,7 @@ def validateXbrlFinally(val: ValidateXbrl, *args: Any, **kwargs: Any) -> None:
365
365
  # or to other sections of the annual financial report.'''
366
366
  #elif eltTag == "a":
367
367
  # href = elt.get("href","").strip()
368
- # if scheme(href) in ("http", "https", "ftp"):
368
+ # if isExternalUrl(href):
369
369
  # modelXbrl.error("ESEF.4.1.6.xHTMLDocumentContainsExternalReferences" if val.unconsolidated
370
370
  # else "ESEF.3.5.1.inlineXbrlDocumentContainsExternalReferences",
371
371
  # _("Inline XBRL instance documents MUST NOT contain any reference pointing to resources outside the reporting package: %(element)s"),
@@ -386,6 +386,11 @@ def checkFilingDTS(val: ValidateXbrl, modelDocument: ModelDocument, esefNotesCon
386
386
  val.modelXbrl.error("ESEF.3.1.1.linkbasesNotSeparateFiles",
387
387
  _("Each linkbase type MUST be provided in a separate linkbase file, found: %(linkbasesFound)s."),
388
388
  modelObject=modelDocument.xmlRootElement, linkbasesFound=", ".join(sorted(linkbasesFound)))
389
+ # As per ESEF conformance test case TC2_invalid, also output an extensionTaxonomyWrongFilesStructure error
390
+ val.modelXbrl.error("ESEF.3.1.1.extensionTaxonomyWrongFilesStructure",
391
+ _("Each linkbase type MUST be provided in a separate linkbase file, please check file %(documentName)s."),
392
+ modelObject=modelDocument.xmlRootElement,
393
+ documentName=modelDocument.basename)
389
394
 
390
395
  # check for any prohibiting dimensionArc's
391
396
  for prohibitingArcElt in modelDocument.xmlRootElement.iterdescendants(tag="{http://www.xbrl.org/2003/linkbase}definitionArc"):
@@ -33,7 +33,7 @@ from arelle.PythonUtil import strTruncate
33
33
  from arelle.utils.Contexts import partitionModelXbrlContexts
34
34
  from arelle.utils.Units import partitionModelXbrlUnits
35
35
  from arelle.utils.validate.DetectScriptsInXhtml import containsScriptMarkers
36
- from arelle.UrlUtil import isHttpUrl
36
+ from arelle.UrlUtil import isHttpUrl, isExternalUrl
37
37
  from arelle.ValidateUtr import ValidateUtr
38
38
  from arelle.ValidateXbrl import ValidateXbrl
39
39
  from arelle.ValidateXbrlCalcs import inferredDecimals, rangeValue
@@ -355,6 +355,27 @@ def validateXbrlFinally(val: ValidateXbrl, *args: Any, **kwargs: Any) -> None:
355
355
  modelXbrl.error(f"{contentOtherThanXHTMLGuidance}.executableCodePresent",
356
356
  _("Inline XBRL documents MUST NOT contain executable code: %(element)s"),
357
357
  modelObject=elt, element=eltTag)
358
+ externalReferenceFound = False
359
+ if eltTag == "object":
360
+ # Check if the attribute 'archive' contains an external reference!
361
+ archiveAttr = elt.get("archive", "").strip()
362
+ for possibleURI in archiveAttr.split(" "):
363
+ if isExternalUrl(possibleURI.strip()):
364
+ externalReferenceFound = True
365
+ break
366
+ elif eltTag == "script":
367
+ # Check if the attribute 'src' contains an external reference!
368
+ srcAttr = elt.get("src", "").strip()
369
+ if isExternalUrl(srcAttr):
370
+ externalReferenceFound = True
371
+ if externalReferenceFound:
372
+ modelXbrl.error(
373
+ "ESEF.4.1.6.xHTMLDocumentContainsExternalReferences" if val.unconsolidated
374
+ else "ESEF.3.5.1.inlineXbrlDocumentContainsExternalReferences",
375
+ _("Inline XBRL instance documents MUST NOT contain any reference pointing to resources outside the reporting package: %(element)s"),
376
+ modelObject=elt, element=eltTag,
377
+ messageCodes=("ESEF.3.5.1.inlineXbrlDocumentContainsExternalReferences",
378
+ "ESEF.4.1.6.xHTMLDocumentContainsExternalReferences"))
358
379
  elif eltTag == "a" and "mailto" in elt.get("href", ""):
359
380
  modelXbrl.warning(f"{contentOtherThanXHTMLGuidance}.executableCodePresent.mailto",
360
381
  _("Inline XBRL documents SHOULD NOT contain any 'mailto' URI: %(element)s"),
@@ -371,7 +392,7 @@ def validateXbrlFinally(val: ValidateXbrl, *args: Any, **kwargs: Any) -> None:
371
392
  # or to other sections of the annual financial report.'''
372
393
  #elif eltTag == "a":
373
394
  # href = elt.get("href","").strip()
374
- # if scheme(href) in ("http", "https", "ftp"):
395
+ # if isExternalUrl(href):
375
396
  # modelXbrl.error("ESEF.4.1.6.xHTMLDocumentContainsExternalReferences" if val.unconsolidated
376
397
  # else "ESEF.3.5.1.inlineXbrlDocumentContainsExternalReferences",
377
398
  # _("Inline XBRL instance documents MUST NOT contain any reference pointing to resources outside the reporting package: %(element)s"),
@@ -92,7 +92,11 @@
92
92
  "http://www.esma.europa.eu/taxonomy/2017-03-31/esef_cor.xsd",
93
93
  "https://www.esma.europa.eu/taxonomy/2017-03-31/esef_cor.xsd",
94
94
  "http://www.esma.europa.eu/taxonomy/2019-03-27/esef_cor.xsd",
95
- "https://www.esma.europa.eu/taxonomy/2019-03-27/esef_cor.xsd"
95
+ "https://www.esma.europa.eu/taxonomy/2019-03-27/esef_cor.xsd",
96
+ "http://www.esma.europa.eu/taxonomy/2017-03-31/esef_all.xsd",
97
+ "https://www.esma.europa.eu/taxonomy/2017-03-31/esef_all.xsd",
98
+ "http://www.esma.europa.eu/taxonomy/2019-03-27/esef_all.xsd",
99
+ "https://www.esma.europa.eu/taxonomy/2019-03-27/esef_all.xsd"
96
100
  ],
97
101
  "effectiveTaxonomyURLs": [
98
102
  "http://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd",
@@ -108,7 +112,13 @@
108
112
  "http://www.esma.europa.eu/taxonomy/2019-03-27/esef_cor.xsd",
109
113
  "https://www.esma.europa.eu/taxonomy/2019-03-27/esef_cor.xsd",
110
114
  "http://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd",
111
- "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd"
115
+ "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd",
116
+ "http://www.esma.europa.eu/taxonomy/2017-03-31/esef_all.xsd",
117
+ "https://www.esma.europa.eu/taxonomy/2017-03-31/esef_all.xsd",
118
+ "http://www.esma.europa.eu/taxonomy/2019-03-27/esef_all.xsd",
119
+ "https://www.esma.europa.eu/taxonomy/2019-03-27/esef_all.xsd",
120
+ "http://www.esma.europa.eu/taxonomy/2020-03-16/esef_all.xsd",
121
+ "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_all.xsd"
112
122
  ],
113
123
  "effectiveTaxonomyURLs": [
114
124
  "http://www.esma.europa.eu/taxonomy/2021-03-24/esef_cor.xsd",
@@ -124,7 +134,13 @@
124
134
  "http://www.esma.europa.eu/taxonomy/2019-03-27/esef_cor.xsd",
125
135
  "https://www.esma.europa.eu/taxonomy/2019-03-27/esef_cor.xsd",
126
136
  "http://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd",
127
- "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd"
137
+ "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd",
138
+ "http://www.esma.europa.eu/taxonomy/2017-03-31/esef_all.xsd",
139
+ "https://www.esma.europa.eu/taxonomy/2017-03-31/esef_all.xsd",
140
+ "http://www.esma.europa.eu/taxonomy/2019-03-27/esef_all.xsd",
141
+ "https://www.esma.europa.eu/taxonomy/2019-03-27/esef_all.xsd",
142
+ "http://www.esma.europa.eu/taxonomy/2020-03-16/esef_all.xsd",
143
+ "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_all.xsd"
128
144
  ],
129
145
  "effectiveTaxonomyURLs": [
130
146
  "http://www.esma.europa.eu/taxonomy/2021-03-24/esef_cor.xsd",
@@ -142,7 +158,15 @@
142
158
  "http://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd",
143
159
  "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_cor.xsd",
144
160
  "http://www.esma.europa.eu/taxonomy/2021-03-24/esef_cor.xsd",
145
- "https://www.esma.europa.eu/taxonomy/2021-03-24/esef_cor.xsd"
161
+ "https://www.esma.europa.eu/taxonomy/2021-03-24/esef_cor.xsd",
162
+ "http://www.esma.europa.eu/taxonomy/2017-03-31/esef_all.xsd",
163
+ "https://www.esma.europa.eu/taxonomy/2017-03-31/esef_all.xsd",
164
+ "http://www.esma.europa.eu/taxonomy/2019-03-27/esef_all.xsd",
165
+ "https://www.esma.europa.eu/taxonomy/2019-03-27/esef_all.xsd",
166
+ "http://www.esma.europa.eu/taxonomy/2020-03-16/esef_all.xsd",
167
+ "https://www.esma.europa.eu/taxonomy/2020-03-16/esef_all.xsd",
168
+ "http://www.esma.europa.eu/taxonomy/2021-03-24/esef_all.xsd",
169
+ "https://www.esma.europa.eu/taxonomy/2021-03-24/esef_all.xsd"
146
170
  ],
147
171
  "effectiveTaxonomyURLs": [
148
172
  "http://www.esma.europa.eu/taxonomy/2022-03-24/esef_cor.xsd",
@@ -17,7 +17,7 @@ from arelle import ModelDocument
17
17
  from arelle.ModelObjectFactory import parser
18
18
  from arelle.ModelXbrl import ModelXbrl
19
19
  from arelle.typing import TypeGetText
20
- from arelle.UrlUtil import decodeBase64DataImage, scheme
20
+ from arelle.UrlUtil import decodeBase64DataImage, isExternalUrl
21
21
  from arelle.utils.validate.Validation import Validation
22
22
  from arelle.ValidateFilingText import parseImageDataURL, validateGraphicHeaderType
23
23
  from arelle.ValidateXbrl import ValidateXbrl
@@ -105,7 +105,7 @@ def validateImage(
105
105
  if minExternalRessourceSize != -1:
106
106
  # transform kb to b
107
107
  minExternalRessourceSize = minExternalRessourceSize * 1024
108
- if scheme(image) in ("http", "https", "ftp"):
108
+ if isExternalUrl(image):
109
109
  yield Validation.error(("ESEF.4.1.6.xHTMLDocumentContainsExternalReferences" if not params.consolidated
110
110
  else "ESEF.3.5.1.inlineXbrlDocumentContainsExternalReferences",
111
111
  "NL.NL-KVK.3.6.2.1.inlineXbrlDocumentContainsExternalReferences"),
@@ -277,7 +277,7 @@ def checkSVGContentElt(
277
277
  yield Validation.error((f"{guidance}.executableCodePresent", "NL.NL-KVK.3.5.1.1.executableCodePresent"),
278
278
  _("Inline XBRL images MUST NOT contain executable code: %(element)s"),
279
279
  modelObject=imgElts, element=eltTag)
280
- elif scheme(href) in ("http", "https", "ftp"):
280
+ elif isExternalUrl(href):
281
281
  yield Validation.error((f"{guidance}.referencesPointingOutsideOfTheReportingPackagePresent", "NL.NL-KVK.3.6.2.1.inlineXbrlDocumentContainsExternalReferences"),
282
282
  _("Inline XBRL instance document [image] MUST NOT contain any reference pointing to resources outside the reporting package: %(element)s"),
283
283
  modelObject=imgElts, element=eltTag)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arelle-release
3
- Version: 2.37.64
3
+ Version: 2.37.66
4
4
  Summary: An open source XBRL platform.
5
5
  Author-email: "arelle.org" <support@arelle.org>
6
6
  License-Expression: Apache-2.0
@@ -66,10 +66,10 @@ arelle/TkTableWrapper.py,sha256=Bdm-WmLdwIiudqfaVGZElip_92eeSKQdd7hCjlILm1A,3361
66
66
  arelle/UITkTable.py,sha256=N83cXi5c0lLZLsDbwSKcPrlYoUoGsNavGN5YRx6d9XY,39810
67
67
  arelle/UiUtil.py,sha256=3G0xPclZI8xW_XQDbiFrmylB7Nd5muqi5n2x2oMkMZU,34218
68
68
  arelle/Updater.py,sha256=IZ8cq44Rq88WbQcB1VOpMA6bxdfZxfYQ8rgu9Ehpbes,7448
69
- arelle/UrlUtil.py,sha256=HrxZSG59EUMGMMGmWPuZkPi5-0BGqY3jAMkp7V4IdZo,32400
69
+ arelle/UrlUtil.py,sha256=EmjVfZ6-Ax5cvjVsbdYMb3VHzISVecGDE2gLRHzHmfQ,32489
70
70
  arelle/Validate.py,sha256=cX1OA3JPiwmjNmxfecZc24GBW1qXdjcEEynJ9F1K7Zg,58764
71
71
  arelle/ValidateDuplicateFacts.py,sha256=LEIbdEvm_fD4Nr5PMpVSy05e7FuyTw-VJMTVSSNX7Ac,21819
72
- arelle/ValidateFilingText.py,sha256=xnXc0xgdNiHQk0eyP7VSSpvw7qr-pRFRwqqoUb569is,54051
72
+ arelle/ValidateFilingText.py,sha256=ppPC8Uje1cxaVXQnRSpgNtLO2BlHWM9316IxPj7bfpA,54024
73
73
  arelle/ValidateInfoset.py,sha256=Rz_XBi5Ha43KpxXYhjLolURcWVx5qmqyjLxw48Yt9Dg,20396
74
74
  arelle/ValidateUtr.py,sha256=oxOPrOa1XEzBay4miXvx6eRLTnVFYUIJC9ueWUk4EkI,13633
75
75
  arelle/ValidateVersReport.py,sha256=RMe7GlcyZV0HoVFHL0qOGrKm4et-6yPq5dmikkhnvoU,43196
@@ -78,11 +78,11 @@ arelle/ValidateXbrlCalcs.py,sha256=6OMjIef6ixJGkxH-hgIRbMRJ46e52KEo-8vDyM97krc,4
78
78
  arelle/ValidateXbrlDTS.py,sha256=souKOWM_i52g0mNu9TMhqqdEwXm1tDO7R2n396r_7gs,103992
79
79
  arelle/ValidateXbrlDimensions.py,sha256=Qv7_CI65SiUcpgsnEc86XuMjKz81-170wE5dmZqnvHc,38373
80
80
  arelle/Version.py,sha256=RjbPSSiH57VzZFhhUmEmvLsL8uSb5VwEIj2zq-krhsY,934
81
- arelle/ViewFile.py,sha256=Bvh50RAHDEauAmF0KPHWAZocMyA0UCduJ46e0wbSnPE,19286
81
+ arelle/ViewFile.py,sha256=e68U1PnD10dw0PSKvqZkJ6ueLLZBPPGOa75xMfGifUA,19325
82
82
  arelle/ViewFileConcepts.py,sha256=ecIGNPhFelkpHSPzbV19w7ts8RZZsD657oYLQHtAzhk,4370
83
83
  arelle/ViewFileDTS.py,sha256=IlbBTKFT8grC4N4cWdam8UsUaVFeiy7MfL5PdyEefvA,2029
84
84
  arelle/ViewFileFactList.py,sha256=AVYoDJnhUoIkX7fT2D-bOrKP5g1JAwVnmSr4FYhT4iI,7194
85
- arelle/ViewFileFactTable.py,sha256=I3U6XomCHE5bnbUN_WMq80LyYnPz0GRgYdRDm8Pu3tg,17013
85
+ arelle/ViewFileFactTable.py,sha256=vgUFnImoEQTztO4m6B6mCLN1LWfGct24qSQKl36ZlXM,17069
86
86
  arelle/ViewFileFormulae.py,sha256=753p3pAZsoxx6-3b_xR_CDFReeMBgBZOCV_TIO0FuJE,4740
87
87
  arelle/ViewFileRelationshipSet.py,sha256=beQ6vGHJgpVwB3upofuPG0Rys2yt7GxsO4BcT96_nL8,16814
88
88
  arelle/ViewFileRenderedGrid.py,sha256=I0Q6tyhbu1vcZvWiigAGrPK2bHv_ixsZvLr3merYPJo,14112
@@ -125,7 +125,7 @@ arelle/XmlValidateConst.py,sha256=U_wN0Q-nWKwf6dKJtcu_83FXPn9c6P8JjzGA5b0w7P0,33
125
125
  arelle/XmlValidateParticles.py,sha256=Mn6vhFl0ZKC_vag1mBwn1rH_x2jmlusJYqOOuxFPO2k,9231
126
126
  arelle/XmlValidateSchema.py,sha256=6frtZOc1Yrx_5yYF6V6oHbScnglWrVbWr6xW4EHtLQI,7428
127
127
  arelle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
- arelle/_version.py,sha256=pzNwbLyTDGMLh8oqxsJPGFHbPoDh3ciopU2CzerFPvU,708
128
+ arelle/_version.py,sha256=7mP6Dryl-C9zKK-ALa3HCZHkwF-7BbhH__zd8ouxGn0,708
129
129
  arelle/typing.py,sha256=PRe-Fxwr2SBqYYUVPCJ3E7ddDX0_oOISNdT5Q97EbRM,1246
130
130
  arelle/api/Session.py,sha256=a71ML4FOkWxeqxQBRu6WUqkUoI4C5R6znzAQcbGR5jg,7902
131
131
  arelle/config/creationSoftwareNames.json,sha256=5MK7XUjfDJ9OpRCCHXeOErJ1SlTBZji4WEcEOdOacx0,3128
@@ -304,7 +304,7 @@ arelle/plugin/validate/DBA/PluginValidationDataExtension.py,sha256=y9W5S5QeuBoDk
304
304
  arelle/plugin/validate/DBA/ValidationPluginExtension.py,sha256=UygF7oELnPJcP6Ta0ncy3dy5fnJq-Mz6N2-gEaVhigo,48690
305
305
  arelle/plugin/validate/DBA/__init__.py,sha256=KhmlUkqgsRtEXpu5DZBXFzv43nUTvi-0sdDNRfw5Up4,1564
306
306
  arelle/plugin/validate/DBA/resources/config.xml,sha256=KHfo7SrjzmjHbfwIJBmESvOOjdIv4Av26BCcZxfn3Pg,875
307
- arelle/plugin/validate/DBA/rules/__init__.py,sha256=eBm6FAb_WnBBYfgLSwsO30gVjpWaHxLqRHRJAIBj7oo,10418
307
+ arelle/plugin/validate/DBA/rules/__init__.py,sha256=FdmlqdX7RE5nnN19PU23zLKzDibEm24UU2xurlfFmrw,10404
308
308
  arelle/plugin/validate/DBA/rules/fr.py,sha256=IAegA_Fc-Zkjj8qlzFuo_52gNVHW-lAddBFCQw8W8P4,71318
309
309
  arelle/plugin/validate/DBA/rules/tc.py,sha256=CXPOGHpab9Y-iV84wDXrsE-rPe_d6Uhw4HjEyTBEzq4,1572
310
310
  arelle/plugin/validate/DBA/rules/th.py,sha256=mDrjescz6106jBGjdH6bipqx48BnxcjHSkNL1qQf0QE,6227
@@ -334,23 +334,23 @@ arelle/plugin/validate/EDINET/resources/dei-requirements.csv,sha256=8ILKNn8bXbcg
334
334
  arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml,sha256=YXaPu-60CI2s0S-vXcLDEXCrrukEAAHyCEk0QRhrYR8,16772
335
335
  arelle/plugin/validate/EDINET/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
336
336
  arelle/plugin/validate/EDINET/rules/contexts.py,sha256=fSYIZOWg3Q3cDos17hNAvw1HUVdcZx7IlUFfBJnwjHo,19604
337
- arelle/plugin/validate/EDINET/rules/edinet.py,sha256=UhvTPfHxDuUitIAPY_4fgirAsjJG5Xfd-gH_4pMd3qI,25449
337
+ arelle/plugin/validate/EDINET/rules/edinet.py,sha256=mGqPXCJgy1SXb5Qhn3OpZZKbU7Rq3OeW-pDODFPvR4s,29714
338
338
  arelle/plugin/validate/EDINET/rules/frta.py,sha256=wpX5zK0IfVVYZR9ELy2g_Z_F1Jzhwd9gh_KZC5ALkLg,12756
339
- arelle/plugin/validate/EDINET/rules/gfm.py,sha256=CoFDf9yIncroaqtCRRJImnfELf6IU6ORN1c2xvhTj54,89125
339
+ arelle/plugin/validate/EDINET/rules/gfm.py,sha256=l5XHOBqyorub0LaQ7lA6oISy4oSynNFz4ilW9-Br89A,92060
340
340
  arelle/plugin/validate/EDINET/rules/manifests.py,sha256=MoT9R_a4BzuYdQVbF7RC5wz134Ve68svSdJ3NlpO_AU,4026
341
- arelle/plugin/validate/EDINET/rules/upload.py,sha256=eI1eJWGCsEqG5jUsbc5VH-PoT2aSMWxlW5aqwZGQ0Fk,50266
341
+ arelle/plugin/validate/EDINET/rules/upload.py,sha256=kG-zihz16ow_B6lGOYEqyH84Mx9sIqSX1_m0sSQfV3Q,52875
342
342
  arelle/plugin/validate/ESEF/Const.py,sha256=JujF_XV-_TNsxjGbF-8SQS4OOZIcJ8zhCMnr-C1O5Ho,22660
343
343
  arelle/plugin/validate/ESEF/Dimensions.py,sha256=MOJM7vwNPEmV5cu-ZzPrhx3347ZvxgD6643OB2HRnIk,10597
344
344
  arelle/plugin/validate/ESEF/Util.py,sha256=QH3btcGqBpr42M7WSKZLSdNXygZaZLfEiEjlxoG21jE,7950
345
345
  arelle/plugin/validate/ESEF/__init__.py,sha256=LL7uYOcGPHgjwTlcfW2oWMqWiqrZ5yABzcKkJZFrZis,20391
346
- arelle/plugin/validate/ESEF/ESEF_2021/DTS.py,sha256=6Za7BANwwc_egxLCgbgWzwUGOXZv9IF1I7JCkDNt2Tw,26277
347
- arelle/plugin/validate/ESEF/ESEF_2021/Image.py,sha256=4bnhuy5viBU0viPjb4FhcRRjVVKlNdnKLFdSGg3sZvs,4871
348
- arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py,sha256=YhjHL3vo07ZtdCwUsOeTTKdiU8fmDyO9L4gbQ6nBSi4,63715
346
+ arelle/plugin/validate/ESEF/ESEF_2021/DTS.py,sha256=0uVPVysjgJK4yplRUvHO2kZ6M7FC-egIjImN3791koY,26761
347
+ arelle/plugin/validate/ESEF/ESEF_2021/Image.py,sha256=UDGpb2qFjt6J8MTeevlbDQX8D79Hzv3cZoxvkmDtEvE,4857
348
+ arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py,sha256=KCqJnjTUEe3FFiztQ-PDTJoYNJQ4QFZ3tKj_na0spjg,63680
349
349
  arelle/plugin/validate/ESEF/ESEF_2021/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
350
- arelle/plugin/validate/ESEF/ESEF_Current/DTS.py,sha256=epp-PBh1NJzQqgxUE6C468HmoDc2w3j54rMwfiOAry4,29334
351
- arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py,sha256=FmdnPircIKOO9EvFGzlAeRJGmMLnDHPpALM0-8zfKIs,75025
350
+ arelle/plugin/validate/ESEF/ESEF_Current/DTS.py,sha256=t8eadnO1paPzHcCaEEs67hg17dSPDlGlDbVpHwJF6UA,29818
351
+ arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py,sha256=BCruY89slaiDuZIIVriAD1DPGIrIFNUQqMVBifEWY7Q,76680
352
352
  arelle/plugin/validate/ESEF/ESEF_Current/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
353
- arelle/plugin/validate/ESEF/resources/authority-validations.json,sha256=_Xnqaj0pdw2QM3LhOguBHnEqbo1eutm643_SO18UJls,15487
353
+ arelle/plugin/validate/ESEF/resources/authority-validations.json,sha256=69o1ubI1-fNcaF7uOp1HTBcyVL_kCquAG3f3H6V9Ghk,17275
354
354
  arelle/plugin/validate/ESEF/resources/config.xml,sha256=t3STU_-QYM7Ay8YwZRPapnohiWVWhjfr4L2Rjx9xN9U,3902
355
355
  arelle/plugin/validate/FERC/__init__.py,sha256=rC1OYNBWnoXowEohiR9yagHtAi_NPAlmaahRSQhSdS4,11325
356
356
  arelle/plugin/validate/FERC/config.xml,sha256=bn9b8eCqJA1J62rYq1Nz85wJrMGAahVmmnIUQZyerjo,1919
@@ -681,16 +681,16 @@ arelle/utils/Units.py,sha256=c9bwnu9Xnm00gC9Q6qQ1ogsEeTEXGRH7rahlEbrEWnQ,1201
681
681
  arelle/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
682
682
  arelle/utils/validate/Decorator.py,sha256=8LGmA171HZgKrALtsMKyHqMNM-XCdwJOv6KpZz4pC2c,3161
683
683
  arelle/utils/validate/DetectScriptsInXhtml.py,sha256=RFBh_Z24OjR69s71qQzSzbxdU-WCTWuvYlONN-BgpZ0,2098
684
- arelle/utils/validate/ESEFImage.py,sha256=M3pR9zxz0Y8oNjrpniEYwztCV2hoBK4fDSi4U095C3k,15520
684
+ arelle/utils/validate/ESEFImage.py,sha256=R3_iWmLYBbIAnPuNpuRi8bqa3MAPXc8MDumfizkAz_8,15485
685
685
  arelle/utils/validate/Validation.py,sha256=n6Ag7VeCj_VO5nqzw_P53hOfXXeT2APK0Enb3UQqBns,832
686
686
  arelle/utils/validate/ValidationPlugin.py,sha256=mArkGwSUQxMnLrQT_oprDjeJaN9dD0A0LWvpHCSmFz8,14712
687
687
  arelle/utils/validate/ValidationUtil.py,sha256=hghMQoNuC3ocs6kkNtIQPhh8QwzubwHGtGn6g-Yx4ME,525
688
688
  arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
689
689
  arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
690
690
  arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
691
- arelle_release-2.37.64.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
692
- arelle_release-2.37.64.dist-info/METADATA,sha256=HdYz86IdNk8BDYFcX_4VLej6PIgl6c6B53RCpNa4oA4,9355
693
- arelle_release-2.37.64.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
694
- arelle_release-2.37.64.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
695
- arelle_release-2.37.64.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
696
- arelle_release-2.37.64.dist-info/RECORD,,
691
+ arelle_release-2.37.66.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
692
+ arelle_release-2.37.66.dist-info/METADATA,sha256=_ztovOi_5js6O0w_nldk5c99k8B_ZpFp2TDTj4jKits,9355
693
+ arelle_release-2.37.66.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
694
+ arelle_release-2.37.66.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
695
+ arelle_release-2.37.66.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
696
+ arelle_release-2.37.66.dist-info/RECORD,,