Anda di halaman 1dari 8

KNM XVI

3-6 Juli 2012

UNPAD, Jatinangor

ANALISIS KONSTRUKSI DAN SIFAT


BCH CODE
ACHMAD FAHRUROZI, M.SI1,2, SRI MARDIYATI, M.KOM2
1

Universitas Gunadarma Depok, achmad.fahrurozi@yahoo.co.id


2
Universitas Indonesia Depok, sri_math@sci.ui.ac.id

Abstract
Pada makalah ini, akan dibahas suatu metode pengkodean, dimana ketika pesan-pesan
yang berbentuk k-tuple akan dikirim, maka pesan-pesan tersebut diubah menjadi code
yang merupakan kumpulan n-tuple codeword, dengan n > k . Codeword tersebut terdiri
dari k simbol yang merupakan pesan yang berkorespondensi dengan codeword tersebut,
dan (n-k) simbol yang disebut bit parity check. Simbol yang digunakan adalah
elemen-elemen dari suatu lapangan hingga GF (q ), q = 2m , m N . Untuk
memperoleh bit parity check ini, digunakan algoritma BCH code, dimana code yang
dihasilkan mampu mendeteksi dan mengkoreksi error yang terjadi pada proses
pengiriman pesan-pesan. Kemampuan suatu code dalam mengontrol error (mendeteksi
dan atau mengkoreksi error) tergantung pada jarak minimum antar codeword dalam code
tersebut.
Kata kunci: pesan, lapangan hingga, codeword, code, jarak minimum.
1. Pendahuluan
Pengkodean informasi adalah suatu cara yang digunakan untuk melindungi informasi
yang dikirim dari gangguan yang mungkin terjadi pada media pengiriman. Untuk
melakukan ini, sebelum dikirim, informasi yang berupa huruf, karakter ataupun suara
diubah terlebih dahulu menjadi pesan-pesan yang berbentuk k-tuple, dimana komponenkomponennya adalah anggota lapangan hingga. Pesan-pesan tersebut kemudian diubah
menjadi kumpulan n-tuple yang disebut codeword melalui proses encoding. Hasil dari
metode pengkodean informasi tersebut disebut code. Gagasan mengenai cara

pengkodean informasi sehingga suatu kesalahan dapat dideteksi dan juga dapat
diperbaiki pertama kali dikembangkan oleh ilmuwan bernama R.W. Hamming.
Dalam perkembangannya, muncul berbagai cara pengkodean informasi yang berbedabeda, yang memiliki proses konstruksi dan sifat yang berbeda satu dengan lainnya.
Berbagai jenis code yang dihasilkan tersebut tidak hanya diaplikasikan pada komputer
saja, tetapi bermanfaat untuk berbagai aspek kehidupan sehari-hari, khususnya teknologi
komunikasi digital. Salah satu jenis atau kelompok code yang mempunyai nilai kegunaan
yang baik adalah cyclic code. Pada makalah ini akan dibahas mengenai konstruksi BCH
code yang termasuk ke dalam kelompok cyclic code.

Fahrurozi A., Mardiyati S.

Analisis BCH Code

2. Teori Coding
Untuk membahas kemampuan suatu code dalam mendeteksi sekaligus mengkoreksi error
yang terjadi, diperlukan beberapa pengertian yang berkaitan dengan suatu code C.
Berikut diberikan pengertian tentang jarak Hamming dan bobot Hamming dalam suatu
code C.
(i)
Jarak Hamming antara dua codeword berbentuk n-tuple x = ( x1 , x2 , , xn ) dan

y = ( y1 , y2 ,, yn ) dalam C, dilambangkan d ( x, y ) , adalah banyaknya koordinat


(ii)

dalam x dan y yang berbeda.


Bobot Hamming dari codeword berbentuk n-tuple x = ( x1 , x2 , , xn ) dalam C,
dilambangkan w( x ) , adalah banyaknya koordinat xi yang tak-nol.

Jarak minimum suatu code C, dilambangkan d min (C ) , atau juga sering disingkat d min ,
didefinisikan sebagai [5]

d min = min d (u , v)
u ,vC
u v

