புதிரான மின்னஞ்சல் அமைப்பின் அடுக்குகளை அவிழ்த்தல்
ஒரு மர்மத்தில் சுற்றப்பட்ட புதிர் போல உணரும் தொழில்நுட்பத்தை நீங்கள் எப்போதாவது சந்தித்திருக்கிறீர்களா? B2F மின்னஞ்சல் நெறிமுறையை டீகோட் செய்ய நான் முதன்முறையாக முயற்சித்தபோது அப்படித்தான் உணர்ந்தேன். 🧩 சிறப்புத் தகவல்தொடர்புக்காக வடிவமைக்கப்பட்டுள்ளது, இது தலைப்புகள், உடல்கள் மற்றும் பைனரி இணைப்புகளின் விசித்திரமான கையாளுதல் ஆகியவற்றைக் கொண்டுள்ளது, இது என் தலையை சொறிந்துவிடும்.
உரை தலைப்புகள் மற்றும் சுருக்கப்பட்ட பைனரி தரவு இரண்டையும் உள்ளடக்கிய முழு செய்திக் கோப்பையும் ஏற்றுவதில் எனது சவால் தொடங்கியது. நவீன மின்னஞ்சல் வடிவங்களைப் போலல்லாமல், B2F ஒரு கடுமையான ASCII குறியாக்க அமைப்பு மற்றும் தனிப்பட்ட டிலிமிட்டர்களைப் பயன்படுத்துகிறது, சரியாக அலசுவதற்கு கூடுதல் கவனிப்பு தேவைப்படுகிறது. முதல் பார்வையில், பணி நேரடியானதாகத் தோன்றியது - நான் அதை செயல்படுத்த முயற்சிக்கும் வரை.
தலைப்புகளைப் படிப்பது மிகவும் எளிமையானது, ஆனால் உடல் மற்றும் இணைப்புகளைப் பிரித்தெடுப்பது மிகவும் சிக்கலானதாக நிரூபிக்கப்பட்டது. உடலில் உள்ள X எழுத்துக்களை படிப்பதில் இருந்து பைனரி இணைப்புகளை தனிமைப்படுத்தி செயலாக்குவதில் சிரமம் உள்ளது. இந்த ஸ்ட்ரீம்களை சரியாகக் கையாள்வது, படம் இல்லாமல் ஒரு புதிரைச் சேர்ப்பது போல் உணர்ந்தேன். 😅
நீங்கள் இதே போன்ற சவால்களுடன் போராடுகிறீர்கள் என்றால், நீங்கள் தனியாக இல்லை! இந்த கட்டுரை B2F, ஸ்ட்ரீம்களை திறம்பட நிர்வகித்தல் மற்றும் சுருக்கப்பட்ட தரவை படிப்படியாக டிகோடிங் செய்வதன் மூலம் உங்களுக்கு வழிகாட்டும். சில பொறுமை மற்றும் சரியான கருவிகள் மூலம், இந்த ஒருமுறை கடினமான பணி பலனளிக்கும் கற்றல் அனுபவமாக மாறும்.
கட்டளை | பயன்பாட்டின் உதாரணம் |
---|---|
split('\\n\\n', 1) | இந்த பைதான் முறை இரண்டு புதிய வரி எழுத்துக்களின் முதல் நிகழ்வில் ஒரு சரத்தை இரண்டு பகுதிகளாகப் பிரிக்கிறது. மின்னஞ்சல் கோப்பின் உடலிலிருந்து தலைப்புகளைப் பிரிக்க இது இங்கே பயன்படுத்தப்படுகிறது. |
re.search(r'X-Body-Length: (\\d+)') | "எக்ஸ்-உடல் நீளம்" தலைப்பின் மதிப்பைத் தேட வழக்கமான வெளிப்பாட்டைப் பயன்படுத்துகிறது, இது உடல் உரையில் உள்ள எழுத்துக்களின் எண்ணிக்கையைக் குறிக்கிறது. மின்னஞ்சலைப் படிப்பதை எங்கு நிறுத்துவது என்பதைக் கண்டறிவதற்கு அவசியம். |
TStringList.LoadFromStream() | டெல்பியில், இந்த முறையானது ஸ்ட்ரீமின் உள்ளடக்கங்களை (கோப்பு போன்றது) TStringList இல் எளிதாக உரை பாகுபடுத்தலுக்கு ஏற்றுகிறது. முக்கிய மதிப்பு ஜோடிகளின் பட்டியலாக தலைப்புகளைப் படிக்க இது பயனுள்ளதாக இருக்கும். |
TMemoryStream.CopyFrom() | இந்த Delphi கட்டளை ஒரு ஸ்ட்ரீமில் இருந்து மற்றொரு ஸ்ட்ரீமுக்கு தரவை நகலெடுக்கிறது. ஸ்கிரிப்ட்டில், மின்னஞ்சலின் பைனரி இணைப்புப் பகுதியை மேலும் செயலாக்க அல்லது சேமிப்பதற்காக பிரித்தெடுக்க இது பயன்படுகிறது. |
data.encode('ascii') | பைத்தானில் ஒரு சரத்தை மீண்டும் ASCII-குறியீடு செய்யப்பட்ட பைனரி தரவுகளாக மாற்றுகிறது. B2F நெறிமுறையின் பைனரி பகுதிகளுடன் பணிபுரியும் போது, அதன் ASCII-அடிப்படையிலான வடிவமைப்புடன் இணக்கத்தன்மையை உறுதி செய்யும் போது இது அவசியம். |
re.match() | ஒரு சரம் ஒரு குறிப்பிட்ட வடிவத்துடன் தொடங்குகிறதா என்பதைச் சரிபார்க்கிறது. B2F நெறிமுறை வடிவமைப்பிற்கு இணங்குவதை உறுதிசெய்ய, தலைப்புகளின் கட்டமைப்பை சரிபார்க்க இது பயனுள்ளதாக இருக்கும். |
FileStream.Position | கோப்பு ஸ்ட்ரீமில் தற்போதைய வாசிப்பு/எழுதுதல் நிலையைக் குறிப்பிடும் டெல்பி சொத்து. உடலைச் செயலாக்கிய பின் B2F மின்னஞ்சலின் பைனரி பகுதிக்கு துல்லியமான வழிசெலுத்தலை இது அனுமதிக்கிறது. |
TStringStream.Create() | டெல்பியில் ஒரு சரம் ஸ்ட்ரீமை உருவாக்குகிறது, இது சரம் தரவைச் சேமிக்கவும் கையாளவும் பயன்படுகிறது. தலைப்புகள் போன்ற சிறிய உரைத் தரவைக் கையாளும் போது இது TMemoryStream க்கு இலகுரக மாற்றாகும். |
unittest.TestCase | அலகு சோதனைகளை வரையறுக்க பைதான் வகுப்பு பயன்படுத்தப்படுகிறது. ஸ்கிரிப்ட்களில், செயல்படுத்தலின் நம்பகத்தன்மையை உறுதிப்படுத்த, வெவ்வேறு சூழ்நிலைகளில் தலைப்புகள், உடல்கள் மற்றும் பைனரி தரவுகளின் சரியான பாகுபடுத்தலை இது சரிபார்க்கிறது. |
BinaryStream.SaveToFile() | டெல்பியில், இந்த முறை நினைவக ஸ்ட்ரீமின் உள்ளடக்கங்களை பைனரி கோப்பில் சேமிக்கிறது. B2F மின்னஞ்சல் வடிவமைப்பிலிருந்து பிரித்தெடுக்கப்பட்ட இணைப்புகளைத் தொடர்ந்து வைத்திருப்பதற்கு இது மிகவும் முக்கியமானது. |
B2F மின்னஞ்சல் நெறிமுறையை டிகோடிங் செய்வதற்கான தர்க்கத்தை உடைத்தல்
மேலே உள்ள பைதான் ஸ்கிரிப்ட் B2F மின்னஞ்சல் நெறிமுறையை பாகுபடுத்தி டிகோடிங் செய்யும் சவாலைச் சமாளிக்கிறது, மின்னஞ்சல் கோப்பை அதன் முக்கிய கூறுகளாகப் பிரிப்பதன் மூலம்: தலைப்புகள், உடல் மற்றும் பைனரி இணைப்புகள். ஆரம்பத்தில், ஸ்கிரிப்ட் பைனரி பயன்முறையில் கோப்பைப் படித்து அதை ASCII என டிகோட் செய்கிறது, B2F வடிவம் கடுமையான ASCII குறியாக்கத்தை நம்பியிருப்பதால் இது ஒரு முக்கியமான படியாகும். பயன்படுத்துவதன் மூலம் பிளவு('nn', 1) செயல்பாடு, ஸ்கிரிப்ட் மின்னஞ்சலை இரண்டு பகுதிகளாகப் பிரிக்கிறது: தலைப்புகள் மற்றும் ஒருங்கிணைந்த உடல் மற்றும் பைனரி தரவு. மெட்டாடேட்டா எங்கு முடிவடைகிறது மற்றும் உள்ளடக்கம் தொடங்குகிறது என்பதைக் கண்டறிவதற்கு இந்தப் பிரிப்பு முக்கியமானது, இது B2F இன் தனித்துவமான கட்டமைப்பை திறம்பட கையாள்வதற்கான இன்றியமையாத படியாகும்.
அடுத்து, ஸ்கிரிப்ட் வழக்கமான வெளிப்பாடு செயல்பாட்டை மேம்படுத்துகிறது re.search(r'X-உடல் நீளம்: (d+)') தலைப்புகளில் இருந்து "எக்ஸ்-உடல் நீளம்" மதிப்பைப் பிரித்தெடுக்க. இந்த மதிப்பு மின்னஞ்சலில் படிக்க வேண்டிய எழுத்துகளின் எண்ணிக்கையையும், கூடுதல் புதிய வரி எழுத்தையும் ஆணையிடுகிறது. ஸ்கிரிப்ட்டின் இந்த பகுதி முக்கியமானது, ஏனெனில் தலைப்புத் தரவை தவறாகப் புரிந்துகொள்வது மின்னஞ்சல் அமைப்பைச் செயலாக்கும்போது பிழைகளுக்கு வழிவகுக்கும். பைத்தானின் சரம் வெட்டுதல் நுட்பங்களைப் பயன்படுத்துவதன் மூலம், உடல் உரை தனிமைப்படுத்தப்பட்டு, மீதமுள்ள தரவு பைனரி இணைப்புப் பகுதியாக இருக்கும்.
டெல்பி செயலாக்கத்திற்கு, ஸ்கிரிப்ட் பயன்படுத்துகிறது TStringList.LoadFromStream நிர்வகிக்கக்கூடிய வடிவத்தில் தலைப்புகளைப் படிக்க. ஸ்ட்ரீம்களைக் கையாள்வதில் சிறந்து விளங்கும் மொழியான டெல்பியில் முக்கிய மதிப்பு ஜோடிகளுடன் பணிபுரிய இந்த அணுகுமுறை திறமையானது. ஸ்ட்ரீமின் நிலை பின்னர் கைமுறையாக பயன்படுத்தி சரிசெய்யப்படுகிறது FileStream.Position மின்னஞ்சல் உடல் மற்றும் பைனரி தரவு பிரிவுகளுக்கு நேரடியாக செல்ல. ஸ்ட்ரீமின் நிலையை வெளிப்படையாக நிர்வகிப்பதன் மூலம், தேவையற்ற தரவை நினைவகத்தில் ஏற்றுவதை ஸ்கிரிப்ட் தவிர்க்கிறது, பைனரி இணைப்புகளுடன் பெரிய கோப்புகளைக் கையாள்வதற்கான சிறந்த நடைமுறை.
பைனரி தரவு டெல்பியுடன் செயலாக்கப்படுகிறது TMemoryStream, பைனரி தகவல்களைப் படித்து சேமிப்பதற்கான பல்துறை கருவி. பைத்தானில், இது குறியாக்க முறை மூலம் செய்யப்படுகிறது, மேலும் பயன்படுத்த பைனரி இணைப்புகள் சரியாக வடிவமைக்கப்பட்டுள்ளன. இந்த முறைகள் பிரித்தெடுக்கப்பட்ட பைனரியை டிகம்ப்ரஷனுக்காக தனி கோப்புகளில் சேமிக்க அனுமதிக்கின்றன. எடுத்துக்காட்டாக, மின்னஞ்சலில் சுருக்கப்பட்ட படக் கோப்பு இருந்தால், பைனரி தரவு அதன் அசல் வடிவத்தில் சுருக்கப்பட்டு பார்க்கப்படும். ஸ்ட்ரீம் மேனேஜ்மென்ட் மற்றும் வழக்கமான வெளிப்பாடுகளை இணைப்பது சிக்கலான பணிகளை எவ்வாறு திறமையாக தீர்க்க முடியும் என்பதை இந்த அணுகுமுறை எடுத்துக்காட்டுகிறது. 🔍😊
B2F நெறிமுறையைப் புரிந்துகொள்வது: இணைப்புகளுடன் மின்னஞ்சல் தரவைப் பாகுபடுத்துதல்
இந்தத் தீர்வு, பைத்தானைப் பயன்படுத்தி B2F மின்னஞ்சல்களைப் பாகுபடுத்துகிறது, தலைப்புகள், உடல் உரை மற்றும் பைனரி இணைப்புகளை திறம்பட கையாள்வதில் கவனம் செலுத்துகிறது.
import re
def parse_b2f_email(file_path):
# Open the file and load all data
with open(file_path, 'rb') as f:
data = f.read().decode('ascii')
# Split the headers and body
headers, body = data.split('\\n\\n', 1)
# Extract X value from headers
x_match = re.search(r'X-Body-Length: (\\d+)', headers)
if not x_match:
raise ValueError("Header does not contain 'X-Body-Length'")
x_length = int(x_match.group(1))
# Read the specified body text and additional LF
body_text = body[:x_length + 1]
remaining_data = body[x_length + 1:]
# Extract the binary data
binary_data_start = remaining_data.find('\\n\\n') + 2
binary_data = remaining_data[binary_data_start:].encode('ascii')
return headers, body_text, binary_data
# Example usage
headers, body_text, binary_data = parse_b2f_email('example.b2f')
print("Headers:", headers)
print("Body Text:", body_text)
with open('output_binary.bin', 'wb') as f:
f.write(binary_data)
டெல்பியைப் பயன்படுத்தி B2F மின்னஞ்சல் நெறிமுறையை டிகோடிங் செய்தல்
இந்த தீர்வு, தலைப்புகள், உடல் மற்றும் பைனரி இணைப்புகளை ஒரு மட்டு வழியில் எவ்வாறு செயலாக்குவது என்பதை நிரூபிக்க டெல்பியைப் பயன்படுத்துகிறது.
procedure ParseB2FEmail(const FileName: string);
var
FileStream: TFileStream;
Headers, Body: TStringList;
XLength: Integer;
BinaryStream: TMemoryStream;
begin
FileStream := TFileStream.Create(FileName, fmOpenRead);
Headers := TStringList.Create;
Body := TStringList.Create;
BinaryStream := TMemoryStream.Create;
try
Headers.LoadFromStream(FileStream);
FileStream.Position := Headers.Text.Length + 2; // Skip headers + LF
// Parse X-Length from headers
if TryStrToInt(Headers.Values['X-Body-Length'], XLength) then
begin
SetLength(Body.Text, XLength + 1);
FileStream.Read(Pointer(Body.Text)^, XLength + 1);
// Extract and save binary data
BinaryStream.CopyFrom(FileStream, FileStream.Size - FileStream.Position);
BinaryStream.SaveToFile('output_binary.bin');
end;
finally
Headers.Free;
Body.Free;
BinaryStream.Free;
FileStream.Free;
end;
end;
begin
ParseB2FEmail('example.b2f');
end.
பைத்தானில் B2F பாகுபடுத்தலுக்கான அலகு சோதனைகள்
இங்கே, பல காட்சிகளில் B2F பாகுபடுத்தும் செயல்பாட்டைச் சரிபார்க்க பைத்தானில் யூனிட் சோதனைகளை எழுதுகிறோம்.
import unittest
class TestB2FParser(unittest.TestCase):
def test_parse_valid_email(self):
headers, body_text, binary_data = parse_b2f_email('test_valid.b2f')
self.assertIn('X-Body-Length', headers)
self.assertEqual(len(body_text.strip()), expected_body_length)
def test_missing_x_body_length(self):
with self.assertRaises(ValueError):
parse_b2f_email('test_missing_header.b2f')
def test_binary_output(self):
_, _, binary_data = parse_b2f_email('test_binary.b2f')
self.assertGreater(len(binary_data), 0)
if __name__ == '__main__':
unittest.main()
B2F நெறிமுறையின் சூழலில் ஸ்ட்ரீம் நிர்வாகத்தைப் புரிந்துகொள்வது
B2F மின்னஞ்சல் நெறிமுறையைக் கையாள்வதில் ஒரு முக்கியமான அம்சம், உரை மற்றும் பைனரி தரவைப் படிப்பதற்கான ஸ்ட்ரீம்களை எவ்வாறு திறமையாக நிர்வகிப்பது என்பதைப் புரிந்துகொள்வது. உரை ஸ்ட்ரீம்கள் எப்படி விரும்புகின்றன என்பதில் ஒரு முக்கிய வேறுபாடு உள்ளது TStringStream போன்ற நினைவகத்தை மையமாகக் கொண்ட ஸ்ட்ரீம்களுடன் ஒப்பிடும்போது தரவைக் கையாளவும் TMemoryStream. TStringStream சிறிய உரை பகுதிகளுடன் வேலை செய்வதற்கு ஏற்றதாக இருந்தாலும், பைனரி தரவு பிரித்தெடுப்பதில் இது போராடுகிறது. மறுபுறம், TMemoryStream மூல பைனரி செயல்பாடுகளின் மீது துல்லியமான கட்டுப்பாட்டை வழங்குகிறது, இது B2F இன் சிக்கலான கட்டமைப்பிற்கு சிறந்த பொருத்தமாக அமைகிறது.
சரியான வகை ஸ்ட்ரீமைத் தேர்ந்தெடுப்பதுடன், இந்த ஸ்ட்ரீம்களுக்குள் நிலைநிறுத்துவது முக்கியப் பங்கு வகிக்கிறது. உதாரணமாக, அந்நியப்படுத்துதல் FileStream.Position டெல்பியில் டெவலப்பர்கள் முழு உள்ளடக்கத்தையும் நினைவகத்தில் ஏற்றாமல் மின்னஞ்சல் கோப்பின் விரும்பிய பகுதிகளுக்கு நேரடியாக செல்ல அனுமதிக்கிறது. இந்த முறை திறமையானது மட்டுமல்ல, பெரிய இணைப்புகளுடன் பணிபுரியும் போது வளங்கள் சோர்வடையும் அபாயத்தையும் குறைக்கிறது. ஸ்ட்ரீம் சரியாக நிர்வகிக்கப்படுவதை உறுதிசெய்வது உடல் உரையிலிருந்து பைனரி தரவுகளுக்கு சீராக மாற உதவுகிறது, இது B2F போன்ற நெறிமுறைகளில் முக்கியமானது.
கடைசியாக, இந்த வடிவமைப்பில் பணிபுரியும் போது ASCII குறியாக்கத்தைப் புரிந்துகொள்வது பேச்சுவார்த்தைக்குட்படாது. B2F அதன் தலைப்புகள் மற்றும் உடலுக்கு ASCII ஐ நம்பியிருப்பதால், எந்த விலகலும் தவறான விளக்கத்திற்கு வழிவகுக்கும். ASCII தரவை தொடர்ந்து டிகோட் செய்வது மற்றும் பைனரி இணைப்புகள் துல்லியமாக தனிமைப்படுத்தப்படுவதை உறுதி செய்வது அவசியம். B2F வழியாக அனுப்பப்பட்ட ZIP கோப்பை டிகோட் செய்ய முயற்சிப்பதை கற்பனை செய்து பாருங்கள் - தவறான ஸ்ட்ரீம் கையாளுதல் இணைப்பு பயனற்றதாகிவிடும். இந்த நுட்பங்களில் தேர்ச்சி பெறுவதன் மூலம், நீங்கள் B2F இன் வினோதங்களை திறமையாகவும் நம்பிக்கையுடனும் சமாளிக்கலாம். 📜💡
B2F நெறிமுறையில் அடிக்கடி கேட்கப்படும் கேள்விகளுக்கான பதில்கள்
- பங்கு என்ன TMemoryStream டெல்பியில் B2F க்கு?
- TMemoryStream நினைவகத்தில் பைனரி தரவை ஏற்றவும் கையாளவும் டெவலப்பர்களை அனுமதிக்கிறது, இது B2F மின்னஞ்சல்களில் உள்ள இணைப்புகளைப் பிரித்தெடுக்கவும் மற்றும் சுருக்கவும் ஏற்றதாக அமைகிறது.
- பைதான் எப்படி இருக்கிறது split() B2F மின்னஞ்சல்களை பாகுபடுத்தும் முறை உதவியா?
- தி split() மெட்டாடேட்டாவை உள்ளடக்கத்திலிருந்து வேறுபடுத்துவதற்கான எளிதான வழியை வழங்கும் முறை, முதல் இரட்டை புதிய வரியில் பிரிப்பதன் மூலம் மின்னஞ்சலை தலைப்புகள் மற்றும் உள்ளடக்கமாகப் பிரிக்கிறது.
- முடியும் FileStream.Position உரை மற்றும் பைனரி தரவு இரண்டையும் கையாளவா?
- ஆம், FileStream.Position உரை மற்றும் பைனரி தரவுகளுக்கு இடையே திறமையாக மாற ஸ்ட்ரீமுக்குள் துல்லியமாக செல்லவும்.
- B2F இல் ASCII குறியாக்கம் ஏன் முக்கியமானது?
- B2F, தலைப்புகள் மற்றும் உடல் உரைக்கான கடுமையான ASCII குறியாக்கத்தை நம்பியுள்ளது, இது கணினிகள் முழுவதும் இணக்கத்தன்மையை உறுதி செய்கிறது மற்றும் பைனரி இணைப்பு பிரித்தெடுப்பதில் பிழைகளைத் தவிர்க்கிறது.
- பிரித்தெடுத்த பிறகு பைனரி தரவு ஒருமைப்பாட்டை என்ன கருவிகள் உறுதி செய்ய முடியும்?
- போன்ற ஸ்ட்ரீம்களைப் பயன்படுத்துதல் TMemoryStream டெல்பியில் அல்லது பைத்தானில் உள்ள பைட் வரிசைகள் செயலாக்கம் மற்றும் டிகம்பரஷ்ஷனின் போது தரவு ஒருமைப்பாட்டை பராமரிக்க உதவுகிறது.
சிக்கலான நெறிமுறைகளை டிகோடிங் செய்யும் கலையில் தேர்ச்சி பெறுதல்
B2F நெறிமுறையை டிகோட் செய்வது முதலில் கடினமானதாகத் தோன்றலாம், ஆனால் சரியான கருவிகள் மற்றும் முறைகள் மூலம், இது ஒரு அடையக்கூடிய பணியாக மாறும். உகந்த கட்டளைகள் மற்றும் தெளிவான படிகளுடன் செயல்முறையை நெறிப்படுத்துவது தலைப்புகள், உடல் உரை மற்றும் பைனரி தரவு ஆகியவற்றைக் கையாள்வதை மிகவும் எளிதாக்குகிறது.
நீங்கள் Python அல்லது Delphi ஐப் பயன்படுத்தினாலும், குறியாக்கம் மற்றும் ஸ்ட்ரீம் பொருத்துதல் போன்ற விவரங்களுக்கு கவனம் செலுத்துவது வெற்றிகரமான பாகுபடுத்தலை உறுதி செய்கிறது. எதிர்காலத்தில் இதுபோன்ற டிகோடிங் சவால்களை நம்பிக்கையுடன் சமாளிக்க உதவும் நடைமுறை தீர்வுகள் மற்றும் நுண்ணறிவுகளை இந்த வழிகாட்டி வழங்குகிறது. 🔧
B2F புரோட்டோகால் டிகோடிங்கிற்கான ஆதாரங்கள் மற்றும் குறிப்புகள்
- B2F நெறிமுறை பற்றிய விரிவான தகவல்களை அதிகாரப்பூர்வ Winlink ஆவணப் பக்கத்தில் காணலாம்: Winlink B2F புரோட்டோகால் ஆவணப்படுத்தல் .
- பயன்படுத்துவது பற்றிய நுண்ணறிவு TStringList மற்றும் TMemoryStream டெல்பியில் திறம்பட டெல்பி சமூக மன்றங்கள் மற்றும் அதிகாரப்பூர்வ Embarcadero ஆவணங்களில் இருந்து குறிப்பிடப்பட்டுள்ளது: Embarcadero வளங்கள் .
- பைனரி ஸ்ட்ரீம்களைக் கையாள்வதற்கான சிறந்த நடைமுறைகள் மற்றும் பைத்தானில் ASCII குறியாக்கம் ஆகியவை பைத்தானின் அதிகாரப்பூர்வ ஆவணத்திலிருந்து பெறப்பட்டது: பைதான் ஆவணம் .