#!/usr/bin/perl

# MPEG 2 PS VOB file on stdin -> descrambled output on stdout
# arguments: title key bytes in least to most-significant order

s''while(read+STDIN,_,2048){P=29;J=142;if((@a=unx"C*",_)[20]&48){M=5;_=
unxb24,join"",@b=map{xB8,unxb8,chr(_^$a[--M+84])}@ARGV;s/...$/1$&/;X=unx
V,xb25,_;Q=73;Y=256|(ord$b[4])<<9|ord$b[3];X=X>>8^(K=(Z=255)&(X>>12^X>>
4^X^X/8))<<17,Y=Y>>8^(Z&(L=(W=Y>>14&7^Y)^W*8^W<<6))<<9,_=(map{_%16orZ^=J
^=(O=(11,10,116,100,11,122,20,100)[_/16%8])&110;Z^=(72,@z=(64,72,P^=12*
(_%16-2?0:O&17)),Q^=_%64?12:0,@z)[_%8]}(16..271))[_]^((M>>=8)+=K+(~L&Z)
)for@a[128..$#a]}print+x"C*",@a}';s/x/pack+/g;s/[W-ZJ-MO-Q_]/\$$&/g;eval