Misal C adalah code dengan d min = d . Maka C memiliki kemampuan kontrol error:
mengkoreksi maksimum t = d 1 error dan mendeteksi maksimum d 1 error [5].
2
Suatu code C yang merupakan (n,k)-blok code disebut grup code jika C merupakan
subruang dari GF (q) n , dimana GF (q ) n menyatakan suatu ruang vektor berdimensi n
atas lapangan hingga GF ( q ) sekaligus merupakan lapangan perluasan dari lapangan
GF (q) . Sehingga proses encoding suatu grup code secara umum dapat juga dipandang
sebagai sebuah transformasi dari ruang vektor GF (q ) k ke ruang vektor GF (q ) n .
Sehingga proses encoding suatu code dapat melibatkan matriks generator G yang
berukuran nxk . Berikut ini adalah sifat yang dimiliki oleh suatu grup code:
Teorema 1: Misalkan d min adalah jarak minimum dari suatu grup code C. Maka d min
adalah minimum dari bobot Hamming semua codeword tak-nol dalam C. Ditulis
d min = min w ( x ) | 0 x C [7]

Suatu code dapat pula dibangun dengan mencari solusi dari persamaan Hx = 0 , dimana
H disebut matriks parity check yang berbentuk H = ( A | I n k ) , dimana A adalah
T

sebarang matriks berukuran n k x k dan I n k adalah matriks identitas berukuran

n k x n k . Code yang dibangun tersebut disebut linier code. Suatu linier code juga
merupakan suatu grup code.
Suatu linier (n,k) code C dikatakan suatu cyclic code jika untuk setiap codeword
(a1 , a2 ,...., an ) dalam C, maka pergantian secara siklik menjadi n-tuple

(a2 , a3 ,...., an , a1 ) juga merupakan codeword dalam C [5].


Suatu cyclic code dapat dibangun dari suatu polinomial generator g ( x ) membagi x n 1
dalam GF (q )[ x ] . Berikut adalah sifat yang dimiliki oleh suatu cyclic code C:
Teorema 2: Misal C = g ( x) adalah cyclic code dan misalkan adalah akar primitif
ke-n dari unit atas Z 2 . Jika s buah pangkat berurutan dari adalah akar dari g ( x ) ,

s < n , maka jarak minimum dari code C paling kecil adalah s + 1 [1].
KNM XVI - 3-6 Juli 2012 UNPAD, Jatinangor

Fahrurozi A., Mardiyati S.

Analisis BCH Code

3. Konstruksi BCH code


BCH code adalah suatu contoh binary code, yang diperkenalkan oleh dua orang ilmuwan,
R. C. Bose dan D. V. Ray-Chaudhuri mengacu pada penemuan A. Hocquenghem. Sistem
komunikasi dan informasi Eropa dan trans-Atlantik menggunakan BCH code yang
berbentuk (255,231)-blok code [5].
Berikut diberikan algoritma konstruksi BCH code:
1. Tentukan panjang codeword n = 2 m 1 , untuk suatu m N dan tentukan juga jarak
BCH d N dan d ( n 1) / 2 .
2. Cari minimum polinomial untuk i , dilambangkan mi ( x) , dimana adalah akar
primitif ke-n dari unit dan i = 1, 2,..., 2r
3. Tentukan polinomial generator g ( x) , yaitu

g ( x) = lcm [ m1 ( x), m2 ( x),..., m2 r ( x)]

4. Bentuk

m( x ) = a1 x

polinomial
k 1

+ a2 x

k 2

u ( x) = x n k m( x) mod g ( x) ,

dimana

+ ... + ak adalah polinomial yang berkorespondensi dengan

pesan m = ( a1 , a2 ,..., ak ) , ai Z 2

5. Sehingga diperoleh codeword c yang berkorespondensi dengan polinomial


c ( x ) = x n k m( x ) + u ( x ) .
Dalam algoritma tersebut, dapat dianalisa beberapa hal, yaitu
Polinomial minimal untuk i ditentukan dengan menggunakan teorema berikut:
Teorema 3: Misal adalah elemen GF ( p m ) dan misal m menyatakan polinomial
minimal dari . Misalkan adalah elemen primitif dalam GF ( p m ) dan misalkan

= i . Jika i ada dalam cyclotomic coset Ci , maka m = ( x j ) [7] .


jCi

Pada Langkah 3, karena polinomial generator g ( x) = lcm [ m1 ( x), m2 ( x),..., m2 r ( x) ]


