BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
ĐỀ TÀI !
!" #$% ! && !'() $*
Cao học khóa : K18.
Giảng viên hướng dẫn : !+, -*
Nhóm : ./
Sinh viên thực hiện : !+, 01$ *
Sinh viên thực hiện : 2 !3-45 !*
6
LỜI GIỚI THIỆU
078)97:+$;1 ! !") ! !%
4< != > &*; !? $19($@ >$'"+A !=B
8>$C% !+ $D05 3= % & !EF G
H 7I$$=$ !$; $H7I:9) !F *% !
J>$'"+A !=B8>9$;94$$I$KL JF 8M
94$$$N 84L$ F GO$$4: =3<$=$ !
4 !<! !:PO>$" #$B8> !>A$N$Q
C% !+ $$; 71$R*? ; !? $1=% ! =
=B8> !S *
;S !T8<$F5 9N H+!!+, -9(R 4E !
U *V ! R 94L$A% !$F7>$=% ! >$'"+A !
=B8>A$N*
Hà nội, ngày 06/04/2012
;./
.
MỤC LỤC
Sinh viên thực hiện : Nguyễn Đức Bình 1
1
1.1 Lịch sử phát triển của Data warehouse 4
1.2 Data warehouse là gì? 4
1.3 Lợi ích data ware house đêm lại cho một tổ chức 8
1.4 Mô hình đa chiều (Dimensional modeling) 8
2 Phương pháp xây dựng kho dữ liệu 12
2.1 Kho dữ liệu doanh nghiệp (Enterprise data warehouse architecture) 14
2.2 Kho dữ liệu chiều (Dimensional data warehouse architecture): 16
2.3 So sánh kiến trúc Kimball và Inmon 17
2.4 Kho dữ liệu liên đoàn (Federated data warehouse architecture) 19
2.5 Data mart 21
3 Xây dựng kho dữ liệu 23
3.1 Hiện trạng dữ liệu và nhu cầu xây dựng kho dữ liệu 23
3.2 Xây dựng kho dữ liệu 24
W
1. Giới thiệu về Data warehouse
1.1 Lịch sử phát triển của Data warehouse
XB8>9(94L$ $S B ! Y6Z[/991 !
$H !+$ !Y !7" #$B8>JF 8M% ! 4 !=% !
9&94L$I\>S !9 !94L$T !*\$$>S !9 !&9) !
94L$N=N9S4;$!3$OS84L !B8>!3$9(94L$
)$$ $; !!B$$] !I !)^$1$ ? >$
A$> #$LB8>=;=Y 5 *07 +&=;=Y $>$I
$_#$L`" #$B8>a*
XNJF8O)>S !? !94L$!@894L$N=N9
!FJ+N B !: 97*$;94B8>b$$>S !
!c =$ 4>S !JF 8MB8>J >O$$R d !OIF !
# OB8> !+$Fb'$$ !c I? !^$1$*B8> +9;
94L$^$1$ !)$$S4;$$9#$I$*" > E
!4<T !% !J$% !$I$94L$$ !$:I\
$e !4<2 ! !> $; !, ! R 94L$$$
% ! B#$*
1.2 Data warehouse là gì?
f
C; 793 !g=B8> B !$P !97$;)S9$ !
!S ! *88 h !4<94L$IN9N 48$9i$Q=B
8>O=B8>94L$J+93 4
jData warehoue là một tập hợp dữ liệu tương đối ổn định (nonvolatile) , liên
kết với thời gian (time-variant), được tích hợp (integrated) theo một chủ đề
(subject-oriented) nhằm hỗ trợ quá trình tạo quyết định về mặt quản lý
(Support management’s decision making process)j
C$R !B !93 !g=B8>? 94L$!F#$ 4
Tính bền vững (Nonvolatile)B8>84 !8=% !
+9^*
Biến thời gian (time-variant):k?$HJ !$=B8>8&7
<! 5 E$$>S !$ !>*C5\B8>$ !>B
8>$;!3> <*C] B8>$Q=B8>$ !$:% ! 83$T
_# 4Olh6/ Y4E$a*m+NS<! 94L$84B !Cn*
l
Hướng chủ đề (subject-oriented): B8>94L$^$1$ !$$9S4L !
$# o$$$J = *m#^IN $Q$$B8>93
4E !9S4L !8=$ !OF GO $ !$:!3$I *R
!>$% ;" #$B8>$$$ 94J+N93 O
=% !R !$$&9) !+$$'T8M!3$ ! !+
p
Tích hợp (integrated) B8>b 7 !c =$ $Q$$] !I
!^$1$*!c B8>=$ $;$; B !$$=$ 9'$
93 )9S4L !$*+ ? O !)=B8>$q$;)93
!g$QF G*07 +9&94L$Ir !$$T !!FJ+N' !9)
? !=B8>*m=$P !9&94L$97 +O$P ! ;r !B
8>94L$#$L*
Hỗ trợ quá trình tạo quyết định (Support management’s decision making
process) >JF$Q)=B8>!P94J+N93 A? B8>
83$To$A=> *n9;O$$J+N93 = OJ+ =
$;94L$S4;9 " !$>JF*
s
1.3 Lợi ích data ware house đêm lại cho một tổ chức.
C;: 78L#$=B8> !8&$$$^$1$
tBB8>83$T9" #$R$# N>S ! !c =% !+
B8>83$T*
Ce9 !"+$R$$B8>? !>*
CF> $:84L !B8>Ir !$$8&$$+ 9^B8>=F
=B8>*
C !$:$I)R = o$ !4<J+N93 )? IF
+ :$Q$" 8Mo$$$% ! 94L$ I+S ! :*
C !$:% ! +B8>I)R = o$ !4<J+N
93 *
C !$:>:+: S4;=% !F 4\ !9N >S !
&9) !*
C !$:% ! 9$F> J+ = *
1.4 Mô hình đa chiều (Dimensional modeling).
V% 9$78)N=N$5\B8>=uR9KL !4<
2 ! !>9+: B8> !=B8>*C$% 9$7
94L$ 94E !E$F> >:+: ,T !*07
J @ !8$H 84Mr !$$% $78=% !$H N)$
$5\B8>J >*C$45 !N$R % 9$7O\1$L
8MO$;94L$ !$I:=v 1$R8MO$d !& 4$5\B8>
J >9$7*
!% 9$7O$;= >J @ !A=> _w$a=#$
4E$_ a*
Sự kiện (fact):$] 94L$!@84E$984< ! & != *nA
=> 8!3S$;94L$^ !L*m#S84L ! !I *
[
Kích thước (dimensions)94L$!@8IS$F !P'$93 x$$A=> O
#? F GO45 !>O<! ***8 B ! H $Q=#$
4E$*
Hình : Mô hình đa chiều của một doanh nghiệp có chiều Time, Product, Market.
Mô hình đa chiều được thiết kế theo 03 kiểu như sau:
Lược đồ sao (Star schema): 8)N=N$7$)$5\B8>J
>4< !94L$T ! !*C;)IF !A=> _w$a
& ! " $Q 84L$ 9c I J I\ ) S IF ! =#$ 4E$
_ a !84L$9cO=#$4E$8? J 9N ;8&E
48$$$) !IF !=#$4E$94L$T !984BB8>$Q
A=> 94L$84B !A=> _w$a*
Hình : Minh họa lược đồ ngôi sao.
Z
Lược đồ bông tuyết (Snowflake schema): I!c)IF !A=> _w$a
IJ I\ 7IF !=#$4E$_ a$;94L$=N SE
IF !=#$4E$_ a=$% !JSJ > 7h)*4L$
9cI% !+N8)8&84L$9cO+ ? ;81$&5 E
)84L$9c*4L$9cI% !+N94L$N=Nb$$84L$9cIr !
$$N$$G ;$$IF !=#$4E$98&IyB8>4b*
9; !84L$9cI% !+NO+$;)IF !=#$4E$8E =N SE
)IF !A$Nz$;) ;$$IF !=#$4E$ 7*tF 9c +
${ !!PN=>=% !! + ? ;8Y !S84L !$QIF !
=#$4E$*
Hình: Minh họa lược đồ bông tuyết.
So sánh lược đồ sao & lược đồ bông tuyết:
Lược đồ sao Lược đồ bông tuyết
Dễ hiểu , !5 $ !4<2 !
!>$$ "
#$+: B8>*
C;8=;=Y 5 $
!4<2 ! !>
$$ " #$S
84L !I O@F9S;
6/
E*
Kích thước bảng
Cq$;)IF !=#$4E$
$K=#$4E$*F !
=#$4E$=% !1$
$G ;W|*
C;$; 75 6IF !
=#$4E$$K=#$
4E$*X#$4E$IF !
94L$$G ;W|*
Truy vấn phức tạp
C$+: 8:95 !F
,
+: 1$&5
F=NL$$=; !&
!B$$IF !=#$4E$
Hiệu suất truy vấn
->:$*} ! $;
S4;Y !>:
+: A? A9 *
C; 78? =N=;
! ? <! +:
8"5 E84L$9c*
Không gian lưu trữ
XIF !=#$4E$84B
45 !9SS84L ! y$$
!O=% !! =% !F
8): 978E O$P !$;
T !84L$9c*
XIF !=#$4E$84B
S84L !8E !EB
8>A] !=% !
! 8): 97O$P !
$;$@ I% !+N
84L$9c9N=>=% !
! *
Số lượng khóa ngoại ~ C5
Loại data warehouse
>$S : !I:=v
•
S5 $
y•
Hướng dẫn xây dựng một mô hình đa chiều 0'"+A !)% B
8>$7$H )45 !$F$$J+N93 $H FA$>
9 N=N$5\B8>*45 ! +T !)$$N
$R b? 'S !I\ ;8H 9H? '$93 $$J $# !^
$1$$QI& O 5B8>94L$R*V) >J @ !$Q$$
N=N$5\B8>8I€9HE$$ !c B8>> $;$Q^$1$*n
66
=J 94L$'$93 O)o$ 7IF !A=> 94L$'"+A !bK
J = *C$I4E$9"+%F$$45 !T !9'"+
A !$$% B8>*
Bước 1C@ J+ = S T !9" #$$$: 97
94L$% ;*
Bước 2•$93 1$9)$N$Q$$IF !A=> _w$a*
Bước 3•$93 =#$4E$_ a" $:$KIF !A=> *
Bước 4•$93 $$I> $$$IF !A=> *
Bước 5•$93 $$)$# $KIF !=#$4E$*
Bước 6F c$Q !4<2 !9'$ $$% B8>*
2 Phương pháp xây dựng kho dữ liệu.
C@ 8A=N P$=B8>2L9'"+A !8)
$% !>$$A$=vJ @ ! r9FIFz91 !94L$
$$+?$H= *
V)S=N P$=B8>% ! !
Kho dữ liệu doanh nghiệp (Enterprise data warehouse architecture)
887=N P$=B8> !>% ! b$$>
S ! !c =$ 94L$L : )=84B !"!@
8)=B8> !>*‚ ! !=B8> 4$$$% !$I
$OB8>94L$+: b++: A$N=B
8>*
Kho dữ liệu chiều (Dimensional data warehouse architecture) !=N
P$$Qƒ8XI887=B8>OB8>94L$ !b=€$$
!>)939 !"94L$!@8$7=B8>*tS ! 4
=N P$$Q 7=B8>O=B8>$7${ !9(8 !"
$Q !>* !% XI887=B8>=N P$O
8)RL$ $QIF !8? =NE Ir !$$T !84L$
6.
9cI% !+N*X% !!S ! 4=N P$ !>$Q
7=B8>O\% XI88>S !" #$$;+$RB8>
A$Nb=B8>$7*
Kho dữ liệu liên đoàn (Federated data warehouse architecture)$ !$:
)$$N$R >JFNA$9'"+A !)=B8>E
!)%4< !=% !9c ! :Ir !$$#$LF =B8>
>S != % ! E *
Data Mart!c= >$Q$$8&=$ 9(
94L$ =A$> *
6W
2.1 Kho dữ liệu doanh nghiệp (Enterprise data warehouse architecture).
094L$=N P$B8>$Q O(+' F b !
F*V)S+NS 4
Hình: Kiến trức kho dữ liệu của Inmon (CIF).
Ứng dụng trong tổ chức (Corporate Applications)C$1 ! ! +8>
S !&9) !O$$>S !!3$O 9KL= *->
S !!3$94L$T !9RB8>b$$!3$=
4I !ON3OJF 8MR8>***94L$84B !$$
1$=$ I!cB8>J >OB8>" $:o$R
$#$$IF !# * !=N P$ O>S !!3$$] 94L$!@8
>S ! !c $ !$:B8>$=B8>*
Tiến trình ETL (ETL Processes)094B8>b>S !!3$O)
N 94L$!@8}94L$T !*}8N€$#$':O
$+ 9^ &*}8J L :B8>OIN ; )
93 & !?$G $F ;)=84B+ :94L$!@
8=B8> !>o$}„*N }$;$&+ 4)
6f
J A$93 =vo$)!3$A? B8><! A$
!H *N }94L$!@8#$LB8>o$$$3$B8>*
Kho dữ liệu doanh nghiệp (Enterprise data warehouse):8)+NS !
" !=N P$=B8>$Q *93 !g$Q 7
=B8>O=B8> !>8)=84B#$LB8>
!+? T*B8> !=B8> !>I3I€\)1$9):
:$Q$N*B8> !=B8> !>94L$84B !
$5\B8>J >T !N=N$5\B8>& !W|*
Data mart8!;$ % ! B8>4E !$Q97$Q)I)R
R B8>b=B8> !>*nA^ !LB8>$;
'F+=B8>94L$$+ b=B8> !>9N
*T !N=N$79;$$B8> !$$
9(… !9" #$*07J @ !8$H 84Mr !:$F$$1 !
!I? !o$$$$% !$I$OJF 3 !>% !
+: B8>b++$RA$N=B8>
!>*
6l
2.2 Kho dữ liệu chiều (Dimensional data warehouse architecture):
094L$=N P$B8>$Qƒ8XI88O(+' F b
!F*V)S+NS 4
Hình: Kiến trức kho dữ liệu của Ralph Kimball.
Ứng dụng giao dịch (Transaction applications)8>S !&9) !94L$
&9JF 8M$$!3$= *C$B8>$Q>S !!
3$4< !94L$84B !$5\B8>J >OR o$& !Ir !
d ! 4IF !# *B !>S !!3$8>S ! !c $Q$$
=B8> !=B8>=N P$ƒ8XI88*
ETL094B8>b>S !!3$4L$84BE$$ 1$
=$ O$$N }94L$T !*}8N€$Q#$':
_'$aO$+ 9^_ waF_8a*C$B8> !$$93
& !=$ 94L$?$G ;$+ 9^ !93 & !9(
… !9F=B8>*
Kho dữ liệu chiều (Dimensional data warehouse): 8$Q=N P$
=B8>*XB8>$7$1$$B8> !>\93 & !
&$* !=88 =B8>=N P$Ir !$$T !%
6p
}ƒO=B8>$794L$N=NT !% $7*;$;
!g8=B8>$7I!c$$84L$9c_$ao$
=S_$Ia*C$>S !" #$o$$$$% !$I$$;+
$RB8>A$Nb=B8>$7*
Data mart: !=N P$ +O= >7$q8)A"
$8!$*8)=A$4E !$Q97 !=B8>$7*
XB8>$7$] 94L$IN9N E? I$$O$$
o$8*
2.3 So sánh kiến trúc Kimball và Inmon.
XI88 !=B8>=N P$
CFXI88 $2 !$;)# Y !^IN 8K !4<$;
)=#$LB8> !+? T* !=N P$ $Q ;94L$!@8
=B8> !> !=N P$$QXI88O ;94L$!@8=B
8>$7*CF=N P$$;)ARLB8> !>KL"
#$% ! J)^$1$*C$N$R +$e9!FJ+N$$
+?$H= )$Q97$] 7$Q97=$*
+ ? $;)S=$I> !=N P$=B8>$Q$F
$+? !
XI88T !% $7 484L$9co$I% !+N9^$1$
$$B8> !=B8>$7 != T !% }ƒ
!=B8> !>* $qT !% $7$
$q !=XI88T ! ;$:$F$$B8>
T !$$" $$R8Mb=B8> !>
$P !94L$'"+A !9T !$$$] !I * != !
=N P$$QXI88O ;8=% !$H N9$$$b=B
8>$7*
6s
!=B8>$7$QXI88O" #$>S !$;+$RB
8>A$N* != !=N P$$Q O>S !" #$$q$;
+$RB8> !=B8> !>% !J$$*
n XI88 !$$N$R '"+A !=B8>
88 97 !3'"+A !=B8>45 !N$R b?
'S !* !N8M$Q O ;94L$I€9HE>$'"+A !)=
B8>8E R !B8>$Q !>O 5:$FB8>$;…
b$$>S !!3$94L$L : )I)4R$Q97
93 4E !O#$LO<! IN I7 B ! rKLJ
J+N93 *n9;94L$'"+A !$$$ $H" #$
$Q$$] !I *
!4L$8&E$$N$R 88 Oƒ8XI8897 !3'"+A !$$
=B8>45 !N$R b4E8? * !N8M$QXI88O ;
I€9HEJ @ !$ $H" #$$Q$$] !
I *n9;O ;94L$#$L$$9 :J B8>% !J
w I*XI88T !% $79!FJ+N$$ $H
$Q$$I)R E$$$Q97=$ ! !>*
A$@ !B$$N$R XI88+ 9'"+A !=B8>†
Đặc điểm
Kimball Inmon
Yêu cầu về hỗ trợ quyết
định kinh doanh
CN R CN 84L$
Dữ liệu tích hợp yêu cầu B8>$$I) B8> !>
Cấu trúc dữ liệu XO>JF= 01 ! 7 $H
Tính ổn định của nguồn
dữ liệu
->S ! !c ^ 93
->S ! !c $;A+
9^ 7*
Kỹ năng ; y ;$+? !
6[
Hạn chế về thời gian !€ O$:I$
Chi phí xây dựng C#I€9H: C#I€9H$
2.4 Kho dữ liệu liên đoàn (Federated data warehouse architecture).
!+ +O^$1$4< !$;)RL$$>S !=% !9c ! :=N
P$$;$1>S !!3$$$$% !$= % ! $ !$:
=F Y !" #$$ $H$Qb !I)R $ " *VKI)R '
)% = J 9? !$Q^$1$*0#$L$$>
S !=% !9c ! : r$9#$$ !$:=F Y !" #$? $$
$1$ Y !$$] !I =$ O=B8>8? 9 _|
$$a94L$ *XB8>8? 9 8)45 !
N$R A$N99&94L$$$j? IF + :$Q$" 8Mj !^
$1$*XB8>8? 9 94L$T !9#$L$$!F=
$# _a=#$4E$_ a*7 F !$Q=B8>8?
9 8% = ^IN =A$ A !_$ ! !
a*
XA$8? I !$;8? =B8>
^$1$8E $; 7=A$= =$ O1 !K=A$
9;8 B !=$ !$*mEK=A$$OXB8>9(94L$
'"+A !E+?$H? !991 ! $H= $$Q=A$
9;*V)=B8> $H_t8I8a${ !9(94L$'"+A !
9$ !$:=F Y !" #$997 \$:9) $H*nA=$I>
!B>S !=B8>=A$ $H8IF $:$QB8>$4P
6Z
!K$:9)>S !* !=A$8? B8> F =N P$
=4E9"+O$;8c !B8>!B$$=B8>=A$ $H
Đẩy lên (Upward Federation)B8>A$N$q94L$$+ b=B
8>=A$8? =B8> $H*RLB8>$;'F+&=
B8> $H=B8>#$Lo$ !J $+ B8>*
Đẩy xuông(Downward Federation): B8>94L$9G+b=B8>
$H'S !=B8>=A$*09FIFAS ! : ‡ $Q
B8> !^$1$*B8>!3$b>S !&9) ! !>
4}ƒOCƒV***$; !c !S$\$:9) $H9;#$':O
$+ 9^ &=B8>=A$45 !1 !*
Hình: Khu vực - kho dữ liệu liên đoàn.
C1$ Y !$;$;\=B8>8? 9 *
XB8>8? 9 4< !94L$T !=^$1$$;>S !=B8>
=$ 94L$'"+A !? !$$$1 ! !$ 4}ƒOCƒVo$
$Q97$*C$ H $1$ Y !$Q=N P$=B8>8? 9
I!c$$O=B8>2+$q O$% !$}O$1$ Y !I$
J>S !O84BB8><! A$I$ 4 4E9"+
./
Hình: Chức năng - kho dữ liệu liên đoàn.
2.5 Data mart.
V)8)RL$$B8>$2 !$Q994L$^$1$ rK
L>$J+N93 A? $H$$Q) ; !4<2 !
!>o$I)R *
C;8&9)$8R_ h8 a
)$_ a*
Data mart độc lập(independent or stand-alone data mart)B8>R !
? !)$Q97 ;=% !94L$N=N91 !$$F
!>*m#I)R F ':$;$Q@OI)R " 8A$OI)
R $# ${ ! 4R+* R B8>b 7>S !!
3$)$Q97o$+?$H= $$Q)I)R *
9)$8R$;94L$N=N$7o$% A$
J >*->S !" #$JF 3 !>% ! +:
B8>$% !$A$Nb*B ! F 4E9"+8)
n h8 9 *
.6
Data mart phụ thuộc (Dependent data mart): O)
)$8) 5B8>$Q ;9N b)=B8>*B8> !
) =B8>94L$^ !LO$5$:8&O;€= ;9
)$*C$=N P$$Q)?3B8>)$ 4
Hình: Kiến trúc Data mart phụ thuộc.
L#$$Q>$'"+A !)?3B8>)$
Hiệu suất=>:A$> $Q=B8>\ ): 97
>$'"+A !)o$$;!FJ+N: 97*\'T8M
B8>94L$A$> I? !$$=B8>*
An ninhIr !$$9o$$B8>I? !=B8> !$$O
b !I)R \BB8>$Q@ =B8>$Q@*
Xx8 58M4\ !9'"+A !xXJ<
! $Q<! *
3 Xây dựng kho dữ liệu.
3.1 Hiện trạng dữ liệu và nhu cầu xây dựng kho dữ liệu.
-> &C% !+ $9 ! ='"+A !)>S !I
'+J I:9) !F C) !9c !%!EI:9) !F > OC) !
9c !$ !$:$$F G> #$'+J I:9) !F ˆtP=$
!, !=N$$F G$:84L !2L*
t9& 9H? $N '"+A ! ? !$$) !
9) !I:9) !F m> E !S &=? =N S!B$$ %
!EI:9) !F )$$ $ !$# '$*tP$$ %!EA
9 ! % !J$$?$#N8R9$@ 8A %!Eo$F
GS :$=$ !*n$) !9c !%!E94L$'"+A !E
$% ! !?
->JF 3CnV+n‰*
V( !c \8*
mE !S 91 !S $H$Q !4<2 !7IAI
'4E !34< !I:9) !F r$;A4: =3<$ !4<2 !*
C% !+ $ !S $;I$7
nS84L ! b !H O !OJMˆ9=ŠEA" 8&$Q
4$9#$ _OI O$?O$H ?a‹=A$‰R O
.W
+> ‹8&F G_ IO F G3$a1 !EK
8&F Gz8" $: y5 *
•4E !!$Q34< !A O=A$O<! *XNL
$P !E$$I$& !'88$$05 30n=$94*
mE B !I$ 4? O>S !> &=% !91 !94L$+?$H
->S !B8>? 7 894L$^$1$$&9) !A? $:
P$_:$FB8>O OJR +> O8&nO8& $Hˆa
? >$+':B8> 7$78:=;$R*
m>$#$LB8>E$$w8'88994I$94L$A$> Q
$% !:=;=Y *
B8>N# ^ 93 >S !93 =vz!F; !$$ 9Y !9
S4;S$9)*_tF; !Ir !$$'; N& o$I$=
IF !B8>=$a
091 !+?$HbI)R I$C% !+ $O%97':'"+
A !=B8>7S84L ! 9Y !O!Ib !?$#*
3.2 Xây dựng kho dữ liệu
0=€$$$$: 97? >$'"+A !)=B8>$I)R
" #$8 2L*
CY $1+?$HI
Dữ liệu tích hợp)H b>S !8 ! !>*
Kỹ năng: ; yN '"+A !*
Thời gian:9]y<! !:P*
Chi phí:C#9H4I 9H:*
.f
“Với các yêu cầu như trên của bài toán thì việc lựa chọn cách phương pháp
Kimbal (mô hình dữ liệu chiều) để xây dựng kho dữ liệu là hoàn toàn phù hợp”
$Q97'"+A !z''e$$A$
!4<2 !_a84B% ! 7 !4<2 !!c$$)$#
O O ŒOŒ! *
9Y !84B% ! 7 9Y !E$$)$# O $_O
I O$?O$H ?aO OJ + O O!*
V% $Q97 !$% !+ $
.l