Connect failed: Connection timed out

[GastForen Programmierung/Entwicklung AppleScript Dokumente in Ordner auf Vollständigkeit prüfen

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Dokumente in Ordner auf Vollständigkeit prüfen

mb_new
Beiträge gesamt: 123

26. Feb 2014, 12:50
Beitrag # 1 von 15
Bewertung:
(11572 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen!

Ich hab hier im Büro so einige Automator/Applescript Routinen laufen und die vereinfachen den Arbeitsalltag sehr.

Nun steh ich aber (mit meinen wenigen Kenntnissen) etwas an:

Ich möchte per Automator prüfen, welche Pdf Dokumente in einem Ordner fehlen.
Die Namen der Pdfs beginnen alle mit einer Zahl "001-..."
Das erste und letzte Dokument sind sicher vorhanden (wechselnde Zahl, es können 99 oder 20 Dokumente sein), dazwischen fehlen Dokumente, das ergibt es sich aus dem Kopierworkflow der Mitarbeiter.
Ich möchte nun mit Automator diesen Ordner durchsuchen und am Ende eine Liste in TextEdit ausgeben wo alle Nummern, die fehlen aufgelistet sind.

Ist so was einfach hinzubekommen?
X

Dokumente in Ordner auf Vollständigkeit prüfen

Hans Haesler
  
Beiträge gesamt: 5826

26. Feb 2014, 20:14
Beitrag # 2 von 15
Beitrag ID: #524180
Bewertung:
(11546 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo mb_new,

also ... "Automator" benutze ich nie. Ich habe mich nur vor Jahren – als er neu war –, damit beschäftigt, um einen Artikel für die "Fachhefte grafische Industrie" zu verfassen.

Deshalb eine automatorfreie Lösung, aus welcher Du hoffentlich etwas übernehmen kannst.

Code
-- den Quellordner wählen 
set sourceFolder to (choose folder) as Unicode text
-- die Namen der Dateien auflisten
set allFiles to list folder sourceFolder without invisibles

-- eine Liste vorbereiten
set numbersList to {}
-- eine Schleife durch die Namen
repeat with n from 1 to count allFiles
-- das aktuelle Element
set curFile to item n of allFiles
-- die ersten drei Zeichen des Namens an die Liste hängen
set end of numbersList to text 1 thru 3 of curFile
end repeat

-- die Startnummer
set startNum to item 1 of numbersList as integer
-- die Endnummer
set stopNum to item -1 of numbersList as integer

-- die Liste der fehlenden Nummern vorbereiten
set missList to {}
-- eine Schleife durch die Elemente
repeat with n from startNum + 1 to stopNum - 1
-- ein aktuelles Element zusammensetzen
set curItem to text -3 thru -1 of ("00" & n)
-- wenn sich das Element nicht in der Nummern-Liste befindet ...
if curItem is not in numbersList then
-- ... dann wird es an die Liste "Fehlende Nummern" gehängt
set end of missList to curItem
end if
end repeat

-- die Liste in einen String verwandeln
set AppleScript's text item delimiters to return
set missString to every text item of missList as string
set AppleScript's text item delimiters to {""}

-- den Nummernstring mit TextEdit anzeigen
tell application "TextEdit"
activate
make new document
set text of document 1 to "Fehlende Nummern:" & return & missString
end tell

Bedingung ist allerdings, dass sämtliche Dateinamen mit drei Ziffern beginnen. Falls das nicht zutreffen sollte, dann müsste wenigstens beim ersten und beim letzten geprüft werden, ob die drei ersten Zeichen wirklich Ziffern sind.

Gruss, Hans


als Antwort auf: [#524155]

Dokumente in Ordner auf Vollständigkeit prüfen

mb_new
Beiträge gesamt: 123

28. Mai 2019, 11:06
Beitrag # 3 von 15
Beitrag ID: #570420
Bewertung:
(10440 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,
hallo Forengemeinde!

Ich verwende dein Skript seit damals und es hat einwandfrei funktioniert.

Nach einem Update auf Mojave 10.14.4 funktioniert es leider nicht mehr.

Ich habe ein wenig herumgespielt und mir die einzelnen Parameter anzeigen lassen (zB Start und Endnummer) und mir kommt vor als würde die Reihenfolge der Zahlen nicht mehr richtig erkannt.
Wenn ich zB 2 Dateien mit "001-Datei1.pdf" und "005-Datei2.pdf" in einem Ordner habe, wird mir 5 als startNum angezeigt.
Dh meiner Meinung nach wird der Ordner irgendwie falsch durchsucht seit Mojave.

Ist euch Spezialisten da was bekannt? Bzw habt ihr Abhilfe?

Danke
Martin


als Antwort auf: [#524180]

Dokumente in Ordner auf Vollständigkeit prüfen

Hans Haesler
  
Beiträge gesamt: 5826

28. Mai 2019, 12:17
Beitrag # 4 von 15
Beitrag ID: #570423
Bewertung:
(10427 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

ja das Problem ist bekannt. Man sollte die Mojave-Entwickler in die gleichnamige Wüste schicken ...

Ich bin gerade unterwegs, werde aber heute Abend versuchen, das Script anzupassen.

Gruss, Hans


als Antwort auf: [#570420]

Dokumente in Ordner auf Vollständigkeit prüfen

Hans Haesler
  
Beiträge gesamt: 5826

28. Mai 2019, 18:35
Beitrag # 5 von 15
Beitrag ID: #570430
Bewertung:
(10391 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

wie gesagt: Diese Fehlleistung der Mojave-Bastler ist bekannt. Kürzlich wurde sie in der Skriptwerkstatt beklagt:
https://www.hilfdirselbst.ch/...i?post=570030#570030

Die Lösung: Die Liste der Namen muss sortiert werden, bevor sie weiter untersucht werden kann. Zum Sortieren wird hier ein QuickSort-Handler aufgerufen.
Ich kann nicht prüfen, ob das erweiterte Script wie erwartet funktioniert. "Mojave" ist noch nicht installiert (obwohl der AppStore es mir wöchentlich aufschwatzen will).

Dasselbe Script – leicht abgeändert – ist an diese Antwort angehängt. Als benutzerfreundliches Droplet gespeichert: Im Dock unterbringen und den zu untersuchenden Ordner auf das Icon des Droplets ziehen.

Code
(*FehlendeDateien.scpt 
Eventuell fehlende Dateien auflisten
® 28.05.2019 Hans Haesler, Châtelard 52, CH-1018 Lausanne
*)

# den Quellordner wählen
set sourceFolder to (choose folder) as Unicode text
# die Namen der Dateien auflisten
set namesList to list folder sourceFolder without invisibles
set nItems to count namesList
if nItems > 1 then
# die Liste zum Sortier-Handler schicken
set namesList to quickSort(namesList, 1, nItems)
end if

# eine Liste vorbereiten
set numbersList to {}

# eine Schleife durch die Namen
repeat with n from 1 to count namesList
# das aktuelle Element
set curFile to item n of namesList
# die ersten drei Zeichen des Namens an die Liste hängen
set end of numbersList to text 1 thru 3 of curFile
end repeat

# die Startnummer
set startNum to item 1 of numbersList as integer
# die Endnummer
set stopNum to item -1 of numbersList as integer

# die Liste der fehlenden Nummern vorbereiten
set missList to {}
# eine Schleife durch die Elemente
repeat with n from startNum + 1 to stopNum - 1
# ein aktuelles Element zusammensetzen
set curItem to text -3 thru -1 of ("00" & n)
# wenn sich das Element nicht in der Nummern-Liste befindet ...
if curItem is not in numbersList then
# ... dann wird es an die Liste "Fehlende Nummern" gehängt
set end of missList to curItem
end if
end repeat

# die Liste prüfen
if (count of missList) is greater than 0 then
# die Liste in einen String verwandeln
set AppleScript's text item delimiters to return
set missString to every text item of missList as string
set AppleScript's text item delimiters to {""}
# den Nummernstring mit TextEdit anzeigen
tell application "TextEdit"
activate
make new document
set text of document 1 to "Fehlende Nummern:" & return & missString
end tell
else
display dialog "Die Dateien sind vollzählig." buttons "OK" default button 1 with icon 1
end if

#######################################################
# der Handler, welcher die Namen sortiert
on quickSort(a, L, R)
script
property namesList : a
end script
tell result
set ctr to L
set n to R
set aRef to item L of its namesList
repeat while ctr < n
repeat while (aRef < item n of its namesList) and (ctr < n)
set n to n - 1
end repeat
if n is not ctr then
set item ctr of its namesList to item n of its namesList
set ctr to ctr + 1
end if
repeat while (aRef > item ctr of its namesList) and (ctr < n)
set ctr to ctr + 1
end repeat
if n is not ctr then
set item n of its namesList to item ctr of its namesList
set n to n - 1
end if
end repeat
set item n of its namesList to aRef
if L < n then
quickSort(its namesList, L, n - 1)
end if
if R > ctr then
quickSort(its namesList, ctr + 1, R)
return its namesList
end if
end tell
end quickSort

Neu im obigen Script und im Droplet: Wenn die Dateien vollzählig sind, wird ein entsprechender Dialog gezeigt.

Gruss, Hans


als Antwort auf: [#570420]
Anhang:
FehlendeDateien.zip (61.0 KB)

Dokumente in Ordner auf Vollständigkeit prüfen

mb_new
Beiträge gesamt: 123

29. Mai 2019, 10:38
Beitrag # 6 von 15
Beitrag ID: #570437
Bewertung:
(10347 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans!

Danke für deinen Einsatz. Immer wieder bewundernswert was du so rauszauberst.

Leider ist irgendwo ein Haken drinnen.

Ich bekomme die Fehlermeldung
"Die Variable "namesList" ist nicht definiert."

Anscheinend funktioniert da irgendwas mit dem Sortierhandler nicht. Meine Vermutung.

Lg
Martin


als Antwort auf: [#570430]

Dokumente in Ordner auf Vollständigkeit prüfen

mb_new
Beiträge gesamt: 123

29. Mai 2019, 12:11
Beitrag # 7 von 15
Beitrag ID: #570439
Bewertung:
(10336 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Ich habe in der Zwischenzeit eine Möglichkeit gefunden, das Problem zu lösen.
Allerdings nicht elegant mit einem Applescript, sondern über einen Umweg.

Ich frage mittels Automator den Ordner ab und lasse die Dateien von Automator sortieren und übergebe dann an das alte Applescript.
Das hab ich als Dienst abgespeichert und kann es über das Kontextmenü aufrufen.

Das funktioniert soweit einmal.

lg
martin


als Antwort auf: [#570437]

Dokumente in Ordner auf Vollständigkeit prüfen

Hans Haesler
  
Beiträge gesamt: 5826

29. Mai 2019, 12:23
Beitrag # 8 von 15
Beitrag ID: #570440
Bewertung:
(10335 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

gut, dass Du eine Lösung gefunden hast.

Welches Script hattest Du ausprobiert? Das Droplet oder jenes, welches ab Skript-Editor gestartet wird?

Hier haben beide wie erwartet funktioniert. Allerdings unter "High Sierra".

Ich werde das Ganze gegen Abend durchchecken.

Gruss, Hans


als Antwort auf: [#570439]

Dokumente in Ordner auf Vollständigkeit prüfen

mb_new
Beiträge gesamt: 123

29. Mai 2019, 14:45
Beitrag # 9 von 15
Beitrag ID: #570442
Bewertung:
(10317 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

danke für die Info.
Hier unter Mojave funktionieren beide Varianten nicht. Ich werd das auf einem anderen Rechner am Wochenende mit High Sierra auch probieren.

lg
Martin


als Antwort auf: [#570440]

Dokumente in Ordner auf Vollständigkeit prüfen

Hans Haesler
  
Beiträge gesamt: 5826

29. Mai 2019, 19:47
Beitrag # 10 von 15
Beitrag ID: #570445
Bewertung:
(10293 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

unter "High Sierra" ist das Sortieren nicht notwendig. Der Handler wird dennoch ausgeführt. Aber es kommt keine Fehlermeldung.

Damit die Namen dennoch sortiert werden, habe ich die Zeilen ...

Code
set sourceFolder to (choose folder) as Unicode text 
set namesList to list folder sourceFolder without invisibles

... durch diese ersetzt:

Code
set namesList to {"005-test.pdf", "001-test.pdf", "019-test.pdf", "002-test.pdf", "014-test.pdf", "003-test.pdf", ¬ 
"006-test.pdf", "007-test.pdf", "008-test.pdf", "009-test.pdf", "016-test.pdf", "011-test.pdf", "012-test.pdf", ¬
"013-test.pdf", "015-test.pdf", "017-test.pdf", "018-test.pdf", "020-test.pdf", "022-test.pdf", "023-test.pdf"}

Wenn das Script ausgeführt wird, zeigt "TextEdit" dieses erwartete Ergebnis:
---
Fehlende Nummern:
004
010
021
---

*****
Vorerst bleibt nur der Versuch einer Fern-Analyse:
– Das Script im Skripteditor öffnen;
– Das Fenster, welches den Verlauf aufzeichnet, öffnen (im AppleScript-Editor-Menü "Fenster" den Artikel "Verlauf des Event-Protokolls" wählen);
– das Script starten;
– den Verlauf auswählen, kopieren und mir durchgeben.

Besten Dank im voraus.

Gruss, Hans


als Antwort auf: [#570442]

Dokumente in Ordner auf Vollständigkeit prüfen

mb_new
Beiträge gesamt: 123

3. Jun 2019, 11:59
Beitrag # 11 von 15
Beitrag ID: #570493
Bewertung:
(9249 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans!

Hier dei Fehlermeldung aus dem Verlauf:
Zitat tell application "Script Editor"
choose folder
--> alias "Macintosh HD:Users:xxx:Desktop:Neuer Ordner 2:"
end tell
tell current application
list folder "Macintosh HD:Users:xxx:Desktop:Neuer Ordner 2:" without invisibles
--> {"018-Test.pdf", "014-Test.pdf"}
Ergebnis:
error "Die Variable „namesList“ ist nicht definiert." number -2753 from "namesList"



In der Zwischenzeit bin ich per Zufall draufgekommen, wann der Fehler vorkommt.
Ich habe die Dateien immer in diesen "Testordner" reinkopiert.

Wenn ich den Originalordner untersuche, funktioniert sowohl das Skript als auch das Droplet.

Wenn ich es auf die kopierten Dateien anwende kommt die Fehlermeldung.
Wenn ich dann bei einer Datei etwas am Namen ändere - funktioniert es wieder.
Einmal muss ich die Seitenzahlen ändern, ein anderes Mal genügt es bei einer Datei einen Buchstaben zu löschen. Verhält sich sehr komisch.

Was solls - anscheinend liegt der Hund wirklich in der Struktur von Mojave oder sonst wo ...
Ich werde das Skript jetzt einmal verwenden (ich untersuch ohnehin meist nur die POriginalordner) und schau ob es im Arbeitsalltag noch zu Fehlermeldungen kommt.


lg
Martin


als Antwort auf: [#570445]

Dokumente in Ordner auf Vollständigkeit prüfen

Hans Haesler
  
Beiträge gesamt: 5826

3. Jun 2019, 13:44
Beitrag # 12 von 15
Beitrag ID: #570496
Bewertung:
(9234 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

danke für die Rückmeldung.

*****
Idee eins:
Vielleicht stören die Leerschläge in Ordnernamen: "Neuer Ordner 2".
Möglicherweise hilft es, diesen so umzubenennen: "Neuer_Ordner_2"

*****
Idee zwei:
Und was passiert, wenn "System Events" eingespannt wird?

Code
(*FehlendeDateien_03dscpt 
Eventuell fehlende Dateien auflisten
® 03.06.2019 Hans Haesler, Châtelard 52, CH-1018 Lausanne
*)

# den Quellordner wählen
set sourceFolder to (choose folder) as Unicode text
# die Namen der Dateien auflisten
set namesList to {}
tell application "System Events"
set tmpList to (name of every item of folder sourceFolder)
set nItems to count of tmpList
repeat with n from 1 to nItems
set curItem to item n of tmpList
if curItem does not start with "." then
set end of namesList to curItem
end if
end repeat
end tell

set nItems to count namesList
if nItems > 1 then
# die Liste zum Sortier-Handler schicken
set namesList to quickSort(namesList, 1, nItems)
end if

# eine Liste vorbereiten
set numbersList to {}

# eine Schleife durch die Namen
repeat with n from 1 to count namesList
# das aktuelle Element
set curFile to item n of namesList
# die ersten drei Zeichen des Namens an die Liste hängen
set end of numbersList to text 1 thru 3 of curFile
end repeat

# die Startnummer
set startNum to item 1 of numbersList as integer
# die Endnummer
set stopNum to item -1 of numbersList as integer

# die Liste der fehlenden Nummern vorbereiten
set missList to {}
# eine Schleife durch die Elemente
repeat with n from startNum + 1 to stopNum - 1
# ein aktuelles Element zusammensetzen
set curItem to text -3 thru -1 of ("00" & n)
# wenn sich das Element nicht in der Nummern-Liste befindet ...
if curItem is not in numbersList then
# ... dann wird es an die Liste "Fehlende Nummern" gehängt
set end of missList to curItem
end if
end repeat

# die Liste prüfen
if (count of missList) is greater than 0 then
# die Liste in einen String verwandeln
set AppleScript's text item delimiters to return
set missString to every text item of missList as string
set AppleScript's text item delimiters to {""}
# den Nummernstring mit TextEdit anzeigen
tell application "TextEdit"
activate
make new document
set text of document 1 to "Fehlende Nummern:" & return & missString
end tell
else
display dialog "Die Dateien sind vollzählig." buttons "OK" default button 1 with icon 1
end if

#######################################################
# der Handler, welcher die Namen sortiert
on quickSort(a, L, R)
script
property namesList : a
end script
tell result
set ctr to L
set n to R
set aRef to item L of its namesList
repeat while ctr < n
repeat while (aRef < item n of its namesList) and (ctr < n)
set n to n - 1
end repeat
if n is not ctr then
set item ctr of its namesList to item n of its namesList
set ctr to ctr + 1
end if
repeat while (aRef > item ctr of its namesList) and (ctr < n)
set ctr to ctr + 1
end repeat
if n is not ctr then
set item n of its namesList to item ctr of its namesList
set n to n - 1
end if
end repeat
set item n of its namesList to aRef
if L < n then
quickSort(its namesList, L, n - 1)
end if
if R > ctr then
quickSort(its namesList, ctr + 1, R)
return its namesList
end if
end tell
end quickSort

Gruss, Hans


als Antwort auf: [#570493]

Dokumente in Ordner auf Vollständigkeit prüfen

mb_new
Beiträge gesamt: 123

5. Jun 2019, 16:31
Beitrag # 13 von 15
Beitrag ID: #570578
Bewertung:
(9158 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

also Leerschläge kann ich ausschließen, da keine vorhanden sind.

Das Dubiose ist: ich habe den gleichen Ordner wie beim letzten Mal heute durchsucht: keine Fehlermeldung.

Die Dateien neu kopiert: keine Fehlermeldung

Da ich die Dinge dann nicht verstehe bzw. reproduzieren kann, hab ich die Dateien erneut kopiert: Fehler!
Und auch mit dem neuen Skript mit System Events.

Ich hoffe aufs nächste OS :-)))

lg
Martin


als Antwort auf: [#570496]

Dokumente in Ordner auf Vollständigkeit prüfen

Hans Haesler
  
Beiträge gesamt: 5826

5. Jun 2019, 19:16
Beitrag # 14 von 15
Beitrag ID: #570590
Bewertung:
(9144 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

Antwort auf: also Leerschläge kann ich ausschließen, da keine vorhanden sind.

Der Ordnername "Neuer Ordner 2" enthält aber zwei Leerschläge (oder Zwischenräume).

Doch eigenartig ist, dass es zwei Mal geht und dann wieder nicht.

Gruss, Hans


als Antwort auf: [#570578]

Dokumente in Ordner auf Vollständigkeit prüfen

Hans Haesler
  
Beiträge gesamt: 5826

6. Jun 2019, 14:10
Beitrag # 15 von 15
Beitrag ID: #570603
Bewertung:
(9058 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Martin,

machen wir doch mal einen Versuch mit einem JavaScript. Die gebrauchsfertige Script-Datei ("FehlendeDateien_CC_01d.js") ist unten angehängt.

[edit]
Das Script im Ordner "Scripts Panel" von InDesign unterbringen und durch Doppelklick auf seinen Namen im Skript-Bedienfeld starten.
[/edit]

Code
//FehlendeDateien_CC_01d.js 
//© 06.06.2019 / Hans Haesler, Châtelard 52, CH-1018 Lausanne
//DESCRIPTION:Eventuell fehlende Dateien auflisten

// vorbeugenderweise das Anzeigen von Dialogen aktivieren
app.scriptPreferences.userInteractionLevel = UserInteractionLevels.interactWithAll;

// das Auswählen eines Ordners
var folderObj = File (Folder.selectDialog("Den Ordner auswählen, welcher die\nzu prüfenden Dokumente enthält."));
var testObj = "" + folderObj;
if (testObj.match("null")) {
exit();
}

// den Inhalt des Ordners auflisten ...
var tmpList = folderObj.getFiles("*.pdf");

// die Nummern auflisten ...
var nFiles = tmpList.length;
if (nFiles == 0) {
alert ("Keine PDF-Datei gefunden.", "");
exit();
}
else if (nFiles == 1) {
alert ("Nur *eine* PDF-Datei vorhanden.", "");
exit();
}
var numbersArr = [];
for (var n=0; n<nFiles; n++) {
numbersArr[n] = tmpList[n].name.slice(0,3);
}
// ... und sortieren
numbersArr.sort();

// die Startnummer
var startNum = numbersArr[0]*1;
// die Endnummer
var stopNum = numbersArr[nFiles-1]*1;

// die Liste der fehlenden Nummern vorbereiten
var missList = [];
// eine Schleife durch die Elemente
for (var n=startNum+1; n<stopNum; n++) {
// ein aktuelles Element zusammensetzen
var curItem = ("00" + n).slice(-3);
// wenn sich das Element nicht in der Nummern-Liste befindet ...
var isListed = checkArr(curItem, numbersArr, nFiles);
if (isListed == false) {
// ... dann wird es an die Liste "Fehlende Nummern" gehängt
missList.push(curItem);
}
}

// die Liste prüfen
var nMiss = missList.length;
if (nMiss > 0) {
// den Report-String zusammensetzen
if (nMiss == 1) {
var missString = missList[0];
var repString = "Fehlende Nummer:\r" + missString;
}
else {
var missString = missList.join("\n");
var repString = "Fehlende Nummern:\r" + missString;
}
// den Nummernstring mit InDesign anzeigen
var curDoc = app.documents.add();
var resFrame = curDoc.textFrames.add({geometricBounds:[10,10,100,100]});
resFrame.parentStory.contents = repString;
}
else {
alert ("Die Dateien sind vollzählig.", "");
}

//////////////////////////////////////////////////////////////////////////
function checkArr(curItem, numbersArr, nFiles) {
for (var m=1; m<nFiles; m++) {
if (curItem == numbersArr[m]) {
return true;
}
}
return false;
}

Hier klappt es. Und bei Dir?

Gruss, Hans


als Antwort auf: [#570578]
(Dieser Beitrag wurde von Hans Haesler am 6. Jun 2019, 15:24 geändert)

Anhang:
FehlendeDateien_CC_01d.zip (1.63 KB)
X