dimana mi ( x) adalah polinomial minimal untuk i , maka polinomial generator
tersebut dijamin memiliki paling sedikit 2r akar berurutan, yaitu , 2 ,..., 2 r .
Selain itu, karena adalah akar primitif ke-n dari unit, maka polinomial generator
g ( x ) juga dijamin membagi x n 1 .

Pada Langkah 4, dapat dilihat bahwa polinomial u ( x) = x n k m( x) mod g ( x) akan


berderajat kurang dari derajat g ( x ) . Sehingga, jika deg g ( x ) = s , maka
deg u ( x ) s 1 . Karena BCH code adalah suatu cyclic code yang dibangun oleh
g ( x ) maka diperoleh hubungan
s = n k , s = deg g ( x )
(1)

Andai deg u ( x ) = s 1 , maka koefisien dalam u ( x ) = u0 + u1 x + ... + us 1 x s 1 akan


langsung menjadi n-k komponen terakhir pada codeword yang dihasilkan. Jika
deg u ( x ) = v < s 1 , maka u ( x) akan ditulis sebagai

u ( x ) = 0 x s 1 + 0 x s 2 + ... + u s v x v + u s v +1 x v 1 + ... + u s v + ( v 1) x + u s ,
yang dimaksudkan untuk menjamin koefisien u ( x) selalu menjadi s = n k
komponen terakhir pada codeword yang dihasilkan. Dengan kata lain, jika

KNM XVI - 3-6 Juli 2012 UNPAD, Jatinangor

Fahrurozi A., Mardiyati S.

Analisis BCH Code

c( x) = x n k m( x) + u ( x) = c1 x n 1 + c2 x n 2 + ... + cn , maka codeword yang dihasilkan


adalah

c = ( c1 , c2 ,..., ck , ck +1 ,..., cn ) , dimana

adalah

( c1 , c2 ,..., ck ) = m

dan

( ck +1 ,..., cn1 , cn ) = u .

Sedangkan pada Langkah 5, perkalian x n k m( x) adalah suatu manipulasi agar pesan


m berada pada k komponen pertama dalam codeword yang dihasilkan.

Teorema berikut memberikan hubungan antara jarak d yang ditentukan pada definisi
BCH code dan jarak minimum pada BCH code tersebut.
Teorema 4: BCH code yang dibangun dengan polinomial generator g ( x ) seperti di atas
memiliki jarak minimum d min d [5].
Teorema 5: Suatu BCH code dengan panjang n = 2m 1 dan jarak minimum paling
sedikit d = 2r + 1 , memiliki bit parity check maksimum sebanyak mr . Dengan kata lain,
n k mr [8].
Lebih lanjut, karena jarak minimum d min d = 2r + 1 dan karena kemampuan koreksi

d min 1
, maka jelas bahwa t r . Jadi, berdasarkan Teorema 5 diperoleh:
2
n k mt

error t =

Misalkan suatu BCH code adalah linier (n,k) code, maka berikut ini diberikan hubungan
antara panjang code (n), panjang pesan (k), dan kemampuan koreksi error maksimum (t)
yang dimiliki oleh BCH code tersebut.
Tabel 1. Hubungan n, k dan t pada BCH (n,k) code
dengan n=7, 15, 31, 63 dan 255
n

63

57

255

247

255

163

12

255

139

15

255

55

31

155

13

131

18

47

42

147

14

123

19

45

43

139

15

115

21

37

45

131

18

107

22

29

47

123

19

99

23

21

55

115

21

91

25

107

22

87

26

99

23

79

27

155

13

71

29

147

14

63

30

15

31

11

51

239

45

231

39

223

26

36

215

21

30

207

16

24

199

11

18

10

191

16

11

187

10

13

179

10

15

171

11

13

59

63

Pada tabel terlihat bahwa panjang pesan yang dapat dikirm (k) dan kemampuan koreksi
maksimum (t) berubah-ubah secara tak teratur. Hal ini dipengaruhi oleh bentuk
polinomial
generator
dari
BCH
code.
Karena
polinomial
generator
g ( x) = lcm [ m1 ( x), m2 ( x),..., m2 r ( x)] , maka bentuknya bergantung pada polinomial
minimal dari k yang besar pangkatnya bergantung pada jumlah elemen dalam suatu
cyclotomic coset. Sebagai contoh, misal diambil n = 15. Perhatikan bahwa terdapat 5
buah cyclotomic coset s (mod 15), 0 < s 15 yang berbeda, yaitu:

KNM XVI - 3-6 Juli 2012 UNPAD, Jatinangor

Fahrurozi A., Mardiyati S.

Analisis BCH Code

C0 = {0}

C3 = {3, 6,12,9}

C1 = {1, 2, 4,8}

C5 = {5,10}

C7 = {7,14,13,11}

Maka akan terdapat 5 buah polinomial minimal berbeda, masing-masing untuk


0 , , 3 , 5 dan 7 . Jika dipilih d = 3, maka perlu dicari polinomial minimal untuk
dan 2 . Karena 1, 2 C1 , maka polinomial minimal untuk dan 2 sama, yaitu
polinomial primitif, dan karena jumlah elemen C1 adalah 4, maka polinomial generator
akan berderajat empat. Sehingga berdasarkan persamaan (1), panjang pesan yang dapat
dikirim adalah 15 4 = 11. Sedangkan jika dipilih d = 5, perlu dicari polinomial minimal
untuk , 2 , 3 dan 4 , dimana hanya akan terdapat dua polinomial minimal yang
berbeda, yaitu polinomial minimal untuk dan polinomial minimal untuk 3 . Karena
anggota cyclotomic coset C1 = {1, 2, 4,8} dan C3 = {3, 6,12,9} total berjumlah 8, maka
derajat dari polinomial generator adalah 8 (polinomial generator g ( x ) adalah hasil
perkalian dari dua buah polinomial minimal berderajat empat). Sehingga panjang pesan
yang dapat dikirim adalah 15 8 = 7.
Sedangkan jika dipilih d =7, maka perlu dicari polinomial minimal untuk
, 2 , 3 , 4 , 5 dan 6 , dimana akan terdapat tiga polinomial minimal yang berbeda,
yaitu polinomial minimal untuk , 3 dan 5 . Karena anggota cyclotomic coset

C1 = {1, 2, 4,8} , C3 = {3, 6,12,9} , dan C5 = {5,10} berjumlah total 10, maka derajat
dari polinomial generator adalah 10. Sehingga menyebabkan panjang pesan yang dapat
dikirim adalah 15 10 = 5. Jadi, saat jarak BCH d yang dituju berturut-turut dipilih 3, 5
dan 7, nilai k yang diperoleh adalah 11, 7 dan 5, dimana terlihat bahwa polanya tidak
teratur (dalam hal ini, berarti tidak memiliki selisih yang tetap).
Kemampuan koreksi error maksimum juga memiliki pola perubahan yang tidak teratur
untuk d yang berbeda-beda. Penjelasan untuk hal tersebut adalah karena saat kita
menetapkan jarak BCH d pada algoritma encoding, maka kadangkala jarak minimum
dari BCH code yang terbentuk lebih besar dari d. Sebagai contoh, untuk n = 31, jika
dipilih d = 7, maka dapat dihitung jarak minimum dari BCH code yang terbentuk adalah
7, sehingga kemampuan koreksi error maksimum adalah t = 3. Sedangkan jika dipilih d =
9, maka jarak minimum dari code yang terbentuk adalah 11. Perhatikan contoh berikut.
Untuk d = 5, polinomial generator yang terbentuk adalah

g 2 ( x) = lcm [ m1 ( x), m2 ( x), m3 ( x), m4 ( x)] = m1 ( x)m3 ( x)

Untuk d = 7, polinomial generator yang terbentuk adalah

g3 ( x) = lcm [ m1 ( x), m2 ( x),..., m6 ( x)]

Karena cyclotomic coset (mod 31) C5 = {5,10, 20,9,18} , C6 = {6,12, 24,17,3} ,

C7 = {7,14, 28, 25,19}

dan

C8 = {8,16,1, 2, 4}

maka

polinomial

minimal

m6 ( x) = m3 ( x) . Sehingga

g3 ( x) = lcm [ m1 ( x), m2 ( x), m3 ( x), m4 ( x)].m5 ( x) = g 2 ( x)m5 ( x)

Sedangkan untuk d = 9, polinomial generator yang terbentuk adalah

g 4 ( x) = lcm [ m1 ( x), m2 ( x),..., m8 ( x)]

sedangkan polinomial minimal m8 ( x) = m4 ( x) . Sehingga

g 4 ( x) = lcm [ m1 ( x), m2 ( x),..., m6 ( x)].m7 ( x) = g3 ( x).m7 ( x)

KNM XVI - 3-6 Juli 2012 UNPAD, Jatinangor

Fahrurozi A., Mardiyati S.

Analisis BCH Code

Sedangkan untuk d = 11, polinomial generator yang terbentuk adalah

g5 ( x) = lcm [ m1 ( x), m2 ( x),...m9 ( x), m10 ( x)]

Karena C9 = {9,18, 7,14, 28} = C7 dan C10 = {10, 20,9,18,5} = C5 , maka polinomial
minimal m9 ( x ) = m7 ( x ) dan m10 ( x ) = m5 ( x) . Sehingga

g5 ( x) = lcm [ m1 ( x), m2 ( x),..., m9 ( x), m10 ( x) ]

= lcm [ m1 ( x), m2 ( x),..., m8 ( x)] = g 4 ( x)


Terlihat bahwa, untuk d = 9 dan d = 11, polinomial generator yang terbentuk adalah
sama, sehingga jika dipilih d = 9, BCH code yang terbentuk akan sama dengan BCH code
yang terbentuk jika dipilih d = 11. Sehingga C = g 4 ( x) = g5 ( x) dan memiliki
kemampuan koreksi error maksimum t = 5.
Lebih lanjut, dapat diperhatikan bahwa:
Untuk d = 13, g 6 ( x) = g5 ( x) m11 ( x)
Untuk d = 15, g 7 ( x) = g 6 ( x)
Sehingga untuk d = 9 dan d = 11, polinomial generator dari code yang terbentuk adalah
sama. Begitu juga untuk d = 13 dan d =15, code yang terbentuk memiliki polinomial
generator yang sama. Sedangkan untuk d lainnya, polinomial generator dari code yang
terbentuk berbeda-beda. Kemudian perhatikan pada tabel, untuk n = 31, terjadi lompatan
nilai t dari 2, 3, kemudian 5, dan kemudian 7. Nilai t = 4 dan t = 6 dilompati berkaitan
dengan kesamaan pada g 5 ( x ) = g 4 ( x) dan g 7 ( x) = g 6 ( x) . Jadi, dapat ditemukan pola
saat gi +1 ( x) = gi ( x) , sedangkan gi ( x) gi 1 ( x) dan gi + 2 ( x ) gi +1 ( x ) maka nilai t
akan lompat dari t = i 1 ke t = i + 1 .
Dapat
dianalisa
pola
yang
lebih
umum,
yaitu
bahwa
pada
saat
gi + j ( x) = gi + j 1 ( x) = ... = gi + j v ( x) ,
untuk
suatu
dan
berlaku
i, j , v 1

gi + j v ( x) gi + j v 1 ( x) dan gi + j +1 ( x) gi + j ( x) , maka akan terjadi lompatan nilai t pada


tabel dari t = i + j v 1 ke t = i + j + 1 .
4. Hasil Simulasi
Berikut diberikan output dari contoh konstruksi BCH code. Pertama, dipilih dahulu
panjang code n = 2 m 1 dengan cara menentukan nilai untuk m . Lalu dipilih d yang
diinginkan, dimana d yang dipilih harus merupakan bilangan ganjil dan memiliki batas
bawah 3 (karena bentuk jarak BCH d yang dipilih adalah d BCH = 2r + 1 , sehingga
polinomial generator terdefinisi untuk r 1 ). Sedangkan batas atas untuk nilai d yang
bisa dipilih adalah 2m1 1 . Hal ini karena untuk d = 2 m 1 + 1 , maka panjang pesan
adalah 1, dan hal tersebut tidak diperbolehkan dalam MATLAB. Dalam aplikasinya, jika
panjang pesan hanya 1, maka hanya mungkin dikirimkan 2 simbol, dan code dengan
panjang pesan 1 tidak pernah digunakan. Sedangkan untuk d 2m 1 + 3 , BCH code tidak
terdefinisi.
masukan nilai pangkat yang diinginkan!
m =5
Panjang code adalah n = 31.
masukkan nilai d yang diinginkan, dengan syarat d ganjil dan <= 15!
d =11
Panjang pesan yang bisa dikirim adalah k = 11.

KNM XVI - 3-6 Juli 2012 UNPAD, Jatinangor

Fahrurozi A., Mardiyati S.

Analisis BCH Code

Polinomial generator dari BCH code yang terbentuk adalah:


g = GF(2) array.
Array elements =
1

memiliki kemampuan koreksi maksimum


masukkan pesan
msg = [1 1 1 1 0 0 0 0 1 1 0]
code = GF(2) array.
Array elements =
Columns 1 through 22
1 1
1 1 0 0 0
0
1
1
Columns 23 through 31
0
1
0
0
1
1
1
0
0

5 error

Output MATLAB contoh konstruksi BCH code


Pada output, akan ditampilkan panjang pesan k yang dapat dikirimkan serta kemampuan
error maksimum dari BCH code yang terbentuk setelah n dan d ditentukan. Pada contoh,
jika nilai k cukup besar, maka user dapat memasukkan contoh pesan secara acak, dengan
menggunakan perintah randint(1,k) pada MATLAB. Output terakhir dari program
tersebut adalah codeword yang bersesuaian dengan pesan yang dimasukkan oleh user.
5. Kesimpulan
BCH code dibangun oleh suatu polinomial generator yang merupakan least common
multiple dari 2r = d 1 polinomial minimal untuk s , s = 1, 2,...., 2r .
Untuk m N , m 3 dapat dibentuk BCH code yang memiliki parameter sebagai
berikut:
1. n = 2m 1
2. n k mt
3. d min d
Dalam konstruksi BCH code, terlebih dahulu ditentukan nilai d, yang mengakibatkan
panjang pesan yang dapat dikirim terbatasi. Hal ini dikarenakan dalam konstruksi BCH
code, sebenarnya yang dilakukan adalah memilih 2 k buah n-tuple yang tersedia
dalam GF (q ) n untuk menjadi codeword dalam BCH code yang dikehendaki sedemikian
sehingga jarak minimum antar codeword tersebut lebih besar atau sama dengan d yang
ditentukan di awal.
Jarak minimum dari BCH code yang terbentuk kadangkala lebih besar daripada d yang
ditentukan pada awal konstruksi. Hal tersebut dikarenakan polinomial generator untuk
nilai d yang berbeda dapat berbentuk sama.
Kedua hal tersebut (keterbatasan panjang code yang dikirim dan jarak minimum BCH
code yang terbentuk) berkaitan dengan bentuk cyclotomic coset (mod n) yang
mempengaruhi bentuk polinomial minimal untuk s , dimana s = 1, 2,..., d 1 .
Referensi:
[1] Adams, Sarah S. (2008). Introduction to Algebraic Coding Theory. Juli 19, 2011.
< http://www.math.niu.edu/~beachy/courses/523/coding_theory.pdf>
[2] Bhattacharya, P.B., S.K. Jain & S.R. Nagpaul. 1994. Basic Abstract Algebra,
second edition. Cambridge University Press., Cambridge: 281-311.
[3] Berlekamp, E. R. (1972). A Survey of Coding Theory. Journal of the Royal
Statistical Society. Serie A (General), Vol. 135, No. 1, pp. 44- 73.
[4] Herstein, I. N. (1996). Abstract Algebra, 3nd edition. Prentice-Hall Inc., New
Jersey: 40-223.

KNM XVI - 3-6 Juli 2012 UNPAD, Jatinangor

Fahrurozi A., Mardiyati S.

Analisis BCH Code

[5] Judson, Thomas W. (1997). Abstract Algebra Theory and Applications.


VCU Mathematics Textbook Series.
[6] Koblitz, Neil. (1997). Algebraic Aspects of Cryptography, volume 3. SpringerVerlag, Berlin: 53-60.
[7] Lidl, R. & G. Pilz. (1997). Applied Abstract Algebra, second edition. SpringerVerlag, Berlin: 117-131.
[8] Vermani, Lekh R. (1996). Elements of Algebraic Coding Theory. Chapman & Hall,
2-6 Boundary Row, London SE1 8HN, UK.
[9] Wallace, Hank. (2001). Error Detecting and Correcting Using the BCH Code.
September 28, 2011. http://www.aqdi.com/bch.pdf.

KNM XVI - 3-6 Juli 2012 UNPAD, Jatinangor

Anda mungkin juga menyukai